Ly8gQ29weXJpZ2h0IChjKSAyMDEyIEdDVCBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCiNpZiAhZGVmaW5lZChHQ1RUWVBFX0hfMjAxMDAzMTApCiNkZWZpbmUgR0NUVFlQRV9IXzIwMTAwMzEwCgojaW5jbHVkZSAiV2lNYXhUeXBlLmgiCgojaWYgIWRlZmluZWQoU0RLX1RZUEVERUYpCiNkZWZpbmUgU0RLX1RZUEVERUYKI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQp0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sOwojZW5kaWYKdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1ODsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdTE2Owp0eXBlZGVmIHVuc2lnbmVkIGludAkJdTMyOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1NjQ7CnR5cGVkZWYJc2lnbmVkIGNoYXIJCQlzODsKdHlwZWRlZiBzaWduZWQgc2hvcnQJCXMxNjsKdHlwZWRlZiBpbnQJCQkJczMyOwp0eXBlZGVmIGxvbmcgbG9uZwkJCXM2NDsKI2lmIDEKdHlwZWRlZiB3Y2hhcl90CQkJCXVjaGFyOwojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1Y2hhcjsKI2VuZGlmCiNlbmRpZgoKI2RlZmluZSBHQ1RfQVBJIAojZGVmaW5lIElOVkFMSURfR0hBTkRMRQkJMHgwMDAwMDAwMDAKCnR5cGVkZWYgZW51bSBfR0NUX0FQSV9SRVQKewoJR0NUX0FQSV9SRVRfRklSU1RfQ09NTU9OX0VSUk9SID0gMCwKCS8vLyBObyBlcnJvcnMKCUdDVF9BUElfUkVUX1NVQ0NFU1MsCgkvLy8gRmFpbCB0byBvYnRhaW4gcmVzdWx0cwoJR0NUX0FQSV9SRVRfRkFJTEVELAkKCS8vLyBCdWZmZXIgc2l6ZSBwYXNzIGluIHBhcmFtZXRlciBpcyB0b28gc21hbGwuCglHQ1RfQVBJX1JFVF9CVUZGRVJfU0laRV9UT09fU01BTEwsCQoJLy8vIEludmFsaWQgcHJpdmlsZWdlcyB0byBleGVjdXRlIHRoZSBjb21tYW5kCglHQ1RfQVBJX1JFVF9QRVJNSVNTSU9OX0RFTklFRCwJCgkvLy8gRGV2aWNlIHNwZWNpZmllZCBpcyBpbnZhbGlkLgoJR0NUX0FQSV9SRVRfSU5WQUxJRF9ERVZJQ0UsCQoJLy8vIEludmFsaWQgUGFyYW1ldGVyIFBhc3NlZAoJR0NUX0FQSV9SRVRfSU5WQUxJRF9QQVJBTUVURVIsCgkvLy8gQ2Fubm90IHBlcmZvcm0gdGhlIGNvbW1hbmQgbW9iaWxlIGNvbm5lY3Rpb24uCglHQ1RfQVBJX1JFVF9BTFJFQURZX0NPTk5FQ1RFRCwKCS8vLyBMaW5rIGlzIG5vdCBjb25uZWN0ZWQsIGNhbm5vdCBvYnRhaW4gcmVzdWx0LgoJR0NUX0FQSV9SRVRfTElOS19OT1RfQ09OTkVDVEVELAoJLy8vIENvbm5lY3Rpb24gdG8gdGhlIG5ldHdvcmsgaXMgcHJvaGliaXRlZAoJR0NUX0FQSV9SRVRfTkVUV09SS19QUk9ISUJJVEVELAoJLy8vIERldmljZSBzcGVjaWZpZWQgaXMgbWlzc2luZyBiZWNhdXNlIG9mIGp1c3QgYmVpbmcgcmVtb3ZlZCEKCUdDVF9BUElfUkVUX0RFVklDRV9NSVNTSU5HLAoJLy8vIFByb2ZpbGUgc3BlY2lmaWVkIGlzIGludmFsaWQuCglHQ1RfQVBJX1JFVF9JTlZBTElEX1BST0ZJTEUsCQoJLy8vIENvbm5lY3Rpb24gdG8gYSByb2FtaW5nIG5ldHdvcmsgaXMgbm90IGFsbG93ZWQuCglHQ1RfQVBJX1JFVF9ST0FNSU5HX05PVF9BTExPV0VELAkKCS8vLyBDb25uZWN0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKCUdDVF9BUElfUkVUX0NPTk5FQ1RJT05fSU5fUFJPR1JFU1MsCgkvLy8gRnVuY3Rpb24gbm90IGltcGxlbWVudGVkCglHQ1RfQVBJX1JFVF9OT1RfSU1QTEVNRU5URUQsCgkvLy8gU0RLIGlzIGJ1c3kKCUdDVF9BUElfUkVUX0JVU1ksCgoJLy8vIGxhc3QgZXJyb3IgY29kZQoJR0NUX0FQSV9SRVRfTEFTVF9DT01NT05fRVJST1IJCQkJCQkJCn0gR0NUX0FQSV9SRVQsICpQR0NUX0FQSV9SRVQ7Cgp0eXBlZGVmIHZvaWQgKiBBUElIQU5EOwoKdHlwZWRlZiBzdHJ1Y3QgR0RFVl9JRF9TIHsKCUFQSUhBTkQgYXBpSGFuZGxlOwoJdTggZGV2aWNlSW5kZXg7Cgp9IEdERVZfSUQsICpHREVWX0lEX1A7Cgp0eXBlZGVmIGVudW0gX0dDVF9XSU1BWF9TREtfTU9ERQp7CglHQ1RfV0lNQVhfU0RLX0VNQkVEREVEX0VBUF9FTkFCTEVEID0gKDE8PDApLAoJR0NUX1dJTUFYX1NES19PTUFfRE1fRU5BQkxFRCA9ICgxPDwxKSwKCUdDVF9XSU1BWF9TREtfTU9ERV9NQVgKCn0gR0NUX1dJTUFYX1NES19NT0RFOwoKdHlwZWRlZiBlbnVtIF9HQ1RfV0lNQVhfQVBJX09QRU5fTU9ERQp7CglHQ1RfV0lNQVhfQVBJX1BSSVZJTEVHRV9SRUFEX1dSSVRFID0gKDE8PDApLCAvKio8IFJlYWQgV3JpdGUgcHJpdmlsZWdlIGFjY2Vzcy4oZGVmYXVsdCkgKi8KCUdDVF9XSU1BWF9BUElfUFJJVklMRUdFX1JFQURfT05MWSA9ICgxPDwxKSwgIC8qKjwgUmVhZCBPbmx5IHByaXZpbGVnZSBhY2Nlc3MuICovCgkKCUdDVF9XSU1BWF9BUElfT1BFTl9NT0RFX05PUk1BTCA9ICgxPDwyKSwKCUdDVF9XSU1BWF9BUElfT1BFTl9NT0RFX0VORyA9ICgxPDwzKSwKCQoJR0NUX1dJTUFYX0FQSV9PUEVOX01PREVfTUFYCgp9IEdDVF9XSU1BWF9BUElfT1BFTl9NT0RFLCAqUEdDVF9XSU1BWF9BUElfT1BFTl9NT0RFOwoKCnR5cGVkZWYgc3RydWN0IF9HQ1RfV0lNQVhfQVBJX1BBUkFNIHsKCWNoYXIgbm9udm9sYXRpbGVfZGlyWzI1Nl07CgljaGFyIGxvZ19wYXRoWzI1Nl07CglpbnQgbG9nX2xldmVsOwoKfSBHQ1RfV0lNQVhfQVBJX1BBUkFNOwoKdHlwZWRlZiBlbnVtIF9HQ1RfQVBJX1BPV0VSX01PREUKewoJV2lNQVhQb3dlck1vZGVJZGxlLAoJV2lNQVhQb3dlck1vZGVTbGVlcCwKCVdpTUFYUG93ZXJNb2RlTm9ybWFsLAoKCVdpTUFYUG93ZXJNb2RlTWF4aW11bQoKfSBHQ1RfQVBJX1BPV0VSX01PREUsICpHQ1RfQVBJX1BPV0VSX01PREVfUDsKCnR5cGVkZWYgc3RydWN0IF9HQ1RfQVBJX05FSUdIQk9SX0xJU1QKewoJVUlOVDMyCXN0cnVjdHVyZVNpemU7CQkvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglVSU5UOAlic0lkWzZdOwkJCS8qKjwgQlMgSUQgb2YgdGhlIGN1cnJlbnQgc2VydmluZyBCUyBhcyByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrICovCglVSU5UOAlyc3NpOwkJCQkvKio8IFJTU0kgdmFsdWUgKi8KCVVJTlQ4CWNpbnI7CQkJCS8qKjwgQ0lOUiB2YWx1ZSAqLwoJVUlOVDgJcHJlYW1ibGU7CQkJLyoqIHByZWFtYmxlIHZhbHVlICovCgkvL1VJTlQxNglyb3VuZFRyaXBUaW1lOwkJLyoqIHJvdW5kIHRyaXAgdGltZSBmcm9tIHRoZSBiYXNlIHN0YXRpb24gbWVhc3VyZWQgaW4gbmFub3NlY29uZHMuICovICAgICAgICAgICAgICAgICAKCVVJTlQzMglmcmVxdWVuY3k7Cgp9IEdDVF9BUElfTkVJR0hCT1JfTElTVCwgKkdDVF9BUElfTkVJR0hCT1JfTElTVF9QOwoKdHlwZWRlZiBzdHJ1Y3QgZ2N0X2hhcnFfc3RhdGlzdGljc19zCnsKCVVJTlQzMiBOdW1EbEhhcnFSZXRyeVs4XTsKCVVJTlQzMiBOdW1VbEhhcnFSZXRyeVs4XTsKCn0gZ2N0X2hhcnFfc3RhdGlzdGljc190OwoKdHlwZWRlZiBzdHJ1Y3QgZ2N0X21jc19zdGF0c19zIHsKCVVJTlQ4IE1vZHVsYXRpb25GRUM7CglVSU5UOCBSZXBldGl0aW9uQ29kZTsKCVVJTlQ4IElVQzsKCVVJTlQ4IEZlYXR1cmU7CglVSU5UOCBOdW1CdXJzdDsKCVVJTlQ4IE51bUJ1cnN0RXJyb3I7CglVSU5UOCBMZW5QRFU7CglVSU5UOCBOdW1QRFU7Cgp9IGdjdF9tY3Nfc3RhdHNfdDsKCnR5cGVkZWYgZW51bSBfR0NUX0FQSV9FQVBfVFlQRQp7CglHQ1RfV0lNQVhfTk9fRUFQID0gMCwKCUdDVF9XSU1BWF9FQVBfVExTID0gMSwKCUdDVF9XSU1BWF9FQVBfVFRMU19NRDUgPSAyLAoJR0NUX1dJTUFYX0VBUF9UVExTX01TQ0hBUFYyID0gMywKCUdDVF9XSU1BWF9FQVBfVFRMU19DSEFQID0gNCwKCUdDVF9XSU1BWF9FQVBfQUtBID0gNQoKfSBHQ1RfQVBJX0VBUF9UWVBFOwojZGVmaW5lIEdDVF9BUElfSVNfRUFQX1RMUyh0KQkoKHQpPj1HQ1RfV0lNQVhfRUFQX1RMUyAmJiAodCk8PUdDVF9XSU1BWF9FQVBfVFRMU19DSEFQKQojZGVmaW5lIEdDVF9BUElfSVNfVkFMSURfRUFQKHQpCSgodCk+PUdDVF9XSU1BWF9FQVBfVExTICYmICh0KTw9R0NUX1dJTUFYX0VBUF9BS0EpCgp0eXBlZGVmIHN0cnVjdCBfR0NUX0FQSV9FQVBfUEFSQU0KewojZGVmaW5lIFdJTUFYX0VBUF9TVFJfTEVOCQkyNTYKI2RlZmluZSBXSU1BWF9FQVBfRklMRV9MRU4JCTI1NgojZGVmaW5lIFdJTUFYX0VBUF9ERUNPX0xFTgkJMTI4CS8qZGVjb3JhdGlvbiovCglHQ1RfQVBJX0VBUF9UWVBFCXR5cGU7CgoJVUlOVDE2CQlmcmFnU2l6ZTsKCVVJTlQ4CQl1c2VEZWxpbWl0ZXI7CglVSU5UOAkJZGV2Q2VydE5VTEw7CglVSU5UOAkJY2FDZXJ0TlVMTDsKCVVJTlQ4CQlkaXNhYmxlUmVzdW1wdGlvbjsKCVVJTlQ4CQljcjgwMUVuYWJsZTsKCVVJTlQ4CQlkaXNhYmxlU2Vzc2lvblRpY2tldDsKCglVSU5UOAkJdXNlTnZyYW1QYXJhbTsKCVVJTlQ4CQl1c2VySWRbV0lNQVhfRUFQX1NUUl9MRU5dOwoJVUlOVDgJCXVzZXJJZFB3ZFtXSU1BWF9FQVBfU1RSX0xFTl07CglVSU5UOAkJYW5vbnltb3VzSWRbV0lNQVhfRUFQX1NUUl9MRU5dOwoJVUlOVDgJCXByaXZhdGVLZXlQd2RbV0lNQVhfRUFQX1NUUl9MRU5dOwoKCVVJTlQ4CQlkZWNvcmF0aW9uW1dJTUFYX0VBUF9ERUNPX0xFTl07CgojZGVmaW5lIENBQ0VSVF9OVU0JCQkJMTAKCglVSU5UOAkJbG9nRW5hYmxlOwp9IEdDVF9BUElfRUFQX1BBUkFNLCAqR0NUX0FQSV9FQVBfUEFSQU1fUDsKCnR5cGVkZWYgc3RydWN0IF9HQ1RfQVBJX09ETV9QQVJBTQp7CglVSU5UOAkJdXNlT0RNOwoKfSBHQ1RfQVBJX09ETV9QQVJBTSwgKkdDVF9BUElfT0RNX1BBUkFNX1A7Cgp0eXBlZGVmIHN0cnVjdCBfR0NUX0FQSV9DRVJUX0lORk8KewojZGVmaW5lIFdJTUFYX0NFUlRfU1RSX0xFTgkJMjU2CglVSU5UMzIJCXNvdXJjZTsKCVVJTlQ4CQljZXJ0X3R5cGVbV0lNQVhfQ0VSVF9TVFJfTEVOXTsKCVVJTlQ4CQlzdWJqZWN0X2NuW1dJTUFYX0NFUlRfU1RSX0xFTl07CglVSU5UOAkJaXNzdWVyX2NuW1dJTUFYX0NFUlRfU1RSX0xFTl07CglVSU5UOAkJZXhwaXJlX2RhdGVbV0lNQVhfQ0VSVF9TVFJfTEVOXTsKCn0gR0NUX0FQSV9DRVJUX0lORk8sICpHQ1RfQVBJX0NFUlRfSU5GT19QOwoKdHlwZWRlZiBzdHJ1Y3QgX0dDVF9BUElfUkZfSU5GT1JNIHsKCUlOVDMyCQluUEVSUmVjZWl2ZUNvdW50OwoJSU5UMzIJCW5QRVJFcnJvckNvdW50OwoJVUlOVDgJCWJzSWRbNl07CglVSU5UOAkJVUxQZXJtQmFzZTsKCVVJTlQ4CQlETFBlcm1CYXNlOwoJVUlOVDgJCUN1cnJlbnRQcmVhbWJsZUluZGV4OwoJVUlOVDgJCVByZXZpb3VzUHJlYW1ibGVJbmRleDsKCVVJTlQxNgkJSGFuZE92ZXJDb3VudDsKCVVJTlQxNgkJSGFuZE92ZXJGYWlsQ291bnQ7CglVSU5UMTYJCVJlc3luY0NvdW50OwkKCVVJTlQxNgkJSG9TaWduYWxMYXRlbmN5OwoJVUlOVDgJCUNJTlI7CglVSU5UOAkJQ0lOUjI7CglVSU5UOAkJUlNTSTsKCVVJTlQ4CQlSU1NJMjsKCVVJTlQxNgkJUEVSOwoJVUlOVDgJCVBvd2VyQ29udHJvbE1vZGU7CglVSU5UOAkJVHhQb3dlcjsKCVVJTlQ4CQlUeFBvd2VyTWF4OwoJVUlOVDgJCVVMQnVyc3REYXRhRkVDU2NoZW1lOwoJVUlOVDgJCURMQnVyc3REYXRhRkVDU2NoZW1lOwoJVUlOVDgJCVVMQnVyc3REYXRhVUlVQzsKCVVJTlQ4CQlETEJ1cnN0RGF0YURJVUM7CglVSU5UMzIJCUZyZXF1ZW5jeTsKCn0gR0NUX0FQSV9SRl9JTkZPUk0sICpHQ1RfQVBJX1JGX0lORk9STV9QOwoKdHlwZWRlZiBlbnVtIF9HQ1RfQVBJX1NDQU5fVFlQRSB7CglHQ1RfQVBJX1NDQU5fV0lERSwKCUdDVF9BUElfU0NBTl9BTExfU1VCU0NSSVBUSU9OUywKCUdDVF9BUElfU0NBTl9DVVJSX1NVQlNDUklQVElPTgoKfSBHQ1RfQVBJX1NDQU5fVFlQRSwgKkdDVF9BUElfU0NBTl9UWVBFX1A7Cgp0eXBlZGVmIGVudW0gX0dDVF9BUElfTk9USV9DQVRFR09SWSB7CglHQ1RfQVBJX0VSUk9SX05PVElfRUFQLAoJR0NUX0FQSV9OT1RJX0VBUCwKCUdDVF9BUElfTk9USV9PRE1fTk9USSwKCUdDVF9BUElfTk9USV9PRE1fRVJST1IKCn0gR0NUX0FQSV9OT1RJX0NBVEVHT1JZLCAqR0NUX0FQSV9OT1RJX0NBVEVHT1JZX1A7Cgp0eXBlZGVmIGVudW0gX0dDVF9BUElfT0RNX05PVElfVFlQRV9QIHsKCUdDVF9BUElfT0RNX05PVElfRVhFQ19SRUdJU1RSQVRJT05fUEFHRV9PUEVOLAoJR0NUX0FQSV9PRE1fTk9USV9DSEFOR0VfQUNUSVZBVEVELAkJCQkKCUdDVF9BUElfT0RNX05PVElfVU5LTk9XTl9TRVJWRVJfUkVBTE0JCQkvLyBmb3IgQ1IxMDc0Cgp9IEdDVF9BUElfT0RNX05PVElfVFlQRSwgKkdDVF9BUElfT0RNX05PVElfVFlQRV9QOwoKdHlwZWRlZiBlbnVtIF9HQ1RfQVBJX05PVElfVFlQRSB7CglHQ1RfQVBJX05PVElfVFlQRV9DT0RFLAoJR0NUX0FQSV9OT1RJX1RZUEVfVEVYVAkKCn0gR0NUX0FQSV9OT1RJX1RZUEUsICpHQ1RfQVBJX05PVElfVFlQRV9QOwoKdHlwZWRlZiBlbnVtIF9JTUFHRV9UWVBFIHsKCUlNR19LRVJORUwgPSAwLAoJSU1HX0ZTID0gMSwKCUlNR19DRkcgPSAyLAoJSU1HX0NGR19SQU0gPSAzLAoJSU1HX0ZTMiA9IDQsCglJTUdfQ0xSX0NGRyA9IDUsCglJTUdfRUFQX1BBUkFNID0gNiwKCUlNR19CTF9FRVBST00gPSA3LAoJSU1HX0JMX0ZMQVNIID0gOCwKCglJTUdfT01BX1hNTCA9IDB4MTAwLAoJSU1HX0RFVl9DRVJUID0gMHgxMDEsCglJTUdfQ0VSVDFfVSA9IDB4MTAyLAoJSU1HX0NFUlQxX0wgPSAweDEwMywKCUlNR19DRVJUMl9VID0gMHgxMDQsCglJTUdfQ0VSVDJfTCA9IDB4MTA1LAoJSU1HX0NFUlRfQklHID0gMHgxMDYsCgoJSU1HX0VORAoJCn0gSU1BR0VfVFlQRTsKCnR5cGVkZWYgZW51bSBfQ0FQQUJJTElUWV9CSVQgewoJQ0FQQUJJTElUWV9FTkNfWE1MCQk9ICgxPDwwKSwKCUNBUEFCSUxJVFlfRV9FQVBfVExTCT0gKDE8PDEpLAoJQ0FQQUJJTElUWV9PRE0JCQk9ICgxPDwyKSwKCUNBUEFCSUxJVFlfRV9FQVBfQUtBCT0gKDE8PDMpLAoJQ0FQQUJJTElUWV9DQVBMX0lORk8JPSAoMTw8NCksCgoJQ0FQQUJJTElUWV9FTkQKCn0gQ0FQQUJJTElUWV9CSVQsICpDQVBBQklMSVRZX0JJVF9QOwoKI2lmIGRlZmluZWQoQ09ORklHX0VOQUJMRV9TRVJWSUNFX0ZMT1cpCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTZXJ2aWNlIEZsb3cgTWFuYWdlbWVudAogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KCiNkZWZpbmUgV0lNQVhfTUFYX1NFUlZJQ0VfRkxPVwkJMTYKI2RlZmluZSBXSU1BWF9NQVhfUlVMRVMJCQkxNgkvKiBNQVggcnVsZXMgcGVyIFNGICovCiNkZWZpbmUgTUFYX1NFUlZJQ0VfQ0xBU1NfTkFNRQkxMjgKCgovKiBVTCBHcmFudCBTY2hlZHVsaW5nIFR5cGUgUGFyYW1ldGVyICovCiNkZWZpbmUgVUxfU0NIRURfVFlQRV9SRVNFUlZFRAkJMAojZGVmaW5lIFVMX1NDSEVEX1RZUEVfVU5ERUYJCTEKI2RlZmluZSBVTF9TQ0hFRF9UWVBFX0JFCQkyCiNkZWZpbmUgVUxfU0NIRURfVFlQRV9ucnRQUwkJMwojZGVmaW5lIFVMX1NDSEVEX1RZUEVfcnRQUwkJNAojZGVmaW5lIFVMX1NDSEVEX1RZUEVfZXJ0UFMJCTUKI2RlZmluZSBVTF9TQ0hFRF9UWVBFX1VHUwkJNgoKCi8qIFR5cGUgb2YgRGF0YSBEZWxpdmVyeSBTZXJ2aWNlcyBwYXJhbWV0ZXIgKi8KI2RlZmluZSBEQVRBX1NFUlZJQ0VfVUdTCQkwCiNkZWZpbmUgREFUQV9TRVJWSUNFX1JUX1ZSCQkxCiNkZWZpbmUgREFUQV9TRVJWSUNFX05SVF9WUgkJMgojZGVmaW5lIERBVEFfU0VSVklDRV9CRQkJCTMKI2RlZmluZSBEQVRBX1NFUlZJQ0VfRVJUX1ZSCQk0CgojZGVmaW5lIE1BWF9QSFNTCTEyOAoKc3RydWN0IHdpbWF4X3NmX2V2ZW50X3BhcmFtIHsKCXVpbnQ4X3QJCWNjOwkJLyogY29uZmlybSBjb2RlICovCgl1aW50OF90CQltc19pbml0aWF0ZWQ7CS8qIE1TIGluaXRpYXRlZCBEU3ggKi8KCXVpbnQzMl90CXNmaWQ7IAkJLyogU0ZJRCBTRiBldmVudCB0b29rIHBsYWNlIG9uICovCglpbnQ4X3QJCWNsZnJfYWN0aW9uOwkvKiBjbGFzc2lmaWNhdGlvbiBydWxlIERTQyBhY3Rpb24gKi8KCXVpbnQxNl90CVBhY2tldENsYXNzaWZpY2F0aW9uUnVsZUluZGV4OyAvKiBjaGFuZ2VkIGNsYXNzZmljYXRpb24gcnVsZSBpbmRleCAqLwoJaW50OF90CQlwaHNfYWN0aW9uOwkvKiBwaHMgcnVsZSBjaGFuZ2VkIERTQyBhY3Rpb24gKi8KCXVpbnQxNl90CVBIU0k7CQkvKiBjaGFuZ2VkIFBIU0kgKi8KfTsKCnR5cGVkZWYgZW51bSBfV0lNQVhfU0ZfRVZFTlRfVFlQRSB7CgkvKiBTZXJ2aWNlIGZsb3ctcmVsYXRlZCBldmVudHMgKi8KCVdJTUFYX0VWVF9TRVJWSUNFX0ZMT1dfQURERUQsCglXSU1BWF9FVlRfU0VSVklDRV9GTE9XX0NIQU5HRUQsCQoJV0lNQVhfRVZUX1NFUlZJQ0VfRkxPV19ERUxFVEVELAoJV0lNQVhfRVZUX0NJRF9VUERBVEUsCn0gV0lNQVhfU0ZfRVZFTlRfVFlQRTsKCnR5cGVkZWYgc3RydWN0IF93aW1heF9zZl9ldmVudCB7CglXSU1BWF9TRl9FVkVOVF9UWVBFCWNvZGU7CglzdHJ1Y3Qgd2ltYXhfc2ZfZXZlbnRfcGFyYW0gc2Y7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgV0lNQVhfU0ZfRVZFTlQsICpXSU1BWF9TRl9FVkVOVF9QOwoKdHlwZWRlZiBlbnVtIHsKCVdJTUFYX1NGX1NVQ0NFU1MgPSAwLAoJV0lNQVhfU0ZfT1RIRVIsCglXSU1BWF9TRl9VTlJFQ09HTklaRURfQ09ORl9TRVRUSU5HLAoJV0lNQVhfU0ZfVEVNUE9SQVJZLAkJLy8gcmVqZWN0LXJlc291cmNlCglXSU1BWF9TRl9QRVJNQU5BTlQsCQkvLyByZWplY3QtYWRtaW4KCVdJTUFYX1NGX05PVF9PV05FUiwKCVdJTUFYX1NGX05PVF9GT1VORCwKCVdJTUFYX1NGX0VYSVNUUywKCVdJTUFYX1NGX1JFUUlSRURfUEFSQU1fTk9UX1BSRVNFTlQsCglXSU1BWF9TRl9IRUFERVJfU1VQUkVTU0lPTiwKCVdJTUFYX1NGX1VOS05PV05fVFJBTlNBQ1RJT05fSUQsCglXSU1BWF9TRl9BVVRIX0ZBSUxVUkUsCglXSU1BWF9TRl9BRERfQUJPUlRFRCwKCVdJTUFYX1NGX0VYQ0VFREVEX0RZTkFNSUNfU0VSVklDRV9MSU1JVCwKCVdJTUFYX1NGX05PVF9BVVRIT1JJWkVEX0ZPUl9USEVfUkVRVUVTVEVEX1NBSUQsCglXSU1BWF9TRl9GQUlMX1RPX0VTVEFCTElTSF9USEVfUkVRVUVTVEVEX1NBLAoJV0lNQVhfU0ZfTk9UX1NVUFBPUlRFRF9QQVJBTUVURVIsCglXSU1BWF9TRl9OT1RfU1VQUE9SVEVEX1BBUkFNRVRFUl9WQUxVRQp9IFdJTUFYX1NGX0NDOwoKCnR5cGVkZWYgZW51bSB7CglEU0NfQUREX0NMQVNTSUZJRVIgPSAwLAoJRFNDX1JFUExBQ0VfQ0xBU1NJRklFUiwKCURTQ19ERUxFVEVfQ0xBU1NJRklFUiwKCURTQ19OT1BfQ0xBU1NJRklFUiwKfSBXSU1BWF9DTEZSX0RTQ19BQ1RJT047CgoKdHlwZWRlZiBlbnVtIHsKCURTQ19BRERfUEhTID0gMCwKCURTQ19TRVRfUEhTLAkJLy9UT0RPIG5vdCB0ZXN0ZWQKCURTQ19ERUxFVEVfUEhTLAoJRFNDX0RFTEVURV9BTExfUEhTLAkvL1RPRE8gbm90IHN1cHBvcnRlZAoJRFNDX05PUF9QSFMsCn0gV0lNQVhfUEhTX0RTQ19BQ1RJT047CgoKc3RydWN0IGlwdjRfYWRkciB7CglzdHJ1Y3QgaW5fYWRkcglhZGRyZXNzOwoJc3RydWN0IGluX2FkZHIgIG1hc2s7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgoKc3RydWN0IGlwdjZfYWRkciB7CglzdHJ1Y3QgaW42X2FkZHIgYWRkcmVzczsKCXN0cnVjdCBpbjZfYWRkciBtYXNrOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKdHlwZWRlZiBzdHJ1Y3Qgd2ltYXhfY2xhc3NpZmljYXRpb25fcnVsZSB7Cgl1aW50MzJfdAl2YWxpZDsKCgl1bmlvbiB7CgkJdWludDE2X3QgYWxsOwoJCXN0cnVjdCB7CgkJCXVpbnQxNl90IHJlc2VyaXZlZDoxOwoJCQl1aW50MTZfdCBJUFR5cGVPZlNlcnZpY2U6MTsKCQkJdWludDE2X3QgUHJvdG9jb2w6MTsKCQkJdWludDE2X3QgSVBNYXNrZWRTcmNBZGRyZXNzOjE7CgkJCXVpbnQxNl90IElQTWFza2VkRHN0QWRkcmVzczoxOwoJCQl1aW50MTZfdCBQcm90b2NvbFNyY1BvcnRSYW5nZToxOwoJCQl1aW50MTZfdCBQcm90b2NvbERzdFBvcnRSYW5nZToxOwoJCQl1aW50MTZfdCBEc3RNYWNBZGRyOjE7CgkJCXVpbnQxNl90IFNyY01hY0FkZHI6MTsKCQkJdWludDE2X3QgRXRoZXJ0eXBlOjE7CgkJCXVpbnQxNl90IElFRUU4MDJfMURVc2VyUHJpb3JpdHk6MTsKCQkJdWludDE2X3QgSUVFRTgwMl8xUVZMQU5JRDoxOwoJCQl1aW50MTZfdCBSZXNlcnZlZDo1OwoJCX0gZmllbGRzOwoJfSBtYXNrOyAgICAKCgkvKiBQYWNrZXQgQ2xhc3NpZmljYXRpb24gUnVsZSAqLwoJdWludDhfdCAJQ2xhc3NpZmllclJ1bGVQcmlvcml0eTsKCXN0cnVjdCB7CgkJdWludDhfdCBsb3c7CgkJdWludDhfdCBoaWdoOwoJCXVpbnQ4X3QgbWFzazsKCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgSVBUeXBlT2ZTZXJ2aWNlOwoJCgl1aW50OF90CVByb3RvY29sOwoJCglzdHJ1Y3QgaXB2NF9hZGRyIAlJUHY0TWFza2VkU291cmNlQWRkcmVzczsKCXN0cnVjdCBpcHY2X2FkZHIJSVB2Nk1hc2tlZFNvdXJjZUFkZHJlc3M7CglzdHJ1Y3QgaXB2NF9hZGRyCUlQdjRNYXNrZWREZXN0QWRkcmVzczsKCXN0cnVjdCBpcHY2X2FkZHIJSVB2Nk1hc2tlZERlc3RBZGRyZXNzOwkKCglzdHJ1Y3QgewoJCXVpbnQxNl90IGxvdzsKCQl1aW50MTZfdCBoaWdoOwoJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBQcm90b2NvbFNvdXJjZVBvcnQsIFByb3RvY29sRGVzdFBvcnQ7CgoJc3RydWN0IHsKCQl1aW50OF90CWFkZHJbNl07CgkJdWludDhfdAltYXNrWzZdOwoJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBFdGhlcm5ldERlc3RNQUNBZGRyZXNzLCBFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3M7CgoJc3RydWN0IHsKCQl1aW50OF90CXR5cGU7CgkJdWludDhfdAllcHJvdDE7CgkJdWludDhfdAllcHJvdDI7Cgl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIEV0aGVyVHlwZTsKCglzdHJ1Y3QgewoJCXVpbnQ4X3QJbG93OwoJCXVpbnQ4X3QgaGlnaDsKCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgSUVFRTgwMl8xRF9Vc2VyUHJpb3JpdHk7CgoJdWludDE2X3QgSUVFRTgwMl8xUV9WTEFOSUQ7CgoJdWludDhfdCAJQXNzb2NpYXRlZFBIU0k7Cgl1aW50MTZfdCAJUGFja2V0Q2xhc3NpZmllclJ1bGVJbmRleDsKCXVpbnQ4X3QJCUlQdjZGbG93TGFiZWxbM107Cgl1aW50OF90CQlDb250ZXh0SUQ7Cn0gV0lNQVhfQ0xGUl9SVUxFLCAqV0lNQVhfQ0xGUl9SVUxFX1A7CgoKdHlwZWRlZiBzdHJ1Y3Qgd2ltYXhfcGhzX3J1bGUgewoJdWludDMyX3QJdmFsaWQ7CglzdHJ1Y3Qgd2ltYXhfcGhzX3J1bGUgKm5leHQ7CS8qIG5vdCB1c2VkICovCgl1aW50OF90CQlzdGF0ZTsKCXVpbnQ4X3QJCVBIU0k7Cgl1aW50OF90CQlQSFNGW01BWF9QSFNTXTsKCXVpbnQ4X3QJCVBIU01bKE1BWF9QSFNTICsgNykgPj4gM107Cgl1aW50OF90CQlQSFNTOwoJdWludDhfdAkJUEhTVjsKfSBXSU1BWF9QSFNfUlVMRSwgKldJTUFYX1BIU19SVUxFX1A7CgoKdHlwZWRlZiBzdHJ1Y3Qgd2ltYXhfc2ZfcGFyYW0gewoJdWludDhfdAkJREw7CgkvKiBUTFYgLSAxMS4xMyAqLwoJdWludDMyX3QJU0ZJRDsKCXVpbnQxNl90CUNJRDsKCXVpbnQ4X3QJCVNlcnZpY2VDbGFzc05hbWVbTUFYX1NFUlZJQ0VfQ0xBU1NfTkFNRV07Cgl1aW50OF90CQlNQlNTZXJ2aWNlOwoJCgl1aW50OF90CQlRb3NQYXJhbVNldFR5cGU7IC8qIEFkbWl0dGVkLCBBY3RpdmUsIFByb3Zpc2lvbmVkICovCgl1aW50OF90CQlUcmFmZmljUHJpb3JpdHk7IAkJLyogNiAqLwoJdWludDMyX3QJTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGU7Cgl1aW50MzJfdAlNYXhUcmFmZmljQnVyc3Q7Cgl1aW50MzJfdAlNaW5SZXNlcnZlZFRyYWZmaWNSYXRlOwoJdWludDMyX3QJTWluVG9sZXJhYmxlUmF0ZTsJCS8qIDEwICovCgl1aW50OF90CQlVTEdyYW50U2NoZWR1bGluZ1R5cGU7CQkvKiAxMSAqLwoJdWludDhfdAkJUmVxdWVzdFRyYW5zbWlzc2lvblBvbGljeTsJLyogMTIgKi8KCXVpbnQzMl90CVRvbGVyYXRlZEppdHRlcjsJCS8qIDEzICovCgl1aW50MzJfdAlNYXhMYXRlbmN5OwkJCS8qIDE0ICovCgkKCXVpbnQ4X3QJCUZpeGVkTGVuZ3RoU0RVSW5kaWNhdG9yOwkvKiAxNSAqLwoJdWludDhfdAkJU0RVU2l6ZTsJCQkvKiAxNiAqLwoJdWludDE2X3QJVGFyZ2V0U0FJRDsJCQkvKiAxNyAqLwoJCgl1aW50OF90CQlBUlFFbmFibGU7CQkJLyogMTggKi8KCXVpbnQxNl90CUFSUVdpbmRvd1NpemU7CQkJLyogMTkgKi8KCXVpbnQxNl90CUFSUVRyYW5zbWl0dGVyRGVsYXk7CQkvKiAyMCAqLwoJdWludDE2X3QJQVJRUmVjZWl2ZXJEZWxheTsJCS8qIDIxICovCgl1aW50MTZfdAlBUlFCbG9ja0xpZmVUaW1lOwkJLyogMjIgKi8KCXVpbnQxNl90CUFSUVN5bmNMb3NzVGltZW91dDsJCS8qIDIzICovCgl1aW50OF90CQlBUlFEZWxpdmVySW5PcmRlcjsJCS8qIDI0ICovCgl1aW50MTZfdAlBUlFSeFB1cmdlVGltZW91dDsJCS8qIDI1ICovCgl1aW50MTZfdAlBUlFCbG9ja1NpemU7CQkJLyogMjYgKi8KCXVpbnQ4X3QJCVJlY2VpdmVyQVJRQWNrUHJvY2Vzc2luZ1RpbWU7CS8qIDI3ICovCgkKCXVpbnQ4X3QJCUNTU3BlY2lmaWNhdGlvbjsJCS8qIDI4ICovCgoJdWludDhfdCAJVHlwZU9mRGF0YURlbGl2ZXJ5U2VydmljZXM7CS8vIDI5Cgl1aW50MTZfdCAJU0RVSW50ZXJBcnJpdmFsSW50ZXJ2YWw7CS8vIDMwCgl1aW50MTZfdCAJVGltZUJhc2U7CQkJLy8gMzEKCXVpbnQ4X3QgCVBhZ2luZ1ByZWZlcmVuY2U7CQkvLyAzMgoJdWludDhfdCAJTUJTWm9uZUlEWzhdOwkJCS8vIDMzCgl1aW50OF90IAlUcmFmZmljUHJlZmVyZW5jZUluZGljYXRpb247CS8vIDM0Cgl1aW50OF90IAlHbG9iYWxTZXJ2aWNlQ2xhc3NOYW1lWzZdOwkvLyAzNQoJdWludDhfdCAJU05GZWVkYmFja0VuYWJsZWQ7CQkvLyAzNwoJdWludDhfdCAJRlNOU2l6ZTsJCQkvLyAzOAoJdWludDhfdCAJTnVtX0NJREFsbG9jRm9yQWN0aXZlQlNzOwoJdWludDE2X3QgCUNJREFsbG9jRm9yQWN0aXZlQlNzWzhdOwkvLyAzOSA/PwoJdWludDE2X3QgCVVuc29saWNpdGVkR3JhbnRJbnRlcnZhbDsJLy8gNDAKCXVpbnQxNl90IAlVbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbDsJLy8gNDEKCXVpbnQ4X3QgCVBEVVNORXh0ZW5kZWRTdWJoZWFkZXJGb3JIQVJRUmVvcmRlcmluZzsJLy8gNDIKCXVpbnQ4X3QgCU51bV9NQlNDb250ZW50c0lEczsJCS8vIDQzCgl1aW50MTZfdCAJTUJTQ29udGVudHNJRHNbOF07CQkvLyA0MwoJdWludDhfdCAJSEFSUVNlcnZpY2VGbG93czsJCS8vIDQ0Cgl1aW50OF90CQlBdXRob3JpemF0aW9uVG9rZW47CQkvLyA0NQoJdWludDhfdCAJTnVtX0hBUlFDaGFubmVsTWFwcGluZzsJCS8vIDQ2Cgl1aW50OF90IAlIQVJRQ2hhbm5lbE1hcHBpbmdbMTZdOwkJLy8gNDYKfSBXSU1BWF9TRl9QQVJBTSwgKldJTUFYX1NGX1BBUkFNX1A7Cgp0eXBlZGVmIHVuaW9uIHdpbWF4X3NmX3N0YXRzIHsKICAgIHN0cnVjdCB7Cgl1aW50MzJfdAlzZHVfcGFja2V0czsKCXVpbnQzMl90CXNkdV9wYWNrZXRzX2Ryb3BwZWQ7Cgl1aW50MzJfdAlzZHVfYnl0ZXM7Cgl1aW50MzJfdAlzZHVfYnl0ZXNfZHJvcHBlZDsKCXVpbnQzMl90CXBkdV9wYWNrZXRzOwoJdWludDMyX3QJcGR1X2J5dGVzOwoJCgl1aW50MzJfdAlid19yZXE7Cgl1aW50MzJfdAlnbXNoOwoJCgl1aW50MzJfdAlhcnFfYmxvY2tzOwoJdWludDMyX3QJYXJxX2Jsb2Nrc19yZXRyeTsKCXVpbnQxNl90CWFycV9kaXNjYXJkOwoJdWludDE2X3QJYXJxX3Jlc2V0OwoJdWludDE2X3QJYXJxX3N5bmNfbG9zczsJCQogICAgfSB1bDsKICAgIHN0cnVjdCB7Cgl1aW50MzJfdAlzZHVfcGFja2V0czsKCXVpbnQzMl90CXNkdV9wYWNrZXRzX2Ryb3BwZWQ7Cgl1aW50MzJfdAlzZHVfYnl0ZXM7Cgl1aW50MzJfdAlzZHVfYnl0ZXNfZHJvcHBlZDsKCXVpbnQzMl90CXBkdV9wYWNrZXRzOwoJdWludDMyX3QJcGR1X2J5dGVzOwoJCgl1aW50MzJfdAlhcnFfYmxvY2tzOwoJdWludDMyX3QJYXJxX2Jsb2Nrc19yZXRyeTsKCXVpbnQxNl90CWFycV9kaXNjYXJkOwoJdWludDE2X3QJYXJxX3Jlc2V0OwoJdWludDE2X3QJYXJxX3N5bmNfbG9zczsJCiAgICB9IGRsOwp9IFdJTUFYX1NGX1NUQVRTLCAqV0lNQVhfU0ZfU1RBVFNfUDsKCnR5cGVkZWYgc3RydWN0IHdpbWF4X3NlcnZpY2VfZmxvdyB7Cgl1aW50OF90CQkJdmFsaWQ7CglzdHJ1Y3Qgd2ltYXhfc2ZfcGFyYW0gCXBhcmFtOwoJc3RydWN0IHdpbWF4X2NsYXNzaWZpY2F0aW9uX3J1bGUgY2xhc3NpZmljYXRpb25fcnVsZVtXSU1BWF9NQVhfUlVMRVNdOwoJc3RydWN0IHdpbWF4X3Boc19ydWxlCXBoc19ydWxlW1dJTUFYX01BWF9SVUxFU107Cgl1bmlvbiB3aW1heF9zZl9zdGF0cwlzdGF0czsKfSBXSU1BWF9TRVJWSUNFX0ZMT1csICpXSU1BWF9TRVJWSUNFX0ZMT1dfUDsKCgpleHRlcm4gY29uc3Qgc3RydWN0IHdpbWF4X3NmX3BhcmFtIHNmX3BhcmFtX2luaXQ7CmV4dGVybiBjb25zdCBzdHJ1Y3Qgd2ltYXhfY2xhc3NpZmljYXRpb25fcnVsZSBjbGFzc2lmaWVyX3J1bGVfaW5pdDsKZXh0ZXJuIGNvbnN0IHN0cnVjdCB3aW1heF9waHNfcnVsZSBwaHNfcnVsZV9pbml0OwoKI2VuZGlmIC8vIENPTkZJR19FTkFCTEVfU0VSVklDRV9GTE9XCgp0eXBlZGVmIGVudW0gX0dDVF9BUElfQ01EX01BQ19TVEFURV9UWVBFIHsKCUdDVF9BUElfQ01EX01BQ19TVEFURV9FTlRFUl9TTEVFUF9NT0RFLAoJR0NUX0FQSV9DTURfTUFDX1NUQVRFX0VYSVRfU0xFRVBfTU9ERSwKCUdDVF9BUElfQ01EX01BQ19TVEFURV9FTlRFUl9JRExFX01PREUsCglHQ1RfQVBJX0NNRF9NQUNfU1RBVEVfRVhJVF9JRExFX01PREUKfSBHQ1RfQVBJX0NNRF9NQUNfU1RBVEVfVFlQRSwgKkdDVF9BUElfQ01EX01BQ19TVEFURV9UWVBFX1A7Cgp0eXBlZGVmIGVudW0gX0ZFQ19NT0QgewoJT0ZETUFfRkVDX01PRF9RUFNLX0NDX0gJCQkJPSAwLAoJT0ZETUFfRkVDX01PRF9RUFNLX0NDXzNRCQkJPSAxLAoJT0ZETUFfRkVDX01PRF9RQU0xNl9DQ19ICQkJPSAyLAoJT0ZETUFfRkVDX01PRF9RQU0xNl9DQ18zUQkJCT0gMywKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfQ0NfSAkJCT0gNCwKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfQ0NfMk8zCQkJPSA1LAoJT0ZETUFfRkVDX01PRF9RQU02NF9DQ18zUQkJCT0gNiwKCU9GRE1BX0ZFQ19NT0RfUVBTS19CVENfSAkJCT0gNywKCU9GRE1BX0ZFQ19NT0RfUVBTS19CVENfM1EJCQk9IDgsCglPRkRNQV9GRUNfTU9EX1FBTTE2X0JUQ18zTzUJCQk9IDksCglPRkRNQV9GRUNfTU9EX1FBTTE2X0JUQ180TzUJCQk9IDEwLAoJT0ZETUFfRkVDX01PRF9RQU02NF9CVENfNU84CQkJPSAxMSwKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfQlRDXzRPNQkJCT0gMTIsCglPRkRNQV9GRUNfTU9EX1FQU0tfQ1RDX0gJCQk9IDEzLAoJT0ZETUFfRkVDX01PRF9SRVNFUlZFRDE0CQkJPSAxNCwKCU9GRE1BX0ZFQ19NT0RfUVBTS19DVENfM1EJCQk9IDE1LAoJT0ZETUFfRkVDX01PRF9RQU0xNl9DVENfSAkJCT0gMTYsCglPRkRNQV9GRUNfTU9EX1FBTTE2X0NUQ18zUQkJCT0gMTcsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0NUQ19ICQkJPSAxOCwKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfQ1RDXzJPMwkJCT0gMTksCglPRkRNQV9GRUNfTU9EX1FBTTY0X0NUQ18zUQkJCT0gMjAsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0NUQ181TzYJCQk9IDIxLAoJT0ZETUFfRkVDX01PRF9RUFNLX1pUQ0NfSAkJCT0gMjIsCglPRkRNQV9GRUNfTU9EX1FQU0tfWlRDQ18zUQkJCT0gMjMsCglPRkRNQV9GRUNfTU9EX1FBTTE2X1pUQ0NfSAkJCT0gMjQsCglPRkRNQV9GRUNfTU9EX1FBTTE2X1pUQ0NfM1EJCQk9IDI1LAoJT0ZETUFfRkVDX01PRF9RQU02NF9aVENDX0gJCQk9IDI2LAoJT0ZETUFfRkVDX01PRF9RQU02NF9aVENDXzJPMwkJPSAyNywKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfWlRDQ18zUQkJCT0gMjgsCglPRkRNQV9GRUNfTU9EX1FQU0tfU0RQQ19ICQkJPSAyOSwKCU9GRE1BX0ZFQ19NT0RfUVBTS19TRFBDXzJPM19BX0NPREUJPSAzMCwKCU9GRE1BX0ZFQ19NT0RfUVBTS19MRFBDXzNRX0FfQ09ERQk9IDMxLAoJT0ZETUFfRkVDX01PRF9RQU0xNl9MRFBDX0gJCQk9IDMyLAoJT0ZETUFfRkVDX01PRF9RQU0xNl9MRFBDXzJPM19BX0NPREUJPSAzMywKCU9GRE1BX0ZFQ19NT0RfUUFNMTZfTERQQ18zUV9BX0NPREUJPSAzNCwKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfTERQQ19ICQkJPSAzNSwKCU9GRE1BX0ZFQ19NT0RfUUFNNjRfTERQQ18yTzNfQV9DT0RFCT0gMzYsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0xEUENfM1FfQV9DT0RFCT0gMzcsCglPRkRNQV9GRUNfTU9EX1FQU0tfTERQQ18yTzNfQl9DT0RFCT0gMzgsCglPRkRNQV9GRUNfTU9EX1FQU0tfTERQQ18zUV9CX0NPREUJPSAzOSwKCU9GRE1BX0ZFQ19NT0RfUUFNMTZfTERQQ18yTzNfQl9DT0RFCT0gNDAsCglPRkRNQV9GRUNfTU9EX1FBTTE2X0xEUENfM1FfQl9DT0RFCT0gNDEsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0xEUENfMk8zX0JfQ09ERQk9IDQyLAoJT0ZETUFfRkVDX01PRF9RQU02NF9MRFBDXzNRX0JfQ09ERQk9IDQzLAoJT0ZETUFfRkVDX01PRF9RUFNLX0NDX09JX0gJCQk9IDQ0LAoJT0ZETUFfRkVDX01PRF9RUFNLX0NDX09JXzNRCQkJPSA0NSwKCU9GRE1BX0ZFQ19NT0RfUUFNMTZfQ0NfT0lfSAkJCT0gNDYsCglPRkRNQV9GRUNfTU9EX1FBTTE2X0NDX09JXzNRCQk9IDQ3LAoJT0ZETUFfRkVDX01PRF9RQU02NF9DQ19PSV8yTzMJCT0gNDgsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0NDX09JXzNRCQk9IDQ5LAoJT0ZETUFfRkVDX01PRF9RUFNLX0xEUENfNU82CQkJPSA1MCwKCU9GRE1BX0ZFQ19NT0RfUUFNMTZfTERQQ181TzYJCT0gNTEsCglPRkRNQV9GRUNfTU9EX1FBTTY0X0xEUENfNU82CQk9IDUyLAoJT0ZETUFfRkVDX01PREVfQ05ULAp9IEZFQ19NT0Q7Cgp0eXBlZGVmIGVudW0gX1JFUEVUSVRJT05fQ09ERQp7CglSRVBFVElUSU9OX0NPRElOR19OT1RfU1BFQ0lGSUVECQk9IDAsCglOT19SRVBFVElUSU9OX0NPRElORwkJCQk9IDEsCglSRVBFVElUSU9OX0NPRElOR19PRl8yX1VTRUQJCQk9IDIsCglSRVBFVElUSU9OX0NPRElOR19PRl80X1VTRUQJCQk9IDMsCglSRVBFVElUSU9OX0NPRElOR19PRl82X1VTRUQJCQk9IDQsCglSRVBFVElUSU9OX0NPRElOR19DTlQsCn0gUkVQRVRJVElPTl9DT0RFOwoKdHlwZWRlZiBlbnVtIF9NSU1PX1RZUEUKewoJTUlOT19UWVBFX05PVF9TUEVDCQkJCQk9IDAsCglNSU5PX1RZUEUyX0FOVF9TVENfTUFUUklYX0EJCQk9IDEsCglNSU5PX1RZUEUyX0FOVF9TVENfTUFUUklYX0JfVkMJCT0gMiwKCS8qCglNSU5PX1RZUEUyX0FOVF9TVENfTUFUUklYX0JfSEMJCT0gMywKCU1JTk9fVFlQRTRfQU5UX1NUQ19NQVRSSVhfQQkJCT0gNCwKCU1JTk9fVFlQRTRfQU5UX1NUQ19NQVRSSVhfQl9WQwkJPSA1LAoJTUlOT19UWVBFNF9BTlRfU1RDX01BVFJJWF9CX0hDCQk9IDYsCglNSU5PX1RZUEU0X0FOVF9TVENfTUFUUklYX0NfVkMJCT0gNywKCU1JTk9fVFlQRTRfQU5UX1NUQ19NQVRSSVhfQ19IQwkJPSA4LAoJTUlOT19UWVBFM19BTlRfU1RDX01BVFJJWF9BCQkJPSA5LAoJTUlOT19UWVBFM19BTlRfU1RDX01BVFJJWF9CCQkJPSAxMCwKCU1JTk9fVFlQRTNfQU5UX1NUQ19NQVRSSVhfQ19WQwkJPSAxMSwKCU1JTk9fVFlQRTNfQU5UX1NUQ19NQVRSSVhfQ19IQwkJPSAxMiwKCU1JTU9fTk9UX1VTRAkJCQkJCT0gMTMsCgkqLwoJTUlNT19UWVBFX0NOVCwKfSBNSU1PX1RZUEU7Cgp0eXBlZGVmIHN0cnVjdCBfR0NUX0FQSV9NQUNfUEhZX01BQ19CQVNJQyB7Cgl1MzIJZnJhbWVfbnVtYmVyOwoJdTMyCWZjaDsKCXUxNgl0dGc7Cgl1MTYJcnRnOwoJdTgJbnVtX2RsX3N5bWJvbDsKCXU4CW51bV91bF9zeW1ib2w7Cgl1OAljdXJyZW50X3BpOwkvKlByZWFtYmxlSW5kZXgqLwoJdTgJcHJldmlvdXNfcGk7CS8qUHJlYW1ibGVJbmRleCovCgl1OAl1bF9wZXJtX2Jhc2U7Cgl1OAltYWNfc3RhdGU7Cgl1OAlic2lkWzZdOwoJczMyCXVsX3RpbWU7Cgl1MzIJZnJlcXVlbmN5OwoJdTE2CWJhbmR3aWR0aDsKCXUxNglwYWQ7CS8vIHBhZGRpbmcKCXUzMgl0aW1lX2FjdGl2ZTsKCXUzMgl0aW1lX3NsZWVwOwoJdTMyCXRpbWVfaWRsZTsKCXUxNgliYXNpY19jaWQ7Cgl1MTYJcHJpbWFyeV9jaWQ7Cn0gR0NUX0FQSV9NQUNfUEhZX01BQ19CQVNJQywgKkdDVF9BUElfTUFDX1BIWV9NQUNfQkFTSUNfUDsKCnR5cGVkZWYgc3RydWN0IF9HQ1RfQVBJX01BQ19QSFlfTUNTIHsKc3RydWN0IHN0cnVjdF9tYWNfcGh5X21jc19zIHsKCQl1MzIgbnVtX2J1cnN0OwoJCXUzMiBudW1fYnVyc3RfZXJyb3I7CgkJdTMyIGxlbl9wZHU7CgkJdTMyIG51bV9wZHU7Cgl9IGRsW09GRE1BX0ZFQ19NT0RFX0NOVF1bUkVQRVRJVElPTl9DT0RJTkdfQ05UXVtNSU1PX1RZUEVfQ05UXSwgdWxbT0ZETUFfRkVDX01PREVfQ05UXVtSRVBFVElUSU9OX0NPRElOR19DTlRdW01JTU9fVFlQRV9DTlRdOwoKCWJvb2wgZGxfdXNlZFtPRkRNQV9GRUNfTU9ERV9DTlRdW1JFUEVUSVRJT05fQ09ESU5HX0NOVF1bTUlNT19UWVBFX0NOVF07Cglib29sIHVsX3VzZWRbT0ZETUFfRkVDX01PREVfQ05UXVtSRVBFVElUSU9OX0NPRElOR19DTlRdW01JTU9fVFlQRV9DTlRdOwp9IEdDVF9BUElfTUFDX1BIWV9NQ1MsICpHQ1RfQVBJX01BQ19QSFlfTUNTX1A7Cgp0eXBlZGVmIHN0cnVjdCBfR0NUX0FQSV9NQUNfUEhZX0NJTlJfUlNTSSB7CglzOAljaW5yX21lYW47CglzOAljaW5yX3N0ZF9kZXY7CglzOAlyc3NpX21lYW47CglzOAlyc3NpX3N0ZF9kZXY7CglzOAljaW5yX2FfbWVhbjsKCXM4CWNpbnJfYl9tZWFuOwoJczgJY2lucl9tYWluOwoJczgJY2lucl9kaXZlcnNpdHk7CglzOAlyc3NpX21haW47CglzOAlyc3NpX2RpdmVyc2l0eTsKCXM4CXByZWFtYmxlX2NpbnJfcmV1c2UzOwoJczgJcHJlYW1ibGVfY2lucl9yZXVzZTE7Cn0gR0NUX0FQSV9NQUNfUEhZX0NJTlJfUlNTSSwgKkdDVF9BUElfTUFDX1BIWV9DSU5SX1JTU0lfUDsKCnR5cGVkZWYgZW51bSBfRlVNT19SRVNVTFQgewoJRlVNT19TVUNDRVNTRlVMID0gMjAwLCAvKlRoZSBSZXF1ZXN0IGhhcyBTdWNjZWVkZWQqLwoJRlVNT19TVUNDRVNTRlVMX1ZFTkRPUl9TUEVDID0gMjUwLCAvKjI1MCAtMjk5IFZlbmRvciBTcGVjaWZpZWQgU3VjY2Vzc2Z1bCBPcGVyYXRpb24KCQkJCQkJCQkJCXdpdGggVmVuZG9yIFNwZWNpZmllZCBSZXN1bHRDb2RlKi8KCUZVTU9fTU5HTVRfQ0xJRU5UX0VSUiA9IDQwMCwgLypNYW5hZ2VtZW50IENsaWVudCBlcnJvciAuCgkJCQkJCQkJCWJhc2VkIG9uIFVzZXIgb3IgRGV2aWNlIGJlaGF2aW9yKi8KCUZVTU9fVVNFUl9DQU5DRUxMRUQgPSA0MDEsIC8qVXNlciBjaG9zZSBub3QgdG8gYWNjZXB0IHRoZSBvcGVyYXRpb24gd2hlbiBwcm9tcHRlZCovCglGVU1PX0NPUlJVUFRFRF9GV19VUERBVEUgPSA0MDIsIC8qQ29ycnVwdGVkIGZpcm13YXJlIHVwZGF0ZSBwYWNrYWdlLAoJCQkJCQkJCQlkaWQgbm90IHN0b3JlIGNvcnJlY3RseS4qLwoJRlVNT19ERVZJQ0VfTUlTTUFUQ0ggPSA0MDMsIC8qRmlybXdhcmUgVXBkYXRlIFBhY2thZ2UuIERldmljZSBNaXNtYXRjaCovCglGVU1PX1BLR19WQUxJREFUSU9OX0VSUiA9IDQwNCwgLypQYWNrYWdlIFZhbGlkYXRpb24gRmFpbHVyZSB0byBwb3NpdGl2ZWx5IHZhbGlkYXRlCgkJCQkJCQkJCWRpZ2l0YWwgc2lnbmF0dXJlIG9mIGZpcm13YXJlIHVwZGF0ZSBwYWNrYWdlKi8KCUZVTU9fUEtHX05PVF9BQ0NFUFRBQkxFX0ZXID0gNDA1LCAvKkZpcm13YXJlIFVwZGF0ZSBQYWNrYWdlIGlzIE5vdCBBY2NlcHRhYmxlKi8KCUZVTU9fQUxURVJOQVRFX0RMX0FVVEhfRVJSID0gNDA2LCAvKkF1dGhlbnRpY2F0aW9uIHdhcyBSZXF1aXJlZCBidXQgQXV0aGVudGljYXRpb24KCQkJCQkJRmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgd2hlbiBkb3dubG9hZGluZyBGaXJtd2FyZSBVcGRhdGUgUGFja2FnZSovCglGVU1PX0FMVEVSTkFURV9ETF9SRVFfVElNRU9VVCA9IDQwNywgLypDbGllbnQgaGFzIGVuY291bnRlcmVkIGEgdGltZS1vdXQKCQkJCQkJCQkJCXdoZW4gZG93bmxvYWRpbmcgRmlybXdhcmUgVXBkYXRlIFBhY2thZ2UqLwoJRlVNT19OT1RfSU1QTEVNRU5URUQgPSA0MDgsIC8qVGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLiovCglGVU1PX1VOREVGSU5FRF9FUlIgPSA0MDksIC8qSW5kaWNhdGVzIGZhaWx1cmUgbm90IGRlZmluZWQgYnkgYW55IG90aGVyIGVycm9yIGNvZGUqLwoJRlVNT19GV19VUERBVEVfRkFJTEVEID0gNDEwLCAvKkZpcm13YXJlIFVwZGF0ZSBvcGVyYXRpb24gZmFpbGVkIGluIGRldmljZSovCglGVU1PX01BTEZPUk1FRF9PUl9CQURfVVJMID0gNDExLCAvKlRoZSBVUkwgcHJvdmlkZWQgZm9yIGFsdGVybmF0ZSBkb3dubG9hZCBpcyBiYWQqLwoJRlVNT19BTFRfRExfU0VSVl9VTkFWQUlMQUJMRSA9IDQxMiwgLypUaGUgQWx0ZXJuYXRlIERvd25sb2FkIFNlcnZlciBpcyAKCQkJCQkJCQkJCVVuYXZhaWxhYmxlIG9yIERvZXMgbm90IFJlc3BvbmQqLwoJRlVNT19DTElFTlRfRVJSID0gNDUwLCAvKjQ1MC00OTk6IENsaWVudCBFcnJvciBlbmNvdW50ZXJlZCBmb3IgT3BlcmF0aW9uIHdpdGggCgkJCQkJCQlWZW5kb3IgU3BlY2lmaWVkIFJlc3VsdENvZGUqLwoJRlVNT19BTFRfRExfU0VSVl9FUlIgPSA1MDAsIC8qQWx0ZXJuYXRlIERvd25sb2FkIFNlcnZlciBFcnJvciBFbmNvdW50ZXJlZCovCglGVU1PX0RMX09VVF9PRl9NRU0gPSA1MDEsIC8qRG93bmxvYWQgZmFpbHMgZHVlIHRvIGRldmljZSBpcyBvdXQgb2YgbWVtb3J5CgkJCQkJCQkJVGhlIGRvd25sb2FkIGZhaWxzIGR1ZSBpbnN1ZmZpY2llbnQgbWVtb3J5IGluIHRoZSBkZXZpY2UKCQkJCQkJCQl0byBzYXZlIHRoZSBmaXJtd2FyZSB1cGRhdGUgcGFja2FnZS4qLwoJRlVNT19VUERBVEVfT1VUX09GX01FTSA9IDUwMiwgLypGaXJtd2FyZSB1cGRhdGUgZmFpbHMgZHVlIHRvIGRldmljZSBvdXQgb2YgbWVtb3J5CgkJCQlUaGUgdXBkYXRlIGZhaWxzIGJlY2F1c2UgdGhlcmUgaXNuoa90IHN1ZmZpY2llbnQgbWVtb3J5IHRvIHVwZGF0ZSB0aGUgZGV2aWNlLiovCglGVU1PX0RMX05FVFdPUktfRVJSID0gNTAzLCAvKkRvd25sb2FkIGZhaWxzIGR1ZSB0byBuZXR3b3JrIGlzc3VlcwoJCQkJCQkJCVRoZSBkb3dubG9hZCBmYWlscyBkdWUgdG8gbmV0d29yay90cmFuc3BvcnQgbGV2ZWwgZXJyb3JzKi8KCUZVTU9fQUxUX0RMX1NFUlZfRVJSX1ZFTkRPUl9TUEVDID0gNTUwLCAvKjU1MC01OTk6IEFsdGVybmF0ZSBEb3dubG9hZCBTZXJ2ZXIgRXJyb3IuCgkJCQkJCQkJVmVuZG9yIFNwZWNpZmllZAoJCQkJCQkJCUFsdGVybmF0ZSBEb3dubG9hZCBTZXJ2ZXIgRXJyb3IgZW5jb3VudGVyZWQgZm9yIE9wZXJhdGlvbgoJCQkJCQkJCXdpdGggVmVuZG9yIFNwZWNpZmllZCBSZXN1bHRDb2RlKi8KCglGVU1PX1JFU1VMVF9FTkQKfSBGVU1PX1JFU1VMVDsKCiNkZWZpbmUgR0FQSV9MT0dfTEVWRUxfSVNfRklMRShsZXZlbCkJCSgobGV2ZWwpPjQpCiNkZWZpbmUgR0FQSV9MT0dfRkxVU0hfTEVWRUwJCTEwCgp0eXBlZGVmIHZvaWQgKCpHSW5kUmN2SENJUGFja2V0KSAoR0RFVl9JRF9QIHBJRCwgY2hhciAqc3pCdWYsIGludCBuQnVmU2l6ZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmRQb3dlck1vZGVDaGFuZ2UpIChHREVWX0lEX1AgcElELCBHQ1RfQVBJX1BPV0VSX01PREUgblBvd2VyTW9kZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmREZXZpY2VTdGF0dXNVcGRhdGUpKEdERVZfSURfUCBwSUQsCgkJCQlXSU1BWF9BUElfREVWSUNFX1NUQVRVUyBkZXZpY2VTdGF0dXMsCgkJCQlXSU1BWF9BUElfU1RBVFVTX1JFQVNPTiBzdGF0dXNSZWFzb24sCgkJCQlXSU1BWF9BUElfQ09OTkVDVElPTl9QUk9HUkVTU19JTkZPIGNvbm5lY3Rpb25Qcm9ncmVzc0luZm8pOwp0eXBlZGVmIHZvaWQgKCpHSW5kRGV2aWNlSW5zZXJ0UmVtb3ZlKShHREVWX0lEX1AgcElELCBCT09MIGNhcmRQcmVzZW5jZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmRDb250cm9sUG93ZXJNYW5hZ2VtZW50KShHREVWX0lEX1AgcElELCBXSU1BWF9BUElfUkZfU1RBVEUgcG93ZXJTdGF0ZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmRDb25uZWN0VG9OZXR3b3JrKSAoR0RFVl9JRF9QIHBJRCwKCQkJCVdJTUFYX0FQSV9ORVRXT1JLX0NPTk5FQ1RJT05fUkVTUCBuZXR3b3JrQ29ubmVjdGlvblJlc3BvbnNlKTsKdHlwZWRlZiB2b2lkICgqR0luZERpc2Nvbm5lY3RGcm9tTmV0d29yaykgKEdERVZfSURfUCBwSUQsCgkJCQlXSU1BWF9BUElfTkVUV09SS19DT05ORUNUSU9OX1JFU1AgbmV0d29ya0Rpc2Nvbm5lY3RSZXNwb25zZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmROZXR3b3JrU2VhcmNoV2lkZVNjYW4pIChHREVWX0lEX1AgcElELCBXSU1BWF9BUElfTlNQX0lORk9fUCBwTnNwTGlzdCwKCQkJCVVJTlQzMiBsaXN0U2l6ZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmRQcm92aXNpb25pbmdPcGVyYXRpb24pIChHREVWX0lEX1AgcElELCAKCQkJCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTiBwcm92aXNpb25pbmdPcGVyYXRpb24sCgkJCQlXSU1BWF9BUElfQ09OVEFDVF9UWVBFIGNvbnRhY3RUeXBlKTsKdHlwZWRlZiB2b2lkICgqR0luZFBhY2thZ2VVcGRhdGUpIChHREVWX0lEX1AgcElELCBXSU1BWF9BUElfUEFDS19VUERBVEUgcGFja2FnZVVwZGF0ZSk7CnR5cGVkZWYgdm9pZCAoKkdJbmROb3RpZmljYXRpb24pIChHREVWX0lEX1AgcElELCBHQ1RfQVBJX05PVElfQ0FURUdPUlkgbkNhdGVnb3J5LAoJCQkJR0NUX0FQSV9OT1RJX1RZUEUgblR5cGUsIGludCBuQnVmU2l6ZSwgY2hhciAqc3pCdWYpOwoKI2lmIGRlZmluZWQoQ09ORklHX0VOQUJMRV9TRVJWSUNFX0ZMT1cpCnR5cGVkZWYgdm9pZCAoKkdJbmROb3RpU2VydmljZUZsb3cpKEdERVZfSURfUCBwSUQsIFdJTUFYX1NGX0VWRU5UX1AgcFNmRXZlbnQpOwojZW5kaWYgLy8gQ09ORklHX0VOQUJMRV9TRVJWSUNFX0ZMT1cKI2VuZGlmCg==