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.2.0.QFBCNXM:user/release-keys");
ui_print("Target: Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.3.0.QFBCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.2.0.QFBCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.3.0.QFBCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.2.0.QFBCNXM:user/release-keys or Xiaomi/grus/grus:10/QKQ1.190828.002/V12.0.3.0.QFBCNXM: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:725b7b70ccc0a1f0daaa794a5e20d84f7f83851d",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:34dc990efc2438f3bb95bc5728b9a0ca44bf547d") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:725b7b70ccc0a1f0daaa794a5e20d84f7f83851d\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:34dc990efc2438f3bb95bc5728b9a0ca44bf547d\" has unexpected contents.");
apply_patch_space(185270272) || 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", "536,1,642,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2534,2566,2709,3661,3692,3694,3695,3699,3700,3708,3709,3710,3711,5030,5234,6294,6415,8562,8592,9068,9069,9071,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,20331,21807,25589,25591,26941,28805,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,35301,35316,35479,35489,35501,35507,36554,36588,36614,36620,36629,36635,36643,36649,36698,36706,38932,38938,39133,39143,39167,39173,41785,41814,41825,41831,41839,41845,45035,45078,45083,45089,45220,45228,45634,45651,48377,48421,49084,49108,54398,54425,55221,55246,55332,55340,65537,66042,67116,67130,67143,67149,67165,67189,67814,67832,69366,69405,70174,70189,73365,73392,76721,76758,79154,79206,86076,86157,87977,87983,88026,88033,90766,90806,93674,93689,95831,95837,96844,96873,97533,97560,98306,98526,98527,99032,100674,100722,103285,103327,103379,103386,103394,103401,105364,105372,105419,105425,106980,107024,107055,107061,107301,107313,107512,107519,107563,107569,109837,109878,109993,110001,110070,110077,110793,110813,111081,111092,119170,121740,121809,121817,126469,126542,131073,131578,132587,132676,132687,132693,133318,133336,134039,134057,134071,134077,137005,137488,139321,139349,162240,162269,162276,162282,162299,162305,162312,162322,162340,162346,162751,162758,162785,162791,163842,164062,164063,164568,165894,165944,166220,166232,166395,166406,166437,166444,166445,167368,167370,167396,168653,168682,173947,176149,176571,176585,178776,178793,179167,179177,181810,181817,196609,197114,215365,215383,229378,229598,229599,230104,262145,262650,269648,270440,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,426596,427177,427188,427606,427607,428272,428284,428337,428360,428646,436436,436523,438262,438277,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,629768,629779,634080,634157,634168,634174,634251,634258,655361,655866,660249,660327,660488,660498,660507,660513,661255,661279,661336,661343,667104,667168,667448,667459,670671,670700,671998,672041,673610,673644,673655,673661,673683,673689,673700,673706,673973,673986,673993,674003,675234,675260,675660,675673,675771,675780,675804,675811,675819,675825,677345,677363,677455,677463,688129,688634,691380,691420,694284,694348,701005,701037,717100,717129,717369,717375,718132,718212,718288,718362,720897,721402,725938,725940,726346,726458,729099,732398,733466,733493,742632,746531,753665,754170,763165,763297,767387,767455,767475,767481,767510,767516,775677,775683,780635,780641,781111,781122,781939,781959,786433,786938,791823,791829,793188,793198,793205,793211,796472,796516,796580,796587,796588,796595,804114,804186,804255,804353,804360,804366,804421,804428,807170,807218,807236,807242,807382,807392,809230,809272,810030,811201,811350,811357,811365,811371,811386,811392,811426,811433,813601,813642,814205,814227,814247,814253,814263,814269,814278,814284,814347,814354,814366,814372,814490,814496,814511,814517,814530,814536,814562,814568,819202,819422,819423,819928,850065,850071,850090,850097,850106,850113,850122,850128,850143,850149,850162,850168,850174,850180,851969,852474,853805,853811,853867,853873,853880,853886,853913,853919,853941,853947,853967,853973,854438,854652,854653,854867,868696,868702,869442,869460,869467,869473,874764,874784,884527,884736,884738,884958,884959,891084,891552,891568,892238,892256,892286,892292,892298,892304,892587,892598,892601,892607,892631,892638,897101,903007,917212") == "bf4af6339b9419152c0051086e180d0f7d2670cd" || 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", "536,1,642,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2534,2566,2709,3661,3692,3694,3695,3699,3700,3708,3709,3710,3711,5030,5234,6294,6415,8562,8592,9068,9069,9071,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,20331,21807,25589,25591,26941,28805,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,35301,35316,35479,35489,35501,35507,36554,36588,36614,36620,36629,36635,36643,36649,36698,36706,38932,38938,39133,39143,39167,39173,41785,41814,41825,41831,41839,41845,45035,45078,45083,45089,45220,45228,45634,45651,48377,48421,49084,49108,54398,54425,55221,55246,55332,55340,65537,66042,67116,67130,67143,67149,67165,67189,67814,67832,69366,69405,70174,70189,73365,73392,76721,76758,79154,79206,86076,86157,87977,87983,88026,88033,90766,90806,93674,93689,95831,95837,96844,96873,97533,97560,98306,98526,98527,99032,100674,100722,103285,103327,103379,103386,103394,103401,105364,105372,105419,105425,106980,107024,107055,107061,107301,107313,107512,107519,107563,107569,109837,109878,109993,110001,110070,110077,110793,110813,111081,111092,119170,121740,121809,121817,126469,126542,131073,131578,132587,132676,132687,132693,133318,133336,134039,134057,134071,134077,137005,137488,139321,139349,162240,162269,162276,162282,162299,162305,162312,162322,162340,162346,162751,162758,162785,162791,163842,164062,164063,164568,165894,165944,166220,166232,166395,166406,166437,166444,166445,167368,167370,167396,168653,168682,173947,176149,176571,176585,178776,178793,179167,179177,181810,181817,196609,197114,215365,215383,229378,229598,229599,230104,262145,262650,269648,270440,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,426596,427177,427188,427606,427607,428272,428284,428337,428360,428646,436436,436523,438262,438277,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,629768,629779,634080,634157,634168,634174,634251,634258,655361,655866,660249,660327,660488,660498,660507,660513,661255,661279,661336,661343,667104,667168,667448,667459,670671,670700,671998,672041,673610,673644,673655,673661,673683,673689,673700,673706,673973,673986,673993,674003,675234,675260,675660,675673,675771,675780,675804,675811,675819,675825,677345,677363,677455,677463,688129,688634,691380,691420,694284,694348,701005,701037,717100,717129,717369,717375,718132,718212,718288,718362,720897,721402,725938,725940,726346,726458,729099,732398,733466,733493,742632,746531,753665,754170,763165,763297,767387,767455,767475,767481,767510,767516,775677,775683,780635,780641,781111,781122,781939,781959,786433,786938,791823,791829,793188,793198,793205,793211,796472,796516,796580,796587,796588,796595,804114,804186,804255,804353,804360,804366,804421,804428,807170,807218,807236,807242,807382,807392,809230,809272,810030,811201,811350,811357,811365,811371,811386,811392,811426,811433,813601,813642,814205,814227,814247,814253,814263,814269,814278,814284,814347,814354,814366,814372,814490,814496,814511,814517,814530,814536,814562,814568,819202,819422,819423,819928,850065,850071,850090,850097,850106,850113,850122,850128,850143,850149,850162,850168,850174,850180,851969,852474,853805,853811,853867,853873,853880,853886,853913,853919,853941,853947,853967,853973,854438,854652,854653,854867,868696,868702,869442,869460,869467,869473,874764,874784,884527,884736,884738,884958,884959,891084,891552,891568,892238,892256,892286,892292,892298,892304,892587,892598,892601,892607,892631,892638,897101,903007,917212") && 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", "56,1,258,602,610,620,622,629,713,720,984,991,1022,1028,1034,1040,1051,1058,32770,32864,32865,33370,39465,45659,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,292384,292390,294914,295008,295009,295514,295568,360448,360449,386991,393125,393215,393216") == "bc115a980c835991130bf746a26bfd81f3105eac" || 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", "56,1,258,602,610,620,622,629,713,720,984,991,1022,1028,1034,1040,1051,1058,32770,32864,32865,33370,39465,45659,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,292384,292390,294914,295008,295009,295514,295568,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:725b7b70ccc0a1f0daaa794a5e20d84f7f83851d",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:34dc990efc2438f3bb95bc5728b9a0ca44bf547d",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:34dc990efc2438f3bb95bc5728b9a0ca44bf547d");

# ---- 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");
