getprop("ro.product.device") == "grus" || abort("E3004: This package is for \"grus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.1.0.QFBMIXM:user/release-keys");
ui_print("Target: Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.2.0.QFBMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.1.0.QFBMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.2.0.QFBMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.1.0.QFBMIXM:user/release-keys or Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.2.0.QFBMIXM: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:134217728:a6b98c6ed2988aba2221d700b740cb20ec6cc7db",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:cab148c75f51d4cfd06ceb020d13d545e01112e3") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:a6b98c6ed2988aba2221d700b740cb20ec6cc7db\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:cab148c75f51d4cfd06ceb020d13d545e01112e3\" 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", "486,1,572,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2566,2709,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35038,35039,35657,35660,35671,35672,35678,35679,35684,35685,35804,35807,37421,37422,39633,39634,39665,39666,39878,39879,39978,41395,43209,43210,43223,43224,43228,43229,43231,43232,45596,45597,45967,45968,46055,46056,46247,46248,48933,48934,48937,48938,49247,49248,52939,52940,53101,53102,53522,53523,54429,54430,54434,54435,54457,54458,55678,55679,56078,56079,56115,56116,59423,59425,63211,63212,63399,63400,64702,64703,64841,64842,64874,64875,65325,65326,65536,65537,66515,66516,67745,67746,67922,67923,69737,69738,72194,72195,72680,72681,75233,75234,76413,76414,76460,76461,76480,76483,79777,79778,82183,82184,82948,82949,83095,83096,83755,83756,83768,83769,83773,83774,84115,84118,84128,84129,89212,89213,90863,90864,90915,90916,90919,90922,92642,92643,92727,92728,92730,92731,92752,92753,93691,93694,94081,94084,94250,94251,94292,94293,96158,96159,96209,96210,96560,96561,96580,96581,96652,96653,97266,97267,98304,98306,98526,98527,102145,102146,102151,102152,102547,102548,104029,104030,105393,105394,105842,105843,105847,105848,105856,105857,105861,105862,105873,105874,105897,105898,107794,107795,107933,107934,108213,108216,108744,108745,108748,108749,109674,109675,110341,110342,110608,110611,112847,112848,113053,113054,115683,115684,115696,115697,116038,116039,117887,117972,118383,118384,118819,118820,120556,120557,123328,123334,123340,123341,123660,123661,123737,123968,123975,123976,123988,123989,123998,124001,124002,124003,124004,124005,124007,124008,124009,124010,124066,124067,124073,124074,124160,124161,124165,124166,124172,124173,124196,124197,124267,124268,124271,124276,124277,124278,124279,124280,124281,124282,125212,125213,125220,125221,125774,125776,126329,126331,126332,126333,126334,126335,126336,126337,126338,126339,126340,126341,126342,126343,126345,126346,126347,126350,127207,127209,127210,127211,127294,127295,127297,127298,127301,127303,127561,127562,127569,127571,127692,128055,128061,128063,128170,128171,128201,128202,128213,128214,128480,128481,128594,128595,128611,128613,128615,128616,131072,131073,138056,138057,145979,145980,147928,147929,148206,148207,148231,148240,153360,153361,163840,163842,164062,164063,164595,165857,166089,168215,170812,170813,170838,170849,170976,170977,177086,177087,189597,191082,191361,193962,196608,196609,197511,197512,198584,198585,216102,216601,216636,216918,216932,216936,216945,216948,216958,216960,216981,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,838234,884736,884738,884958,884959,903007,917316,917503,917504") == "c6cc69c12313446c8d6c0ad4718a9f013ef41717" || 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", "486,1,572,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2566,2709,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35038,35039,35657,35660,35671,35672,35678,35679,35684,35685,35804,35807,37421,37422,39633,39634,39665,39666,39878,39879,39978,41395,43209,43210,43223,43224,43228,43229,43231,43232,45596,45597,45967,45968,46055,46056,46247,46248,48933,48934,48937,48938,49247,49248,52939,52940,53101,53102,53522,53523,54429,54430,54434,54435,54457,54458,55678,55679,56078,56079,56115,56116,59423,59425,63211,63212,63399,63400,64702,64703,64841,64842,64874,64875,65325,65326,65536,65537,66515,66516,67745,67746,67922,67923,69737,69738,72194,72195,72680,72681,75233,75234,76413,76414,76460,76461,76480,76483,79777,79778,82183,82184,82948,82949,83095,83096,83755,83756,83768,83769,83773,83774,84115,84118,84128,84129,89212,89213,90863,90864,90915,90916,90919,90922,92642,92643,92727,92728,92730,92731,92752,92753,93691,93694,94081,94084,94250,94251,94292,94293,96158,96159,96209,96210,96560,96561,96580,96581,96652,96653,97266,97267,98304,98306,98526,98527,102145,102146,102151,102152,102547,102548,104029,104030,105393,105394,105842,105843,105847,105848,105856,105857,105861,105862,105873,105874,105897,105898,107794,107795,107933,107934,108213,108216,108744,108745,108748,108749,109674,109675,110341,110342,110608,110611,112847,112848,113053,113054,115683,115684,115696,115697,116038,116039,117887,117972,118383,118384,118819,118820,120556,120557,123328,123334,123340,123341,123660,123661,123737,123968,123975,123976,123988,123989,123998,124001,124002,124003,124004,124005,124007,124008,124009,124010,124066,124067,124073,124074,124160,124161,124165,124166,124172,124173,124196,124197,124267,124268,124271,124276,124277,124278,124279,124280,124281,124282,125212,125213,125220,125221,125774,125776,126329,126331,126332,126333,126334,126335,126336,126337,126338,126339,126340,126341,126342,126343,126345,126346,126347,126350,127207,127209,127210,127211,127294,127295,127297,127298,127301,127303,127561,127562,127569,127571,127692,128055,128061,128063,128170,128171,128201,128202,128213,128214,128480,128481,128594,128595,128611,128613,128615,128616,131072,131073,138056,138057,145979,145980,147928,147929,148206,148207,148231,148240,153360,153361,163840,163842,164062,164063,164595,165857,166089,168215,170812,170813,170838,170849,170976,170977,177086,177087,189597,191082,191361,193962,196608,196609,197511,197512,198584,198585,216102,216601,216636,216918,216932,216936,216945,216948,216958,216960,216981,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,838234,884736,884738,884958,884959,903007,917316,917503,917504") && 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", "190,1,257,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1333,1334,1385,1425,4337,4338,4496,4497,5188,5189,5870,5871,6804,6809,9062,9064,16672,16673,21345,21346,24425,24426,32768,32770,32864,32865,35111,35112,43876,43877,56409,56410,60384,60385,65536,65537,73560,73561,78317,78318,85262,85263,86268,86270,86286,86288,86721,86722,86803,86804,95771,95774,95792,95793,95838,95839,95857,95858,96000,96001,96049,96050,96100,96101,96901,96902,96915,96916,96953,96954,97137,97138,97384,97385,97395,97396,98304,98306,98400,98401,103502,103504,109640,109641,109643,109644,109839,110033,110219,110221,110252,110253,116532,116533,119569,119570,119571,119572,119593,119594,120018,120019,120071,120072,120395,120397,120398,120404,120581,120583,120589,120600,120624,120628,120766,120767,126368,126369,129823,129824,130746,130747,131072,131073,132346,132348,133363,133364,134224,135026,144511,144512,163840,163842,163936,163937,173714,173715,178135,178297,196608,196609,203208,203209,211740,211741,213958,213959,213981,213982,214755,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,332559,360448,360449,386991,393125,393215,393216") == "ac13e665dc6252ccf18529307f24b4887765a4b5" || 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", "190,1,257,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1333,1334,1385,1425,4337,4338,4496,4497,5188,5189,5870,5871,6804,6809,9062,9064,16672,16673,21345,21346,24425,24426,32768,32770,32864,32865,35111,35112,43876,43877,56409,56410,60384,60385,65536,65537,73560,73561,78317,78318,85262,85263,86268,86270,86286,86288,86721,86722,86803,86804,95771,95774,95792,95793,95838,95839,95857,95858,96000,96001,96049,96050,96100,96101,96901,96902,96915,96916,96953,96954,97137,97138,97384,97385,97395,97396,98304,98306,98400,98401,103502,103504,109640,109641,109643,109644,109839,110033,110219,110221,110252,110253,116532,116533,119569,119570,119571,119572,119593,119594,120018,120019,120071,120072,120395,120397,120398,120404,120581,120583,120589,120600,120624,120628,120766,120767,126368,126369,129823,129824,130746,130747,131072,131073,132346,132348,133363,133364,134224,135026,144511,144512,163840,163842,163936,163937,173714,173715,178135,178297,196608,196609,203208,203209,211740,211741,213958,213959,213981,213982,214755,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,332559,360448,360449,386991,393125,393215,393216") && 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:134217728:a6b98c6ed2988aba2221d700b740cb20ec6cc7db",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:cab148c75f51d4cfd06ceb020d13d545e01112e3",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:cab148c75f51d4cfd06ceb020d13d545e01112e3");

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
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/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
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");
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/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/logo.img", "/dev/block/bootdevice/by-name/logo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
