getprop("ro.product.device") == "surya" || abort("E3004: This package is for \"surya\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.6.0.QJGRUXM:user/release-keys");
ui_print("Target: POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.7.0.QJGRUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.6.0.QJGRUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.7.0.QJGRUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.6.0.QJGRUXM:user/release-keys or POCO/surya_ru/surya:10/QKQ1.200512.002/V12.0.7.0.QJGRUXM: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:72dd72bb5e6d341d8d5589b89a735988861c9d00",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:2b0ee54f8fc4801b0db68083e9d0cf3089dbe316") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:72dd72bb5e6d341d8d5589b89a735988861c9d00\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:2b0ee54f8fc4801b0db68083e9d0cf3089dbe316\" 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(map_partition("system"), "150,1,198,225,234,287,288,548,552,564,565,584,585,1902,1903,2332,2333,26237,26238,27605,27606,32768,32770,32932,32952,33017,33018,33232,33234,33394,33398,33406,33407,33415,33419,33424,33425,33645,33646,33658,33662,33666,33667,34896,34902,34934,34935,34941,34947,34948,34949,34954,34960,34961,34962,35082,35088,35094,35095,36651,36652,36717,36718,37243,37247,37276,37277,37347,37349,37442,37446,37450,37451,37482,37488,37489,37490,37589,37595,37596,38964,41756,41760,41788,41789,41803,41809,41810,41811,41813,41814,45062,45066,45111,45112,45482,45486,45494,45495,45582,45588,45593,45594,45722,45726,45732,45733,45995,45996,46188,46192,46207,46208,50825,50829,50923,50924,50929,50935,50936,50937,51624,51628,51650,51651,51709,51710,51781,51785,51789,51790,53073,53077,53102,98306,98468,163842,164004,229378,229540,294914,295076,622609,622612,655361,655380,664330,666364,676923,677068,677069") == "ea5a3a0b04767646cdcff7ab63160d5e3d568a10" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "150,1,198,225,234,287,288,548,552,564,565,584,585,1902,1903,2332,2333,26237,26238,27605,27606,32768,32770,32932,32952,33017,33018,33232,33234,33394,33398,33406,33407,33415,33419,33424,33425,33645,33646,33658,33662,33666,33667,34896,34902,34934,34935,34941,34947,34948,34949,34954,34960,34961,34962,35082,35088,35094,35095,36651,36652,36717,36718,37243,37247,37276,37277,37347,37349,37442,37446,37450,37451,37482,37488,37489,37490,37589,37595,37596,38964,41756,41760,41788,41789,41803,41809,41810,41811,41813,41814,45062,45066,45111,45112,45482,45486,45494,45495,45582,45588,45593,45594,45722,45726,45732,45733,45995,45996,46188,46192,46207,46208,50825,50829,50923,50924,50929,50935,50936,50937,51624,51628,51650,51651,51709,51710,51781,51785,51789,51790,53073,53077,53102,98306,98468,163842,164004,229378,229540,294914,295076,622609,622612,655361,655380,664330,666364,676923,677068,677069") && block_image_verify(map_partition("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(map_partition("vendor"), "398,1,100,110,114,119,120,201,205,210,211,216,217,480,484,488,489,491,492,494,505,517,521,525,526,529,535,536,537,545,549,553,554,1165,1502,1579,1580,12263,12264,12441,12492,12917,12918,12922,12924,12943,12944,12948,12949,12954,12955,12956,12957,12960,12961,12962,12963,12966,12967,12968,12969,12972,12973,12974,12975,12978,12979,12980,12981,12984,12985,12986,12987,12991,12992,12997,12998,13002,13003,13007,13008,13012,13013,13486,13487,14391,14397,25648,25649,25931,25932,28740,28741,32768,32770,32837,32874,33991,33992,34830,34831,34835,34837,34854,34855,34890,34891,34900,34901,34903,34904,34956,34957,35007,35008,35014,35015,35040,35041,35191,35192,35590,35591,35593,35595,35659,35660,35730,35731,35798,35799,35801,35802,35804,35805,35864,35866,35868,35869,35933,35934,36004,36005,36072,36073,36075,36076,36078,36081,36082,36083,36145,36146,36212,36213,36215,36216,36219,36223,36225,36226,36228,36230,36291,36292,36294,36296,36356,36357,36359,36360,36421,36422,36424,36425,36485,36486,36488,36489,36556,36557,36625,36626,36693,36694,36760,36761,36763,36764,36827,36828,36894,36895,36897,36898,36959,36960,36962,36963,37027,37028,37030,37031,37093,37094,37096,37097,37161,37162,37164,37165,37226,37227,37229,37230,37294,37295,37297,37298,37362,37363,37365,37366,37430,37431,37433,37434,37498,37499,37501,37502,37569,37570,37571,37572,37638,37639,37640,37641,37646,37647,37707,37708,37774,37775,37777,37778,37841,37842,37908,37909,37911,37912,37973,37974,37976,37977,38041,38042,38044,38045,38107,38108,38110,38111,38175,38176,38178,38179,38240,38241,38243,38244,38308,38309,38311,38312,38376,38377,38379,38380,38444,38445,38447,38448,38512,38513,38515,38516,38583,38584,38585,38586,38652,38653,38654,38655,38720,38721,38793,38794,38796,38797,38859,38860,38930,38931,38939,38943,38944,38945,39144,39145,39211,39212,39214,39215,39218,39223,46643,46644,46808,46809,47118,47119,47180,47181,47330,47331,47410,47411,47443,47444,47520,47521,47588,47589,47661,47662,47754,47755,47827,47828,47873,47874,47978,47979,48022,48023,48025,48026,48058,48059,48220,48221,48292,48293,48345,48346,48670,48671,48673,48674,48768,48769,48893,48894,48968,48969,49002,49003,49066,49067,49138,49139,49689,49691,49696,49698,49766,49767,49819,49820,50347,50348,50633,98306,98373,163842,163909,229378,229445,262165,262167,276638,277635,282038,282107,282108") == "90a983d634c6daed72d287bcbbbffb47771b76f6" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "398,1,100,110,114,119,120,201,205,210,211,216,217,480,484,488,489,491,492,494,505,517,521,525,526,529,535,536,537,545,549,553,554,1165,1502,1579,1580,12263,12264,12441,12492,12917,12918,12922,12924,12943,12944,12948,12949,12954,12955,12956,12957,12960,12961,12962,12963,12966,12967,12968,12969,12972,12973,12974,12975,12978,12979,12980,12981,12984,12985,12986,12987,12991,12992,12997,12998,13002,13003,13007,13008,13012,13013,13486,13487,14391,14397,25648,25649,25931,25932,28740,28741,32768,32770,32837,32874,33991,33992,34830,34831,34835,34837,34854,34855,34890,34891,34900,34901,34903,34904,34956,34957,35007,35008,35014,35015,35040,35041,35191,35192,35590,35591,35593,35595,35659,35660,35730,35731,35798,35799,35801,35802,35804,35805,35864,35866,35868,35869,35933,35934,36004,36005,36072,36073,36075,36076,36078,36081,36082,36083,36145,36146,36212,36213,36215,36216,36219,36223,36225,36226,36228,36230,36291,36292,36294,36296,36356,36357,36359,36360,36421,36422,36424,36425,36485,36486,36488,36489,36556,36557,36625,36626,36693,36694,36760,36761,36763,36764,36827,36828,36894,36895,36897,36898,36959,36960,36962,36963,37027,37028,37030,37031,37093,37094,37096,37097,37161,37162,37164,37165,37226,37227,37229,37230,37294,37295,37297,37298,37362,37363,37365,37366,37430,37431,37433,37434,37498,37499,37501,37502,37569,37570,37571,37572,37638,37639,37640,37641,37646,37647,37707,37708,37774,37775,37777,37778,37841,37842,37908,37909,37911,37912,37973,37974,37976,37977,38041,38042,38044,38045,38107,38108,38110,38111,38175,38176,38178,38179,38240,38241,38243,38244,38308,38309,38311,38312,38376,38377,38379,38380,38444,38445,38447,38448,38512,38513,38515,38516,38583,38584,38585,38586,38652,38653,38654,38655,38720,38721,38793,38794,38796,38797,38859,38860,38930,38931,38939,38943,38944,38945,39144,39145,39211,39212,39214,39215,39218,39223,46643,46644,46808,46809,47118,47119,47180,47181,47330,47331,47410,47411,47443,47444,47520,47521,47588,47589,47661,47662,47754,47755,47827,47828,47873,47874,47978,47979,48022,48023,48025,48026,48058,48059,48220,48221,48292,48293,48345,48346,48670,48671,48673,48674,48768,48769,48893,48894,48968,48969,49002,49003,49066,49067,49138,49139,49689,49691,49696,49698,49766,49767,49819,49820,50347,50348,50633,98306,98373,163842,163909,229378,229445,262165,262167,276638,277635,282038,282107,282108") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "424,1,90,106,110,114,115,4451,4455,5930,5931,6595,6598,6602,6603,6644,6645,6652,6658,6659,6660,7377,7381,7388,7389,7395,7401,7402,7403,7463,7467,7472,7473,10228,10229,13701,13702,14340,14344,15114,15115,17522,17523,17886,17890,18397,18398,18410,18416,18417,18418,25311,25312,25713,25714,32768,32770,32839,32850,32953,32954,40964,40965,42428,42429,53498,53499,55757,55758,56134,56135,56213,56215,59583,59585,65536,65547,67076,67077,67083,67084,67086,67087,67093,67099,67100,67101,67229,67235,67236,67237,67249,67255,67256,67257,67260,67261,67267,67273,67274,67275,67298,67304,67305,67306,68150,68151,81849,81850,81869,81870,83836,83837,97655,97656,97832,97833,98200,98201,98304,98306,98375,98386,99034,99035,105418,105419,110171,110172,112423,112424,112611,112612,112623,112629,112630,112631,112641,112642,112647,112651,112656,112657,112661,112667,112671,112672,112678,112684,112685,112686,112698,112704,112705,112706,112716,112722,112723,112724,112726,112733,112739,112740,114497,114498,114504,114505,114639,114640,115848,115855,115909,115916,115921,115928,115953,115960,115979,115986,116004,116011,116027,116028,116039,116041,116210,116211,116212,116213,116214,116215,116216,116217,116254,116256,116264,116265,116270,116271,116609,116613,116617,116621,116622,116624,116629,116633,116634,116638,116639,116643,116644,116648,116649,116653,116654,116658,116659,116663,116664,116666,116673,116677,116678,116682,116683,116687,116688,116692,116693,116695,116696,116700,116701,116705,116706,116708,116709,116713,116714,116718,116719,116723,116724,116728,116729,116733,116734,116738,116739,116743,116744,116748,116749,116751,116755,116759,116760,116764,116765,116769,116770,116774,116775,116777,116778,116782,116783,116785,116786,116790,116791,116793,116794,116798,116799,116803,116804,116806,116807,116811,116812,116967,117994,117995,121599,121600,131072,131085,132338,132340,132391,132395,139267,139269,144618,144620,148552,148553,152602,152604,154134,154136,154362,154363,156053,156063,159573,159574,163840,163842,163911,163926,164370,164371,164373,164374,164977,164979,167238,167241,170290,170291,174327,174329,174374,174376,174516,174518,175774,175776,176853,176855,177315,177316,178943,178944,179588,179589,183221,183222,185854,185855,190606,190607,190632,190634,196608,196621,196622,196623,207625,207632,207663,207664,207665,207669,207785,207786,207959,207960,208254,208261,208292,208293,208859,208860,208993,208994,210240,210241,210815,210816,210894,210895,211668,211670,218325,218327,221125,221127,223023,223024,223449,223451,229376,229378,229447,229525,233712,233713,233982,233983,236364,236368,259798,259800,262144,262174,270412,270413,270443,270449,270450,270451,273013,273014,273022,273027,273028,273029,273312,273318,273327,273334,273356,273361,273373,273376,276710,276711,284013,288516,288586,288587") == "095dcde0068bba28d7e17457c7ff77780d242ad8" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "424,1,90,106,110,114,115,4451,4455,5930,5931,6595,6598,6602,6603,6644,6645,6652,6658,6659,6660,7377,7381,7388,7389,7395,7401,7402,7403,7463,7467,7472,7473,10228,10229,13701,13702,14340,14344,15114,15115,17522,17523,17886,17890,18397,18398,18410,18416,18417,18418,25311,25312,25713,25714,32768,32770,32839,32850,32953,32954,40964,40965,42428,42429,53498,53499,55757,55758,56134,56135,56213,56215,59583,59585,65536,65547,67076,67077,67083,67084,67086,67087,67093,67099,67100,67101,67229,67235,67236,67237,67249,67255,67256,67257,67260,67261,67267,67273,67274,67275,67298,67304,67305,67306,68150,68151,81849,81850,81869,81870,83836,83837,97655,97656,97832,97833,98200,98201,98304,98306,98375,98386,99034,99035,105418,105419,110171,110172,112423,112424,112611,112612,112623,112629,112630,112631,112641,112642,112647,112651,112656,112657,112661,112667,112671,112672,112678,112684,112685,112686,112698,112704,112705,112706,112716,112722,112723,112724,112726,112733,112739,112740,114497,114498,114504,114505,114639,114640,115848,115855,115909,115916,115921,115928,115953,115960,115979,115986,116004,116011,116027,116028,116039,116041,116210,116211,116212,116213,116214,116215,116216,116217,116254,116256,116264,116265,116270,116271,116609,116613,116617,116621,116622,116624,116629,116633,116634,116638,116639,116643,116644,116648,116649,116653,116654,116658,116659,116663,116664,116666,116673,116677,116678,116682,116683,116687,116688,116692,116693,116695,116696,116700,116701,116705,116706,116708,116709,116713,116714,116718,116719,116723,116724,116728,116729,116733,116734,116738,116739,116743,116744,116748,116749,116751,116755,116759,116760,116764,116765,116769,116770,116774,116775,116777,116778,116782,116783,116785,116786,116790,116791,116793,116794,116798,116799,116803,116804,116806,116807,116811,116812,116967,117994,117995,121599,121600,131072,131085,132338,132340,132391,132395,139267,139269,144618,144620,148552,148553,152602,152604,154134,154136,154362,154363,156053,156063,159573,159574,163840,163842,163911,163926,164370,164371,164373,164374,164977,164979,167238,167241,170290,170291,174327,174329,174374,174376,174516,174518,175774,175776,176853,176855,177315,177316,178943,178944,179588,179589,183221,183222,185854,185855,190606,190607,190632,190634,196608,196621,196622,196623,207625,207632,207663,207664,207665,207669,207785,207786,207959,207960,208254,208261,208292,208293,208859,208860,208993,208994,210240,210241,210815,210816,210894,210895,211668,211670,218325,218327,221125,221127,223023,223024,223449,223451,229376,229378,229447,229525,233712,233713,233982,233983,236364,236368,259798,259800,262144,262174,270412,270413,270443,270449,270450,270451,273013,273014,273022,273027,273028,273029,273312,273318,273327,273334,273356,273361,273373,273376,276710,276711,284013,288516,288586,288587") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product 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:72dd72bb5e6d341d8d5589b89a735988861c9d00",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:2b0ee54f8fc4801b0db68083e9d0cf3089dbe316",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:2b0ee54f8fc4801b0db68083e9d0cf3089dbe316");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition vendor

ui_print("Patching vendor image after verification.");
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition product

ui_print("Patching product image after verification.");
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition system

ui_print("Patching system image after verification.");
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");
