getprop("ro.product.device") == "davinci" || abort("E3004: This package is for \"davinci\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.5.21:user/release-keys");
ui_print("Target: Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.6.11:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.5.21:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.6.11:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.5.21:user/release-keys or Xiaomi/davinci/davinci:10/QKQ1.190825.002/20.6.11: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:30c60bd6a0d00d32a7057c6f265f96e1dc231ec8",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:4160e9233cb1979ad81f09dec22dd383faf7be4f") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:30c60bd6a0d00d32a7057c6f265f96e1dc231ec8\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:4160e9233cb1979ad81f09dec22dd383faf7be4f\" 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", "648,1,697,728,743,775,782,784,785,1045,1050,1052,1053,1159,1160,1645,1646,2334,2335,2337,2339,2340,2341,2356,2357,2538,2539,3710,3711,3713,3714,3718,3719,3727,3728,3729,3730,9089,9090,9092,9498,9500,9501,10497,10499,16438,16439,16572,16573,19342,19344,25626,25628,32768,32770,32990,32991,34815,34816,34818,34820,34879,34880,35013,65537,66042,98306,98526,98527,99032,116628,118425,118429,118457,131073,131578,163842,164062,164063,164568,196609,197114,199674,199694,229378,229598,229599,230104,262145,262650,279449,280556,280557,280797,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,411597,411627,425985,426490,458753,459258,491521,492026,509884,509917,524289,524794,557057,557562,588206,588213,588221,588227,588228,588234,588235,588240,588241,588255,588256,588262,588263,588266,588267,588272,588273,588280,588281,588283,588284,588288,588289,588293,588294,588298,588306,588316,588321,588331,588345,588348,588349,588359,588409,588419,588430,588444,588451,588465,588488,588501,588518,588527,588530,588533,588546,588551,588552,588554,588555,588559,588560,588566,588567,588572,588573,588577,588578,588584,588585,588590,588591,588596,588597,588601,588602,588605,588606,588614,588615,588619,588620,588631,588632,588637,588638,588643,588644,588649,588650,588652,588653,588659,588660,588662,588663,588668,588669,588673,588678,588690,588700,588707,588708,588711,588712,588714,588715,588720,588721,588723,588724,588739,588740,588743,588744,588746,588747,588751,588752,588757,588758,588770,588771,588774,588775,588777,588778,588781,588782,588784,588785,588787,588788,588790,588791,588793,588794,588796,588797,588799,588800,588803,588804,588806,588807,588810,588811,588813,588814,588816,588817,588821,588822,588824,588825,588829,588830,588832,588833,588835,588836,588839,588840,588842,588843,588846,588847,588849,588850,588852,588853,588858,588860,588863,588864,588867,588868,588871,588872,588875,588876,588878,588879,588882,588883,588886,588887,588891,588892,588895,588896,588904,588905,588919,588920,588924,588925,588927,588928,588934,588935,588945,588946,588953,588954,588957,588958,588964,588965,588977,588978,588984,588985,588989,588990,589007,589008,589010,589011,589016,589017,589024,589025,589027,589028,589031,589032,589037,589038,589043,589044,589050,589051,589062,589063,589065,589066,589071,589072,589081,589082,589092,589093,589097,589102,589106,589107,589120,589125,589128,589129,589134,589135,589139,589140,589144,589145,589149,589150,589153,589168,589178,589216,589220,589231,589242,589265,589276,589293,589298,589299,589313,589314,589325,589326,589328,589329,589331,589332,589337,589338,589345,589346,589348,589349,589351,589352,589361,589362,589376,589377,589381,589382,589386,589387,589391,589392,589396,589397,589412,589413,589415,589416,589421,589422,589425,589426,589430,589431,589437,589438,589445,589446,589451,589452,589456,589457,589462,589463,589467,589468,589472,589473,589481,589482,589492,589493,589502,589503,589509,589510,589518,589519,589525,589526,589534,589535,589538,589539,589541,589542,589550,589551,589558,589559,589571,589572,589584,589585,589588,589589,589595,589596,589602,589603,589610,589611,589624,589625,589636,589637,589645,589646,589657,589658,589660,589661,589669,589670,589675,589676,589678,589679,589686,589687,589700,589701,589706,589707,589711,589712,589718,589719,589726,589727,589732,589733,589737,589738,589743,589744,589749,589750,589767,589769,589772,589773,589778,589779,589786,589787,589801,589802,589804,589805,589813,589814,589819,589820,589822,589823,589824,589825,590331,590332,590342,590343,590348,590349,590351,590355,590369,590370,590385,590386,590392,590393,590397,590398,590403,590416,590421,590435,590440,590441,590447,590448,590450,590451,590453,590454,590459,590460,590470,590483,590493,590494,590504,590543,590547,590548,590551,590552,590556,590557,590562,590563,590572,590573,590578,590585,590588,590589,590594,590595,590601,590602,590606,590607,590611,590612,590626,590627,590642,590643,590645,590646,590658,590659,590663,590670,590674,590675,590677,590678,590682,590683,590685,590686,590691,590692,590696,590697,590702,590703,590705,590706,590708,590709,590711,590712,590715,590737,590751,590752,590754,622593,623098,655361,655866,683064,683065,683127,683129,683170,683171,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,868648,884736,884738,884958,884959,903007,917316,917503,917504") == "32d7e6a15559fca2a8499d7c6b1b85808d5f7b6d" || 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", "648,1,697,728,743,775,782,784,785,1045,1050,1052,1053,1159,1160,1645,1646,2334,2335,2337,2339,2340,2341,2356,2357,2538,2539,3710,3711,3713,3714,3718,3719,3727,3728,3729,3730,9089,9090,9092,9498,9500,9501,10497,10499,16438,16439,16572,16573,19342,19344,25626,25628,32768,32770,32990,32991,34815,34816,34818,34820,34879,34880,35013,65537,66042,98306,98526,98527,99032,116628,118425,118429,118457,131073,131578,163842,164062,164063,164568,196609,197114,199674,199694,229378,229598,229599,230104,262145,262650,279449,280556,280557,280797,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,411597,411627,425985,426490,458753,459258,491521,492026,509884,509917,524289,524794,557057,557562,588206,588213,588221,588227,588228,588234,588235,588240,588241,588255,588256,588262,588263,588266,588267,588272,588273,588280,588281,588283,588284,588288,588289,588293,588294,588298,588306,588316,588321,588331,588345,588348,588349,588359,588409,588419,588430,588444,588451,588465,588488,588501,588518,588527,588530,588533,588546,588551,588552,588554,588555,588559,588560,588566,588567,588572,588573,588577,588578,588584,588585,588590,588591,588596,588597,588601,588602,588605,588606,588614,588615,588619,588620,588631,588632,588637,588638,588643,588644,588649,588650,588652,588653,588659,588660,588662,588663,588668,588669,588673,588678,588690,588700,588707,588708,588711,588712,588714,588715,588720,588721,588723,588724,588739,588740,588743,588744,588746,588747,588751,588752,588757,588758,588770,588771,588774,588775,588777,588778,588781,588782,588784,588785,588787,588788,588790,588791,588793,588794,588796,588797,588799,588800,588803,588804,588806,588807,588810,588811,588813,588814,588816,588817,588821,588822,588824,588825,588829,588830,588832,588833,588835,588836,588839,588840,588842,588843,588846,588847,588849,588850,588852,588853,588858,588860,588863,588864,588867,588868,588871,588872,588875,588876,588878,588879,588882,588883,588886,588887,588891,588892,588895,588896,588904,588905,588919,588920,588924,588925,588927,588928,588934,588935,588945,588946,588953,588954,588957,588958,588964,588965,588977,588978,588984,588985,588989,588990,589007,589008,589010,589011,589016,589017,589024,589025,589027,589028,589031,589032,589037,589038,589043,589044,589050,589051,589062,589063,589065,589066,589071,589072,589081,589082,589092,589093,589097,589102,589106,589107,589120,589125,589128,589129,589134,589135,589139,589140,589144,589145,589149,589150,589153,589168,589178,589216,589220,589231,589242,589265,589276,589293,589298,589299,589313,589314,589325,589326,589328,589329,589331,589332,589337,589338,589345,589346,589348,589349,589351,589352,589361,589362,589376,589377,589381,589382,589386,589387,589391,589392,589396,589397,589412,589413,589415,589416,589421,589422,589425,589426,589430,589431,589437,589438,589445,589446,589451,589452,589456,589457,589462,589463,589467,589468,589472,589473,589481,589482,589492,589493,589502,589503,589509,589510,589518,589519,589525,589526,589534,589535,589538,589539,589541,589542,589550,589551,589558,589559,589571,589572,589584,589585,589588,589589,589595,589596,589602,589603,589610,589611,589624,589625,589636,589637,589645,589646,589657,589658,589660,589661,589669,589670,589675,589676,589678,589679,589686,589687,589700,589701,589706,589707,589711,589712,589718,589719,589726,589727,589732,589733,589737,589738,589743,589744,589749,589750,589767,589769,589772,589773,589778,589779,589786,589787,589801,589802,589804,589805,589813,589814,589819,589820,589822,589823,589824,589825,590331,590332,590342,590343,590348,590349,590351,590355,590369,590370,590385,590386,590392,590393,590397,590398,590403,590416,590421,590435,590440,590441,590447,590448,590450,590451,590453,590454,590459,590460,590470,590483,590493,590494,590504,590543,590547,590548,590551,590552,590556,590557,590562,590563,590572,590573,590578,590585,590588,590589,590594,590595,590601,590602,590606,590607,590611,590612,590626,590627,590642,590643,590645,590646,590658,590659,590663,590670,590674,590675,590677,590678,590682,590683,590685,590686,590691,590692,590696,590697,590702,590703,590705,590706,590708,590709,590711,590712,590715,590737,590751,590752,590754,622593,623098,655361,655866,683064,683065,683127,683129,683170,683171,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,868648,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", "100,1,273,602,610,620,624,629,630,711,715,720,721,2427,2431,2909,2910,3171,3175,3180,3181,3183,3194,3432,3436,3486,3487,3499,3503,3507,3508,3511,3515,3519,3520,4028,4032,4045,4046,4054,4058,4063,4064,4098,4104,4266,4287,4570,4620,4639,4944,5021,5022,6062,7584,7595,32770,32864,32865,33370,65537,66042,91368,91369,91751,91752,91788,91789,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,336641,336690,342916,360448,360449,386991,393125,393215,393216") == "931358ea4724367121cdf98f35e15379bfec8656" || 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", "100,1,273,602,610,620,624,629,630,711,715,720,721,2427,2431,2909,2910,3171,3175,3180,3181,3183,3194,3432,3436,3486,3487,3499,3503,3507,3508,3511,3515,3519,3520,4028,4032,4045,4046,4054,4058,4063,4064,4098,4104,4266,4287,4570,4620,4639,4944,5021,5022,6062,7584,7595,32770,32864,32865,33370,65537,66042,91368,91369,91751,91752,91788,91789,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,336641,336690,342916,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:30c60bd6a0d00d32a7057c6f265f96e1dc231ec8",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:4160e9233cb1979ad81f09dec22dd383faf7be4f",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:4160e9233cb1979ad81f09dec22dd383faf7be4f");

# ---- 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/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
