getprop("ro.product.device") == "pine" || abort("E3004: This package is for \"pine\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.2.0.QCMCNXM:user/release-keys");
ui_print("Target: Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.3.0.QCMCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.2.0.QCMCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.3.0.QCMCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.2.0.QCMCNXM:user/release-keys or Xiaomi/pine/pine:10/QKQ1.191014.001/V12.0.3.0.QCMCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:33554432:5ec01f563e1074b48c0d5a0ad2a6a5fb49a67a21",
                      "EMMC:/dev/block/bootdevice/by-name/boot:33554432:a4df46ffe15642d7cb4f94cf27f0e0638c44e7bf") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:5ec01f563e1074b48c0d5a0ad2a6a5fb49a67a21\" or \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:a4df46ffe15642d7cb4f94cf27f0e0638c44e7bf\" has unexpected contents.");
apply_patch_space(139223040) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/rpm:169092:78753b27f410957c36688186312cfc2b523957af",
                      "EMMC:/dev/block/bootdevice/by-name/rpm:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpm:169092:78753b27f410957c36688186312cfc2b523957af\" or \"EMMC:/dev/block/bootdevice/by-name/rpm:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:78753b27f410957c36688186312cfc2b523957af",
                      "EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:78753b27f410957c36688186312cfc2b523957af\" or \"EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5",
                      "EMMC:/dev/block/bootdevice/by-name/devcfg:38076:5ad1c067a09341b38736380f1a580c8d60640936") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5\" or \"EMMC:/dev/block/bootdevice/by-name/devcfg:38076:5ad1c067a09341b38736380f1a580c8d60640936\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5",
                      "EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:5ad1c067a09341b38736380f1a580c8d60640936") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5\" or \"EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:5ad1c067a09341b38736380f1a580c8d60640936\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/aboot:774108:41287dca364ae9391c66f7a41397fc091823f9c7",
                      "EMMC:/dev/block/bootdevice/by-name/aboot:774108:7d9066015c8c0517bc37ee7823170215d48e9a45") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/aboot:774108:41287dca364ae9391c66f7a41397fc091823f9c7\" or \"EMMC:/dev/block/bootdevice/by-name/aboot:774108:7d9066015c8c0517bc37ee7823170215d48e9a45\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/abootbak:774108:41287dca364ae9391c66f7a41397fc091823f9c7",
                      "EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7d9066015c8c0517bc37ee7823170215d48e9a45") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abootbak:774108:41287dca364ae9391c66f7a41397fc091823f9c7\" or \"EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7d9066015c8c0517bc37ee7823170215d48e9a45\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:e764f704b52c03d135cf7a09a7d6d1ec9f7c0fdb",
                      "EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:80d134d527a1e0ffbdfc43dab816999be99d4738") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:e764f704b52c03d135cf7a09a7d6d1ec9f7c0fdb\" or \"EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:80d134d527a1e0ffbdfc43dab816999be99d4738\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/keymaster:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70",
                      "EMMC:/dev/block/bootdevice/by-name/keymaster:319776:4209b311db737dd7f6935e78c585d5c8936a39b3") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/keymaster:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70\" or \"EMMC:/dev/block/bootdevice/by-name/keymaster:319776:4209b311db737dd7f6935e78c585d5c8936a39b3\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70",
                      "EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:4209b311db737dd7f6935e78c585d5c8936a39b3") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70\" or \"EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:4209b311db737dd7f6935e78c585d5c8936a39b3\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:543a8bdce2ccf0c1e36c4746ef5b4df13dfaca03",
                      "EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:75972b524b32f0d3b8c41f37f358746326bc6752") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:543a8bdce2ccf0c1e36c4746ef5b4df13dfaca03\" or \"EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:75972b524b32f0d3b8c41f37f358746326bc6752\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/modem:134217728:9366bf6cf2bf7e918ec095f7278e9979f054c338",
                      "EMMC:/dev/block/bootdevice/by-name/modem:134217728:eb57e11bc412574a58e7754abccdab2385ecd8ee") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/modem:134217728:9366bf6cf2bf7e918ec095f7278e9979f054c338\" or \"EMMC:/dev/block/bootdevice/by-name/modem:134217728:eb57e11bc412574a58e7754abccdab2385ecd8ee\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/tz:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee",
                      "EMMC:/dev/block/bootdevice/by-name/tz:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/tz:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee\" or \"EMMC:/dev/block/bootdevice/by-name/tz:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee",
                      "EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee\" or \"EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/dsp:16777216:3b187c12314cdda54b3bbe0e2fd728dd9a102900",
                      "EMMC:/dev/block/bootdevice/by-name/dsp:16777216:cb4d87fdc98670a4085e4bacca8c30573dc28991") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dsp:16777216:3b187c12314cdda54b3bbe0e2fd728dd9a102900\" or \"EMMC:/dev/block/bootdevice/by-name/dsp:16777216:cb4d87fdc98670a4085e4bacca8c30573dc28991\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/sbl1:409044:060454b47fcbc36a0409558f6c488d4866d4543c",
                      "EMMC:/dev/block/bootdevice/by-name/sbl1:409044:c43318a0e637bbf41beecfb513b82e8822a544c9") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1:409044:060454b47fcbc36a0409558f6c488d4866d4543c\" or \"EMMC:/dev/block/bootdevice/by-name/sbl1:409044:c43318a0e637bbf41beecfb513b82e8822a544c9\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:060454b47fcbc36a0409558f6c488d4866d4543c",
                      "EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:c43318a0e637bbf41beecfb513b82e8822a544c9") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:060454b47fcbc36a0409558f6c488d4866d4543c\" or \"EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:c43318a0e637bbf41beecfb513b82e8822a544c9\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7d38b5451a93909371f5555699ad0ec8cbf00058",
                      "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:881208604a8a5183fd59a49753700ffe979d29e2") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7d38b5451a93909371f5555699ad0ec8cbf00058\" or \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:881208604a8a5183fd59a49753700ffe979d29e2\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:45ba578b577b198f3d6f07805fe6a5dea24af7b2",
                      "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:54b3b103df1c0c98d84abd3792f746741499cb5e") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:45ba578b577b198f3d6f07805fe6a5dea24af7b2\" or \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:54b3b103df1c0c98d84abd3792f746741499cb5e\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "126,1,521,696,710,740,747,767,768,955,960,962,963,1069,1070,1550,1551,1553,1555,1556,1557,1572,1573,1710,1711,1977,2023,2038,2046,2538,2539,2541,2542,2545,2546,2554,2555,2556,2557,4153,4249,6978,6979,6981,6982,7266,7267,7269,7270,7281,7439,7762,7812,7833,7835,13774,13775,13908,13909,16678,16680,16961,16973,17014,17526,17603,32770,32958,32959,33464,65537,66042,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,477396,477400,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,712613,753664,753665,774003,786268,786431,786432") == "e62930f6b8aab5dae598ca3a54bb7a594c224e75" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "126,1,521,696,710,740,747,767,768,955,960,962,963,1069,1070,1550,1551,1553,1555,1556,1557,1572,1573,1710,1711,1977,2023,2038,2046,2538,2539,2541,2542,2545,2546,2554,2555,2556,2557,4153,4249,6978,6979,6981,6982,7266,7267,7269,7270,7281,7439,7762,7812,7833,7835,13774,13775,13908,13909,16678,16680,16961,16973,17014,17526,17603,32770,32958,32959,33464,65537,66042,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,477396,477400,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,712613,753664,753665,774003,786268,786431,786432") && block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/bootdevice/by-name/vendor", "574,1,456,570,578,588,592,597,598,679,683,688,689,952,956,961,962,964,965,1189,1197,1205,1211,1223,1227,1231,1232,1235,1239,1243,1244,1817,1818,2265,2732,3731,3732,3913,3914,4300,4301,4933,4934,5670,5675,8854,8855,30498,30499,31985,31986,32768,32770,32832,32833,40594,40599,50522,50524,50544,50546,50865,50866,51192,51193,51487,51488,51796,51797,52079,52080,52374,52375,52746,52747,52821,52822,56251,56252,56462,56463,56518,56521,56539,56540,56585,56586,56604,56606,56655,56656,56687,56688,57575,57576,57589,57590,57620,57621,57719,57720,57994,57995,58011,58012,58159,58160,58162,58163,58729,58730,58806,58807,58808,58809,58812,58813,58821,58823,60089,60090,61227,61229,61650,61651,61925,61926,62350,62351,62525,62529,63370,63371,64279,64280,65067,65398,65536,65537,73762,73763,74749,74750,84501,84502,85980,85981,87644,87646,89306,89307,91082,91083,92745,92746,94470,94471,96164,96165,97379,97380,98304,98306,98368,98369,99276,99277,100598,100599,101825,101826,103149,103150,104536,104537,105829,105830,107132,107133,108487,108488,109782,109783,111039,111040,112275,112276,113628,113629,114811,114812,116164,116165,117403,117404,118213,118214,118238,118239,118263,118264,118520,118521,118545,118546,118570,118571,118595,118596,118620,118621,118721,118722,118963,118964,118988,118989,119126,119127,119151,119152,119176,119177,119786,119787,119811,119812,119836,119837,120049,120050,120094,120095,120119,120120,120144,120145,120169,120170,120194,120195,120536,120537,120561,120562,120699,120700,120724,120725,120749,120750,121386,121387,122588,122589,123908,123909,124099,124100,124124,124125,124149,124150,125191,125192,126485,126486,127638,127639,128886,128887,130103,130104,131072,131073,131800,131801,133051,133052,134265,134266,135414,135415,136555,136556,137700,137701,138850,138851,139316,139317,139341,139342,139366,139367,139623,139624,139648,139649,139673,139674,139698,139699,139723,139724,140065,140066,140090,140091,140134,140135,140229,140230,140254,140255,140279,140280,140889,140890,140914,140915,140939,140940,141196,141197,141221,141222,141246,141247,141271,141272,141296,141297,141349,141350,141639,141640,141664,141665,141802,141803,141827,141828,141852,141853,142565,142566,142804,142805,142829,142830,142854,142855,143718,143719,145471,145472,147193,147194,148934,148935,149157,149158,149182,149183,149207,149208,149232,149233,149257,149258,149599,149600,149624,149625,150683,150684,152173,152174,153538,153539,154884,154885,156162,156163,157521,157522,158862,158863,160119,160120,161436,161437,163148,163149,163840,163842,163904,163905,165434,165435,168672,168832,178221,178222,183942,183943,184273,184274,185180,185181,185207,185208,185243,185244,185290,185291,185323,185324,185352,185353,185385,185386,185421,185422,185457,185458,185478,185479,185511,185512,185583,185584,186003,186004,186022,186023,186041,186042,186061,186062,186103,186104,186145,186146,186186,186187,186206,186207,186230,186231,186245,186246,186280,186281,186306,186307,186345,186346,186376,186377,186405,186406,186434,186435,186463,186464,186482,186483,186498,186499,186520,186521,186540,186541,186569,186570,186596,186597,186619,186620,186642,186643,186691,186692,186717,186718,186742,186743,186765,186766,186794,186795,186822,186823,186840,186841,186858,186859,186886,186887,186908,186909,186940,186941,186959,186960,186981,186982,187004,187005,187021,187022,187043,187044,187065,187066,187087,187088,187110,187111,187185,187186,187214,187215,187243,187244,187273,187274,187312,187313,187351,187352,187393,187394,187432,187433,187522,187523,187560,187561,187594,187595,187618,187619,187640,187641,187664,187665,187690,187691,187711,187712,187728,187729,187746,187747,187917,187918,189062,189063,189078,189079,190016,196609,197114,222970,229376,229378,229440,229441,257987,262077,262143,262144") == "7f3083bb4a082f4166701dcc3ff2c8c956f90376" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "574,1,456,570,578,588,592,597,598,679,683,688,689,952,956,961,962,964,965,1189,1197,1205,1211,1223,1227,1231,1232,1235,1239,1243,1244,1817,1818,2265,2732,3731,3732,3913,3914,4300,4301,4933,4934,5670,5675,8854,8855,30498,30499,31985,31986,32768,32770,32832,32833,40594,40599,50522,50524,50544,50546,50865,50866,51192,51193,51487,51488,51796,51797,52079,52080,52374,52375,52746,52747,52821,52822,56251,56252,56462,56463,56518,56521,56539,56540,56585,56586,56604,56606,56655,56656,56687,56688,57575,57576,57589,57590,57620,57621,57719,57720,57994,57995,58011,58012,58159,58160,58162,58163,58729,58730,58806,58807,58808,58809,58812,58813,58821,58823,60089,60090,61227,61229,61650,61651,61925,61926,62350,62351,62525,62529,63370,63371,64279,64280,65067,65398,65536,65537,73762,73763,74749,74750,84501,84502,85980,85981,87644,87646,89306,89307,91082,91083,92745,92746,94470,94471,96164,96165,97379,97380,98304,98306,98368,98369,99276,99277,100598,100599,101825,101826,103149,103150,104536,104537,105829,105830,107132,107133,108487,108488,109782,109783,111039,111040,112275,112276,113628,113629,114811,114812,116164,116165,117403,117404,118213,118214,118238,118239,118263,118264,118520,118521,118545,118546,118570,118571,118595,118596,118620,118621,118721,118722,118963,118964,118988,118989,119126,119127,119151,119152,119176,119177,119786,119787,119811,119812,119836,119837,120049,120050,120094,120095,120119,120120,120144,120145,120169,120170,120194,120195,120536,120537,120561,120562,120699,120700,120724,120725,120749,120750,121386,121387,122588,122589,123908,123909,124099,124100,124124,124125,124149,124150,125191,125192,126485,126486,127638,127639,128886,128887,130103,130104,131072,131073,131800,131801,133051,133052,134265,134266,135414,135415,136555,136556,137700,137701,138850,138851,139316,139317,139341,139342,139366,139367,139623,139624,139648,139649,139673,139674,139698,139699,139723,139724,140065,140066,140090,140091,140134,140135,140229,140230,140254,140255,140279,140280,140889,140890,140914,140915,140939,140940,141196,141197,141221,141222,141246,141247,141271,141272,141296,141297,141349,141350,141639,141640,141664,141665,141802,141803,141827,141828,141852,141853,142565,142566,142804,142805,142829,142830,142854,142855,143718,143719,145471,145472,147193,147194,148934,148935,149157,149158,149182,149183,149207,149208,149232,149233,149257,149258,149599,149600,149624,149625,150683,150684,152173,152174,153538,153539,154884,154885,156162,156163,157521,157522,158862,158863,160119,160120,161436,161437,163148,163149,163840,163842,163904,163905,165434,165435,168672,168832,178221,178222,183942,183943,184273,184274,185180,185181,185207,185208,185243,185244,185290,185291,185323,185324,185352,185353,185385,185386,185421,185422,185457,185458,185478,185479,185511,185512,185583,185584,186003,186004,186022,186023,186041,186042,186061,186062,186103,186104,186145,186146,186186,186187,186206,186207,186230,186231,186245,186246,186280,186281,186306,186307,186345,186346,186376,186377,186405,186406,186434,186435,186463,186464,186482,186483,186498,186499,186520,186521,186540,186541,186569,186570,186596,186597,186619,186620,186642,186643,186691,186692,186717,186718,186742,186743,186765,186766,186794,186795,186822,186823,186840,186841,186858,186859,186886,186887,186908,186909,186940,186941,186959,186960,186981,186982,187004,187005,187021,187022,187043,187044,187065,187066,187087,187088,187110,187111,187185,187186,187214,187215,187243,187244,187273,187274,187312,187313,187351,187352,187393,187394,187432,187433,187522,187523,187560,187561,187594,187595,187618,187619,187640,187641,187664,187665,187690,187691,187711,187712,187728,187729,187746,187747,187917,187918,189062,189063,189078,189079,190016,196609,197114,222970,229376,229378,229440,229441,257987,262077,262143,262144") && block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;

# ---- start making changes here ----

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:33554432:5ec01f563e1074b48c0d5a0ad2a6a5fb49a67a21",
                "EMMC:/dev/block/bootdevice/by-name/boot:33554432:a4df46ffe15642d7cb4f94cf27f0e0638c44e7bf",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:33554432:a4df46ffe15642d7cb4f94cf27f0e0638c44e7bf");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpm:169092:78753b27f410957c36688186312cfc2b523957af",
                "EMMC:/dev/block/bootdevice/by-name/rpm:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpm:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5",
                "EMMC:/dev/block/bootdevice/by-name/devcfg:38076:5ad1c067a09341b38736380f1a580c8d60640936",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfg:38076:5ad1c067a09341b38736380f1a580c8d60640936");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:774108:41287dca364ae9391c66f7a41397fc091823f9c7",
                "EMMC:/dev/block/bootdevice/by-name/aboot:774108:7d9066015c8c0517bc37ee7823170215d48e9a45",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:774108:7d9066015c8c0517bc37ee7823170215d48e9a45");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:e764f704b52c03d135cf7a09a7d6d1ec9f7c0fdb",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:80d134d527a1e0ffbdfc43dab816999be99d4738",
                package_extract_file("patch/firmware-update/cmnlib64_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:80d134d527a1e0ffbdfc43dab816999be99d4738");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymaster:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70",
                "EMMC:/dev/block/bootdevice/by-name/keymaster:319776:4209b311db737dd7f6935e78c585d5c8936a39b3",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymaster:319776:4209b311db737dd7f6935e78c585d5c8936a39b3");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:543a8bdce2ccf0c1e36c4746ef5b4df13dfaca03",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:75972b524b32f0d3b8c41f37f358746326bc6752",
                package_extract_file("patch/firmware-update/cmnlib_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:75972b524b32f0d3b8c41f37f358746326bc6752");
patch_partition("EMMC:/dev/block/bootdevice/by-name/modem:134217728:9366bf6cf2bf7e918ec095f7278e9979f054c338",
                "EMMC:/dev/block/bootdevice/by-name/modem:134217728:eb57e11bc412574a58e7754abccdab2385ecd8ee",
                package_extract_file("patch/firmware-update/NON-HLOS.bin.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/modem:134217728:eb57e11bc412574a58e7754abccdab2385ecd8ee");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tz:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee",
                "EMMC:/dev/block/bootdevice/by-name/tz:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tz:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d");
patch_partition("EMMC:/dev/block/bootdevice/by-name/dsp:16777216:3b187c12314cdda54b3bbe0e2fd728dd9a102900",
                "EMMC:/dev/block/bootdevice/by-name/dsp:16777216:cb4d87fdc98670a4085e4bacca8c30573dc28991",
                package_extract_file("patch/firmware-update/adspso.bin.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dsp:16777216:cb4d87fdc98670a4085e4bacca8c30573dc28991");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1:409044:060454b47fcbc36a0409558f6c488d4866d4543c",
                "EMMC:/dev/block/bootdevice/by-name/sbl1:409044:c43318a0e637bbf41beecfb513b82e8822a544c9",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1:409044:c43318a0e637bbf41beecfb513b82e8822a544c9");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:78753b27f410957c36688186312cfc2b523957af",
                "EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:d6c6d1815715dcd8acbf3562c7dda6becbda3d99");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ed03b7763fa31d124fd439e8f9b89b5a27735ce5",
                "EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:5ad1c067a09341b38736380f1a580c8d60640936",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:5ad1c067a09341b38736380f1a580c8d60640936");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:774108:41287dca364ae9391c66f7a41397fc091823f9c7",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7d9066015c8c0517bc37ee7823170215d48e9a45",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7d9066015c8c0517bc37ee7823170215d48e9a45");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:d6e7a3f69bf7c2abb24258d9963dc0e8ac707a70",
                "EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:4209b311db737dd7f6935e78c585d5c8936a39b3",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:4209b311db737dd7f6935e78c585d5c8936a39b3");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:78b47ce56dd09e230c03db5a3fe115ba0dc0a8ee",
                "EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:e0d03eca0b2218d15098976e2223fdad12adfd5d");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:060454b47fcbc36a0409558f6c488d4866d4543c",
                "EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:c43318a0e637bbf41beecfb513b82e8822a544c9",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1bak:409044:c43318a0e637bbf41beecfb513b82e8822a544c9");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/splash.img", "/dev/block/bootdevice/by-name/splash");
patch_partition("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7d38b5451a93909371f5555699ad0ec8cbf00058",
                "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:881208604a8a5183fd59a49753700ffe979d29e2",
                package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:881208604a8a5183fd59a49753700ffe979d29e2");
patch_partition("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:45ba578b577b198f3d6f07805fe6a5dea24af7b2",
                "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:54b3b103df1c0c98d84abd3792f746741499cb5e",
                package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:54b3b103df1c0c98d84abd3792f746741499cb5e");
