LyoKICogQXV0aG9yczoKICogQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkgUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2U+CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHkgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIEFsZXhleSBLdXpuZXRzb3YgIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KICogQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqIEplbnMgTOXlcyA8amVucy5sYWFzQGRhdGEuc2x1LnNlPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKgogKiBBIHRvb2wgZm9yIGxvYWRpbmcgdGhlIG5ldHdvcmsgd2l0aCBwcmVjb25maWd1cmF0ZWQgcGFja2V0cy4KICogVGhlIHRvb2wgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaW51eCBtb2R1bGUuICBQYXJhbWV0ZXJzIGFyZSBvdXRwdXQgCiAqIGRldmljZSwgZGVsYXkgKHRvIGhhcmRfeG1pdCksIG51bWJlciBvZiBwYWNrZXRzLCBhbmQgd2hldGhlcgogKiB0byB1c2UgbXVsdGlwbGUgU0tCcyBvciBqdXN0IHRoZSBzYW1lIG9uZS4KICogcGt0Z2VuIHVzZXMgdGhlIGluc3RhbGxlZCBpbnRlcmZhY2UncyBvdXRwdXQgcm91dGluZS4KICoKICogQWRkaXRpb25hbCBoYWNraW5nIGJ5OgogKgogKiBKZW5zLkxhYXNAZGF0YS5zbHUuc2UKICogSW1wcm92ZWQgYnkgQU5LLiAwMTAxMjAuCiAqIEltcHJvdmVkIGJ5IEFOSyBldmVuIG1vcmUuIDAxMDIxMi4KICogTUFDIGFkZHJlc3MgdHlwbyBmaXhlZC4gMDEwNDE3IC0tcm8KICogSW50ZWdyYXRlZC4gIDAyMDMwMSAtLURhdmVNCiAqIEFkZGVkIG11bHRpc2tiIG9wdGlvbiAwMjAzMDEgLS1EYXZlTQogKiBTY2FsaW5nIG9mIHJlc3VsdHMuIDAyMDQxNy0tc2lndXJkdXJAbGlucHJvLm5vCiAqIFNpZ25pZmljYW50IHJlLXdvcmsgb2YgdGhlIG1vZHVsZToKICogICAqICBDb252ZXJ0IHRvIHRocmVhZGVkIG1vZGVsIHRvIG1vcmUgZWZmaWNpZW50bHkgYmUgYWJsZSB0byB0cmFuc21pdAogKiAgICAgICBhbmQgcmVjZWl2ZSBvbiBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IG9uY2UuCiAqICAgKiAgQ29udmVydGVkIG1hbnkgY291bnRlcnMgdG8gX191NjQgdG8gYWxsb3cgbG9uZ2VyIHJ1bnMuCiAqICAgKiAgQWxsb3cgY29uZmlndXJhdGlvbiBvZiByYW5nZXMsIGxpa2UgbWluL21heCBJUCBhZGRyZXNzLCBNQUNzLAogKiAgICAgICBhbmQgVURQLXBvcnRzLCBmb3IgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBhbmQgY2FuCiAqICAgICAgIHNldCB0byB1c2UgYSByYW5kb20gZGlzdHJpYnV0aW9uIG9yIHNlcXVlbnRpYWxseSB3YWxrIHRoZSByYW5nZS4KICogICAqICBDYW4gbm93IGNoYW5nZSBtb3N0IHZhbHVlcyBhZnRlciBzdGFydGluZy4KICogICAqICBQbGFjZSAxMi1ieXRlIHBhY2tldCBpbiBVRFAgcGF5bG9hZCB3aXRoIG1hZ2ljIG51bWJlciwKICogICAgICAgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wLgogKiAgICogIEFkZCByZWNlaXZlciBjb2RlIHRoYXQgZGV0ZWN0cyBkcm9wcGVkIHBrdHMsIHJlLW9yZGVyZWQgcGt0cywgYW5kCiAqICAgICAgIGxhdGVuY2llcyAod2l0aCBtaWNyby1zZWNvbmQpIHByZWNpc2lvbi4KICogICAqICBBZGQgSU9DVEwgaW50ZXJmYWNlIHRvIGVhc2lseSBnZXQgY291bnRlcnMgJiBjb25maWd1cmF0aW9uLgogKiAgIC0tQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqCiAqIFJlbmFtZWQgbXVsdGlza2IgdG8gY2xvbmVfc2tiIGFuZCBjbGVhbmVkIHVwIHNlbmRpbmcgY29yZSBmb3IgdHdvIGRpc3RpbmN0IAogKiBza2IgbW9kZXMuIEEgY2xvbmVfc2tiPTAgbW9kZSBmb3IgQmVuICJyYW5nZXMiIHdvcmsgYW5kIGEgY2xvbmVfc2tiICE9IDAgCiAqIGFzIGEgImZhc3RwYXRoIiB3aXRoIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjbG9uZXMgYWZ0ZXIgYWxsb2Mncy4KICogY2xvbmVfc2tiPTAgbWVhbnMgYWxsIHBhY2tldHMgYXJlIGFsbG9jYXRlZCB0aGlzIGFsc28gbWVhbnMgcmFuZ2VzIHRpbWUgCiAqIHN0YW1wcyBldGMgY2FuIGJlIHVzZWQuIGNsb25lX3NrYj0xMDAgbWVhbnMgMSBtYWxsb2MgaXMgZm9sbG93ZWQgYnkgMTAwIAogKiBjbG9uZXMuCiAqCiAqIEFsc28gbW92ZWQgdG8gL3Byb2MvbmV0L3BrdGdlbi8gCiAqIC0tcm8KICoKICogU2VwdCAxMDogIEZpeGVkIHRocmVhZGluZy9sb2NraW5nLiAgTG90cyBvZiBib25lLWhlYWRlZCBhbmQgbW9yZSBjbGV2ZXIKICogICAgbWlzdGFrZXMuICBBbHNvIG1lcmdlZCBpbiBEYXZlTSdzIHBhdGNoIGluIHRoZSAtcHJlNiBwYXRjaC4KICogLS1CZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KICoKICogSW50ZWdyYXRlZCB0byAyLjUueCAwMjEwMjkgLS1MdWNpbyBNYWNpZWwgKGx1Y2lvbWFjaWVsQHppcG1haWwuY29tLmJyKQogKgogKiAKICogMDIxMTI0IEZpbmlzaGVkIG1ham9yIHJlZGVzaWduIGFuZCByZXdyaXRlIGZvciBuZXcgZnVuY3Rpb25hbGl0eS4KICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGZvciBob3cgdG8gdXNlIHRoaXMuCiAqCiAqIFRoZSBuZXcgb3BlcmF0aW9uOgogKiBGb3IgZWFjaCBDUFUgb25lIHRocmVhZC9wcm9jZXNzIGlzIGNyZWF0ZWQgYXQgc3RhcnQuIFRoaXMgcHJvY2VzcyBjaGVja3MgCiAqIGZvciBydW5uaW5nIGRldmljZXMgaW4gdGhlIGlmX2xpc3QgYW5kIHNlbmRzIHBhY2tldHMgdW50aWwgY291bnQgaXMgMCBpdCAKICogYWxzbyB0aGUgdGhyZWFkIGNoZWNrcyB0aGUgdGhyZWFkLT5jb250cm9sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyLXByb2Nlc3MgCiAqIGNvbW11bmljYXRpb24uIGNvbnRyb2xsaW5nIHByb2Nlc3MgInBvc3RzIiBvcGVyYXRpb25zIHRvIHRoZSB0aHJlYWRzIHRoaXMgCiAqIHdheS4gVGhlIGlmX2xvY2sgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlbW92ZSB3aGVuIGFkZC9yZW1fZGV2aWNlIGlzIG1lcmdlZAogKiBpbnRvIHRoaXMgdG9vLgogKgogKiBCeSBkZXNpZ24gdGhlcmUgc2hvdWxkIG9ubHkgYmUgKm9uZSogImNvbnRyb2xsaW5nIiBwcm9jZXNzLiBJbiBwcmFjdGljZSAKICogbXVsdGlwbGUgd3JpdGUgYWNjZXNzZXMgZ2l2ZXMgdW5wcmVkaWN0YWJsZSByZXN1bHQuIFVuZGVyc3Rvb2QgYnkgIndyaXRlIiAKICogdG8gL3Byb2MgZ2l2ZXMgcmVzdWx0IGNvZGUgdGhhdHMgc2hvdWxkIGJlIHJlYWQgYmUgdGhlICJ3cml0ZXIiLgogKiBGb3IgcHJhdGljYWwgdXNlIHRoaXMgc2hvdWxkIGJlIG5vIHByb2JsZW0uCiAqCiAqIE5vdGUgd2hlbiBhZGRpbmcgZGV2aWNlcyB0byBhIHNwZWNpZmljIENQVSB0aGVyZSBnb29kIGlkZWEgdG8gYWxzbyBhc3NpZ24gCiAqIC9wcm9jL2lycS9YWC9zbXBfYWZmaW5pdHkgc28gVFgtaW50ZXJydXB0cyBnZXRzIGJvdW5kIHRvIHRoZSBzYW1lIENQVS4gCiAqIC0tcm8KICoKICogRml4IHJlZmNvdW50IG9mZiBieSBvbmUgaWYgZmlyc3QgcGFja2V0IGZhaWxzLCBwb3RlbnRpYWwgbnVsbCBkZXJlZiwgCiAqIG1lbWxlYWsgMDMwNzEwLSBLSlAKICoKICogRmlyc3QgInJhbmdlcyIgZnVuY3Rpb25hbGl0eSBmb3IgaXB2NiAwMzA3MjYgLS1ybwogKgogKiBJbmNsdWRlZCBmbG93IHN1cHBvcnQuIDAzMDgwMiBBTksuCiAqCiAqIEZpeGVkIHVuYWxpZ25lZCBhY2Nlc3Mgb24gSUEtNjQgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CiAqIAogKiBSZW1vdmUgaWYgZml4IGZyb20gYWRkZWQgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+IDA0MDQxOQogKiBpYTY0IGNvbXBpbGF0aW9uIGZpeCBmcm9tICBBcm9uIEdyaWZmaXMgPGFyb25AaHAuY29tPiAwNDA2MDQKICoKICogTmV3IHhtaXQoKSByZXR1cm4sIGRvX2RpdiBhbmQgbWlzYyBjbGVhbiB1cCBieSBTdGVwaGVuIEhlbW1pbmdlciAKICogPHNoZW1taW5nZXJAb3NkbC5vcmc+IDA0MDkyMwogKgogKiBSYW55IER1bmxhcCBmaXhlZCB1NjQgcHJpbnRrIGNvbXBpbGVyIHdhcmluZyAKICoKICogUmVtb3ZlIEZDUyBmcm9tIEJXIGNhbGN1bGF0aW9uLiAgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+CiAqIE5ldyB0aW1lIGhhbmRsaW5nLiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gMDQxMjEzCiAqCiAqIENvcnJlY3Rpb25zIGZyb20gTmlrb2xhaSBNYWx5a2ggKG5tYWx5a2hAYmlsaW0uY29tKSAKICogUmVtb3ZlZCB1bnVzZWQgZmxhZ3MgRl9TRVRfU1JDTUFDICYgRl9TRVRfU1JDSVAgMDQxMjMwCiAqCiAqIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgpIHJlcGxhY2VkIE5pc2hhbnRoIEFyYXZhbXVkYW4gPG5hY2NAdXMuaWJtLmNvbT4gCiAqIDA1MDEwMwogKi8KI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvdGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiNpbmNsdWRlIDxsaW51eC91ZHAuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgojaW5jbHVkZSA8bmV0L2lwdjYuaD4KI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgojaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPiAvKiBkb19kaXYgKi8KI2luY2x1ZGUgPGFzbS90aW1leC5oPgoKCiNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MjogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCgovKiAjZGVmaW5lIFBHX0RFQlVHKGEpIGEgKi8KI2RlZmluZSBQR19ERUJVRyhhKSAKCi8qIFRoZSBidWNrZXRzIGFyZSBleHBvbmVudGlhbCBpbiAnd2lkdGgnICovCiNkZWZpbmUgTEFUX0JVQ0tFVFNfTUFYIDMyCiNkZWZpbmUgSVBfTkFNRV9TWiAzMgoKLyogRGV2aWNlIGZsYWcgYml0cyAqLwojZGVmaW5lIEZfSVBTUkNfUk5EICAgKDE8PDApICAvKiBJUC1TcmMgUmFuZG9tICAqLwojZGVmaW5lIEZfSVBEU1RfUk5EICAgKDE8PDEpICAvKiBJUC1Ec3QgUmFuZG9tICAqLwojZGVmaW5lIEZfVURQU1JDX1JORCAgKDE8PDIpICAvKiBVRFAtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfVURQRFNUX1JORCAgKDE8PDMpICAvKiBVRFAtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDU1JDX1JORCAgKDE8PDQpICAvKiBNQUMtU3JjIFJhbmRvbSAqLwojZGVmaW5lIEZfTUFDRFNUX1JORCAgKDE8PDUpICAvKiBNQUMtRHN0IFJhbmRvbSAqLwojZGVmaW5lIEZfVFhTSVpFX1JORCAgKDE8PDYpICAvKiBUcmFuc21pdCBzaXplIGlzIHJhbmRvbSAqLwojZGVmaW5lIEZfSVBWNiAgICAgICAgKDE8PDcpICAvKiBJbnRlcmZhY2UgaW4gSVBWNiBNb2RlICovCgovKiBUaHJlYWQgY29udHJvbCBmbGFnIGJpdHMgKi8KI2RlZmluZSBUX1RFUk1JTkFURSAgICgxPDwwKSAgCiNkZWZpbmUgVF9TVE9QICAgICAgICAoMTw8MSkgIC8qIFN0b3AgcnVuICovCiNkZWZpbmUgVF9SVU4gICAgICAgICAoMTw8MikgIC8qIFN0YXJ0IHJ1biAqLwojZGVmaW5lIFRfUkVNREVWICAgICAgKDE8PDMpICAvKiBSZW1vdmUgYWxsIGRldnMgKi8KCi8qIExvY2tzICovCiNkZWZpbmUgICB0aHJlYWRfbG9jaygpICAgICAgICBzcGluX2xvY2soJl90aHJlYWRfbG9jaykKI2RlZmluZSAgIHRocmVhZF91bmxvY2soKSAgICAgIHNwaW5fdW5sb2NrKCZfdGhyZWFkX2xvY2spCgovKiBJZiBsb2NrIC0tIGNhbiBiZSByZW1vdmVkIGFmdGVyIHNvbWUgd29yayAqLwojZGVmaW5lICAgaWZfbG9jayh0KSAgICAgICAgICAgc3Bpbl9sb2NrKCYodC0+aWZfbG9jaykpOwojZGVmaW5lICAgaWZfdW5sb2NrKHQpICAgICAgICAgICBzcGluX3VubG9jaygmKHQtPmlmX2xvY2spKTsKCi8qIFVzZWQgdG8gaGVscCB3aXRoIGRldGVybWluaW5nIHRoZSBwa3RzIG9uIHJlY2VpdmUgKi8KI2RlZmluZSBQS1RHRU5fTUFHSUMgMHhiZTliZTk1NQojZGVmaW5lIFBHX1BST0NfRElSICJwa3RnZW4iCgojZGVmaW5lIE1BWF9DRkxPV1MgIDY1NTM2CgpzdHJ1Y3QgZmxvd19zdGF0ZQp7CglfX3UzMgkJY3VyX2RhZGRyOwoJaW50CQljb3VudDsKfTsKCnN0cnVjdCBwa3RnZW5fZGV2IHsKCgkvKgoJICogVHJ5IHRvIGtlZXAgZnJlcXVlbnQvaW5mcmVxdWVudCB1c2VkIHZhcnMuIHNlcGFyYXRlZC4KCSAqLwoKICAgICAgICBjaGFyIGlmbmFtZVszMl07CiAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudDsKICAgICAgICBjaGFyIHJlc3VsdFs1MTJdOwogICAgICAgIC8qIHByb2MgZmlsZSBuYW1lcyAqLwogICAgICAgIGNoYXIgZm5hbWVbODBdOwoKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogcGdfdGhyZWFkOyAvKiB0aGUgb3duZXIgKi8KICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dDsgLyogVXNlZCBmb3IgY2hhaW5pbmcgaW4gdGhlIHRocmVhZCdzIHJ1bi1xdWV1ZSAqLwoKICAgICAgICBpbnQgcnVubmluZzsgIC8qIGlmIHRoaXMgY2hhbmdlcyB0byBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBzdG9wICovCiAgICAgICAgCiAgICAgICAgLyogSWYgbWluICE9IG1heCwgdGhlbiB3ZSB3aWxsIGVpdGhlciBkbyBhIGxpbmVhciBpdGVyYXRpb24sIG9yCiAgICAgICAgICogd2Ugd2lsbCBkbyBhIHJhbmRvbSBzZWxlY3Rpb24gZnJvbSB3aXRoaW4gdGhlIHJhbmdlLgogICAgICAgICAqLwogICAgICAgIF9fdTMyIGZsYWdzOyAgICAgCgogICAgICAgIGludCBtaW5fcGt0X3NpemU7ICAgIC8qID0gRVRIX1pMRU47ICovCiAgICAgICAgaW50IG1heF9wa3Rfc2l6ZTsgICAgLyogPSBFVEhfWkxFTjsgKi8KICAgICAgICBpbnQgbmZyYWdzOwogICAgICAgIF9fdTMyIGRlbGF5X3VzOyAgICAvKiBEZWZhdWx0IGRlbGF5ICovCiAgICAgICAgX191MzIgZGVsYXlfbnM7CiAgICAgICAgX191NjQgY291bnQ7ICAvKiBEZWZhdWx0IE5vIHBhY2tldHMgdG8gc2VuZCAqLwogICAgICAgIF9fdTY0IHNvZmFyOyAgLyogSG93IG1hbnkgcGt0cyB3ZSd2ZSBzZW50IHNvIGZhciAqLwogICAgICAgIF9fdTY0IHR4X2J5dGVzOyAvKiBIb3cgbWFueSBieXRlcyB3ZSd2ZSB0cmFuc21pdHRlZCAqLwogICAgICAgIF9fdTY0IGVycm9yczsgICAgLyogRXJyb3JzIHdoZW4gdHJ5aW5nIHRvIHRyYW5zbWl0LCBwa3RzIHdpbGwgYmUgcmUtc2VudCAqLwoKICAgICAgICAvKiBydW50aW1lIGNvdW50ZXJzIHJlbGF0aW5nIHRvIGNsb25lX3NrYiAqLwogICAgICAgIF9fdTY0IG5leHRfdHhfdXM7ICAgICAgICAgIC8qIHRpbWVzdGFtcCBvZiB3aGVuIHRvIHR4IG5leHQgKi8KICAgICAgICBfX3UzMiBuZXh0X3R4X25zOwogICAgICAgIAogICAgICAgIF9fdTY0IGFsbG9jYXRlZF9za2JzOwogICAgICAgIF9fdTMyIGNsb25lX2NvdW50OwoJaW50IGxhc3Rfb2s7ICAgICAgICAgICAvKiBXYXMgbGFzdCBza2Igc2VudD8gCgkgICAgICAgICAgICAgICAgICAgICAgICAqIE9yIGEgZmFpbGVkIHRyYW5zbWl0IG9mIHNvbWUgc29ydD8gIFRoaXMgd2lsbCBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXF1ZW5jZSBudW1iZXJzIGluIG9yZGVyLCBmb3IgZXhhbXBsZS4KCQkJCSovCiAgICAgICAgX191NjQgc3RhcnRlZF9hdDsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTY0IHN0b3BwZWRfYXQ7IC8qIG1pY3JvLXNlY29uZHMgKi8KICAgICAgICBfX3U2NCBpZGxlX2FjYzsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTMyIHNlcV9udW07CiAgICAgICAgCiAgICAgICAgaW50IGNsb25lX3NrYjsgLyogVXNlIG11bHRpcGxlIFNLQnMgZHVyaW5nIHBhY2tldCBnZW4uICBJZiB0aGlzIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhhdCBtYW55IGNvcHBpZXMgb2YgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldCB3aWxsIGJlIHNlbnQgYmVmb3JlIGEgbmV3IHBhY2tldCBpcyBhbGxvY2F0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSB3YW50IHRvIHNlbmQgMTAyNCBpZGVudGljYWwgcGFja2V0cwogICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIGNyZWF0aW5nIGEgbmV3IHBhY2tldCwgc2V0IGNsb25lX3NrYiB0byAxMDI0LgogICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgCiAgICAgICAgY2hhciBkc3RfbWluW0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwogICAgICAgIGNoYXIgZHN0X21heFtJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KICAgICAgICBjaGFyIHNyY19taW5bSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCiAgICAgICAgY2hhciBzcmNfbWF4W0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwoKCXN0cnVjdCBpbjZfYWRkciAgaW42X3NhZGRyOwoJc3RydWN0IGluNl9hZGRyICBpbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIGN1cl9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIGN1cl9pbjZfc2FkZHI7CgkvKiBGb3IgcmFuZ2VzICovCglzdHJ1Y3QgaW42X2FkZHIgIG1pbl9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1heF9pbjZfZGFkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1pbl9pbjZfc2FkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIG1heF9pbjZfc2FkZHI7CgogICAgICAgIC8qIElmIHdlJ3JlIGRvaW5nIHJhbmdlcywgcmFuZG9tIG9yIGluY3JlbWVudGFsLCB0aGVuIHRoaXMKICAgICAgICAgKiBkZWZpbmVzIHRoZSBtaW4vbWF4IGZvciB0aG9zZSByYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgX191MzIgc2FkZHJfbWluOyAvKiBpbmNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCiAgICAgICAgX191MzIgc2FkZHJfbWF4OyAvKiBleGNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCiAgICAgICAgX191MzIgZGFkZHJfbWluOyAvKiBpbmNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLwogICAgICAgIF9fdTMyIGRhZGRyX21heDsgLyogZXhjbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KCiAgICAgICAgX191MTYgdWRwX3NyY19taW47IC8qIGluY2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCiAgICAgICAgX191MTYgdWRwX3NyY19tYXg7IC8qIGV4Y2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCiAgICAgICAgX191MTYgdWRwX2RzdF9taW47IC8qIGluY2x1c2l2ZSwgZGVzdCBVRFAgcG9ydCAqLwogICAgICAgIF9fdTE2IHVkcF9kc3RfbWF4OyAvKiBleGNsdXNpdmUsIGRlc3QgVURQIHBvcnQgKi8KCiAgICAgICAgX191MzIgc3JjX21hY19jb3VudDsgLyogSG93IG1hbnkgTUFDcyB0byBpdGVyYXRlIHRocm91Z2ggKi8KICAgICAgICBfX3UzMiBkc3RfbWFjX2NvdW50OyAvKiBIb3cgbWFueSBNQUNzIHRvIGl0ZXJhdGUgdGhyb3VnaCAqLwogICAgICAgIAogICAgICAgIHVuc2lnbmVkIGNoYXIgZHN0X21hY1s2XTsKICAgICAgICB1bnNpZ25lZCBjaGFyIHNyY19tYWNbNl07CiAgICAgICAgCiAgICAgICAgX191MzIgY3VyX2RzdF9tYWNfb2Zmc2V0OwogICAgICAgIF9fdTMyIGN1cl9zcmNfbWFjX29mZnNldDsKICAgICAgICBfX3UzMiBjdXJfc2FkZHI7CiAgICAgICAgX191MzIgY3VyX2RhZGRyOwogICAgICAgIF9fdTE2IGN1cl91ZHBfZHN0OwogICAgICAgIF9fdTE2IGN1cl91ZHBfc3JjOwogICAgICAgIF9fdTMyIGN1cl9wa3Rfc2l6ZTsKICAgICAgICAKICAgICAgICBfX3U4IGhoWzE0XTsKICAgICAgICAvKiA9IHsgCiAgICAgICAgICAgMHgwMCwgMHg4MCwgMHhDOCwgMHg3OSwgMHhCMywgMHhDQiwgCiAgICAgICAgICAgCiAgICAgICAgICAgV2UgZmlsbCBpbiBTUkMgYWRkcmVzcyBsYXRlcgogICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAgICAgMHgwOCwgMHgwMAogICAgICAgICAgIH07CiAgICAgICAgKi8KICAgICAgICBfX3UxNiBwYWQ7IC8qIHBhZCBvdXQgdGhlIGhoIHN0cnVjdCB0byBhbiBldmVuIDE2IGJ5dGVzICovCgogICAgICAgIHN0cnVjdCBza19idWZmKiBza2I7IC8qIHNrYiB3ZSBhcmUgdG8gdHJhbnNtaXQgbmV4dCwgbWFpbmx5IHVzZWQgZm9yIHdoZW4gd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgdHJhbnNtaXR0aW5nIHRoZSBzYW1lIG9uZSBtdWx0aXBsZSB0aW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBvZGV2OyAvKiBUaGUgb3V0LWdvaW5nIGRldmljZS4gIE5vdGUgdGhhdCB0aGUgZGV2aWNlIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIGl0J3MgcGdfaW5mbyBwb2ludGVyIHBvaW50aW5nIGJhY2sgdG8gdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXZpY2UuICBUaGlzIHdpbGwgYmUgc2V0IHdoZW4gdGhlIHVzZXIgc3BlY2lmaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBvdXQtZ29pbmcgZGV2aWNlIG5hbWUgKG5vdCB3aGVuIHRoZSBpbmplY3QgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnRlZCBhcyBpdCB1c2VkIHRvIGRvLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglzdHJ1Y3QgZmxvd19zdGF0ZSAqZmxvd3M7Cgl1bnNpZ25lZCBjZmxvd3M7ICAgICAgICAgLyogQ29uY3VycmVudCBmbG93cyAoY29uZmlnKSAqLwoJdW5zaWduZWQgbGZsb3c7ICAgICAgICAgIC8qIEZsb3cgbGVuZ3RoICAoY29uZmlnKSAqLwoJdW5zaWduZWQgbmZsb3dzOyAgICAgICAgIC8qIGFjY3VtdWxhdGVkIGZsb3dzIChzdGF0cykgKi8KfTsKCnN0cnVjdCBwa3RnZW5faGRyIHsKICAgICAgICBfX3UzMiBwZ2hfbWFnaWM7CiAgICAgICAgX191MzIgc2VxX251bTsKCV9fdTMyIHR2X3NlYzsKCV9fdTMyIHR2X3VzZWM7Cn07CgpzdHJ1Y3QgcGt0Z2VuX3RocmVhZCB7CiAgICAgICAgc3BpbmxvY2tfdCBpZl9sb2NrOwogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICppZl9saXN0OyAgICAgICAgICAgLyogQWxsIGRldmljZSBoZXJlICovCiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQqIG5leHQ7CiAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICBjaGFyIGZuYW1lWzEyOF07IC8qIG5hbWUgb2YgcHJvYyBmaWxlICovCiAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudDsKICAgICAgICBjaGFyIHJlc3VsdFs1MTJdOwogICAgICAgIHUzMiBtYXhfYmVmb3JlX3NvZnRpcnE7IC8qIFdlJ2xsIGNhbGwgZG9fc29mdGlycSB0byBwcmV2ZW50IHN0YXJ2YXRpb24uICovCiAgICAgICAgCgkvKiBGaWVsZCBmb3IgdGhyZWFkIHRvIHJlY2VpdmUgInBvc3RlZCIgZXZlbnRzIHRlcm1pbmF0ZSwgc3RvcCBpZnMgZXRjLiovCgogICAgICAgIHUzMiBjb250cm9sOwoJaW50IHBpZDsKCWludCBjcHU7CgogICAgICAgIHdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwp9OwoKI2RlZmluZSBSRU1PVkUgMQojZGVmaW5lIEZJTkQgICAwCgovKiAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCB0aGUgZmFjdCB0aGF0IGRvX2RpdiBjYW5ub3QgaGFuZGxlIHR3byA2NC1iaXQKICAgIG51bWJlcnMsIGFuZCByZWd1bGFyIDY0LWJpdCBkaXZpc2lvbiBkb2Vzbid0IHdvcmsgb24geDg2IGtlcm5lbHMuCiAgICAtLUJlbgoqLwoKI2RlZmluZSBQR19ESVYgMAoKLyogVGhpcyB3YXMgZW1haWxlZCB0byBMTUtMIGJ5OiBDaHJpcyBDYXB1dG8gPGNjYXB1dG9AYWx0Lm5ldD4KICogRnVuY3Rpb24gY29waWVkL2FkYXB0ZWQvb3B0aW1pemVkIGZyb206CiAqCiAqICBuZW1lc2lzLnNvdXJjZWZvcmdlLm5ldC9icm93c2UvbGliL3N0YXRpYy9pbnRtYXRoL2l4ODYvaW50bWF0aC5jLmh0bWwKICoKICogQ29weXJpZ2h0IDE5OTQsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIENvbXB1dGVyIExhYm9yYXRvcnkKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICovCnN0YXRpYyBpbmxpbmUgczY0IGRpdnJlbWRpMyhzNjQgeCwgczY0IHksIGludCB0eXBlKQp7CiAgICAgICAgdTY0IGEgPSAoeCA8IDApID8gLXggOiB4OwogICAgICAgIHU2NCBiID0gKHkgPCAwKSA/IC15IDogeTsKICAgICAgICB1NjQgcmVzID0gMCwgZCA9IDE7CgogICAgICAgIGlmIChiID4gMCkgewogICAgICAgICAgICAgICAgd2hpbGUgKGIgPCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPDw9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPDw9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGlmICggYSA+PSBiICkgewogICAgICAgICAgICAgICAgICAgICAgICBhIC09IGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYiA+Pj0gMTsKICAgICAgICAgICAgICAgIGQgPj49IDE7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChkKTsKCiAgICAgICAgaWYgKFBHX0RJViA9PSB0eXBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCgoeCBeIHkpICYgKDFsbDw8NjMpKSA9PSAwKSA/IHJlcyA6IC0oczY0KXJlczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCh4ICYgKDFsbDw8NjMpKSA9PSAwKSA/IGEgOiAtKHM2NClhOwogICAgICAgIH0KfQoKLyogRW5kIG9mIGhhY2tzIHRvIGRlYWwgd2l0aCA2NC1iaXQgbWF0aCBvbiB4ODYgKi8KCi8qKiBDb252ZXJ0IHRvIG1pbGlzZWNvbmRzICovCnN0YXRpYyBpbmxpbmUgX191NjQgdHZfdG9fbXMoY29uc3Qgc3RydWN0IHRpbWV2YWwqIHR2KSAKewogICAgICAgIF9fdTY0IG1zID0gdHYtPnR2X3VzZWMgLyAxMDAwOwogICAgICAgIG1zICs9IChfX3U2NCl0di0+dHZfc2VjICogKF9fdTY0KTEwMDA7CiAgICAgICAgcmV0dXJuIG1zOwp9CgoKLyoqIENvbnZlcnQgdG8gbWljcm8tc2Vjb25kcyAqLwpzdGF0aWMgaW5saW5lIF9fdTY0IHR2X3RvX3VzKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0dikgCnsKICAgICAgICBfX3U2NCB1cyA9IHR2LT50dl91c2VjOwogICAgICAgIHVzICs9IChfX3U2NCl0di0+dHZfc2VjICogKF9fdTY0KTEwMDAwMDA7CiAgICAgICAgcmV0dXJuIHVzOwp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IHBnX2RpdihfX3U2NCBuLCBfX3UzMiBiYXNlKSB7CiAgICAgICAgX191NjQgdG1wID0gbjsKICAgICAgICBkb19kaXYodG1wLCBiYXNlKTsKICAgICAgICAvKiBwcmludGsoInBrdGdlbjogcGdfZGl2LCBuOiAlbGx1ICBiYXNlOiAlZCAgcnY6ICVsbHVcbiIsCiAgICAgICAgICAgICAgICAgIG4sIGJhc2UsIHRtcCk7ICovCiAgICAgICAgcmV0dXJuIHRtcDsKfQoKc3RhdGljIGlubGluZSBfX3U2NCBwZ19kaXY2NChfX3U2NCBuLCBfX3U2NCBiYXNlKSAKewogICAgICAgIF9fdTY0IHRtcCA9IG47Ci8qCiAqIEhvdyBkbyB3ZSBrbm93IGlmIHRoZSBhcmNoaXRlY3RydXJlIHdlIGFyZSBydW5uaW5nIG9uCiAqIHN1cHBvcnRzIGRpdmlzaW9uIHdpdGggNjQgYml0IGJhc2U/CiAqIAogKi8KI2lmIGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19pYTY0X18pIAoKCQlkb19kaXYodG1wLCBiYXNlKTsKI2Vsc2UKCQl0bXAgPSBkaXZyZW1kaTMobiwgYmFzZSwgUEdfRElWKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuIHRtcDsKfQoKc3RhdGljIGlubGluZSB1MzIgcGt0Z2VuX3JhbmRvbSh2b2lkKQp7CiNpZiAwCglfX3UzMiBuOwoJZ2V0X3JhbmRvbV9ieXRlcygmbiwgNCk7CglyZXR1cm4gbjsKI2Vsc2UKCXJldHVybiBuZXRfcmFuZG9tKCk7CiNlbmRpZgp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IGdldEN1ck1zKHZvaWQpIAp7CiAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICAgICAgcmV0dXJuIHR2X3RvX21zKCZ0dik7Cn0KCnN0YXRpYyBpbmxpbmUgX191NjQgZ2V0Q3VyVXModm9pZCkgCnsKICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKICAgICAgICByZXR1cm4gdHZfdG9fdXMoJnR2KTsKfQoKc3RhdGljIGlubGluZSBfX3U2NCB0dl9kaWZmKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCogYikgCnsKICAgICAgICByZXR1cm4gdHZfdG9fdXMoYSkgLSB0dl90b191cyhiKTsKfQoKCi8qIG9sZCBpbmNsdWRlIGVuZCAqLwoKc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBWRVJTSU9OOwoKc3RhdGljIHNzaXplX3QgcHJvY19wZ2N0cmxfcmVhZChzdHJ1Y3QgZmlsZSogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKc3RhdGljIHNzaXplX3QgcHJvY19wZ2N0cmxfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CnN0YXRpYyBpbnQgcHJvY19pZl9yZWFkKGNoYXIgKmJ1ZiAsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CgpzdGF0aWMgaW50IHByb2NfdGhyZWFkX3JlYWQoY2hhciAqYnVmICwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBwcm9jX2lmX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwpzdGF0aWMgaW50IHByb2NfdGhyZWFkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwpzdGF0aWMgaW50IGNyZWF0ZV9wcm9jX2Rpcih2b2lkKTsKc3RhdGljIGludCByZW1vdmVfcHJvY19kaXIodm9pZCk7CgpzdGF0aWMgaW50IHBrdGdlbl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqaSk7CnN0YXRpYyBpbnQgcGt0Z2VuX2FkZF9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQqIHQsIGNvbnN0IGNoYXIqIGlmbmFtZSk7CnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogcGt0Z2VuX2ZpbmRfdGhyZWFkKGNvbnN0IGNoYXIqIG5hbWUpOwpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9maW5kX2RldihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCwgY29uc3QgY2hhciogaWZuYW1lKTsKc3RhdGljIGludCBwa3RnZW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwpzdGF0aWMgdm9pZCBwa3RnZW5fcnVuX2FsbF90aHJlYWRzKHZvaWQpOwpzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnModm9pZCk7CnN0YXRpYyBpbnQgcGt0Z2VuX3N0b3BfZGV2aWNlKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KTsKc3RhdGljIHZvaWQgcGt0Z2VuX3N0b3Aoc3RydWN0IHBrdGdlbl90aHJlYWQqIHQpOwpzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpOwpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9OTl90aHJlYWRzKGNvbnN0IGNoYXIqIGRldl9uYW1lLCBpbnQgcmVtb3ZlKTsKc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2lwNihjb25zdCBjaGFyICpzLGNoYXIgaXBbMTZdKTsKc3RhdGljIHVuc2lnbmVkIGludCBmbXRfaXA2KGNoYXIgKnMsY29uc3QgY2hhciBpcFsxNl0pOwoKLyogTW9kdWxlIHBhcmFtZXRlcnMsIGRlZmF1bHRzLiAqLwpzdGF0aWMgaW50IHBnX2NvdW50X2QgPSAxMDAwOyAvKiAxMDAwIHBrdHMgYnkgZGVmYXVsdCAqLwpzdGF0aWMgaW50IHBnX2RlbGF5X2QgPSAwOwpzdGF0aWMgaW50IHBnX2Nsb25lX3NrYl9kID0gMDsKc3RhdGljIGludCBkZWJ1ZyA9IDA7CgpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF90aHJlYWRfbG9jayk7CnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGt0Z2VuX3RocmVhZHMgPSBOVUxMOwoKc3RhdGljIGNoYXIgbW9kdWxlX2ZuYW1lWzEyOF07CnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKm1vZHVsZV9wcm9jX2VudCA9IE5VTEw7CgpzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBrdGdlbl9ub3RpZmllcl9ibG9jayA9IHsKCS5ub3RpZmllcl9jYWxsID0gcGt0Z2VuX2RldmljZV9ldmVudCwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBrdGdlbl9mb3BzID0gewogICAgICAgIC5yZWFkICAgICA9IHByb2NfcGdjdHJsX3JlYWQsCiAgICAgICAgLndyaXRlICAgID0gcHJvY19wZ2N0cmxfd3JpdGUsCgkvKiAgLmlvY3RsICAgID0gcGt0Z2VuX2lvY3RsLCBsYXRlciBtYXliZSAqLwp9OwoKLyoKICogL3Byb2MgaGFuZGxpbmcgZnVuY3Rpb25zIAogKgogKi8KCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBnX3Byb2NfZGlyID0gTlVMTDsKc3RhdGljIGludCBwcm9jX3BnY3RybF9yZWFkX2VvZj0wOwoKc3RhdGljIHNzaXplX3QgcHJvY19wZ2N0cmxfcmVhZChzdHJ1Y3QgZmlsZSogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7IAoJY2hhciBkYXRhWzIwMF07CglpbnQgbGVuID0gMDsKCglpZihwcm9jX3BnY3RybF9yZWFkX2VvZikgewoJCXByb2NfcGdjdHJsX3JlYWRfZW9mPTA7CgkJbGVuID0gMDsKCQlnb3RvIG91dDsKCX0KCglzcHJpbnRmKGRhdGEsICIlcyIsIFZFUlNJT04pOyAKCglsZW4gPSBzdHJsZW4oZGF0YSk7CgoJaWYobGVuID4gY291bnQpIHsKCQlsZW4gPS1FRkFVTFQ7CgkJZ290byBvdXQ7Cgl9ICAJCgoJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIGxlbikpIHsKCQlsZW4gPS1FRkFVTFQ7CgkJZ290byBvdXQ7Cgl9ICAKCgkqcHBvcyArPSBsZW47Cglwcm9jX3BnY3RybF9yZWFkX2VvZj0xOyAvKiBFT0YgbmV4dCBjYWxsICovCgogb3V0OgoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIHNzaXplX3QgcHJvY19wZ2N0cmxfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCgkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCnsKCWNoYXIgKmRhdGEgPSBOVUxMOwoJaW50IGVyciA9IDA7CgogICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSl7CiAgICAgICAgICAgICAgICBlcnIgPSAtRVBFUk07CgkJZ290byBvdXQ7CiAgICAgICAgfQoKCWRhdGEgPSAodm9pZCopdm1hbGxvYyAoKHVuc2lnbmVkIGludCljb3VudCk7CgoJaWYoIWRhdGEpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gb3V0OwoJfQoJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgY291bnQpKSB7CgkJZXJyID0tRUZBVUxUOwoJCWdvdG8gb3V0X2ZyZWU7Cgl9ICAKCWRhdGFbY291bnQtMV0gPSAwOyAvKiBNYWtlIHN0cmluZyAqLwoKCWlmICghc3RyY21wKGRhdGEsICJzdG9wIikpIAoJCXBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcygpOwoKICAgICAgICBlbHNlIGlmICghc3RyY21wKGRhdGEsICJzdGFydCIpKSAKCQlwa3RnZW5fcnVuX2FsbF90aHJlYWRzKCk7CgoJZWxzZSAKCQlwcmludGsoInBrdGdlbjogVW5rbm93biBjb21tYW5kOiAlc1xuIiwgZGF0YSk7CgoJZXJyID0gY291bnQ7Cgogb3V0X2ZyZWU6Cgl2ZnJlZSAoZGF0YSk7CiBvdXQ6CiAgICAgICAgcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBwcm9jX2lmX3JlYWQoY2hhciAqYnVmICwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQp7CgljaGFyICpwOwoJaW50IGk7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSAoc3RydWN0IHBrdGdlbl9kZXYqKShkYXRhKTsKICAgICAgICBfX3U2NCBzYTsKICAgICAgICBfX3U2NCBzdG9wcGVkOwogICAgICAgIF9fdTY0IG5vdyA9IGdldEN1clVzKCk7CiAgICAgICAgCglwID0gYnVmOwoJcCArPSBzcHJpbnRmKHAsICJQYXJhbXM6IGNvdW50ICVsbHUgIG1pbl9wa3Rfc2l6ZTogJXUgIG1heF9wa3Rfc2l6ZTogJXVcbiIsCgkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5jb3VudCwKCQkgICAgIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSwgcGt0X2Rldi0+bWF4X3BrdF9zaXplKTsKCglwICs9IHNwcmludGYocCwgIiAgICAgZnJhZ3M6ICVkICBkZWxheTogJXUgIGNsb25lX3NrYjogJWQgIGlmbmFtZTogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm5mcmFncywgMTAwMCpwa3RfZGV2LT5kZWxheV91cytwa3RfZGV2LT5kZWxheV9ucywgcGt0X2Rldi0+Y2xvbmVfc2tiLCBwa3RfZGV2LT5pZm5hbWUpOwoKCXAgKz0gc3ByaW50ZihwLCAiICAgICBmbG93czogJXUgZmxvd2xlbjogJXVcbiIsIHBrdF9kZXYtPmNmbG93cywgcGt0X2Rldi0+bGZsb3cpOwoKCglpZihwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikgewoJCWNoYXIgYjFbMTI4XSwgYjJbMTI4XSwgYjNbMTI4XTsKCQlmbXRfaXA2KGIxLCAgcGt0X2Rldi0+aW42X3NhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYjIsICBwa3RfZGV2LT5taW5faW42X3NhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYjMsICBwa3RfZGV2LT5tYXhfaW42X3NhZGRyLnM2X2FkZHIpOwoJCXAgKz0gc3ByaW50ZihwLCAiICAgICBzYWRkcjogJXMgIG1pbl9zYWRkcjogJXMgIG1heF9zYWRkcjogJXNcbiIsIGIxLCBiMiwgYjMpOwoKCQlmbXRfaXA2KGIxLCAgcGt0X2Rldi0+aW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYjIsICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYjMsICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIpOwoJCXAgKz0gc3ByaW50ZihwLCAiICAgICBkYWRkcjogJXMgIG1pbl9kYWRkcjogJXMgIG1heF9kYWRkcjogJXNcbiIsIGIxLCBiMiwgYjMpOwoKCX0gCgllbHNlIAoJCXAgKz0gc3ByaW50ZihwLCAiICAgICBkc3RfbWluOiAlcyAgZHN0X21heDogJXNcbiAgICAgc3JjX21pbjogJXMgIHNyY19tYXg6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kc3RfbWluLCBwa3RfZGV2LT5kc3RfbWF4LCBwa3RfZGV2LT5zcmNfbWluLCBwa3RfZGV2LT5zcmNfbWF4KTsKCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICIgICAgIHNyY19tYWM6ICIpOwoKCWlmICgocGt0X2Rldi0+c3JjX21hY1swXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1syXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1szXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s1XSA9PSAwKSkgCgoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAoJCQlwICs9IHNwcmludGYocCwgIiUwMlglcyIsIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAiICAiIDogIjoiKTsKCgllbHNlIAoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAoJCQlwICs9IHNwcmludGYocCwgIiUwMlglcyIsIHBrdF9kZXYtPnNyY19tYWNbaV0sIGkgPT0gNSA/ICIgICIgOiAiOiIpOwoKICAgICAgICBwICs9IHNwcmludGYocCwgImRzdF9tYWM6ICIpOwoJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCgkJcCArPSBzcHJpbnRmKHAsICIlMDJYJXMiLCBwa3RfZGV2LT5kc3RfbWFjW2ldLCBpID09IDUgPyAiXG4iIDogIjoiKTsKCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICIgICAgIHVkcF9zcmNfbWluOiAlZCAgdWRwX3NyY19tYXg6ICVkICB1ZHBfZHN0X21pbjogJWQgIHVkcF9kc3RfbWF4OiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX3NyY19taW4sIHBrdF9kZXYtPnVkcF9zcmNfbWF4LCBwa3RfZGV2LT51ZHBfZHN0X21pbiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXgpOwoKICAgICAgICBwICs9IHNwcmludGYocCwgIiAgICAgc3JjX21hY19jb3VudDogJWQgIGRzdF9tYWNfY291bnQ6ICVkIFxuICAgICBGbGFnczogIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c3JjX21hY19jb3VudCwgcGt0X2Rldi0+ZHN0X21hY19jb3VudCk7CgoKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiAgRl9JUFY2KSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiSVBWNiAgIik7CgogICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmICBGX0lQU1JDX1JORCkgCiAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIklQU1JDX1JORCAgIik7CgogICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKSAKICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiSVBEU1RfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJUWFNJWkVfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUFNSQ19STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJVRFBTUkNfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUERTVF9STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJVRFBEU1RfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ1NSQ19STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJNQUNTUkNfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ0RTVF9STkQpIAogICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJNQUNEU1RfUk5EICAiKTsKCiAgICAgICAgCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICJcbiIpOwogICAgICAgIAogICAgICAgIHNhID0gcGt0X2Rldi0+c3RhcnRlZF9hdDsKICAgICAgICBzdG9wcGVkID0gcGt0X2Rldi0+c3RvcHBlZF9hdDsKICAgICAgICBpZiAocGt0X2Rldi0+cnVubmluZykgCiAgICAgICAgICAgICAgICBzdG9wcGVkID0gbm93OyAvKiBub3QgcmVhbGx5IHN0b3BwZWQsIG1vcmUgbGlrZSBsYXN0LXJ1bm5pbmctYXQgKi8KICAgICAgICAKICAgICAgICBwICs9IHNwcmludGYocCwgIkN1cnJlbnQ6XG4gICAgIHBrdHMtc29mYXI6ICVsbHUgIGVycm9yczogJWxsdVxuICAgICBzdGFydGVkOiAlbGx1dXMgIHN0b3BwZWQ6ICVsbHV1cyBpZGxlOiAlbGx1dXNcbiIsCgkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5zb2ZhciwKCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPmVycm9ycywKCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhLAoJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RvcHBlZCwgCgkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5pZGxlX2FjYyk7CgogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICBzZXFfbnVtOiAlZCAgY3VyX2RzdF9tYWNfb2Zmc2V0OiAlZCAgY3VyX3NyY19tYWNfb2Zmc2V0OiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c2VxX251bSwgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0LCBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQpOwoKCWlmKHBrdF9kZXYtPmZsYWdzICYgRl9JUFY2KSB7CgkJY2hhciBiMVsxMjhdLCBiMlsxMjhdOwoJCWZtdF9pcDYoYjEsICBwa3RfZGV2LT5jdXJfaW42X2RhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYjIsICBwa3RfZGV2LT5jdXJfaW42X3NhZGRyLnM2X2FkZHIpOwoJCXAgKz0gc3ByaW50ZihwLCAiICAgICBjdXJfc2FkZHI6ICVzICBjdXJfZGFkZHI6ICVzXG4iLCBiMiwgYjEpOwoJfSAKCWVsc2UgCgkJcCArPSBzcHJpbnRmKHAsICIgICAgIGN1cl9zYWRkcjogMHgleCAgY3VyX2RhZGRyOiAweCV4XG4iLAogICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIsIHBrdF9kZXYtPmN1cl9kYWRkcik7CgoKCXAgKz0gc3ByaW50ZihwLCAiICAgICBjdXJfdWRwX2RzdDogJWQgIGN1cl91ZHBfc3JjOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QsIHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKCglwICs9IHNwcmludGYocCwgIiAgICAgZmxvd3M6ICV1XG4iLCBwa3RfZGV2LT5uZmxvd3MpOwoKCWlmIChwa3RfZGV2LT5yZXN1bHRbMF0pCgkJcCArPSBzcHJpbnRmKHAsICJSZXN1bHQ6ICVzXG4iLCBwa3RfZGV2LT5yZXN1bHQpOwoJZWxzZQoJCXAgKz0gc3ByaW50ZihwLCAiUmVzdWx0OiBJZGxlXG4iKTsKCSplb2YgPSAxOwoKCXJldHVybiBwIC0gYnVmOwp9CgoKc3RhdGljIGludCBjb3VudF90cmFpbF9jaGFycyhjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHVuc2lnbmVkIGludCBtYXhsZW4pCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBtYXhsZW47IGkrKykgewogICAgICAgICAgICAgICAgY2hhciBjOwogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGMsICZ1c2VyX2J1ZmZlcltpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CgkJY2FzZSAnXCInOgoJCWNhc2UgJ1xuJzoKCQljYXNlICdccic6CgkJY2FzZSAnXHQnOgoJCWNhc2UgJyAnOgoJCWNhc2UgJz0nOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlnb3RvIGRvbmU7CgkJfTsKCX0KZG9uZToKCXJldHVybiBpOwp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBudW1fYXJnKGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhsZW4sIAoJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm51bSkKewoJaW50IGkgPSAwOwoJKm51bSA9IDA7CiAgCglmb3IoOyBpIDwgbWF4bGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGNoYXIgYzsKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcihjLCAmdXNlcl9idWZmZXJbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKCQkJKm51bSAqPSAxMDsKCQkJKm51bSArPSBjIC0nMCc7CgkJfSBlbHNlCgkJCWJyZWFrOwoJfQoJcmV0dXJuIGk7Cn0KCnN0YXRpYyBpbnQgc3Rybl9sZW4oY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQp7CglpbnQgaSA9IDA7CgoJZm9yKDsgaSA8IG1heGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjaGFyIGM7CiAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKCQljYXNlICdcIic6CgkJY2FzZSAnXG4nOgoJCWNhc2UgJ1xyJzoKCQljYXNlICdcdCc6CgkJY2FzZSAnICc6CgkJCWdvdG8gZG9uZV9zdHI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX07Cgl9CmRvbmVfc3RyOgoKCXJldHVybiBpOwp9CgpzdGF0aWMgaW50IHByb2NfaWZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCWludCBpID0gMCwgbWF4LCBsZW47CgljaGFyIG5hbWVbMTZdLCB2YWxzdHJbMzJdOwoJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSAoc3RydWN0IHBrdGdlbl9kZXYqKShkYXRhKTsKICAgICAgICBjaGFyKiBwZ19yZXN1bHQgPSBOVUxMOwogICAgICAgIGludCB0bXAgPSAwOwoJY2hhciBidWZbMTI4XTsKICAgICAgICAKICAgICAgICBwZ19yZXN1bHQgPSAmKHBrdF9kZXYtPnJlc3VsdFswXSk7CiAgICAgICAgCglpZiAoY291bnQgPCAxKSB7CgkJcHJpbnRrKCJwa3RnZW46IHdyb25nIGNvbW1hbmQgZm9ybWF0XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KICAKCW1heCA9IGNvdW50IC0gaTsKCXRtcCA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAodG1wIDwgMCkgeyAKCQlwcmludGsoInBrdGdlbjogaWxsZWdhbCBmb3JtYXRcbiIpOwoJCXJldHVybiB0bXA7IAoJfQogICAgICAgIGkgKz0gdG1wOwogICAgICAgIAoJLyogUmVhZCB2YXJpYWJsZSBuYW1lICovCgoJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YobmFtZSkgLSAxKTsKICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKCWlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCAmdXNlcl9idWZmZXJbaV0sIGxlbikgKQoJCXJldHVybiAtRUZBVUxUOwoJaSArPSBsZW47CiAgCgltYXggPSBjb3VudCAtaTsKCWxlbiA9IGNvdW50X3RyYWlsX2NoYXJzKCZ1c2VyX2J1ZmZlcltpXSwgbWF4KTsKICAgICAgICBpZiAobGVuIDwgMCkgCiAgICAgICAgICAgICAgICByZXR1cm4gbGVuOwogICAgICAgIAoJaSArPSBsZW47CgoJaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICBjaGFyIHRiW2NvdW50ICsgMV07CiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIodGIsIHVzZXJfYnVmZmVyLCBjb3VudCkpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgdGJbY291bnRdID0gMDsKCQlwcmludGsoInBrdGdlbjogJXMsJWx1ICBidWZmZXIgLTolczotXG4iLCBuYW1lLCBjb3VudCwgdGIpOwogICAgICAgIH0KCglpZiAoIXN0cmNtcChuYW1lLCAibWluX3BrdF9zaXplIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHZhbHVlIDwgMTQrMjArOCkKCQkJdmFsdWUgPSAxNCsyMCs4OwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5taW5fcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogbWluX3BrdF9zaXplPSV1IiwgcGt0X2Rldi0+bWluX3BrdF9zaXplKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJtYXhfcGt0X3NpemUiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAodmFsdWUgPCAxNCsyMCs4KQoJCQl2YWx1ZSA9IDE0KzIwKzg7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+bWF4X3BrdF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtYXhfcGt0X3NpemU9JXUiLCBwa3RfZGV2LT5tYXhfcGt0X3NpemUpOwoJCXJldHVybiBjb3VudDsKCX0KCiAgICAgICAgLyogU2hvcnRjdXQgZm9yIG1pbiA9IG1heCAqLwoKCWlmICghc3RyY21wKG5hbWUsICJwa3Rfc2l6ZSIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmICh2YWx1ZSA8IDE0KzIwKzgpCgkJCXZhbHVlID0gMTQrMjArODsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT5taW5fcGt0X3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWluX3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBwa3Rfc2l6ZT0ldSIsIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CgkJcmV0dXJuIGNvdW50OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiZGVidWciKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGRlYnVnID0gdmFsdWU7CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZGVidWc9JXUiLCBkZWJ1Zyk7CgkJcmV0dXJuIGNvdW50OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiZnJhZ3MiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlwa3RfZGV2LT5uZnJhZ3MgPSB2YWx1ZTsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBmcmFncz0ldSIsIHBrdF9kZXYtPm5mcmFncyk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRlbGF5IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHZhbHVlID09IDB4N0ZGRkZGRkYpIHsKCQkJcGt0X2Rldi0+ZGVsYXlfdXMgPSAweDdGRkZGRkZGOwoJCQlwa3RfZGV2LT5kZWxheV9ucyA9IDA7CgkJfSBlbHNlIHsKCQkJcGt0X2Rldi0+ZGVsYXlfdXMgPSB2YWx1ZSAvIDEwMDA7CgkJCXBrdF9kZXYtPmRlbGF5X25zID0gdmFsdWUgJSAxMDAwOwoJCX0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkZWxheT0ldSIsIDEwMDAqcGt0X2Rldi0+ZGVsYXlfdXMrcGt0X2Rldi0+ZGVsYXlfbnMpOwoJCXJldHVybiBjb3VudDsKCX0KIAlpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyY19taW4iKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT51ZHBfc3JjX21pbikgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSAgICAgICAKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfc3JjX21pbj0ldSIsIHBrdF9kZXYtPnVkcF9zcmNfbWluKTsKCQlyZXR1cm4gY291bnQ7Cgl9CiAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9kc3RfbWluIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+dWRwX2RzdF9taW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9taW4gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfZHN0X21pbj0ldSIsIHBrdF9kZXYtPnVkcF9kc3RfbWluKTsKCQlyZXR1cm4gY291bnQ7Cgl9CiAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9zcmNfbWF4IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+dWRwX3NyY19tYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX3NyY19tYXggPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfc3JjX21heD0ldSIsIHBrdF9kZXYtPnVkcF9zcmNfbWF4KTsKCQlyZXR1cm4gY291bnQ7Cgl9CiAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9kc3RfbWF4IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+dWRwX2RzdF9tYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXggPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfZHN0X21heD0ldSIsIHBrdF9kZXYtPnVkcF9kc3RfbWF4KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiY2xvbmVfc2tiIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jbG9uZV9za2IgPSB2YWx1ZTsKCQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGNsb25lX3NrYj0lZCIsIHBrdF9kZXYtPmNsb25lX3NrYik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImNvdW50IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJcGt0X2Rldi0+Y291bnQgPSB2YWx1ZTsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBjb3VudD0lbGx1IiwKCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+Y291bnQpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWFjX2NvdW50IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHBrdF9kZXYtPnNyY19tYWNfY291bnQgIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c3JjX21hY19jb3VudCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHNyY19tYWNfY291bnQ9JWQiLCBwa3RfZGV2LT5zcmNfbWFjX2NvdW50KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0X21hY19jb3VudCIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50ICE9IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRzdF9tYWNfY291bnQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3RfbWFjX2NvdW50PSVkIiwgcGt0X2Rldi0+ZHN0X21hY19jb3VudCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImZsYWciKSkgewogICAgICAgICAgICAgICAgY2hhciBmWzMyXTsKICAgICAgICAgICAgICAgIG1lbXNldChmLCAwLCAzMik7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpZiAoY29weV9mcm9tX3VzZXIoZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZiwgIklQU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX0lQU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhSVBTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX0lQU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJUWFNJWkVfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfVFhTSVpFX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhVFhTSVpFX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9UWFNJWkVfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIklQRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX0lQRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhSVBEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX0lQRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJVRFBTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfVURQU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhVURQU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9VRFBTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIlVEUERTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9VRFBEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFVRFBEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX1VEUERTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiTUFDU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX01BQ1NSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIU1BQ1NSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfTUFDU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJNQUNEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfTUFDRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhTUFDRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9NQUNEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihwZ19yZXN1bHQsICJGbGFnIC06JXM6LSB1bmtub3duXG5BdmFpbGFibGUgZmxhZ3MsIChwcmVwZW5kICEgdG8gdW4tc2V0IGZsYWcpOlxuJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQU1JDX1JORCwgSVBEU1RfUk5ELCBUWFNJWkVfUk5ELCBVRFBTUkNfUk5ELCBVRFBEU1RfUk5ELCBNQUNTUkNfUk5ELCBNQUNEU1RfUk5EXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsYWdzPTB4JXgiLCBwa3RfZGV2LT5mbGFncyk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9taW4iKSB8fCAhc3RyY21wKG5hbWUsICJkc3QiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPmRzdF9taW4pIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmLCBwa3RfZGV2LT5kc3RfbWluKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LT5kc3RfbWluLCAwLCBzaXplb2YocGt0X2Rldi0+ZHN0X21pbikpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPmRzdF9taW4sIGJ1ZiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZGFkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+ZGFkZHJfbWluOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBkc3RfbWluIHNldCB0bzogJXNcbiIsIHBrdF9kZXYtPmRzdF9taW4pOwogICAgICAgICAgICAgICAgaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0X21pbj0lcyIsIHBrdF9kZXYtPmRzdF9taW4pOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3RfbWF4IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihwa3RfZGV2LT5kc3RfbWF4KSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWYsIHBrdF9kZXYtPmRzdF9tYXgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPmRzdF9tYXgsIDAsIHNpemVvZihwa3RfZGV2LT5kc3RfbWF4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+ZHN0X21heCwgYnVmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9tYXgpOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9tYXg7CiAgICAgICAgICAgICAgICB9CgkJaWYoZGVidWcpCgkJCXByaW50aygicGt0Z2VuOiBkc3RfbWF4IHNldCB0bzogJXNcbiIsIHBrdF9kZXYtPmRzdF9tYXgpOwoJCWkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdF9tYXg9JXMiLCBwa3RfZGV2LT5kc3RfbWF4KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0NiIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoYnVmKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHJldHVybiBsZW47IAoKCQlwa3RfZGV2LT5mbGFncyB8PSBGX0lQVjY7CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKCgkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5pbjZfZGFkZHIuczZfYWRkcik7CgkJZm10X2lwNihidWYsICBwa3RfZGV2LT5pbjZfZGFkZHIuczZfYWRkcik7CgoJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X2RhZGRyLCAmcGt0X2Rldi0+aW42X2RhZGRyKTsKCiAgICAgICAgICAgICAgICBpZihkZWJ1ZykgCgkJCXByaW50aygicGt0Z2VuOiBkc3Q2IHNldCB0bzogJXNcbiIsIGJ1Zik7CgogICAgICAgICAgICAgICAgaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0Nj0lcyIsIGJ1Zik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdDZfbWluIikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihidWYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCgoJCXBrdF9kZXYtPmZsYWdzIHw9IEZfSVBWNjsKCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwoKCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcik7CgkJZm10X2lwNihidWYsICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIpOwoKCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9kYWRkciwgJnBrdF9kZXYtPm1pbl9pbjZfZGFkZHIpOwogICAgICAgICAgICAgICAgaWYoZGVidWcpIAoJCQlwcmludGsoInBrdGdlbjogZHN0Nl9taW4gc2V0IHRvOiAlc1xuIiwgYnVmKTsKCiAgICAgICAgICAgICAgICBpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3Q2X21pbj0lcyIsIGJ1Zik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdDZfbWF4IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihidWYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCgoJCXBrdF9kZXYtPmZsYWdzIHw9IEZfSVBWNjsKCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwoKCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPm1heF9pbjZfZGFkZHIuczZfYWRkcik7CgkJZm10X2lwNihidWYsICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIpOwoKICAgICAgICAgICAgICAgIGlmKGRlYnVnKSAKCQkJcHJpbnRrKCJwa3RnZW46IGRzdDZfbWF4IHNldCB0bzogJXNcbiIsIGJ1Zik7CgogICAgICAgICAgICAgICAgaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0Nl9tYXg9JXMiLCBidWYpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJzcmM2IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihidWYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCgoJCXBrdF9kZXYtPmZsYWdzIHw9IEZfSVBWNjsKCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwoKCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPmluNl9zYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGJ1ZiwgIHBrdF9kZXYtPmluNl9zYWRkci5zNl9hZGRyKTsKCgkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIsICZwa3RfZGV2LT5pbjZfc2FkZHIpOwoKICAgICAgICAgICAgICAgIGlmKGRlYnVnKSAKCQkJcHJpbnRrKCJwa3RnZW46IHNyYzYgc2V0IHRvOiAlc1xuIiwgYnVmKTsKCQkKICAgICAgICAgICAgICAgIGkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHNyYzY9JXMiLCBidWYpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWluIikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihwa3RfZGV2LT5zcmNfbWluKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmLCBwa3RfZGV2LT5zcmNfbWluKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LT5zcmNfbWluLCAwLCBzaXplb2YocGt0X2Rldi0+c3JjX21pbikpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPnNyY19taW4sIGJ1ZiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NhZGRyID0gcGt0X2Rldi0+c2FkZHJfbWluOwogICAgICAgICAgICAgICAgfQoJCWlmKGRlYnVnKQoJCQlwcmludGsoInBrdGdlbjogc3JjX21pbiBzZXQgdG86ICVzXG4iLCBwa3RfZGV2LT5zcmNfbWluKTsKCQlpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNfbWluPSVzIiwgcGt0X2Rldi0+c3JjX21pbik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgInNyY19tYXgiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPnNyY19tYXgpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWYsIHBrdF9kZXYtPnNyY19tYXgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPnNyY19tYXgsIDAsIHNpemVvZihwa3RfZGV2LT5zcmNfbWF4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+c3JjX21heCwgYnVmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5zYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19tYXgpOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIgPSBwa3RfZGV2LT5zYWRkcl9tYXg7CiAgICAgICAgICAgICAgICB9CgkJaWYoZGVidWcpCgkJCXByaW50aygicGt0Z2VuOiBzcmNfbWF4IHNldCB0bzogJXNcbiIsIHBrdF9kZXYtPnNyY19tYXgpOwoJCWkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHNyY19tYXg9JXMiLCBwa3RfZGV2LT5zcmNfbWF4KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0X21hYyIpKSB7CgkJY2hhciAqdiA9IHZhbHN0cjsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkX2RtYWNbNl07CgkJdW5zaWduZWQgY2hhciAqbSA9IHBrdF9kZXYtPmRzdF9tYWM7CiAgICAgICAgICAgICAgICBtZW1jcHkob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMsIDYpOwogICAgICAgICAgICAgICAgCgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YodmFsc3RyKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCW1lbXNldCh2YWxzdHIsIDAsIHNpemVvZih2YWxzdHIpKTsKCQlpZiggY29weV9mcm9tX3VzZXIodmFsc3RyLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwoJCWkgKz0gbGVuOwoKCQlmb3IoKm0gPSAwOyp2ICYmIG0gPCBwa3RfZGV2LT5kc3RfbWFjICsgNjsgdisrKSB7CgkJCWlmICgqdiA+PSAnMCcgJiYgKnYgPD0gJzknKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJzAnOwoJCQl9CgkJCWlmICgqdiA+PSAnQScgJiYgKnYgPD0gJ0YnKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJ0EnICsgMTA7CgkJCX0KCQkJaWYgKCp2ID49ICdhJyAmJiAqdiA8PSAnZicpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnYScgKyAxMDsKCQkJfQoJCQlpZiAoKnYgPT0gJzonKSB7CgkJCQltKys7CgkJCQkqbSA9IDA7CgkJCX0KCQl9CgoJCS8qIFNldCB1cCBEZXN0IE1BQyAqLwogICAgICAgICAgICAgICAgaWYgKG1lbWNtcChvbGRfZG1hYywgcGt0X2Rldi0+ZHN0X21hYywgNikgIT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzBdKSwgcGt0X2Rldi0+ZHN0X21hYywgNik7CiAgICAgICAgICAgICAgICAKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3RtYWMiKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAic3JjX21hYyIpKSB7CgkJY2hhciAqdiA9IHZhbHN0cjsKCQl1bnNpZ25lZCBjaGFyICptID0gcGt0X2Rldi0+c3JjX21hYzsKCgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YodmFsc3RyKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCW1lbXNldCh2YWxzdHIsIDAsIHNpemVvZih2YWxzdHIpKTsKCQlpZiggY29weV9mcm9tX3VzZXIodmFsc3RyLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpIAoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKCgkJZm9yKCptID0gMDsqdiAmJiBtIDwgcGt0X2Rldi0+c3JjX21hYyArIDY7IHYrKykgewoJCQlpZiAoKnYgPj0gJzAnICYmICp2IDw9ICc5JykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICcwJzsKCQkJfQoJCQlpZiAoKnYgPj0gJ0EnICYmICp2IDw9ICdGJykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICdBJyArIDEwOwoJCQl9CgkJCWlmICgqdiA+PSAnYScgJiYgKnYgPD0gJ2YnKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJ2EnICsgMTA7CgkJCX0KCQkJaWYgKCp2ID09ICc6JykgewoJCQkJbSsrOwoJCQkJKm0gPSAwOwoJCQl9CgkJfQkgIAoKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IHNyY21hYyIpOwoJCXJldHVybiBjb3VudDsKCX0KCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImNsZWFyX2NvdW50ZXJzIikpIHsKICAgICAgICAgICAgICAgIHBrdGdlbl9jbGVhcl9jb3VudGVycyhwa3RfZGV2KTsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IENsZWFyaW5nIGNvdW50ZXJzLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgfQoKCWlmICghc3RyY21wKG5hbWUsICJmbG93cyIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmICh2YWx1ZSA+IE1BWF9DRkxPV1MpCgkJCXZhbHVlID0gTUFYX0NGTE9XUzsKCgkJcGt0X2Rldi0+Y2Zsb3dzID0gdmFsdWU7CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZmxvd3M9JXUiLCBwa3RfZGV2LT5jZmxvd3MpOwoJCXJldHVybiBjb3VudDsKCX0KCglpZiAoIXN0cmNtcChuYW1lLCAiZmxvd2xlbiIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCXBrdF9kZXYtPmxmbG93ID0gdmFsdWU7CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZmxvd2xlbj0ldSIsIHBrdF9kZXYtPmxmbG93KTsKCQlyZXR1cm4gY291bnQ7Cgl9CiAgICAgICAgCglzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIHN1Y2ggcGFyYW1ldGVyIFwiJXNcIiIsIG5hbWUpOwoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgcHJvY190aHJlYWRfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKQp7CgljaGFyICpwOwogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gKHN0cnVjdCBwa3RnZW5fdGhyZWFkKikoZGF0YSk7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoKCiAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGNvdWxkIG5vdCBmaW5kIHRocmVhZCBpbiBwcm9jX3RocmVhZF9yZWFkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCglwID0gYnVmOwoJcCArPSBzcHJpbnRmKHAsICJOYW1lOiAlcyAgbWF4X2JlZm9yZV9zb2Z0aXJxOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgdC0+bmFtZSwgdC0+bWF4X2JlZm9yZV9zb2Z0aXJxKTsKCiAgICAgICAgcCArPSBzcHJpbnRmKHAsICJSdW5uaW5nOiAiKTsKICAgICAgICAKICAgICAgICBpZl9sb2NrKHQpOwogICAgICAgIGZvcihwa3RfZGV2ID0gdC0+aWZfbGlzdDtwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCkgCgkJaWYocGt0X2Rldi0+cnVubmluZykKCQkJcCArPSBzcHJpbnRmKHAsICIlcyAiLCBwa3RfZGV2LT5pZm5hbWUpOwogICAgICAgIAogICAgICAgIHAgKz0gc3ByaW50ZihwLCAiXG5TdG9wcGVkOiAiKTsKCiAgICAgICAgZm9yKHBrdF9kZXYgPSB0LT5pZl9saXN0O3BrdF9kZXY7IHBrdF9kZXYgPSBwa3RfZGV2LT5uZXh0KSAKCQlpZighcGt0X2Rldi0+cnVubmluZykKCQkJcCArPSBzcHJpbnRmKHAsICIlcyAiLCBwa3RfZGV2LT5pZm5hbWUpOwoKCWlmICh0LT5yZXN1bHRbMF0pCgkJcCArPSBzcHJpbnRmKHAsICJcblJlc3VsdDogJXNcbiIsIHQtPnJlc3VsdCk7CgllbHNlCgkJcCArPSBzcHJpbnRmKHAsICJcblJlc3VsdDogTkFcbiIpOwoKCSplb2YgPSAxOwoKICAgICAgICBpZl91bmxvY2sodCk7CgoJcmV0dXJuIHAgLSBidWY7Cn0KCnN0YXRpYyBpbnQgcHJvY190aHJlYWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7CglpbnQgaSA9IDAsIG1heCwgbGVuLCByZXQ7CgljaGFyIG5hbWVbNDBdOwogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OwogICAgICAgIGNoYXIgKnBnX3Jlc3VsdDsKICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKICAgICAgICAKCWlmIChjb3VudCA8IDEpIHsKCQkvLwlzcHJpbnRmKHBnX3Jlc3VsdCwgIldyb25nIGNvbW1hbmQgZm9ybWF0Iik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiAgCgltYXggPSBjb3VudCAtIGk7CiAgICAgICAgbGVuID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOwogICAgICAgIGlmIChsZW4gPCAwKSAKCQlyZXR1cm4gbGVuOyAKICAgICAKCWkgKz0gbGVuOwogIAoJLyogUmVhZCB2YXJpYWJsZSBuYW1lICovCgoJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YobmFtZSkgLSAxKTsKICAgICAgICBpZiAobGVuIDwgMCkgIAoJCXJldHVybiBsZW47IAoJCgltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKCWlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJcmV0dXJuIC1FRkFVTFQ7CglpICs9IGxlbjsKICAKCW1heCA9IGNvdW50IC1pOwoJbGVuID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOwogICAgICAgIGlmIChsZW4gPCAwKSAgCgkJcmV0dXJuIGxlbjsgCgkKCWkgKz0gbGVuOwoKCWlmIChkZWJ1ZykgCgkJcHJpbnRrKCJwa3RnZW46IHQ9JXMsIGNvdW50PSVsdVxuIiwgbmFtZSwgY291bnQpOwogICAgICAgIAoKICAgICAgICB0ID0gKHN0cnVjdCBwa3RnZW5fdGhyZWFkKikoZGF0YSk7CglpZighdCkgewoJCXByaW50aygicGt0Z2VuOiBFUlJPUjogTm8gdGhyZWFkXG4iKTsKCQlyZXQgPSAtRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoKCXBnX3Jlc3VsdCA9ICYodC0+cmVzdWx0WzBdKTsKCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9kZXZpY2UiKSkgewogICAgICAgICAgICAgICAgY2hhciBmWzMyXTsKICAgICAgICAgICAgICAgIG1lbXNldChmLCAwLCAzMik7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IAoJCQlyZXQgPSBsZW47IAoJCQlnb3RvIG91dDsKCQl9CgkJaWYoIGNvcHlfZnJvbV91c2VyKGYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSApCgkJCXJldHVybiAtRUZBVUxUOwoJCWkgKz0gbGVuOwoJCXRocmVhZF9sb2NrKCk7CiAgICAgICAgICAgICAgICBwa3RnZW5fYWRkX2RldmljZSh0LCBmKTsKCQl0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICByZXQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IGFkZF9kZXZpY2U9JXMiLCBmKTsKCQlnb3RvIG91dDsKCX0KCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgInJlbV9kZXZpY2VfYWxsIikpIHsKCQl0aHJlYWRfbG9jaygpOwoJCXQtPmNvbnRyb2wgfD0gVF9SRU1ERVY7CgkJdGhyZWFkX3VubG9jaygpOwoJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKDEyNSkpOyAgLyogUHJvcGFnYXRlIHRocmVhZC0+Y29udHJvbCAgKi8KCQlyZXQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IHJlbV9kZXZpY2VfYWxsIik7CgkJZ290byBvdXQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJtYXhfYmVmb3JlX3NvZnRpcnEiKSkgewogICAgICAgICAgICAgICAgbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwoJCXRocmVhZF9sb2NrKCk7CiAgICAgICAgICAgICAgICB0LT5tYXhfYmVmb3JlX3NvZnRpcnEgPSB2YWx1ZTsKCQl0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICByZXQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1heF9iZWZvcmVfc29mdGlycT0lbHUiLCB2YWx1ZSk7CgkJZ290byBvdXQ7Cgl9CgoJcmV0ID0gLUVJTlZBTDsKIG91dDoKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGNyZWF0ZV9wcm9jX2Rpcih2b2lkKQp7CiAgICAgICAgaW50ICAgICBsZW47CiAgICAgICAgLyogIGRvZXMgcHJvY19kaXIgYWxyZWFkeSBleGlzdHMgKi8KICAgICAgICBsZW4gPSBzdHJsZW4oUEdfUFJPQ19ESVIpOwoKICAgICAgICBmb3IgKHBnX3Byb2NfZGlyID0gcHJvY19uZXQtPnN1YmRpcjsgcGdfcHJvY19kaXI7IHBnX3Byb2NfZGlyPXBnX3Byb2NfZGlyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoKHBnX3Byb2NfZGlyLT5uYW1lbGVuID09IGxlbikgJiYKCQkgICAgKCEgbWVtY21wKHBnX3Byb2NfZGlyLT5uYW1lLCBQR19QUk9DX0RJUiwgbGVuKSkpIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFwZ19wcm9jX2RpcikgCiAgICAgICAgICAgICAgICBwZ19wcm9jX2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBHX1BST0NfRElSLCBTX0lGRElSLCBwcm9jX25ldCk7CiAgICAgICAgCiAgICAgICAgaWYgKCFwZ19wcm9jX2RpcikgCiAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgICAKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCByZW1vdmVfcHJvY19kaXIodm9pZCkKewogICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBHX1BST0NfRElSLCBwcm9jX25ldCk7CiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qIFRoaW5rIGZpbmQgb3IgcmVtb3ZlIGZvciBOTiAqLwpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKl9fcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogaWZuYW1lLCBpbnQgcmVtb3ZlKSAKewoJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CglzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CgogICAgICAgIHQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICAgICAgICAgIAoJd2hpbGUgKHQpIHsKCQlwa3RfZGV2ID0gcGt0Z2VuX2ZpbmRfZGV2KHQsIGlmbmFtZSk7CgkJaWYgKHBrdF9kZXYpIHsKCQkgICAgICAgICAgICAgICAgaWYocmVtb3ZlKSB7IAoJCQkJICAgICAgICBpZl9sb2NrKHQpOwoJCQkJICAgICAgICBwa3RnZW5fcmVtb3ZlX2RldmljZSh0LCBwa3RfZGV2KTsKCQkJCSAgICAgICAgaWZfdW5sb2NrKHQpOwoJCQkJfQoJCQlicmVhazsKCQl9CgkJdCA9IHQtPm5leHQ7Cgl9CiAgICAgICAgcmV0dXJuIHBrdF9kZXY7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogaWZuYW1lLCBpbnQgcmVtb3ZlKSAKewoJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoJdGhyZWFkX2xvY2soKTsKCXBrdF9kZXYgPSBfX3BrdGdlbl9OTl90aHJlYWRzKGlmbmFtZSwgcmVtb3ZlKTsKICAgICAgICB0aHJlYWRfdW5sb2NrKCk7CglyZXR1cm4gcGt0X2RldjsKfQoKc3RhdGljIGludCBwa3RnZW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpIAp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopKHB0cik7CgoJLyogSXQgaXMgT0sgdGhhdCB3ZSBkbyBub3QgaG9sZCB0aGUgZ3JvdXAgbG9jayByaWdodCBub3csCgkgKiBhcyB3ZSBydW4gdW5kZXIgdGhlIFJUTkwgbG9jay4KCSAqLwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CgljYXNlIE5FVERFVl9HT0lOR19ET1dOOgoJY2FzZSBORVRERVZfRE9XTjoKCWNhc2UgTkVUREVWX1VQOgoJCS8qIElnbm9yZSBmb3Igbm93ICovCgkJYnJlYWs7CgkJCgljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgogICAgICAgICAgICAgICAgcGt0Z2VuX05OX3RocmVhZHMoZGV2LT5uYW1lLCBSRU1PVkUpOwoJCWJyZWFrOwoJfTsKCglyZXR1cm4gTk9USUZZX0RPTkU7Cn0KCi8qIEFzc29jaWF0ZSBwa3RnZW5fZGV2IHdpdGggYSBkZXZpY2UuICovCgpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIHBrdGdlbl9zZXR1cF9kZXYoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIHsKCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2OwoKCS8qIENsZWFuIG9sZCBzZXR1cHMgKi8KCglpZiAocGt0X2Rldi0+b2RldikgewoJCWRldl9wdXQocGt0X2Rldi0+b2Rldik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5vZGV2ID0gTlVMTDsKICAgICAgICB9CgoJb2RldiA9IGRldl9nZXRfYnlfbmFtZShwa3RfZGV2LT5pZm5hbWUpOwoKCWlmICghb2RldikgewoJCXByaW50aygicGt0Z2VuOiBubyBzdWNoIG5ldGRldmljZTogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwoJCWdvdG8gb3V0OwoJfQoJaWYgKG9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKSB7CgkJcHJpbnRrKCJwa3RnZW46IG5vdCBhbiBldGhlcm5ldCBkZXZpY2U6IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dF9wdXQ7Cgl9CglpZiAoIW5ldGlmX3J1bm5pbmcob2RldikpIHsKCQlwcmludGsoInBrdGdlbjogZGV2aWNlIGlzIGRvd246IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dF9wdXQ7Cgl9Cglwa3RfZGV2LT5vZGV2ID0gb2RldjsKCQogICAgICAgIHJldHVybiBwa3RfZGV2LT5vZGV2OwoKb3V0X3B1dDoKCWRldl9wdXQob2Rldik7Cm91dDoKIAlyZXR1cm4gTlVMTDsKCn0KCi8qIFJlYWQgcGt0X2RldiBmcm9tIHRoZSBpbnRlcmZhY2UgYW5kIHNldCB1cCBpbnRlcm5hbCBwa3RnZW5fZGV2CiAqIHN0cnVjdHVyZSB0byBoYXZlIHRoZSByaWdodCBpbmZvcm1hdGlvbiB0byBjcmVhdGUvc2VuZCBwYWNrZXRzCiAqLwpzdGF0aWMgdm9pZCBwa3RnZW5fc2V0dXBfaW5qZWN0KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CgkvKiBUcnkgb25jZSBtb3JlLCBqdXN0IGluIGNhc2UgaXQgd29ya3Mgbm93LiAqLwogICAgICAgIGlmICghcGt0X2Rldi0+b2RldikgCiAgICAgICAgICAgICAgICBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpOwogICAgICAgIAogICAgICAgIGlmICghcGt0X2Rldi0+b2RldikgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIkVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIERlZmF1bHQgdG8gdGhlIGludGVyZmFjZSdzIG1hYyBpZiBub3QgZXhwbGljaXRseSBzZXQuICovCgoJaWYgKChwa3RfZGV2LT5zcmNfbWFjWzBdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzFdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzJdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzNdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzRdID09IDApICYmIAoJICAgIChwa3RfZGV2LT5zcmNfbWFjWzVdID09IDApKSB7CgoJICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzZdKSwgcGt0X2Rldi0+b2Rldi0+ZGV2X2FkZHIsIDYpOwogICAgICAgfQogICAgICAgIC8qIFNldCB1cCBEZXN0IE1BQyAqLwogICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzBdKSwgcGt0X2Rldi0+ZHN0X21hYywgNik7CgogICAgICAgIC8qIFNldCB1cCBwa3Qgc2l6ZSAqLwogICAgICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSA9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZTsKCQoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKCQkvKgoJCSAqIFNraXAgdGhpcyBhdXRvbWF0aWMgYWRkcmVzcyBzZXR0aW5nIHVudGlsIGxvY2tzIG9yIGZ1bmN0aW9ucyAKCQkgKiBnZXRzIGV4cG9ydGVkCgkJICovCgojaWZkZWYgTk9UTk9XCgkJaW50IGksIHNldCA9IDAsIGVycj0xOwoJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CgoJCWZvcihpPTA7IGk8IElONl9BRERSX0hTSVpFOyBpKyspCgkJCWlmKHBrdF9kZXYtPmN1cl9pbjZfc2FkZHIuczZfYWRkcltpXSkgewoJCQkJc2V0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgoJCWlmKCFzZXQpIHsKCQkJCgkJCS8qCgkJCSAqIFVzZSBsaW5rbGV2ZWwgYWRkcmVzcyBpZiB1bmNvbmZpZ3VyZWQuCgkJCSAqCgkJCSAqIHVzZSBpcHY2X2dldF9sbGFkZHIgaWYvd2hlbiBpdCdzIGdldCBleHBvcnRlZAoJCQkgKi8KCgoJCQlyZWFkX2xvY2soJmFkZHJjb25mX2xvY2spOwoJCQlpZiAoKGlkZXYgPSBfX2luNl9kZXZfZ2V0KHBrdF9kZXYtPm9kZXYpKSAhPSBOVUxMKSB7CgkJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CgoJCQkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKCQkJCWZvciAoaWZwPWlkZXYtPmFkZHJfbGlzdDsgaWZwOyBpZnA9aWZwLT5pZl9uZXh0KSB7CgkJCQkJaWYgKGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgIShpZnAtPmZsYWdzJklGQV9GX1RFTlRBVElWRSkpIHsKCQkJCQkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIsICZpZnAtPmFkZHIpOwoJCQkJCQllcnIgPSAwOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CgkJCX0KCQkJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOwoJCQlpZihlcnIpCXByaW50aygicGt0Z2VuOiBFUlJPUjogSVB2NiBsaW5rIGFkZHJlc3Mgbm90IGF2YWlsYmxlLlxuIik7CgkJfQojZW5kaWYKCX0gCgllbHNlIHsKCQlwa3RfZGV2LT5zYWRkcl9taW4gPSAwOwoJCXBrdF9kZXYtPnNhZGRyX21heCA9IDA7CgkJaWYgKHN0cmxlbihwa3RfZGV2LT5zcmNfbWluKSA9PSAwKSB7CgkJCQoJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7IAoKCQkJcmN1X3JlYWRfbG9jaygpOwoJCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQocGt0X2Rldi0+b2Rldik7CgkJCWlmIChpbl9kZXYpIHsKCQkJCWlmIChpbl9kZXYtPmlmYV9saXN0KSB7CgkJCQkJcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2FkZHJlc3M7CgkJCQkJcGt0X2Rldi0+c2FkZHJfbWF4ID0gcGt0X2Rldi0+c2FkZHJfbWluOwoJCQkJfQoJCQkJX19pbl9kZXZfcHV0KGluX2Rldik7CQoJCQl9CgkJCXJjdV9yZWFkX3VubG9jaygpOwoJCX0KCQllbHNlIHsKCQkJcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWluKTsKCQkJcGt0X2Rldi0+c2FkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWF4KTsKCQl9CgoJCXBrdF9kZXYtPmRhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+ZHN0X21pbik7CgkJcGt0X2Rldi0+ZGFkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWF4KTsKCX0KICAgICAgICAvKiBJbml0aWFsaXplIGN1cnJlbnQgdmFsdWVzLiAqLwogICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CiAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIgPSBwa3RfZGV2LT5zYWRkcl9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+ZGFkZHJfbWluOwogICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gcGt0X2Rldi0+dWRwX2RzdF9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSBwa3RfZGV2LT51ZHBfc3JjX21pbjsKCXBrdF9kZXYtPm5mbG93cyA9IDA7Cn0KCnN0YXRpYyB2b2lkIHNwaW4oc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsIF9fdTY0IHNwaW5fdW50aWxfdXMpCnsKCV9fdTY0IHN0YXJ0OwoJX191NjQgbm93OwoKCXN0YXJ0ID0gbm93ID0gZ2V0Q3VyVXMoKTsKCXByaW50ayhLRVJOX0lORk8gInNsZWVwaW5nIGZvciAlZFxuIiwgKGludCkoc3Bpbl91bnRpbF91cyAtIG5vdykpOwoJd2hpbGUgKG5vdyA8IHNwaW5fdW50aWxfdXMpIHsKCQkvKiBUT0RPOiBvcHRpbWlzZSBzbGVlcGluZyBiZWhhdmlvciAqLwoJCWlmIChzcGluX3VudGlsX3VzIC0gbm93ID4gamlmZmllc190b191c2VjcygxKSsxKQoJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CgkJZWxzZSBpZiAoc3Bpbl91bnRpbF91cyAtIG5vdyA+IDEwMCkgewoJCQlkb19zb2Z0aXJxKCk7CgkJCWlmICghcGt0X2Rldi0+cnVubmluZykKCQkJCXJldHVybjsKCQkJaWYgKG5lZWRfcmVzY2hlZCgpKQoJCQkJc2NoZWR1bGUoKTsKCQl9CgoJCW5vdyA9IGdldEN1clVzKCk7Cgl9CgoJcGt0X2Rldi0+aWRsZV9hY2MgKz0gbm93IC0gc3RhcnQ7Cn0KCgovKiBJbmNyZW1lbnQvcmFuZG9taXplIGhlYWRlcnMgYWNjb3JkaW5nIHRvIGZsYWdzIGFuZCBjdXJyZW50IHZhbHVlcwogKiBmb3IgSVAgc3JjL2Rlc3QsIFVEUCBzcmMvZHN0IHBvcnQsIE1BQy1BZGRyIHNyYy9kc3QKICovCnN0YXRpYyB2b2lkIG1vZF9jdXJfaGVhZGVycyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgeyAgICAgICAgCiAgICAgICAgX191MzIgaW1uOwogICAgICAgIF9fdTMyIGlteDsKCWludCAgZmxvdyA9IDA7CgoJaWYocGt0X2Rldi0+Y2Zsb3dzKSAgewoJCWZsb3cgPSBwa3RnZW5fcmFuZG9tKCkgJSBwa3RfZGV2LT5jZmxvd3M7CgkJCgkJaWYgKHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ID4gcGt0X2Rldi0+bGZsb3cpCgkJCXBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ID0gMDsKCX0JCQkJCQkKCgoJLyogIERlYWwgd2l0aCBzb3VyY2UgTUFDICovCiAgICAgICAgaWYgKHBrdF9kZXYtPnNyY19tYWNfY291bnQgPiAxKSB7CiAgICAgICAgICAgICAgICBfX3UzMiBtYzsKICAgICAgICAgICAgICAgIF9fdTMyIHRtcDsKCiAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ1NSQ19STkQpIAogICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT5zcmNfbWFjX2NvdW50KTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdF9kZXYtPmN1cl9zcmNfbWFjX29mZnNldCsrOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID4gcGt0X2Rldi0+c3JjX21hY19jb3VudCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0bXAgPSBwa3RfZGV2LT5zcmNfbWFjWzVdICsgKG1jICYgMHhGRik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsxMV0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+c3JjX21hY1s0XSArICgobWMgPj4gOCkgJiAweEZGKSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbMTBdID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPnNyY19tYWNbM10gKyAoKG1jID4+IDE2KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs5XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzJdICsgKChtYyA+PiAyNCkgJiAweEZGKSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbOF0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+c3JjX21hY1sxXSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbN10gPSB0bXA7ICAgICAgICAKICAgICAgICB9CgogICAgICAgIC8qICBEZWFsIHdpdGggRGVzdGluYXRpb24gTUFDICovCiAgICAgICAgaWYgKHBrdF9kZXYtPmRzdF9tYWNfY291bnQgPiAxKSB7CiAgICAgICAgICAgICAgICBfX3UzMiBtYzsKICAgICAgICAgICAgICAgIF9fdTMyIHRtcDsKCiAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ0RTVF9STkQpIAogICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50KTsKCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWMgPSBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA+IHBrdF9kZXYtPmRzdF9tYWNfY291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdG1wID0gcGt0X2Rldi0+ZHN0X21hY1s1XSArIChtYyAmIDB4RkYpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbNV0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+ZHN0X21hY1s0XSArICgobWMgPj4gOCkgJiAweEZGKSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbNF0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+ZHN0X21hY1szXSArICgobWMgPj4gMTYpICYgMHhGRikgKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzNdID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbMl0gKyAoKG1jID4+IDI0KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsyXSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzFdICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsxXSA9IHRtcDsgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgaWYgKHBrdF9kZXYtPnVkcF9zcmNfbWluIDwgcGt0X2Rldi0+dWRwX3NyY19tYXgpIHsKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQU1JDX1JORCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfc3JjID0gKChwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+dWRwX3NyY19tYXggLSBwa3RfZGV2LT51ZHBfc3JjX21pbikpICsgcGt0X2Rldi0+dWRwX3NyY19taW4pOwoKICAgICAgICAgICAgICAgIGVsc2UgewoJCQlwa3RfZGV2LT5jdXJfdWRwX3NyYysrOwoJCQlpZiAocGt0X2Rldi0+Y3VyX3VkcF9zcmMgPj0gcGt0X2Rldi0+dWRwX3NyY19tYXgpCgkJCQlwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHBrdF9kZXYtPnVkcF9zcmNfbWluOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHBrdF9kZXYtPnVkcF9kc3RfbWluIDwgcGt0X2Rldi0+dWRwX2RzdF9tYXgpIHsKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQRFNUX1JORCkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX2RzdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPnVkcF9kc3RfbWF4IC0gcGt0X2Rldi0+dWRwX2RzdF9taW4pKSArIHBrdF9kZXYtPnVkcF9kc3RfbWluKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoJCQlwa3RfZGV2LT5jdXJfdWRwX2RzdCsrOwoJCQlpZiAocGt0X2Rldi0+Y3VyX3VkcF9kc3QgPj0gcGt0X2Rldi0+dWRwX2RzdF9tYXgpIAoJCQkJcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSBwa3RfZGV2LT51ZHBfZHN0X21pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgoJaWYgKCEocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpKSB7CgoJCWlmICgoaW1uID0gbnRvaGwocGt0X2Rldi0+c2FkZHJfbWluKSkgPCAoaW14ID0gbnRvaGwocGt0X2Rldi0+c2FkZHJfbWF4KSkpIHsKCQkJX191MzIgdDsKCQkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUFNSQ19STkQpIAoJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsgaW1uKTsKCQkJZWxzZSB7CgkJCQl0ID0gbnRvaGwocGt0X2Rldi0+Y3VyX3NhZGRyKTsKCQkJCXQrKzsKCQkJCWlmICh0ID4gaW14KSB7CgkJCQkJdCA9IGltbjsKCQkJCX0KCQkJfQoJCQlwa3RfZGV2LT5jdXJfc2FkZHIgPSBodG9ubCh0KTsKCQl9CgkJCgkJaWYgKHBrdF9kZXYtPmNmbG93cyAmJiBwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCAhPSAwKSB7CgkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmN1cl9kYWRkcjsKCQl9IGVsc2UgewoKCQkJaWYgKChpbW4gPSBudG9obChwa3RfZGV2LT5kYWRkcl9taW4pKSA8IChpbXggPSBudG9obChwa3RfZGV2LT5kYWRkcl9tYXgpKSkgewoJCQkJX191MzIgdDsKCQkJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKSB7CgoJCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArIGltbik7CgkJCQkJdCA9IGh0b25sKHQpOwoKCQkJCQl3aGlsZSggTE9PUEJBQ0sodCkgfHwgTVVMVElDQVNUKHQpIHx8IEJBRENMQVNTKHQpIHx8IFpFUk9ORVQodCkgfHwgIExPQ0FMX01DQVNUKHQpICkgewoJCQkJCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSkgKyBpbW4pOwoJCQkJCQl0ID0gaHRvbmwodCk7CgkJCQkJfQoJCQkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IHQ7CgkJCQl9CgkJCQkKCQkJCWVsc2UgewoJCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfZGFkZHIpOwoJCQkJCXQrKzsKCQkJCQlpZiAodCA+IGlteCkgewoJCQkJCQl0ID0gaW1uOwoJCQkJCX0KCQkJCQlwa3RfZGV2LT5jdXJfZGFkZHIgPSBodG9ubCh0KTsKCQkJCX0KCQkJfQoJCQlpZihwa3RfZGV2LT5jZmxvd3MpIHsJCgkJCQlwa3RfZGV2LT5mbG93c1tmbG93XS5jdXJfZGFkZHIgPSBwa3RfZGV2LT5jdXJfZGFkZHI7CgkJCQlwa3RfZGV2LT5uZmxvd3MrKzsKCQkJfQoJCX0KCX0KCWVsc2UgLyogSVBWNiAqICovCgl7CgkJaWYocGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbMF0gPT0gMCAmJgoJCSAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyWzFdID09IDAgJiYKCQkgICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlsyXSA9PSAwICYmCgkJICAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbM10gPT0gMCk7CgkJZWxzZSB7CgkJCWludCBpOwoKCQkJLyogT25seSByYW5kb20gZGVzdGluYXRpb25zIHlldCAqLwoKCQkJZm9yKGk9MDsgaSA8IDQ7IGkrKykgewoJCQkJcGt0X2Rldi0+Y3VyX2luNl9kYWRkci5zNl9hZGRyMzJbaV0gPQoJCQkJCSgocGt0Z2VuX3JhbmRvbSgpIHwKCQkJCQkgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyW2ldKSAmCgkJCQkJIHBrdF9kZXYtPm1heF9pbjZfZGFkZHIuczZfYWRkcjMyW2ldKTsKCQkJfQogCQl9Cgl9CgogICAgICAgIGlmIChwa3RfZGV2LT5taW5fcGt0X3NpemUgPCBwa3RfZGV2LT5tYXhfcGt0X3NpemUpIHsKICAgICAgICAgICAgICAgIF9fdTMyIHQ7CiAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSAtIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwa3RfZGV2LT5taW5fcGt0X3NpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgkJCXQgPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyAxOwoJCQlpZiAodCA+IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkgCgkJCQl0ID0gcGt0X2Rldi0+bWluX3BrdF9zaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdDsKICAgICAgICB9CgoJcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQrKzsKfQoKCnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZmlsbF9wYWNrZXRfaXB2NChzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCgkJCQkgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CglfX3U4ICpldGg7CglzdHJ1Y3QgdWRwaGRyICp1ZHBoOwoJaW50IGRhdGFsZW4sIGlwbGVuOwoJc3RydWN0IGlwaGRyICppcGg7CiAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CiAgICAgICAgCgkvKiBVcGRhdGUgYW55IG9mIHRoZSB2YWx1ZXMsIHVzZWQgd2hlbiB3ZSdyZSBpbmNyZW1lbnRpbmcgdmFyaW91cwoJICogZmllbGRzLgoJICovCgltb2RfY3VyX2hlYWRlcnMocGt0X2Rldik7CgoJc2tiID0gYWxsb2Nfc2tiKHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgMTYsIEdGUF9BVE9NSUMpOwoJaWYgKCFza2IpIHsKCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwoJCXJldHVybiBOVUxMOwoJfQoKCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwoKCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLwoJZXRoID0gKF9fdTggKikgc2tiX3B1c2goc2tiLCAxNCk7CglpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKCXVkcGggPSAoc3RydWN0IHVkcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwoKCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CgkqKHUxNiopJmV0aFsxMl0gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKCglkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLSAyMCAtIDg7IC8qIEV0aCArIElQaCArIFVEUGggKi8KCWlmIChkYXRhbGVuIDwgc2l6ZW9mKHN0cnVjdCBwa3RnZW5faGRyKSkgCgkJZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcik7CiAgICAgICAgCgl1ZHBoLT5zb3VyY2UgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX3NyYyk7Cgl1ZHBoLT5kZXN0ID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9kc3QpOwoJdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbiArIDgpOyAvKiBEQVRBICsgdWRwaGRyICovCgl1ZHBoLT5jaGVjayA9IDA7ICAvKiBObyBjaGVja3N1bSAqLwoKCWlwaC0+aWhsID0gNTsKCWlwaC0+dmVyc2lvbiA9IDQ7CglpcGgtPnR0bCA9IDMyOwoJaXBoLT50b3MgPSAwOwoJaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOyAvKiBVRFAgKi8KCWlwaC0+c2FkZHIgPSBwa3RfZGV2LT5jdXJfc2FkZHI7CglpcGgtPmRhZGRyID0gcGt0X2Rldi0+Y3VyX2RhZGRyOwoJaXBoLT5mcmFnX29mZiA9IDA7CglpcGxlbiA9IDIwICsgOCArIGRhdGFsZW47CglpcGgtPnRvdF9sZW4gPSBodG9ucyhpcGxlbik7CglpcGgtPmNoZWNrID0gMDsKCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHZvaWQgKikgaXBoLCBpcGgtPmlobCk7Cglza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7Cglza2ItPm1hYy5yYXcgPSAoKHU4ICopaXBoKSAtIDE0OwoJc2tiLT5kZXYgPSBvZGV2OwoJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwoKCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkgCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CgllbHNlIHsKCQlpbnQgZnJhZ3MgPSBwa3RfZGV2LT5uZnJhZ3M7CgkJaW50IGk7CgogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyKikoKChjaGFyKikodWRwaCkpICsgOCk7CiAgICAgICAgICAgICAgICAKCQlpZiAoZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKQoJCQlmcmFncyA9IE1BWF9TS0JfRlJBR1M7CgkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKCQkJc2tiX3B1dChza2IsIGRhdGFsZW4tZnJhZ3MqUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiA9IGZyYWdzKlBBR0VfU0laRTsKCQl9CgoJCWkgPSAwOwoJCXdoaWxlIChkYXRhbGVuID4gMCkgewoJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIDApOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBwYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0KCQkJCShkYXRhbGVuIDwgUEFHRV9TSVpFID8gZGF0YWxlbiA6IFBBR0VfU0laRSk7CgkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmxlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+ZGF0YV9sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCgkJd2hpbGUgKGkgPCBmcmFncykgewoJCQlpbnQgcmVtOwoKCQkJaWYgKGkgPT0gMCkKCQkJCWJyZWFrOwoKCQkJcmVtID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAvIDI7CgkJCWlmIChyZW0gPT0gMCkKCQkJCWJyZWFrOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAtPSByZW07CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CgkJCWdldF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0gcmVtOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCX0KCiAgICAgICAgLyogU3RhbXAgdGhlIHRpbWUsIGFuZCBzZXF1ZW5jZSBudW1iZXIsIGNvbnZlcnQgdGhlbSB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KCiAgICAgICAgaWYgKHBnaCkgewogICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKCSAgICAgIAoJICAgICAgcGdoLT5wZ2hfbWFnaWMgPSBodG9ubChQS1RHRU5fTUFHSUMpOwoJICAgICAgcGdoLT5zZXFfbnVtICAgPSBodG9ubChwa3RfZGV2LT5zZXFfbnVtKTsKCSAgICAgIAoJICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1lc3RhbXApOwoJICAgICAgcGdoLT50dl9zZWMgICAgPSBodG9ubCh0aW1lc3RhbXAudHZfc2VjKTsKCSAgICAgIHBnaC0+dHZfdXNlYyAgID0gaHRvbmwodGltZXN0YW1wLnR2X3VzZWMpOwogICAgICAgIH0KICAgICAgICBwa3RfZGV2LT5zZXFfbnVtKys7CiAgICAgICAgCglyZXR1cm4gc2tiOwp9CgovKgogKiBzY2FuX2lwNiwgZm10X2lwIHRha2VuIGZyb20gZGlldGxpYmMtMC4yMSAKICogQXV0aG9yIEZlbGl4IHZvbiBMZWl0bmVyIDxmZWxpeC1kaWV0bGliY0BmZWZlLmRlPgogKgogKiBTbGlnaHRseSBtb2RpZmllZCBmb3Iga2VybmVsLiAKICogU2hvdWxkIGJlIGNhbmRpZGF0ZSBmb3IgbmV0L2lwdjQvdXRpbHMuYwogKiAtLXJvCiAqLwoKc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2lwNihjb25zdCBjaGFyICpzLGNoYXIgaXBbMTZdKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXVuc2lnbmVkIGludCBsZW49MDsKCXVuc2lnbmVkIGxvbmcgdTsKCWNoYXIgc3VmZml4WzE2XTsKCXVuc2lnbmVkIGludCBwcmVmaXhsZW49MDsKCXVuc2lnbmVkIGludCBzdWZmaXhsZW49MDsKCV9fdTMyIHRtcDsKCglmb3IgKGk9MDsgaTwxNjsgaSsrKSBpcFtpXT0wOwoKCWZvciAoOzspIHsKCQlpZiAoKnMgPT0gJzonKSB7CgkJCWxlbisrOwoJCQlpZiAoc1sxXSA9PSAnOicpIHsgICAgICAgIC8qIEZvdW5kICI6OiIsIHNraXAgdG8gcGFydCAyICovCgkJCQlzKz0yOwoJCQkJbGVuKys7CgkJCQlicmVhazsKCQkJfQoJCQlzKys7CgkJfQoJCXsKCQkJY2hhciAqdG1wOwoJCQl1PXNpbXBsZV9zdHJ0b3VsKHMsJnRtcCwxNik7CgkJCWk9dG1wLXM7CgkJfQoKCQlpZiAoIWkpIHJldHVybiAwOwoJCWlmIChwcmVmaXhsZW49PTEyICYmIHNbaV09PScuJykgewoKCQkJLyogdGhlIGxhc3QgNCBieXRlcyBtYXkgYmUgd3JpdHRlbiBhcyBJUHY0IGFkZHJlc3MgKi8KCgkJCXRtcCA9IGluX2F0b24ocyk7CgkJCW1lbWNweSgoc3RydWN0IGluX2FkZHIqKShpcCsxMiksICZ0bXAsIHNpemVvZih0bXApKTsKCQkJcmV0dXJuIGkrbGVuOwoJCX0KCQlpcFtwcmVmaXhsZW4rK10gPSAodSA+PiA4KTsKCQlpcFtwcmVmaXhsZW4rK10gPSAodSAmIDI1NSk7CgkJcyArPSBpOyBsZW4gKz0gaTsKCQlpZiAocHJlZml4bGVuPT0xNikKCQkJcmV0dXJuIGxlbjsKCX0KCi8qIHBhcnQgMiwgYWZ0ZXIgIjo6IiAqLwoJZm9yICg7OykgewoJCWlmICgqcyA9PSAnOicpIHsKCQkJaWYgKHN1ZmZpeGxlbj09MCkKCQkJCWJyZWFrOwoJCQlzKys7CgkJCWxlbisrOwoJCX0gZWxzZSBpZiAoc3VmZml4bGVuIT0wKQoJCQlicmVhazsKCQl7CgkJCWNoYXIgKnRtcDsKCQkJdT1zaW1wbGVfc3RydG9sKHMsJnRtcCwxNik7CgkJCWk9dG1wLXM7CgkJfQoJCWlmICghaSkgewoJCQlpZiAoKnMpIGxlbi0tOwoJCQlicmVhazsKCQl9CgkJaWYgKHN1ZmZpeGxlbitwcmVmaXhsZW48PTEyICYmIHNbaV09PScuJykgewoJCQl0bXAgPSBpbl9hdG9uKHMpOwoJCQltZW1jcHkoKHN0cnVjdCBpbl9hZGRyKikoc3VmZml4K3N1ZmZpeGxlbiksICZ0bXAsIHNpemVvZih0bXApKTsKCQkJc3VmZml4bGVuKz00OwoJCQlsZW4rPXN0cmxlbihzKTsKCQkJYnJlYWs7CgkJfQoJCXN1ZmZpeFtzdWZmaXhsZW4rK10gPSAodSA+PiA4KTsKCQlzdWZmaXhbc3VmZml4bGVuKytdID0gKHUgJiAyNTUpOwoJCXMgKz0gaTsgbGVuICs9IGk7CgkJaWYgKHByZWZpeGxlbitzdWZmaXhsZW49PTE2KQoJCQlicmVhazsKCX0KCWZvciAoaT0wOyBpPHN1ZmZpeGxlbjsgaSsrKQoJCWlwWzE2LXN1ZmZpeGxlbitpXSA9IHN1ZmZpeFtpXTsKCXJldHVybiBsZW47Cn0KCnN0YXRpYyBjaGFyIHRvaGV4KGNoYXIgaGV4ZGlnaXQpIHsKCXJldHVybiBoZXhkaWdpdD45P2hleGRpZ2l0KydhJy0xMDpoZXhkaWdpdCsnMCc7Cn0KCnN0YXRpYyBpbnQgZm10X3hsb25nKGNoYXIqIHMsdW5zaWduZWQgaW50IGkpIHsKCWNoYXIqIGJhaz1zOwoJKnM9dG9oZXgoKGk+PjEyKSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KChpPj44KSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KChpPj40KSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKCSpzPXRvaGV4KGkmMHhmKTsKCXJldHVybiBzLWJhaysxOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGZtdF9pcDYoY2hhciAqcyxjb25zdCBjaGFyIGlwWzE2XSkgewoJdW5zaWduZWQgaW50IGxlbjsKCXVuc2lnbmVkIGludCBpOwoJdW5zaWduZWQgaW50IHRlbXA7Cgl1bnNpZ25lZCBpbnQgY29tcHJlc3Npbmc7CglpbnQgajsKCglsZW4gPSAwOyBjb21wcmVzc2luZyA9IDA7Cglmb3IgKGo9MDsgajwxNjsgais9MikgewoKI2lmZGVmIFY0TUFQUEVEUFJFRklYCgkJaWYgKGo9PTEyICYmICFtZW1jbXAoaXAsVjRtYXBwZWRwcmVmaXgsMTIpKSB7CgkJCWluZXRfbnRvYV9yKCooc3RydWN0IGluX2FkZHIqKShpcCsxMikscyk7CgkJCXRlbXA9c3RybGVuKHMpOwoJCQlyZXR1cm4gbGVuK3RlbXA7CgkJfQojZW5kaWYKCQl0ZW1wID0gKCh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgY2hhcikgaXBbal0gPDwgOCkgKwoJCQkodW5zaWduZWQgbG9uZykgKHVuc2lnbmVkIGNoYXIpIGlwW2orMV07CgkJaWYgKHRlbXAgPT0gMCkgewoJCQlpZiAoIWNvbXByZXNzaW5nKSB7CgkJCQljb21wcmVzc2luZz0xOwoJCQkJaWYgKGo9PTApIHsKCQkJCQkqcysrPSc6JzsgKytsZW47CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoY29tcHJlc3NpbmcpIHsKCQkJCWNvbXByZXNzaW5nPTA7CgkJCQkqcysrPSc6JzsgKytsZW47CgkJCX0KCQkJaSA9IGZtdF94bG9uZyhzLHRlbXApOyBsZW4gKz0gaTsgcyArPSBpOwoJCQlpZiAoajwxNCkgewoJCQkJKnMrKyA9ICc6JzsKCQkJCSsrbGVuOwoJCQl9CgkJfQoJfQoJaWYgKGNvbXByZXNzaW5nKSB7CgkJKnMrKz0nOic7ICsrbGVuOwoJfQoJKnM9MDsKCXJldHVybiBsZW47Cn0KCnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZmlsbF9wYWNrZXRfaXB2NihzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCgkJCQkgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CglfX3U4ICpldGg7CglzdHJ1Y3QgdWRwaGRyICp1ZHBoOwoJaW50IGRhdGFsZW47CglzdHJ1Y3QgaXB2NmhkciAqaXBoOwogICAgICAgIHN0cnVjdCBwa3RnZW5faGRyICpwZ2ggPSBOVUxMOwoKCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCgkgKiBmaWVsZHMuCgkgKi8KCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKCglza2IgPSBhbGxvY19za2IocGt0X2Rldi0+Y3VyX3BrdF9zaXplICsgNjQgKyAxNiwgR0ZQX0FUT01JQyk7CglpZiAoIXNrYikgewoJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gbWVtb3J5Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc2tiX3Jlc2VydmUoc2tiLCAxNik7CgoJLyogIFJlc2VydmUgZm9yIGV0aGVybmV0IGFuZCBJUCBoZWFkZXIgICovCglldGggPSAoX191OCAqKSBza2JfcHVzaChza2IsIDE0KTsKCWlwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKCXVkcGggPSAoc3RydWN0IHVkcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwoKCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CgkqKHUxNiopJmV0aFsxMl0gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOwoKCWRhdGFsZW4gPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUtMTQtIAoJCXNpemVvZihzdHJ1Y3QgaXB2Nmhkciktc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOyAvKiBFdGggKyBJUGggKyBVRFBoICovCgoJaWYgKGRhdGFsZW4gPCBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpKSB7IAoJCWRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpOwoJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCgkJCXByaW50ayhLRVJOX0lORk8gInBrdGdlbjogaW5jcmVhc2VkIGRhdGFsZW4gdG8gJWRcbiIsIGRhdGFsZW4pOwoJfQoKCXVkcGgtPnNvdXJjZSA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7Cgl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsgCgl1ZHBoLT5jaGVjayA9IDA7ICAvKiBObyBjaGVja3N1bSAqLwoKCSAqKHUzMiopaXBoID0gX19jb25zdGFudF9odG9ubCgweDYwMDAwMDAwKTsgLyogVmVyc2lvbiArIGZsb3cgKi8KCglpcGgtPmhvcF9saW1pdCA9IDMyOwoKCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBkYXRhbGVuKTsKCWlwaC0+bmV4dGhkciA9IElQUFJPVE9fVURQOwoKCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9kYWRkcik7CglpcHY2X2FkZHJfY29weSgmaXBoLT5zYWRkciwgJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIpOwoKCXNrYi0+bWFjLnJhdyA9ICgodTggKilpcGgpIC0gMTQ7Cglza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKCXNrYi0+ZGV2ID0gb2RldjsKCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKCglpZiAocGt0X2Rldi0+bmZyYWdzIDw9IDApIAogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopc2tiX3B1dChza2IsIGRhdGFsZW4pOwoJZWxzZSB7CgkJaW50IGZyYWdzID0gcGt0X2Rldi0+bmZyYWdzOwoJCWludCBpOwoKICAgICAgICAgICAgICAgIHBnaCA9IChzdHJ1Y3QgcGt0Z2VuX2hkciopKCgoY2hhciopKHVkcGgpKSArIDgpOwogICAgICAgICAgICAgICAgCgkJaWYgKGZyYWdzID4gTUFYX1NLQl9GUkFHUykKCQkJZnJhZ3MgPSBNQVhfU0tCX0ZSQUdTOwoJCWlmIChkYXRhbGVuID4gZnJhZ3MqUEFHRV9TSVpFKSB7CgkJCXNrYl9wdXQoc2tiLCBkYXRhbGVuLWZyYWdzKlBBR0VfU0laRSk7CgkJCWRhdGFsZW4gPSBmcmFncypQQUdFX1NJWkU7CgkJfQoKCQlpID0gMDsKCQl3aGlsZSAoZGF0YWxlbiA+IDApIHsKCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAwKTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlID0gcGFnZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCA9IDA7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9CgkJCQkoZGF0YWxlbiA8IFBBR0VfU0laRSA/IGRhdGFsZW4gOiBQQUdFX1NJWkUpOwoJCQlkYXRhbGVuIC09IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJc2tiLT5sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmRhdGFfbGVuICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJaSsrOwoJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKCQl9CgoJCXdoaWxlIChpIDwgZnJhZ3MpIHsKCQkJaW50IHJlbTsKCgkJCWlmIChpID09IDApCgkJCQlicmVhazsKCgkJCXJlbSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLyAyOwoJCQlpZiAocmVtID09IDApCgkJCQlicmVhazsKCgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLT0gcmVtOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdOwoJCQlnZXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UpOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5wYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemU7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9IHJlbTsKCQkJaSsrOwoJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKCQl9Cgl9CgogICAgICAgIC8qIFN0YW1wIHRoZSB0aW1lLCBhbmQgc2VxdWVuY2UgbnVtYmVyLCBjb252ZXJ0IHRoZW0gdG8gbmV0d29yayBieXRlIG9yZGVyICovCgkvKiBzaG91bGQgd2UgdXBkYXRlIGNsb25lZCBwYWNrZXRzIHRvbyA/ICovCiAgICAgICAgaWYgKHBnaCkgewogICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKCSAgICAgIAoJICAgICAgcGdoLT5wZ2hfbWFnaWMgPSBodG9ubChQS1RHRU5fTUFHSUMpOwoJICAgICAgcGdoLT5zZXFfbnVtICAgPSBodG9ubChwa3RfZGV2LT5zZXFfbnVtKTsKCSAgICAgIAoJICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1lc3RhbXApOwoJICAgICAgcGdoLT50dl9zZWMgICAgPSBodG9ubCh0aW1lc3RhbXAudHZfc2VjKTsKCSAgICAgIHBnaC0+dHZfdXNlYyAgID0gaHRvbmwodGltZXN0YW1wLnR2X3VzZWMpOwogICAgICAgIH0KICAgICAgICBwa3RfZGV2LT5zZXFfbnVtKys7CiAgICAgICAgCglyZXR1cm4gc2tiOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCgkJCQkgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIAoJCXJldHVybiBmaWxsX3BhY2tldF9pcHY2KG9kZXYsIHBrdF9kZXYpOwoJZWxzZQoJCXJldHVybiBmaWxsX3BhY2tldF9pcHY0KG9kZXYsIHBrdF9kZXYpOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CiAgICAgICAgcGt0X2Rldi0+c2VxX251bSA9IDE7CiAgICAgICAgcGt0X2Rldi0+aWRsZV9hY2MgPSAwOwoJcGt0X2Rldi0+c29mYXIgPSAwOwogICAgICAgIHBrdF9kZXYtPnR4X2J5dGVzID0gMDsKICAgICAgICBwa3RfZGV2LT5lcnJvcnMgPSAwOwp9CgovKiBTZXQgdXAgc3RydWN0dXJlIGZvciBzZW5kaW5nIHBrdHMsIGNsZWFyIGNvdW50ZXJzICovCgpzdGF0aWMgdm9pZCBwa3RnZW5fcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoJaW50IHN0YXJ0ZWQgPSAwOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuLiAlcFxuIiwgdCkpOwoKCWlmX2xvY2sodCk7CiAgICAgICAgZm9yIChwa3RfZGV2ID0gdC0+aWZfbGlzdDsgcGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQgKSB7CgoJCS8qCgkJICogc2V0dXAgb2RldiBhbmQgY3JlYXRlIGluaXRpYWwgcGFja2V0LgoJCSAqLwoJCXBrdGdlbl9zZXR1cF9pbmplY3QocGt0X2Rldik7CgoJCWlmKHBrdF9kZXYtPm9kZXYpIHsgCgkJCXBrdGdlbl9jbGVhcl9jb3VudGVycyhwa3RfZGV2KTsKCQkJcGt0X2Rldi0+cnVubmluZyA9IDE7IC8qIENyYW5rZSB5ZXNlbGYhICovCgkJCXBrdF9kZXYtPnNrYiA9IE5VTEw7CgkJCXBrdF9kZXYtPnN0YXJ0ZWRfYXQgPSBnZXRDdXJVcygpOwoJCQlwa3RfZGV2LT5uZXh0X3R4X3VzID0gZ2V0Q3VyVXMoKTsgLyogVHJhbnNtaXQgaW1tZWRpYXRlbHkgKi8KCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgkJCQoJCQlzdHJjcHkocGt0X2Rldi0+cmVzdWx0LCAiU3RhcnRpbmciKTsKCQkJc3RhcnRlZCsrOwoJCX0KCQllbHNlIAoJCQlzdHJjcHkocGt0X2Rldi0+cmVzdWx0LCAiRXJyb3Igc3RhcnRpbmciKTsKCX0KCWlmX3VubG9jayh0KTsKCWlmKHN0YXJ0ZWQpIHQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnModm9pZCkKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gcGt0Z2VuX3RocmVhZHM7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzLlxuIikpOwoKCXRocmVhZF9sb2NrKCk7Cgl3aGlsZSh0KSB7CgkJcGt0Z2VuX3N0b3AodCk7CgkJdCA9IHQtPm5leHQ7Cgl9CiAgICAgICB0aHJlYWRfdW5sb2NrKCk7Cn0KCnN0YXRpYyBpbnQgdGhyZWFkX2lzX3J1bm5pbmcoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQ7CiAgICAgICAgaW50IHJlcyA9IDA7CgogICAgICAgIGZvcihuZXh0PXQtPmlmX2xpc3Q7IG5leHQ7IG5leHQ9bmV4dC0+bmV4dCkgeyAKCQlpZihuZXh0LT5ydW5uaW5nKSB7CgkJCXJlcyA9IDE7CgkJCWJyZWFrOwoJCX0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKfQoKc3RhdGljIGludCBwa3RnZW5fd2FpdF90aHJlYWRfcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKewogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIHdoaWxlKHRocmVhZF9pc19ydW5uaW5nKHQpKSB7CgogICAgICAgICAgICAgICAgaWZfdW5sb2NrKHQpOwoKCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOyAKCiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNpZ25hbDsKICAgICAgICAgICAgICAgIGlmX2xvY2sodCk7CiAgICAgICAgfQogICAgICAgIGlmX3VubG9jayh0KTsKICAgICAgICByZXR1cm4gMTsKIHNpZ25hbDoKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBwa3RnZW5fd2FpdF9hbGxfdGhyZWFkc19ydW4odm9pZCkKewoJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCWludCBzaWcgPSAxOwoJCgl3aGlsZSAodCkgewoJCXNpZyA9IHBrdGdlbl93YWl0X3RocmVhZF9ydW4odCk7CgkJaWYoIHNpZyA9PSAwICkgYnJlYWs7CgkJdGhyZWFkX2xvY2soKTsKCQl0PXQtPm5leHQ7CgkJdGhyZWFkX3VubG9jaygpOwoJfQoJaWYoc2lnID09IDApIHsKCQl0aHJlYWRfbG9jaygpOwoJCXdoaWxlICh0KSB7CgkJCXQtPmNvbnRyb2wgfD0gKFRfU1RPUCk7CgkJCXQ9dC0+bmV4dDsKCQl9CgkJdGhyZWFkX3VubG9jaygpOwoJfQoJcmV0dXJuIHNpZzsKfQoKc3RhdGljIHZvaWQgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcyh2b2lkKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bl9hbGxfdGhyZWFkcy5cbiIpKTsKCgl0aHJlYWRfbG9jaygpOwoKCXdoaWxlKHQpIHsKCQl0LT5jb250cm9sIHw9IChUX1JVTik7CgkJdCA9IHQtPm5leHQ7Cgl9Cgl0aHJlYWRfdW5sb2NrKCk7CgoJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTI1KSk7ICAvKiBQcm9wYWdhdGUgdGhyZWFkLT5jb250cm9sICAqLwoJCQkKCXBrdGdlbl93YWl0X2FsbF90aHJlYWRzX3J1bigpOwp9CgoKc3RhdGljIHZvaWQgc2hvd19yZXN1bHRzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2LCBpbnQgbnJfZnJhZ3MpCnsKICAgICAgIF9fdTY0IHRvdGFsX3VzLCBicHMsIG1icHMsIHBwcywgaWRsZTsKICAgICAgIGNoYXIgKnAgPSBwa3RfZGV2LT5yZXN1bHQ7CgogICAgICAgdG90YWxfdXMgPSBwa3RfZGV2LT5zdG9wcGVkX2F0IC0gcGt0X2Rldi0+c3RhcnRlZF9hdDsKCiAgICAgICBpZGxlID0gcGt0X2Rldi0+aWRsZV9hY2M7CgogICAgICAgcCArPSBzcHJpbnRmKHAsICJPSzogJWxsdShjJWxsdStkJWxsdSkgdXNlYywgJWxsdSAoJWRieXRlLCVkZnJhZ3MpXG4iLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvdGFsX3VzLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykodG90YWxfdXMgLSBpZGxlKSwgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlkbGUsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+c29mYXIsIAoJCSAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUsIG5yX2ZyYWdzKTsKCiAgICAgICBwcHMgPSBwa3RfZGV2LT5zb2ZhciAqIFVTRUNfUEVSX1NFQzsKCiAgICAgICB3aGlsZSAoKHRvdGFsX3VzID4+IDMyKSAhPSAwKSB7CiAgICAgICAgICAgICAgIHBwcyA+Pj0gMTsKICAgICAgICAgICAgICAgdG90YWxfdXMgPj49IDE7CiAgICAgICB9CgogICAgICAgZG9fZGl2KHBwcywgdG90YWxfdXMpOwogICAgICAgCiAgICAgICBicHMgPSBwcHMgKiA4ICogcGt0X2Rldi0+Y3VyX3BrdF9zaXplOwoKICAgICAgIG1icHMgPSBicHM7CiAgICAgICBkb19kaXYobWJwcywgMTAwMDAwMCk7CiAgICAgICBwICs9IHNwcmludGYocCwgIiAgJWxsdXBwcyAlbGx1TWIvc2VjICglbGx1YnBzKSBlcnJvcnM6ICVsbHUiLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBwcywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1icHMsIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBicHMsIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5lcnJvcnMpOwp9CiAKCi8qIFNldCBzdG9wcGVkLWF0IHRpbWVyLCByZW1vdmUgZnJvbSBydW5uaW5nIGxpc3QsIGRvIGNvdW50ZXJzICYgc3RhdGlzdGljcyAqLwoKc3RhdGljIGludCBwa3RnZW5fc3RvcF9kZXZpY2Uoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CgkKICAgICAgICBpZiAoIXBrdF9kZXYtPnJ1bm5pbmcpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBpbnRlcmZhY2U6ICVzIGlzIGFscmVhZHkgc3RvcHBlZFxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCiAgICAgICAgcGt0X2Rldi0+c3RvcHBlZF9hdCA9IGdldEN1clVzKCk7CiAgICAgICAgcGt0X2Rldi0+cnVubmluZyA9IDA7CgoJc2hvd19yZXN1bHRzKHBrdF9kZXYsIHNrYl9zaGluZm8ocGt0X2Rldi0+c2tiKS0+bnJfZnJhZ3MpOwoKCWlmIChwa3RfZGV2LT5za2IpIAoJCWtmcmVlX3NrYihwa3RfZGV2LT5za2IpOwoKCXBrdF9kZXYtPnNrYiA9IE5VTEw7CgkKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpuZXh0X3RvX3J1bihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCApCnsKCXN0cnVjdCBwa3RnZW5fZGV2ICpuZXh0LCAqYmVzdCA9IE5VTEw7CiAgICAgICAgCglpZl9sb2NrKHQpOwoKCWZvcihuZXh0PXQtPmlmX2xpc3Q7IG5leHQgOyBuZXh0PW5leHQtPm5leHQpIHsKCQlpZighbmV4dC0+cnVubmluZykgY29udGludWU7CgkJaWYoYmVzdCA9PSBOVUxMKSBiZXN0PW5leHQ7CgkJZWxzZSBpZiAoIG5leHQtPm5leHRfdHhfdXMgPCBiZXN0LT5uZXh0X3R4X3VzKSAKCQkJYmVzdCA9ICBuZXh0OwoJfQoJaWZfdW5sb2NrKHQpOwogICAgICAgIHJldHVybiBiZXN0Owp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgewogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpuZXh0ID0gTlVMTDsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3AuXG4iKSk7CgogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIGZvcihuZXh0PXQtPmlmX2xpc3Q7IG5leHQ7IG5leHQ9bmV4dC0+bmV4dCkKICAgICAgICAgICAgICAgIHBrdGdlbl9zdG9wX2RldmljZShuZXh0KTsKCiAgICAgICAgaWZfdW5sb2NrKHQpOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fcmVtX2FsbF9pZnMoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpIAp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKmN1ciwgKm5leHQgPSBOVUxMOwogICAgICAgIAogICAgICAgIC8qIFJlbW92ZSBhbGwgZGV2aWNlcywgZnJlZSBtZW0gKi8KIAogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIGZvcihjdXI9dC0+aWZfbGlzdDsgY3VyOyBjdXI9bmV4dCkgeyAKCQluZXh0ID0gY3VyLT5uZXh0OwoJCXBrdGdlbl9yZW1vdmVfZGV2aWNlKHQsIGN1cik7Cgl9CgogICAgICAgIGlmX3VubG9jayh0KTsKfQoKc3RhdGljIHZvaWQgcGt0Z2VuX3JlbV90aHJlYWQoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpIAp7CiAgICAgICAgLyogUmVtb3ZlIGZyb20gdGhlIHRocmVhZCBsaXN0ICovCgoJc3RydWN0IHBrdGdlbl90aHJlYWQgKnRtcCA9IHBrdGdlbl90aHJlYWRzOwoKICAgICAgICBpZiAoc3RybGVuKHQtPmZuYW1lKSkKICAgICAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KHQtPmZuYW1lLCBOVUxMKTsKCiAgICAgICB0aHJlYWRfbG9jaygpOwoKCWlmICh0bXAgPT0gdCkKCQlwa3RnZW5fdGhyZWFkcyA9IHRtcC0+bmV4dDsKCWVsc2UgewoJCXdoaWxlICh0bXApIHsKCQkJaWYgKHRtcC0+bmV4dCA9PSB0KSB7CgkJCQl0bXAtPm5leHQgPSB0LT5uZXh0OwoJCQkJdC0+bmV4dCA9IE5VTEw7CgkJCQlicmVhazsKCQkJfQoJCQl0bXAgPSB0bXAtPm5leHQ7CgkJfQoJfQogICAgICAgIHRocmVhZF91bmxvY2soKTsKfQoKc3RhdGljIF9faW5saW5lX18gdm9pZCBwa3RnZW5feG1pdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYgPSBOVUxMOwoJX191NjQgaWRsZV9zdGFydCA9IDA7CglpbnQgcmV0OwoKCW9kZXYgPSBwa3RfZGV2LT5vZGV2OwoJCglpZiAocGt0X2Rldi0+ZGVsYXlfdXMgfHwgcGt0X2Rldi0+ZGVsYXlfbnMpIHsKCQl1NjQgbm93OwoKCQlub3cgPSBnZXRDdXJVcygpOwoJCWlmIChub3cgPCBwa3RfZGV2LT5uZXh0X3R4X3VzKQoJCQlzcGluKHBrdF9kZXYsIHBrdF9kZXYtPm5leHRfdHhfdXMpOwoKCQkvKiBUaGlzIGlzIG1heCBERUxBWSwgdGhpcyBoYXMgc3BlY2lhbCBtZWFuaW5nIG9mCgkJICogIm5ldmVyIHRyYW5zbWl0IgoJCSAqLwoJCWlmIChwa3RfZGV2LT5kZWxheV91cyA9PSAweDdGRkZGRkZGKSB7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpICsgcGt0X2Rldi0+ZGVsYXlfdXM7CgkJCXBrdF9kZXYtPm5leHRfdHhfbnMgPSBwa3RfZGV2LT5kZWxheV9uczsKCQkJZ290byBvdXQ7CgkJfQoJfQoJCglpZiAobmV0aWZfcXVldWVfc3RvcHBlZChvZGV2KSB8fCBuZWVkX3Jlc2NoZWQoKSkgewoJCWlkbGVfc3RhcnQgPSBnZXRDdXJVcygpOwoJCQoJCWlmICghbmV0aWZfcnVubmluZyhvZGV2KSkgewoJCQlwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CgkJCWdvdG8gb3V0OwoJCX0KCQlpZiAobmVlZF9yZXNjaGVkKCkpIAoJCQlzY2hlZHVsZSgpOwoJCQoJCXBrdF9kZXYtPmlkbGVfYWNjICs9IGdldEN1clVzKCkgLSBpZGxlX3N0YXJ0OwoJCQoJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpKSB7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOyAvKiBUT0RPICovCgkJCXBrdF9kZXYtPm5leHRfdHhfbnMgPSAwOwoJCQlnb3RvIG91dDsgLyogVHJ5IHRoZSBuZXh0IGludGVyZmFjZSAqLwoJCX0KCX0KCQoJaWYgKHBrdF9kZXYtPmxhc3Rfb2sgfHwgIXBrdF9kZXYtPnNrYikgewoJCWlmICgoKytwa3RfZGV2LT5jbG9uZV9jb3VudCA+PSBwa3RfZGV2LT5jbG9uZV9za2IgKSB8fCAoIXBrdF9kZXYtPnNrYikpIHsKCQkJLyogYnVpbGQgYSBuZXcgcGt0ICovCgkJCWlmIChwa3RfZGV2LT5za2IpIAoJCQkJa2ZyZWVfc2tiKHBrdF9kZXYtPnNrYik7CgkJCQoJCQlwa3RfZGV2LT5za2IgPSBmaWxsX3BhY2tldChvZGV2LCBwa3RfZGV2KTsKCQkJaWYgKHBrdF9kZXYtPnNrYiA9PSBOVUxMKSB7CgkJCQlwcmludGsoInBrdGdlbjogRVJST1I6IGNvdWxkbid0IGFsbG9jYXRlIHNrYiBpbiBmaWxsX3BhY2tldC5cbiIpOwoJCQkJc2NoZWR1bGUoKTsKCQkJCXBrdF9kZXYtPmNsb25lX2NvdW50LS07IC8qIGJhY2sgb3V0IGluY3JlbWVudCwgT09NICovCgkJCQlnb3RvIG91dDsKCQkJfQoJCQlwa3RfZGV2LT5hbGxvY2F0ZWRfc2ticysrOwoJCQlwa3RfZGV2LT5jbG9uZV9jb3VudCA9IDA7IC8qIHJlc2V0IGNvdW50ZXIgKi8KCQl9Cgl9CgkKCXNwaW5fbG9ja19iaCgmb2Rldi0+eG1pdF9sb2NrKTsKCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChvZGV2KSkgewoKCQlhdG9taWNfaW5jKCYocGt0X2Rldi0+c2tiLT51c2VycykpOwpyZXRyeV9ub3c6CgkJcmV0ID0gb2Rldi0+aGFyZF9zdGFydF94bWl0KHBrdF9kZXYtPnNrYiwgb2Rldik7CgkJaWYgKGxpa2VseShyZXQgPT0gTkVUREVWX1RYX09LKSkgewoJCQlwa3RfZGV2LT5sYXN0X29rID0gMTsgICAgCgkJCXBrdF9kZXYtPnNvZmFyKys7CgkJCXBrdF9kZXYtPnNlcV9udW0rKzsKCQkJcGt0X2Rldi0+dHhfYnl0ZXMgKz0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplOwoJCQkKCQl9IGVsc2UgaWYgKHJldCA9PSBORVRERVZfVFhfTE9DS0VEIAoJCQkgICAmJiAob2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xMVFgpKSB7CgkJCWNwdV9yZWxheCgpOwoJCQlnb3RvIHJldHJ5X25vdzsKCQl9IGVsc2UgeyAgLyogUmV0cnkgaXQgbmV4dCB0aW1lICovCgkJCQoJCQlhdG9taWNfZGVjKCYocGt0X2Rldi0+c2tiLT51c2VycykpOwoJCQkKCQkJaWYgKGRlYnVnICYmIG5ldF9yYXRlbGltaXQoKSkKCQkJCXByaW50ayhLRVJOX0lORk8gInBrdGdlbjogSGFyZCB4bWl0IGVycm9yXG4iKTsKCQkJCgkJCXBrdF9kZXYtPmVycm9ycysrOwoJCQlwa3RfZGV2LT5sYXN0X29rID0gMDsKCQl9CgoJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOwoJCXBrdF9kZXYtPm5leHRfdHhfbnMgPSAwOwoKCQlwa3RfZGV2LT5uZXh0X3R4X3VzICs9IHBrdF9kZXYtPmRlbGF5X3VzOwoJCXBrdF9kZXYtPm5leHRfdHhfbnMgKz0gcGt0X2Rldi0+ZGVsYXlfbnM7CgoJCWlmIChwa3RfZGV2LT5uZXh0X3R4X25zID4gMTAwMCkgewoJCQlwa3RfZGV2LT5uZXh0X3R4X3VzKys7CgkJCXBrdF9kZXYtPm5leHRfdHhfbnMgLT0gMTAwMDsKCQl9Cgl9IAoKCWVsc2UgeyAgLyogUmV0cnkgaXQgbmV4dCB0aW1lICovCiAgICAgICAgICAgICAgICBwa3RfZGV2LT5sYXN0X29rID0gMDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOyAvKiBUT0RPICovCgkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CiAgICAgICAgfQoKCXNwaW5fdW5sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOwoJCgkvKiBJZiBwa3RfZGV2LT5jb3VudCBpcyB6ZXJvLCB0aGVuIHJ1biBmb3JldmVyICovCglpZiAoKHBrdF9kZXYtPmNvdW50ICE9IDApICYmIChwa3RfZGV2LT5zb2ZhciA+PSBwa3RfZGV2LT5jb3VudCkpIHsKCQlpZiAoYXRvbWljX3JlYWQoJihwa3RfZGV2LT5za2ItPnVzZXJzKSkgIT0gMSkgewoJCQlpZGxlX3N0YXJ0ID0gZ2V0Q3VyVXMoKTsKCQkJd2hpbGUgKGF0b21pY19yZWFkKCYocGt0X2Rldi0+c2tiLT51c2VycykpICE9IDEpIHsKCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc2NoZWR1bGUoKTsKCQkJfQoJCQlwa3RfZGV2LT5pZGxlX2FjYyArPSBnZXRDdXJVcygpIC0gaWRsZV9zdGFydDsKCQl9CiAgICAgICAgICAgICAgICAKCQkvKiBEb25lIHdpdGggdGhpcyAqLwoJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKCX0gCiBvdXQ6OwogfQoKLyogCiAqIE1haW4gbG9vcCBvZiB0aGUgdGhyZWFkIGdvZXMgaGVyZQogKi8KCnN0YXRpYyB2b2lkIHBrdGdlbl90aHJlYWRfd29ya2VyKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSAKewoJREVGSU5FX1dBSVQod2FpdCk7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoJaW50IGNwdSA9IHQtPmNwdTsKCXNpZ3NldF90IHRtcHNpZzsKCXUzMiBtYXhfYmVmb3JlX3NvZnRpcnE7CiAgICAgICAgdTMyIHR4X3NpbmNlX3NvZnRpcnEgPSAwOwoKCWRhZW1vbml6ZSgicGt0Z2VuLyVkIiwgY3B1KTsKCiAgICAgICAgLyogQmxvY2sgYWxsIHNpZ25hbHMgZXhjZXB0IFNJR0tJTEwsIFNJR1NUT1AgYW5kIFNJR1RFUk0gKi8KCiAgICAgICAgc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAgICAgICAgdG1wc2lnID0gY3VycmVudC0+YmxvY2tlZDsKICAgICAgICBzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCAKICAgICAgICAgICAgICAgICAgICAgIHNpZ21hc2soU0lHS0lMTCkgfCAKICAgICAgICAgICAgICAgICAgICAgIHNpZ21hc2soU0lHU1RPUCl8IAogICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdURVJNKSk7CgogICAgICAgIHJlY2FsY19zaWdwZW5kaW5nKCk7CiAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCgkvKiBNaWdyYXRlIHRvIHRoZSByaWdodCBDUFUgKi8KCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CiAgICAgICAgaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpCiAgICAgICAgICAgICAgICBCVUcoKTsKCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0LT5xdWV1ZSk7CgoJdC0+Y29udHJvbCAmPSB+KFRfVEVSTUlOQVRFKTsKCXQtPmNvbnRyb2wgJj0gfihUX1JVTik7Cgl0LT5jb250cm9sICY9IH4oVF9TVE9QKTsKCXQtPmNvbnRyb2wgJj0gfihUX1JFTURFVik7CgogICAgICAgIHQtPnBpZCA9IGN1cnJlbnQtPnBpZDsgICAgICAgIAoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogc3RhcnRpbmcgcGt0Z2VuLyVkOiAgcGlkPSVkXG4iLCBjcHUsIGN1cnJlbnQtPnBpZCkpOwoKCW1heF9iZWZvcmVfc29mdGlycSA9IHQtPm1heF9iZWZvcmVfc29mdGlycTsKICAgICAgICAKICAgICAgICBfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAgICAgICAgbWIoKTsKCiAgICAgICAgd2hpbGUgKDEpIHsKCQkKCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CgoJCS8qCgkJICogR2V0IG5leHQgZGV2IHRvIHhtaXQgLS0gaWYgYW55LgoJCSAqLwoKICAgICAgICAgICAgICAgIHBrdF9kZXYgPSBuZXh0X3RvX3J1bih0KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYpIHsKCgkJCXBrdGdlbl94bWl0KHBrdF9kZXYpOwoKCQkJLyoKCQkJICogV2UgbGlrZSB0byBzdGF5IFJVTk5JTkcgYnV0IG11c3QgYWxzbyBnaXZlCgkJCSAqIG90aGVycyBmYWlyIHNoYXJlLgoJCQkgKi8KCgkJCXR4X3NpbmNlX3NvZnRpcnEgKz0gcGt0X2Rldi0+bGFzdF9vazsKCgkJCWlmICh0eF9zaW5jZV9zb2Z0aXJxID4gbWF4X2JlZm9yZV9zb2Z0aXJxKSB7CgkJCQlpZiAobG9jYWxfc29mdGlycV9wZW5kaW5nKCkpCgkJCQkJZG9fc29mdGlycSgpOwoJCQkJdHhfc2luY2Vfc29mdGlycSA9IDA7CgkJCX0KCQl9IGVsc2UgewoJCQlwcmVwYXJlX3RvX3dhaXQoJih0LT5xdWV1ZSksICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwoJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKCQkJZmluaXNoX3dhaXQoJih0LT5xdWV1ZSksICZ3YWl0KTsKCQl9CgogICAgICAgICAgICAgICAgLyogCgkJICogQmFjayBmcm9tIHNsZWVwLCBlaXRoZXIgZHVlIHRvIHRoZSB0aW1lb3V0IG9yIHNpZ25hbC4KCQkgKiBXZSBjaGVjayBpZiB3ZSBoYXZlIGFueSAicG9zdGVkIiB3b3JrIGZvciB1cy4KCQkgKi8KCiAgICAgICAgICAgICAgICBpZiAodC0+Y29udHJvbCAmIFRfVEVSTUlOQVRFIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSBvdXJzZWxmICovCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQoKCQlpZih0LT5jb250cm9sICYgVF9TVE9QKSB7CgkJCXBrdGdlbl9zdG9wKHQpOwoJCQl0LT5jb250cm9sICY9IH4oVF9TVE9QKTsKCQl9CgoJCWlmKHQtPmNvbnRyb2wgJiBUX1JVTikgewoJCQlwa3RnZW5fcnVuKHQpOwoJCQl0LT5jb250cm9sICY9IH4oVF9SVU4pOwoJCX0KCgkJaWYodC0+Y29udHJvbCAmIFRfUkVNREVWKSB7CgkJCXBrdGdlbl9yZW1fYWxsX2lmcyh0KTsKCQkJdC0+Y29udHJvbCAmPSB+KFRfUkVNREVWKTsKCQl9CgoJCWlmIChuZWVkX3Jlc2NoZWQoKSkgCgkJCXNjaGVkdWxlKCk7CiAgICAgICAgfSAKCiAgICAgICAgUEdfREVCVUcocHJpbnRrKCJwa3RnZW46ICVzIHN0b3BwaW5nIGFsbCBkZXZpY2VcbiIsIHQtPm5hbWUpKTsKICAgICAgICBwa3RnZW5fc3RvcCh0KTsKCiAgICAgICAgUEdfREVCVUcocHJpbnRrKCJwa3RnZW46ICVzIHJlbW92aW5nIGFsbCBkZXZpY2VcbiIsIHQtPm5hbWUpKTsKICAgICAgICBwa3RnZW5fcmVtX2FsbF9pZnModCk7CgogICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyByZW1vdmluZyB0aHJlYWQuXG4iLCB0LT5uYW1lKSk7CiAgICAgICAgcGt0Z2VuX3JlbV90aHJlYWQodCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX2ZpbmRfZGV2KHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBjb25zdCBjaGFyKiBpZm5hbWUpIAp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwogICAgICAgIGlmX2xvY2sodCk7CgogICAgICAgIGZvcihwa3RfZGV2PXQtPmlmX2xpc3Q7IHBrdF9kZXY7IHBrdF9kZXYgPSBwa3RfZGV2LT5uZXh0ICkgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwa3RfZGV2LT5pZm5hbWUsIGlmbmFtZSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmX3VubG9jayh0KTsKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBmaW5kX2RldiglcykgcmV0dXJuaW5nICVwXG4iLCBpZm5hbWUscGt0X2RldikpOwogICAgICAgIHJldHVybiBwa3RfZGV2Owp9CgovKiAKICogQWRkcyBhIGRldiBhdCBmcm9udCBvZiBpZl9saXN0LiAKICovCgpzdGF0aWMgaW50IGFkZF9kZXZfdG9fdGhyZWFkKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCWludCBydiA9IDA7CgkKICAgICAgICBpZl9sb2NrKHQpOwoKICAgICAgICBpZiAocGt0X2Rldi0+cGdfdGhyZWFkKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6ICBhbHJlYWR5IGFzc2lnbmVkIHRvIGEgdGhyZWFkLlxuIik7CiAgICAgICAgICAgICAgICBydiA9IC1FQlVTWTsKICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgIH0KCXBrdF9kZXYtPm5leHQgPXQtPmlmX2xpc3Q7IHQtPmlmX2xpc3Q9cGt0X2RldjsKICAgICAgICBwa3RfZGV2LT5wZ190aHJlYWQgPSB0OwoJcGt0X2Rldi0+cnVubmluZyA9IDA7Cgogb3V0OgogICAgICAgIGlmX3VubG9jayh0KTsgICAgICAgIAogICAgICAgIHJldHVybiBydjsKfQoKLyogQ2FsbGVkIHVuZGVyIHRocmVhZCBsb2NrICovCgpzdGF0aWMgaW50IHBrdGdlbl9hZGRfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBjb25zdCBjaGFyKiBpZm5hbWUpIAp7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CgkKCS8qIFdlIGRvbid0IGFsbG93IGEgZGV2aWNlIHRvIGJlIG9uIHNldmVyYWwgdGhyZWFkcyAqLwoKCWlmKCAocGt0X2RldiA9IF9fcGt0Z2VuX05OX3RocmVhZHMoaWZuYW1lLCBGSU5EKSkgPT0gTlVMTCkgewoJCQkJCQkgICAKCQlwa3RfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBrdGdlbl9kZXYpLCBHRlBfS0VSTkVMKTsKICAgICAgICAgICAgICAgIGlmICghcGt0X2RldikgCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwoKICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LCAwLCBzaXplb2Yoc3RydWN0IHBrdGdlbl9kZXYpKTsKCgkJcGt0X2Rldi0+Zmxvd3MgPSB2bWFsbG9jKE1BWF9DRkxPV1Mqc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRlKSk7CgkJaWYgKHBrdF9kZXYtPmZsb3dzID09IE5VTEwpIHsKCQkJa2ZyZWUocGt0X2Rldik7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQltZW1zZXQocGt0X2Rldi0+Zmxvd3MsIDAsIE1BWF9DRkxPV1Mqc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRlKSk7CgoJCXBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA9IEVUSF9aTEVOOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+bWF4X3BrdF9zaXplID0gRVRIX1pMRU47CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5uZnJhZ3MgPSAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+Y2xvbmVfc2tiID0gcGdfY2xvbmVfc2tiX2Q7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5kZWxheV91cyA9IHBnX2RlbGF5X2QgLyAxMDAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+ZGVsYXlfbnMgPSBwZ19kZWxheV9kICUgMTAwMDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmNvdW50ID0gcGdfY291bnRfZDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNvZmFyID0gMDsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWluID0gOTsgLyogc2luayBwb3J0ICovCiAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21heCA9IDk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21pbiA9IDk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21heCA9IDk7CgogICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5pZm5hbWUsIGlmbmFtZSwgMzEpOwogICAgICAgICAgICAgICAgc3ByaW50Zihwa3RfZGV2LT5mbmFtZSwgIm5ldC8lcy8lcyIsIFBHX1BST0NfRElSLCBpZm5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICghIHBrdGdlbl9zZXR1cF9kZXYocGt0X2RldikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RnZW5fc2V0dXBfZGV2IGZhaWxlZC5cbiIpOwoJCQlpZiAocGt0X2Rldi0+Zmxvd3MpCgkJCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHBrdF9kZXYpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KHBrdF9kZXYtPmZuYW1lLCAwNjAwLCBOVUxMKTsKICAgICAgICAgICAgICAgIGlmICghcGt0X2Rldi0+cHJvY19lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgcGt0X2Rldi0+Zm5hbWUpOwoJCQlpZiAocGt0X2Rldi0+Zmxvd3MpCgkJCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHBrdF9kZXYpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBrdF9kZXYtPnByb2NfZW50LT5yZWFkX3Byb2MgPSBwcm9jX2lmX3JlYWQ7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+d3JpdGVfcHJvYyA9IHByb2NfaWZfd3JpdGU7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+ZGF0YSA9ICh2b2lkKikocGt0X2Rldik7CgkJcGt0X2Rldi0+cHJvY19lbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CgogICAgICAgICAgICAgICAgcmV0dXJuIGFkZF9kZXZfdG9fdGhyZWFkKHQsIHBrdF9kZXYpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogaW50ZXJmYWNlIGFscmVhZHkgdXNlZC5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICB9Cn0KCnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGt0Z2VuX2ZpbmRfdGhyZWFkKGNvbnN0IGNoYXIqIG5hbWUpIAp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBOVUxMOwoKICAgICAgIHRocmVhZF9sb2NrKCk7CgogICAgICAgIHQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICB3aGlsZSAodCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgdCA9IHQtPm5leHQ7CiAgICAgICAgfQogICAgICAgIHRocmVhZF91bmxvY2soKTsKICAgICAgICByZXR1cm4gdDsKfQoKc3RhdGljIGludCBwa3RnZW5fY3JlYXRlX3RocmVhZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgY3B1KSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKCiAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA+IDMxKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6ICBUaHJlYWQgbmFtZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDMxIGNoYXJhY3RlcnMuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAocGt0Z2VuX2ZpbmRfdGhyZWFkKG5hbWUpKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IHRocmVhZDogJXMgYWxyZWFkeSBleGlzdHNcbiIsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICB0ID0gKHN0cnVjdCBwa3RnZW5fdGhyZWFkKikoa21hbGxvYyhzaXplb2Yoc3RydWN0IHBrdGdlbl90aHJlYWQpLCBHRlBfS0VSTkVMKSk7CiAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IG91dCBvZiBtZW1vcnksIGNhbid0IGNyZWF0ZSBuZXcgdGhyZWFkLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICB9CgogICAgICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc3RydWN0IHBrdGdlbl90aHJlYWQpKTsKICAgICAgICBzdHJjcHkodC0+bmFtZSwgbmFtZSk7CiAgICAgICAgc3Bpbl9sb2NrX2luaXQoJnQtPmlmX2xvY2spOwoJdC0+Y3B1ID0gY3B1OwogICAgICAgIAogICAgICAgIHNwcmludGYodC0+Zm5hbWUsICJuZXQvJXMvJXMiLCBQR19QUk9DX0RJUiwgdC0+bmFtZSk7CiAgICAgICAgdC0+cHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeSh0LT5mbmFtZSwgMDYwMCwgTlVMTCk7CiAgICAgICAgaWYgKCF0LT5wcm9jX2VudCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgdC0+Zm5hbWUpOwogICAgICAgICAgICAgICAga2ZyZWUodCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICB9CiAgICAgICAgdC0+cHJvY19lbnQtPnJlYWRfcHJvYyA9IHByb2NfdGhyZWFkX3JlYWQ7CiAgICAgICAgdC0+cHJvY19lbnQtPndyaXRlX3Byb2MgPSBwcm9jX3RocmVhZF93cml0ZTsKICAgICAgICB0LT5wcm9jX2VudC0+ZGF0YSA9ICh2b2lkKikodCk7CiAgICAgICAgdC0+cHJvY19lbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CgogICAgICAgIHQtPm5leHQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICBwa3RnZW5fdGhyZWFkcyA9IHQ7CgoJaWYgKGtlcm5lbF90aHJlYWQoKHZvaWQgKikgcGt0Z2VuX3RocmVhZF93b3JrZXIsICh2b2lkICopIHQsIAoJCQkgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBDTE9ORV9TSUdIQU5EKSA8IDApCgkJcHJpbnRrKCJwa3RnZW46IGtlcm5lbF90aHJlYWQoKSBmYWlsZWQgZm9yIGNwdSAlZFxuIiwgdC0+Y3B1KTsKCglyZXR1cm4gMDsKfQoKLyogCiAqIFJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgdGhyZWFkIGlmX2xpc3QuIAogKi8Kc3RhdGljIHZvaWQgX3JlbV9kZXZfZnJvbV9pZl9saXN0KHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCXN0cnVjdCBwa3RnZW5fZGV2ICppLCAqcHJldiA9IE5VTEw7CgoJaSA9IHQtPmlmX2xpc3Q7CgoJd2hpbGUoaSkgewoJCWlmKGkgPT0gcGt0X2RldikgewoJCQlpZihwcmV2KSBwcmV2LT5uZXh0ID0gaS0+bmV4dDsKCQkJZWxzZSB0LT5pZl9saXN0ID0gTlVMTDsKCQkJYnJlYWs7CgkJfQoJCXByZXYgPSBpOwoJCWk9aS0+bmV4dDsKCX0KfQoKc3RhdGljIGludCBwa3RnZW5fcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IHJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2RldikpOwoKICAgICAgICBpZiAocGt0X2Rldi0+cnVubmluZykgeyAKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOldBUk5JTkc6IHRyeWluZyB0byByZW1vdmUgYSBydW5uaW5nIGludGVyZmFjZSwgc3RvcHBpbmcgaXQgbm93LlxuIik7CiAgICAgICAgICAgICAgICBwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIERpcy1hc3NvY2lhdGUgZnJvbSB0aGUgaW50ZXJmYWNlICovCgoJaWYgKHBrdF9kZXYtPm9kZXYpIHsKCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+b2RldiA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIAoJLyogQW5kIHVwZGF0ZSB0aGUgdGhyZWFkIGlmX2xpc3QgKi8KCglfcmVtX2Rldl9mcm9tX2lmX2xpc3QodCwgcGt0X2Rldik7CgogICAgICAgIC8qIENsZWFuIHVwIHByb2MgZmlsZSBzeXN0ZW0gKi8KCiAgICAgICAgaWYgKHN0cmxlbihwa3RfZGV2LT5mbmFtZSkpIAogICAgICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkocGt0X2Rldi0+Zm5hbWUsIE5VTEwpOwoKCWlmIChwa3RfZGV2LT5mbG93cykKCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CglrZnJlZShwa3RfZGV2KTsKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2luaXQgcGdfaW5pdCh2b2lkKSAKewoJaW50IGNwdTsKCXByaW50ayh2ZXJzaW9uKTsKCiAgICAgICAgbW9kdWxlX2ZuYW1lWzBdID0gMDsKCgljcmVhdGVfcHJvY19kaXIoKTsKCiAgICAgICAgc3ByaW50Zihtb2R1bGVfZm5hbWUsICJuZXQvJXMvcGdjdHJsIiwgUEdfUFJPQ19ESVIpOwogICAgICAgIG1vZHVsZV9wcm9jX2VudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KG1vZHVsZV9mbmFtZSwgMDYwMCwgTlVMTCk7CiAgICAgICAgaWYgKCFtb2R1bGVfcHJvY19lbnQpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogY2Fubm90IGNyZWF0ZSAlcyBwcm9jZnMgZW50cnkuXG4iLCBtb2R1bGVfZm5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICBtb2R1bGVfcHJvY19lbnQtPnByb2NfZm9wcyA9ICAmcGt0Z2VuX2ZvcHM7CiAgICAgICAgbW9kdWxlX3Byb2NfZW50LT5kYXRhID0gTlVMTDsKCgkvKiBSZWdpc3RlciB1cyB0byByZWNlaXZlIG5ldGRldmljZSBldmVudHMgKi8KCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcGt0Z2VuX25vdGlmaWVyX2Jsb2NrKTsKICAgICAgICAKCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUyA7IGNwdSsrKSB7CgkJY2hhciBidWZbMzBdOwoKCQlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKCQkJY29udGludWU7CgogICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJrcGt0Z2VuZF8laSIsIGNwdSk7CiAgICAgICAgICAgICAgICBwa3RnZW5fY3JlYXRlX3RocmVhZChidWYsIGNwdSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOyAgICAgICAgCn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBwZ19jbGVhbnVwKHZvaWQpCnsKCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOwoKICAgICAgICAvKiBTdG9wIGFsbCBpbnRlcmZhY2VzICYgdGhyZWFkcyAqLyAgICAgICAgCgogICAgICAgIHdoaWxlIChwa3RnZW5fdGhyZWFkcykgewogICAgICAgICAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICAgICAgICAgIHBrdGdlbl90aHJlYWRzLT5jb250cm9sIHw9IChUX1RFUk1JTkFURSk7CgoJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHF1ZXVlLCAodCAhPSBwa3RnZW5fdGhyZWFkcyksIEhaKTsKICAgICAgICB9CgogICAgICAgIC8qIFVuLXJlZ2lzdGVyIHVzIGZyb20gcmVjZWl2aW5nIG5ldGRldmljZSBldmVudHMgKi8KCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwa3RnZW5fbm90aWZpZXJfYmxvY2spOwoKICAgICAgICAvKiBDbGVhbiB1cCBwcm9jIGZpbGUgc3lzdGVtICovCgogICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KG1vZHVsZV9mbmFtZSwgTlVMTCk7CiAgICAgICAgCglyZW1vdmVfcHJvY19kaXIoKTsKfQoKCm1vZHVsZV9pbml0KHBnX2luaXQpOwptb2R1bGVfZXhpdChwZ19jbGVhbnVwKTsKCk1PRFVMRV9BVVRIT1IoIlJvYmVydCBPbHNzb24gPHJvYmVydC5vbHNzb25AaXRzLnV1LnNlIik7Ck1PRFVMRV9ERVNDUklQVElPTigiUGFja2V0IEdlbmVyYXRvciB0b29sIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKbW9kdWxlX3BhcmFtKHBnX2NvdW50X2QsIGludCwgMCk7Cm1vZHVsZV9wYXJhbShwZ19kZWxheV9kLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ocGdfY2xvbmVfc2tiX2QsIGludCwgMCk7Cm1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsK