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:9/PKQ1.181007.001/V10.3.2.0.PEDCNXM:user/release-keys");
ui_print("Target: Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V10.3.4.0.PEDCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V10.3.2.0.PEDCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V10.3.4.0.PEDCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V10.3.2.0.PEDCNXM:user/release-keys or Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V10.3.4.0.PEDCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:54269258:baa41883071a03e2833d8fd8e8171927ad63f710:54273354:f91726b4c58b279f11453e2d72cda919a2acab83") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:54269258:baa41883071a03e2833d8fd8e8171927ad63f710:54273354:f91726b4c58b279f11453e2d72cda919a2acab83\" has unexpected contents.");
apply_patch_space(54273354) || 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", "62,1,208,223,528,8303,8310,8412,8416,8419,8421,8429,8431,8463,8465,8475,8477,8483,8485,8490,8492,8526,8528,8531,8533,8783,8785,8793,8795,8798,8800,8964,8966,8969,8971,8974,8976,9006,32770,32959,97086,98174,98306,98495,163842,164031,229378,229567,294914,295103,509737,522006,524293,524295,524296,528344,643857,643865,684919,774155,780254,780261,786432") == "0af41982e9c272e28f6fbf10b597993e81660a16" || 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", "62,1,208,223,528,8303,8310,8412,8416,8419,8421,8429,8431,8463,8465,8475,8477,8483,8485,8490,8492,8526,8528,8531,8533,8783,8785,8793,8795,8798,8800,8964,8966,8969,8971,8974,8976,9006,32770,32959,97086,98174,98306,98495,163842,164031,229378,229567,294914,295103,509737,522006,524293,524295,524296,528344,643857,643865,684919,774155,780254,780261,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", "78,1,197,207,208,223,451,8303,8309,8310,8343,8350,8351,8353,8354,8368,8369,8577,8596,8605,8696,9133,9182,9275,9290,9304,9680,10569,10570,11233,11234,11479,11509,12097,12100,12211,12216,12220,12232,12244,12247,12248,12249,12349,12350,12355,12356,12373,12387,12391,12400,12403,12436,12439,12447,12472,12475,12734,32770,32959,98306,98495,163842,164031,192986,229376,229378,294912,294914,524288,524289,524295,524296,774155,776558,780142,780254,780261,786432") == "94564e8cb4d0acf37b9597765a01f082bb04eb3c" || 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", "78,1,197,207,208,223,451,8303,8309,8310,8343,8350,8351,8353,8354,8368,8369,8577,8596,8605,8696,9133,9182,9275,9290,9304,9680,10569,10570,11233,11234,11479,11509,12097,12100,12211,12216,12220,12232,12244,12247,12248,12249,12349,12350,12355,12356,12373,12387,12391,12400,12403,12436,12439,12447,12472,12475,12734,32770,32959,98306,98495,163842,164031,192986,229376,229378,294912,294914,524288,524289,524295,524296,774155,776558,780142,780254,780261,786432") && 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);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:54269258:baa41883071a03e2833d8fd8e8171927ad63f710:54273354:f91726b4c58b279f11453e2d72cda919a2acab83",
            "-", f91726b4c58b279f11453e2d72cda919a2acab83, 54273354,
            baa41883071a03e2833d8fd8e8171927ad63f710, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
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.");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/pmic.elf", "/dev/block/bootdevice/by-name/pmic");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/pmic.elf", "/dev/block/bootdevice/by-name/pmicbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
show_progress(0.100000, 2);
