getprop("ro.product.device") == "nitrogen" || abort("E3004: This package is for \"nitrogen\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.0.2.0.QEDCNXM:user/release-keys");
ui_print("Target: Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.5.1.0.QEDCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.0.2.0.QEDCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.5.1.0.QEDCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.0.2.0.QEDCNXM:user/release-keys or Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.5.1.0.QEDCNXM: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:35513674:b6d248d4a4f62cc0c101e2c99f349f3c14358c2e",
                      "EMMC:/dev/block/bootdevice/by-name/boot:35517770:cf51508922da57838c083281b47f0475f8f068eb") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:35513674:b6d248d4a4f62cc0c101e2c99f349f3c14358c2e\" or \"EMMC:/dev/block/bootdevice/by-name/boot:35517770:cf51508922da57838c083281b47f0475f8f068eb\" has unexpected contents.");
apply_patch_space(138940416) || 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/abl:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                      "EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abl:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f\" or \"EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/ablbak:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                      "EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/ablbak:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f\" or \"EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745\" has unexpected contents.");
apply_patch_space(151552) || 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", "270,1,518,698,712,722,725,743,750,752,753,1013,1018,1020,1021,1127,1128,1612,1613,2301,2302,2304,2306,2307,2308,2323,2324,2505,2506,3675,3676,3678,3679,3683,3684,3692,3693,3694,3695,9052,9053,9055,9056,9460,9461,9463,9464,10459,10461,16400,16401,16534,16535,19304,19306,23267,32770,32959,32960,33466,51350,52422,52681,52830,53072,53402,65537,66043,98306,98495,98496,99002,131073,131579,162101,163840,163842,164031,164032,167289,196609,197115,222600,229376,229378,229567,229568,233882,233883,245439,245440,259559,259560,259848,259849,262144,262145,265201,294914,295103,295104,295610,327681,328187,360449,360955,393217,393723,425985,426491,430670,430780,458753,459259,491220,491273,491275,491432,491492,491520,491521,492108,492229,492282,492288,492549,492624,492736,502315,502319,502431,502435,502454,502464,502477,502484,502499,502509,502517,502521,502571,502573,502609,502620,502632,502637,502647,502659,502665,502673,502686,502690,502703,502707,502710,502713,505775,506136,506175,506176,507592,508853,508855,510353,524289,524795,557057,557563,589825,590331,592406,592762,593827,593832,593833,593845,593846,593855,593857,593860,598208,598216,598230,598231,598240,598241,598284,598285,598312,598315,598319,598331,598334,598339,598345,598354,598359,598363,598376,598380,598390,598391,598394,598395,598405,598406,598416,598418,598432,598434,598447,598456,598465,598467,598472,598486,598496,598535,598538,598550,598553,598556,598948,598951,598973,598974,598986,598988,598989,598996,599074,599075,599080,599083,599101,599102,599111,599116,599118,599119,599128,599130,599443,599445,600088,600091,600458,600489,600518,600519,600540,600541,600613,600642,600753,600755,622593,623099,655361,655867,688129,688635,720897,721403,749249,753664,753665,774155,780254,780261,780715") == "a22f1461c4bd5c4819f82aee437ec44e8e73c4f2" || 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", "270,1,518,698,712,722,725,743,750,752,753,1013,1018,1020,1021,1127,1128,1612,1613,2301,2302,2304,2306,2307,2308,2323,2324,2505,2506,3675,3676,3678,3679,3683,3684,3692,3693,3694,3695,9052,9053,9055,9056,9460,9461,9463,9464,10459,10461,16400,16401,16534,16535,19304,19306,23267,32770,32959,32960,33466,51350,52422,52681,52830,53072,53402,65537,66043,98306,98495,98496,99002,131073,131579,162101,163840,163842,164031,164032,167289,196609,197115,222600,229376,229378,229567,229568,233882,233883,245439,245440,259559,259560,259848,259849,262144,262145,265201,294914,295103,295104,295610,327681,328187,360449,360955,393217,393723,425985,426491,430670,430780,458753,459259,491220,491273,491275,491432,491492,491520,491521,492108,492229,492282,492288,492549,492624,492736,502315,502319,502431,502435,502454,502464,502477,502484,502499,502509,502517,502521,502571,502573,502609,502620,502632,502637,502647,502659,502665,502673,502686,502690,502703,502707,502710,502713,505775,506136,506175,506176,507592,508853,508855,510353,524289,524795,557057,557563,589825,590331,592406,592762,593827,593832,593833,593845,593846,593855,593857,593860,598208,598216,598230,598231,598240,598241,598284,598285,598312,598315,598319,598331,598334,598339,598345,598354,598359,598363,598376,598380,598390,598391,598394,598395,598405,598406,598416,598418,598432,598434,598447,598456,598465,598467,598472,598486,598496,598535,598538,598550,598553,598556,598948,598951,598973,598974,598986,598988,598989,598996,599074,599075,599080,599083,599101,599102,599111,599116,599118,599119,599128,599130,599443,599445,600088,600091,600458,600489,600518,600519,600540,600541,600613,600642,600753,600755,622593,623099,655361,655867,688129,688635,720897,721403,749249,753664,753665,774155,780254,780261,780715") && 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", "40,1,437,698,706,716,717,798,799,863,864,866,32770,32959,32960,33466,65537,66043,98306,98495,98496,99002,131073,131579,163842,164031,164032,164538,196609,197115,210692,229376,229378,294912,294914,753664,753665,774155,780254,780261,780625") == "b1c2ad149ce9166fc605626eda9f5ed95b2fb610" || 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", "40,1,437,698,706,716,717,798,799,863,864,866,32770,32959,32960,33466,65537,66043,98306,98495,98496,99002,131073,131579,163842,164031,164032,164538,196609,197115,210692,229376,229378,294912,294914,753664,753665,774155,780254,780261,780625") && 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 ----


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

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abl:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                "EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745",
                package_extract_file("patch/firmware-update/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745");
patch_partition("EMMC:/dev/block/bootdevice/by-name/ablbak:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                "EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745",
                package_extract_file("patch/firmware-update/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:35513674:b6d248d4a4f62cc0c101e2c99f349f3c14358c2e",
                "EMMC:/dev/block/bootdevice/by-name/boot:35517770:cf51508922da57838c083281b47f0475f8f068eb",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:35517770:cf51508922da57838c083281b47f0475f8f068eb");

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

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abl:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                "EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745",
                package_extract_file("patch/firmware-update/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abl:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745");
patch_partition("EMMC:/dev/block/bootdevice/by-name/ablbak:151552:c499329a4ed9cc8ceced6964078f3a3eda23012f",
                "EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745",
                package_extract_file("patch/firmware-update/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/ablbak:151552:5bdfd8aba0518e849d99edf58da4ce9837b0f745");
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...");
