libgpuverify

Signature verification on GPUs (WiP)
Log | Files | Refs | README | LICENSE

commit e326e1bd8f23609b94f84a469f0fd6513e39bb0e
parent b1f4f32728669766e1e7121856f779a97ef01f50
Author: Cedric <cedric.zwahlen@students.bfh.ch>
Date:   Sun, 26 Nov 2023 01:29:43 +0100

Kernel can verify more concurrently

Diffstat:
Msource/rsa-test.c | 25++++++++++++++++++++-----
Mxcode/.DS_Store | 0
Mxcode/lib-gpu-generate/msgsig.txt | 320+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mxcode/lib-gpu-generate/publickey.txt | 2+-
Mxcode/lib-gpu-verify.xcodeproj/project.xcworkspace/xcuserdata/cedriczwahlen.xcuserdatad/UserInterfaceState.xcuserstate | 0
Mxcode/lib-gpu-verify.xcodeproj/xcshareddata/xcschemes/lib-gpu-generate.xcscheme | 2+-
Mxcode/lib-gpu-verify.xcodeproj/xcuserdata/cedriczwahlen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist | 223+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
Mxcode/montgomery.cl | 20++++++++++----------
8 files changed, 477 insertions(+), 115 deletions(-)

diff --git a/source/rsa-test.c b/source/rsa-test.c @@ -372,6 +372,8 @@ int verify_pairs_with_opencl(DIGIT_T *bases, unsigned long *b_len, clGetDeviceInfo(device_id, CL_DEVICE_ADDRESS_BITS, 0, NULL, &retSize_2); clGetDeviceInfo(device_id, CL_DEVICE_ADDRESS_BITS, retSize_2, &address_bits, &retSize_2); + + if (address_bits == 32) { printf("Kernel is only designed to run on 64-bit GPUs."); abort(); @@ -857,9 +859,18 @@ int mont_verify_pairs_with_opencl(char *bases, unsigned long *b_off, clGetDeviceInfo(device_id, CL_DEVICE_ADDRESS_BITS, 0, NULL, &retSize_2); clGetDeviceInfo(device_id, CL_DEVICE_ADDRESS_BITS, retSize_2, &address_bits, &retSize_2); + + size_t retSize_3 = sizeof(cl_ulong); + cl_ulong max_stor = 0; + clGetDeviceInfo(device_id, CL_DEVICE_MAX_MEM_ALLOC_SIZE, 0, NULL, &retSize_3); + clGetDeviceInfo(device_id, CL_DEVICE_MAX_MEM_ALLOC_SIZE, retSize_3, &max_stor, &retSize_3); + + printf("max memory: %llu\n", max_stor); + + if (address_bits == 32) { printf("Kernel is only designed to run on 64-bit GPUs."); - abort(); + return EXIT_FAILURE; } // Create a compute context @@ -965,7 +976,7 @@ int mont_verify_pairs_with_opencl(char *bases, unsigned long *b_off, valid = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(unsigned long) ,NULL, NULL); - global = 65536; // MARK: ??? + if (!sig_mem || !exp_mem || !mod_mem || !comp_mem || !valid ) { @@ -1027,6 +1038,8 @@ int mont_verify_pairs_with_opencl(char *bases, unsigned long *b_off, // Execute the kernel over the entire range of our 1d input data set // using the maximum number of work group items for this device // + + global = n; // MARK: ??? err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &global, &local, 0, NULL, NULL); if (err) @@ -1112,9 +1125,6 @@ int mont_rsa_tests(void) { unsigned long result = 0; - - - mont_verify_pairs_with_opencl(s, s_off, e, e_off, m, m_off, b, b_off, pairs, pks, &result); @@ -1128,6 +1138,11 @@ int mont_rsa_tests(void) { free(m); free(s); + free(b_off); + free(e_off); + free(m_off); + free(s_off); + } diff --git a/xcode/.DS_Store b/xcode/.DS_Store Binary files differ. diff --git a/xcode/lib-gpu-generate/msgsig.txt b/xcode/lib-gpu-generate/msgsig.txt @@ -1,64 +1,256 @@ -00D2165BC2B4BFDD64 -5BD6158BDE0AC0655B6FCEA57994011D18B6B3C9E5FF75C45FC1E5EC2C1F26D6AB8547A17C0BC15D40F4346CFE74CF4EB417E6850D45C3B49E9389DAF400BC5E5B3F5D8E1E45A23DD042A87E82703209F9EA9808A002FEC00C96A5F0D9B7673B4B0A224438D81C0A9CEAD0DD22802B409230072768E73688D63EAB1C9BC242FAEDCFE0C8478B38254BAAC07AD6F82A27A0C3893FCB604BB57158F9125027AECC91D55B364B5C2BB9FE07FB6AB69F5A65112A2B7D5A805CA9B2C1CB75D315DE345BA68100DD5E46FA3BA54B614C298E60EBAF95CEC738DA2513736ECE051D153CECAC29F4A432A5FEB287E2A1B8C4640C58FF9E9E7DB6889E4865D1F1C8CF4E47 -00D138A9266AD7D5BB -00B8B50049C1A29E9ADCC23209AEFE7FFB1458B554B98FD244F4A658E5D6C6F61E42C2393D0C59B5EB4AB1989FD2C93430602B61008BD0C4059131E35DC5F28099BE8CD55B1970627D8AA3070B066DDBD4E2B20584A35BF2F54E2F2C532429BF2D709CFF82DDAE94D3EE34DE4E6D348473C513C93515B90ABE0C6442C2749553A51B991AC5A70DDF21383DC2120B9990BD279CCF0EF0DAE177CA8E6F8479418337F05E7B1C9617092BF143F1A16414B1F268F3C531651E2AF6497A1D7F219BFB56AD875C77D8F6F31E27A1029F51BF819A8F4E5D22334AFB67873CC7459E0F2284490F675D9479A0C9C50E78765EA088977FB10871EC39B38CDA8B73A8A7C4B893 -00B894254930C49655 -00956E3E7B09F7FECEF26CA44FFD69F19DC8DB6C3A29A707C2CDAD56994A58D6ACB8B275678D0D8670D3C716AC5C98398C8067943C7292F787F5451E8202F4C8BAEFA6CA787BC79B73A99CC4C85743EC7320E17195D560A380356A9D32AA81EF276A9DE8B9F6728647851AAD0090A458FB928BCE86884BD7CC7AC3CF226CE546E596135A948B820E1865D6A3395DF2BD5EB26FE5259B2B950CC61F887C0D5A81F77549D8F792D32552870358EC5B2B45552C35829D732CC1A08898FD2FFDFF5EBFE0BEE7D5702FCA240B377BFE7D2821E123F2A146725D01A5CF0A6C89FB7E73CA6F3B8640C44B0FA1A51B429BB3D4668495F20A25FB4185831C3B479C5041713C -33D86BA3A9A40EF8 -00B91210473412D5D2BAED71B445E2FF12BB6477119409AE029E307038E781B942D3717DBF580C10A0BA1C6F1115E699E573C643E3FD30A3B08D02E22A20C34872E841FB242455A92178686D11D33C63BB9F6A276B006BF494852406E275A2965D00714E87E6782DB11E9EC6D5108A21678B8DBE5DAF871792E13EF0F24490864004BC76B978E1BFF178BCBFAFA6C4496DEFDA235922A689C83D84BA4C04031264C4213935099A374EE94AE649037000856989F48C8E7E70D553806CB4919E7042ED1C8A9045080A64341F2DFAE15DD5EE443AF7405D8BFF70A8D36CCD838CA5206FF6032709D990D9C151AC05D8A2C57E63934A31957D2ADA44D52BEE2D1830D9 -0098407339FD84FD9E -0087F0BD6130721104A5F15CCABED06660A657DF8EA7563DF7034E95DF721EC845D3B6B9F9BADC4DA99F0FF29C7FFED88895C1028EF5E8C456699656B50B50D7B37617E282E7D6A0C41BDC0F33D64981D8DA84AD43D2E338D21010494E9A622F611F295816EA99B0D5270A4A7A0894311C9C2F2D23E6FE85F96648641294B3A28C1291D4257E6CDAC2E4F5F37CAF7243E02CDD02A4E2B364E4BD70FDB3B102312F6C369E5E9032327E49681F871061975427FC749E73CA133112553B7B903653310439186CA8E45555806A71EC9E0761B8ABC91D8A11ECE3D97EA98E38CCF16A955E2BCF0C9F395F4F670FE3FA39F4BFE44CD9C71435E360B74485A1461C9B561C -6B5C23584BB6FB94 -30E14CCAF4E499F60E1254740D02BA84349FF9C936EA12E95964CEE90079070B966E92DE6098EE4B0075C99109EDAFA5983351FCC4F1E78897E2EDCD4BDD98D0E5FE0BB07F1B69844B0372D344878252D3EA2967F593E4F2CD71AB0F92A656DE57BE8DCD54795AD826E9357A4D76C447C4ABBFC45BBCE3F4C75CEF4255B64729204D225C47C8C3E3050D95AC7A1AEB5A6D90CB624B7A47E59E3ABF6AD95CFBC3BD5C2499C1F56421250E5D6610236FB8CB87650C1F49A9F948234310A80E42F86FD7D23DCCF90A73173AEAA42543EC789BD7E233DC48177A766C8B4C9FF2142A0BF59682B7B798572E112F545942E493B26A70967737DFBC82D1F2C6A461EE51 -78E5B46E8DD7DF7D -31862D27DB14EE9145BB54F1A010C9F86E282E5D154A71EE64A2DE170F31D86BD2133DFAEF4E75274F1C5DFD1C7D65E087C06840DA0FC055AC3C946117236657E468570D1D9620CB4E27EA063FBFED65DC1F9D87FDB7FF3C071C81E8ECA9CB5A0E373CE6DEEDEE8F4363697E1D5AF07F594EAAB557F4EDB723B23C03317A7629017F8283AA3829BDD11D59EDE0308CE8093B90CEF7F140717E041C45096045DA5D0E9B8B4F179B8E3B86A523B441E8D17E424960F5BAC2702C4245F6C5D5755992896CF4590982DBA694988A3A34F78250485985096081DFFD3DF3B561B4365F064335ECAE330D6CE7196F5E30E74D0DE591732D979E9F0244D5E1726F5D78AA -57C2A5E92EC6C384 -567DBE71A29DC686EC6B20AF16F682A54FA93ACE79C121103D21674274EABD58307814C51276581C1D5773B2AA13D89F2324307D85ADDEE29E1ADC2DB060DCA6D6A595387D1C377B81720A4905931CF702D7D633E965CEE7955DAB3CD2D9DEC9D82F84C1FB50F37177C25264A340E02193B4AC2F5275F4EA0FB429A5B3D7D290121D6D04B410C44F51C11BA47761A0E9D87C1144DA5A537E5D7AED5466244D0F9C1E25E5C2463C894EA55B908D2226F9FF072A3303619B6DFAF8D596DE00525C1BFB7B90BD8C76D920A00BBF878507F002669E1FDC22575ADFE3A4CBB6EB11A986A6821461913EE4F4B3F4EF974495DA6DCC74A5882496A5932EEDFEC6D2E006 -53C04C903C3CC3A5 -542E73578472DEBA4E45E4A80F822C8E24B4C1B7AF23D93A4C4C9A47AF551B73F9C46A6E959FCB98EE18A1C979B60FB3CF86F93037EF8BC3B8C7BE113D0E7C384DF8BF09D7513B7A60863AA61C7BFE7BC43D7D983CB5540CF32482919517032C4806F0594577E498EA624ACE57D198232996BE010E58322C2D26A936057971F75142099D2A4988E971294C72481FC523797F681821FE10D90EEA14E047B4F10F8ACD975C01CED883EE4ED06C6371B18857F93E1F10E935982F5BB17356BA28B5A4E5F4B4CB4F77976EDB7374FD2C93EDF7370F21E08BEC31AAD7F1178E766121CAE57D33601968AB7A85CE4A267423C5F249B78987AB2A3B52BC2DB47B3CE2 -00FDF2D41F60305BFD -00AFBE78D3B8D839EB90120B4DA3CE9DBE6C24366B48666571E9D19720C8D0429215C5172B803B281734D8017A554072D5AEE58775801BF34AE8EF71AD2149B0B80E10EB9531361D1C99D25DCAD09CA721012EA2BC550F8C7738993C46D46CA935CFC4E9F48D9F83C78F325F16FBC1D9877CC6BF2FDFF86723F9DFA3F45D348934442D530F33DCC6E1A566902AF8566E1E97091F0E626C459773C5AC37853AE57B1BD7C3405D46A9CDF08E3C76F84B4245D2FFABC94DCD961593CD5C12339188F3E723C3F6F87F9AD94584FEC35C0CC667AD79D2E8243DB3B11A9A6DE9FBCA264739D81C8A0A3DD1C35BD1129B1447C2899AAD236C53B3E95455E5B211D2B56BDE -415641A674296C20 -4772EECEE851F3EE8CF67E78411F791039476B3849AFCAD92DD7D5E757754024062C9601D8849732E02D9EBF83BDDC87DA0B13B2B08AC1788A83231ED37A6376768CCC5C464F659C70928B2A5E34E7BD91706CBD1E28D4596879BF037E2574ADDDBC70A14DC80C2D23930F3838E663BF62395089934B457A8973D2ACD5594989E0827DDC4734FE7270D2471267C1E43F4522509043CED5433D73B0683D06222D49F16AD11213881B4D0249863553F297EF3B1FB9FD5C82692876DDCF692D86D5665E627E18B19838AFA63CC95E44E3E49D1A2FC86F31BE57A0F02E9151BA141BFCBF508A2E02B1CB843B5AF5F3A3F3A0C0C170C7D37ABF242E44B3F93D136920 -263DF0F6987BC311 -0088A7FB48BD834CC4872EB59FDE7662B2385F7AB342E402429FE31A8B704B032121C54070A3A090BC186533EBB3FD344C247F45F1ABCA8EB135A23C12F57E6CE50FB60D01862F570B114A60DA504C63A21C7CDF0E15023F642F39178BD9B7A4C5D37D40FEDA1397A9F4B46EA772FBE5DA21450443E86736A5AA88B20E1DA3C12D0BF398C17D10B32551CD04397A0441E69123E3C069503940349A311DAEB6541862142CB7768C32E48095EA388C2D290973DC74EE6665770423ED14FB53EC992FDD81C7E096F19DD5B97F4AF20A4A9F3BA2A83351830FD8EC4B00CBE477889B4F84518609C1BBED4CEE0CD784AD53789D62E5E05BA9566D2598D929C95C7887FB -00CC3DCA62E3A33E90 -2E47F9D887321E63607CF95511A2953219A31EBEC359EBA26EFD3F4FAC644E7030D36CEA21DA47898DED96D18AACC27C25F542FF4A9A89F30130D78B0383F6AA2E8C104F7A7BF762BFBCD4E28CAEDD6610F56B5E09D644EC3F30CF842E8E9DF0522DA81508D18FEBA0C69354CCA72DADAF2E7EABE4D7919A7E8746EC67A623F9D7052A9C5021A6C03E1F2D4EDBAEE2CCFF2E424864DFDFC0F53EA80C3E03AEB26F311AD072105E1487497690C3E729426F234396375B81C2856E4CB5C2B1F6A436325776B3DA98CDF4C887CE6F4BF5145CFD53F05C549CBA8E7E5C0EAC54FF8B8901520AD25430202457CDE7DC133AA50352CDF8234804CA9C227A199AE2CF72 -0BEE0FAACEB52773 -53EBD9D4A10C7A66FAC2793C067A0F83D0659E4854493817C41BF26133E45DC40C7EC6DD9A378A8491CB1DDEEF708723FDAB86CBBB2744558BB45BDD72DD97419280CF308E8398CBED5E4AE631AE521E1A76F3E8C9CE8ACC46AFBBC71DABE65C8AA68960F6C6992D2785B59CDA0AFB9EA209D13B7BE1F10F7D61744B452DA69149839E578839FB3669ABEEA9867B53A598B92D24DD2C91166417FAEFF0C7EBBA3798F9F80646443E920A3754A1052F6CFCF21D28A1EAA80EEDB73835A4421D07CC02041CFAEF9380359591E788EAD40ED9533354C61B21CF9F0A9714C3C3CFCF20FBB9D6FDA2F00A10C0ACCFE16A5ADC39B9909BACF3683BF96773654883D303 -00A1A34C0151259F57 -429E47B51AF3E6B7E556A43D0A3FD42DD007631DBDBE3CC17F39E9DD3997BD81AFCC934D97F9A127E2F7B0FD90C9F46EEB403084B21E048E175F9F0EAAF10D27A67582B24452E56C35A01A97091AC8A4612AF24CF39EF3B0172E6E0D4FC4012745B96DF481D2E2AAF6460B70A84C519684038CA1C8B44F91E2AFF20BAB17434FC6CDA6E489ABC5A42AF2767F6D8ACCB462A47BB045AE7975276C78752BFA1AA327E6C788596CA16792E0CDA6A4E9D7B594E662CA907585508C71DBB322710210B0F8B4A5015408D27EC39D966A44A5814DE9F62C2457FAED55E880EA076E1F34A3F1CCE81EB3ACF68C52154398C8259F76B84F7276CCD640872C3C6788743EFA -00D114E792C580A36E -46EE4BB7BDAE8CBD2978A4A4FA7C03FD9A96E54DF864887442D4621AE3D4E0E47F37AEC9D89DFDB98B4EBDD742A09A48EBA2C316E6F338BD6C88901172D3E074E4F74F31A28CD4A387ECD7EB206C249B0647F6B27249FF213F1D6B3E774A74F69D597F5C0A75D9B65A96E071CC87A2A082FE632560B70B47907DEE1D75C7164C786FE4D7719398AB0E79FD2258A6DD5429FAD1E887E56DF670AA3CDE6110952B11099A4616EBE9AC2079B02F3FF1C2AAD153A6B8104C65029BF45FB44773BA8160E68BC76FCF21A1F7102889170DBA841ABCB641C95CCA13C3E3BAAA46C24E4A784EFB2884BA68FD476589BFF3BA3E1B173BBB3521EAB477013D63B1193EAF73 -00FA91AB8115B08275 -20D6E4F2A0CD8C74CE580017C8B825D03844328C0D2A97AF74B0F7160CCFA194DDB3329CE5C89AFD839F63C74BA9B8E2EC9D3836D0B557C892617324371B312EDECD6FC16341A5CFDF63BAA8B8F049D591EFFC70A827E907D86E6C8079F0B61ADFFF6CAF909AD878ED564421FDBA4CDDF7CEEA48CEFE411DBA88FCE8C6581AD86F61033D279D5D1F481CF26619DC9DA7E7E2DD60BA5B357799BEFADF15EC75B05346E437C240BC922FB96EE29526099AA001961320734A1A1EB7D108DFA1D65637E608872758B76BB9329BE67317AE32E771BCDD70A5C43EA2A9A8104DD724E88192A4C231F2588AA2D3CFC273215376BCB2F44E38EF138BA701C2DA73C812D4 -00CF4B51C297D89379 -0084412EC87B14640A613A83B9837709B427442F13333029E6D92534365FF6F88E6AC9D330663D7AB96A1BF09A06701DF125DBDB8F9D6F832835F34CCB4CE5D518D5FC244A90C5C549C9E15E4A676440E1954D74B4B2745C970A1B6CC2A558BA51E62FA140CB0B783485D04A58539167D5EC54CC7523C4932374A792206ED5CFE1ECD3CB79F44F366170644FCE1BFB7B2DBF58B84CEE4DD99BD142061629AE789AF8B79847E5F2F278BEABE8F7B2D5BCEB111B56BE68472126BA9E0D17662561DC19A6705142F26AB24DE2432773E147254B7524102267C8A959CE81F534E831CD8A5B84A7E474853412AD2897BDBEB932380D8AE1270EC7E2FB31EE3FD4C9D652 -00B7A7A96D3C82BE54 -4B527278114960D7C70359B0A5EFEDD02672FF5CB2C9DE345F40F68635B7D82EB43AA4C275B615C9402E4CAF4D218AC8457614DE965F3C26FB81A8B02161FC5380D70E39ADEF14A7805DE02880793A0AC2C3AEE40C58D221DB228C11882D5C03FBADF82B91646034272EEDFF062B5DE18FA68ECD2C33F25807A4CDEA6E8397E23E19BD1F1570362E68D9EF600127426E850768CD48DC9D8389E494919490D9E5D937639F56402C21E937A9DB5060C904C362DA360DC828896E51324D4966F979D12F25F5A37151A2A4B57074C87E00C28BD32F93525510CC3B57BB963918651135B4F9BC77AFC36CEEC3B8D8F3DE0B09D8A464DD3A8A38346C4F6FE8EEF74219 -3CBF3A34FC8300E0 -00B04CE658C3DA18D2BE4087B7A886BE7A6DF7193E754D2CE076148FA1A185018CAD81C6A6C9814A5A5DA3665570D6452F1B9521B1AB5097636FA05DB42AD8A3AD58CBC32A2B5998F2DBE40C6A4AA3DD758A15F9A706102081142BF3AF3B4556347CD8F3EBAA7C206FEAD275B2CDB62CEB0DD5F7545F6970D5737630E3C8A920998F1D1025C9122D40EC120541E23E13688905FADD85E2A0CE73183331117E4E4474EC425D27C62E33CD9FF6DD2ED3B49A8D9C2CD734E110ECBE3DBB562C0BB2C1221FEDBBA986DE094E161B7AD69C69905AFCEFA8F9F309213B14583A4BBEA175447BEB84133D1EA5DFCA9F9C03757746111EA13CB9B3259B9095CB485592F6B1 -395F33A6FE2E0799 -0090B6C9A38BB8C576908D1983111704C00626FED54AFBD84671054698F2F7952580EE084903497ED89B922668715AFCC8F61942A1A287CD4BFB78286A79B96A13D618FE28C8A3CD11E583F46687C39EE3FF854D00B90F217BBEDB592F25435F67CD2ECF0BE5A488E7EC134F2BE655D2E0970151DE58C1F0EFB3F2AAD0E05AAB10E10D70DD7F6A61C74509371731A0491E9729F20C4795FBF54A242A24B8D047F3CB8D90B9E6A0D004DB88A768C1D9C969E08565BDDD4E6D29B70E266DBCF5F6EDBF8E3D950EA1B110CAFC6CFDA79AAAC5C4936C41A2C7FD22E603A6643857FE6F804B8854DFBF98096AB3791F0BEB4B358E7F1FA37E37B86CE6A1E702DC5F9111 -00BE8597F14A024902 -1CE840F10D8578729BC1507A833ED36E86C505C1561FE56CFAAC1250045724268AE8B70FF3BB49248D9D8ACF1041FD7F5680177289B48020D16A38AC69BA78D26054AD4BD22C6E7AC21DB00FF2E91F1B49F8F022E7FD62F4F7AADC011525A18332424F37D90860887DC2729519D3D2A962805B98809D8BCBFB12E60328CA24CF069B4D8717A3FE465DC319D9BE6FB93A1B4DEA2E336E32C21D27D347202953BBDC74BA3BA08A8A91138DCB0F97EDB9866F141B76E84FE781B19FAE203C24EAACD5F6B7EC5DACD126D714D8A49A7C530269389FA8C83151A2F5818E7870FBAF35C3F6CC31AFAF8A062C4FAB6449D8C3C4B22B1481D1981617FA5EE17AE390FE56 -00AAB58CCC11F3D7B7 -797AC39B0F1B318EC03ABBDA2B24F92CBC0C4948ECA63E202851A7E96937FB1A0AC09C35DB5588C697053A7DC7C431EBE3A8A5FEA14AC1A3E291004B7350C2C6FF85B0B2E5018ADAD94AFE3FEC8658F22DDC51DCDF73AAE1092ABEF1536EE0625890C11ADFD48D350BAE1F95F705DB2643E784D632C603C3EBB5BC5F0F6D38D0F66F0F1CE1A5E0BA8AC94B6D0899E04CD4F498FD2FBD5D2B191C802B1024C5557FBFE8A1CCC87E4C6B6DF8A8243E2F4CDA6A5092D91649C0619D2150318DB09F55622E2799CEDF6CC0CA6CE9FFE0DFE7BEB1E47425116E7655AEE255B3ED75A4A96C109D76853688B7D36311A24BFABDE62B7641234504641985D7550314188E -00B1E5C528E3150A7A -00A6145DBE9F88914C8CAA1E49FF2B0B02C8A2F4F3D8B6A0E48A2A5EC9C6DE9DCF7E61AFBD0127632AD2FA9296A94804A6BB3F9B30F8C528B7AAB107754F357E017AF8518BC3889260E71139930DA6FD79EBA7FEEF3DF3320C31AF7B4DBC023B86CD79166120FD34D152F65F4033932E40A8E9D854210A154A551BC1FDD1B71FCAC7B5403FC29A51455D88D6FB0BDCA62444D0C52DF71400D1465A4FD3863A29A3AB853E7EE8B8D87E0970FEE88FB22A85D1B83D50F036ED6FA4EF53FBA91B8BABB94C19F2F8E8D49FD2B4409B427C8B856559BCE56A8C78CECCC9D97E26BDDF4516280DDDCB4E1CC79942CDC9FC336D4F6211025B2571972AE7F28FE063DACC1B -009EE7C919343837A9 -00A566F5D0AE53834855C4B1E6D4B46AAA3C591DD407C10B92CAE646D96ADCE27D7997E5CDDA348862326AC408DED65715EAA72E877A71B87890DA0860E6A1AAACB1086A36908DD4F00B9F3DD3EF777110B21CFAD3F54191CE5876026DEE11E4BA196633A337E86C00413951A2A682E97CC45E68F8CACEE76E17E7AB32145081FB502B2E4618400AA85D002A78174669912F679FAD3EEE7CD406A85EE09B14EB6C5321A55FC613DA7BC0B16623089C84B0154F53366410AC4500D610B39F20F642E80BF612F25E877096758284FD4E13C4A58A0931776810F05F203CD60C334702AD21D20469DF409E4A0EDED54C0CC21E1392A7B03655FA03625140E91A862575 -00DAE3025E757D432A -4C8FDE18A09668E17D9FEC4B74DEE31C1DED79ED606938FA12D572B0F6CFD53E03F5C0202CB96D7DFD949D34C959749C4970C2445A313167DD39DC14C4C0F02A97F6E25B03911876DDAE2680EF995082CAFDFAA9C8D92CD1B98E744AE807E89F25082DCFBC5B0B1A525CC5C0585F47AB5EE72E1E442549C7CF020097A0EE756686F1B8D1E88BCDB4729B74A01FFC686CFE3998753F6D874E2C9C79C498C3F4F4ED2B74A72D63D75C643C40DF2826F9465786FDC949A9552F7A162437C6C3CDB94CCBB94DEA709B424E985936337811A89F149ACB9200443F6DFA29E8F2E01DE50893972D238727808640F01E7421005DEC62AD8635B2BCC2391EFA048C950920 -7D800AC9BA2ACFE8 -5CCA26CBAF395F4B0535910B04893DF7DEE481C24AD589F39244857C7A4D3CE8BB09B37D6A5B93725FD167C5BD72ACFF404441AFE5203856E8FE8E55E54A3339EF25C41D5168FFBF0AA8FC6903327F2F26D37B0A499C67ABF82B401EBF7960A1DD3CF5D9991AEFDA9C4DA1E641A4B6DB77110B83117CF8310E522515DCE5AA120CB1B6BCB72013DF89DB54C6735C3722FF109C1C921FA7CE17198971CE06EB6F1014A4C187FB2907C7FBC3A9CE61393EB1BAA0C5DC855BE8CD820FE039757C98F282AFF592847D807AE969DC0478D67473B7828BF9EB59B9CC71E1CDD4652E3409440339A47B9F4E40CB7E0396F34063428CF8127B796641E2B74CC459DCF1EF -00DD29F87D7227A4BD -586153DCBCC20CFBA56319E867837069DA55B0CB918B3F1F9CE2E152EF07E12E7BB4400D4E74B507969B41D1AE4C13104FAA470C0B60BAACE91B67EF63612776AFC1D9A42B1562B675BE3129784A6B3D2E9E9AFF36AB7EF6ABCEF86309230429FA7548A2A956B5DE19F943B2FCE5FD99688ACC223225F7464EC3284585226F01F4A7A2D357D11F7840B8572EF65EDF10E2562644D88A257E4D36058E492943A7B8C731FB01463F839FB6DA6B1A83A383E253501EA1246B54F25A9B4954A91B6B43D52CF0E9223A5B998DCD0C54DF31AAD8A73DBA896FEBA1B6F3BA0B7F9E429DF9557A7E013728D721203AFEFBB8953255F5AB7D299E7D1C9B5EA5255464B47E -00E8E1C308AB64A058 -0080593E917112EA1DF7A20C1C57548ABFE1F51FEF8F5778B6B96433E691E1EE8E750B3124BE65085F8F7168DC05DA4F6C864DFD56415F08B01483A7A8A3B85AD3AF923CF6FD0BCAB5880068977465377D1EAB42CF67590E6700B34B5343E34BB8A68F168D7EA060FE34E6D27A5107C863E7D85534CBE8C072E553F3D933C2D21BB7F3172445805E4A1D3DCA5B450A5863152116BEAEDBBA70037B531471409030F9AE6C8434D153EC31FAC3F49D6BCE77C17D2924204077929BD97A0A84A962C215747596F3AE514C54DA3D951E2EC2A5A535AAF5AAAAC80AB5E87547B692609E279410E76FB91CB1CF8310F7EB8F90F06E279D810236DD99C679BFDA7584F0D2 -00A5CAFE20669183DB -4D50DF3E05BD47D40066D1A991AFEB3D1CFDB86D5518A1B93B49BA3BEE34960F4FC024C73027925E3C38F483E6BB2335EB534EE607A0C26EB2A0C08F79B726ED0FE386ED20855002D1A3C9F4D72068216ED3E025AD8E644EBA77F38DE120DBEB30A064C071BC9619B1634D79A246F447D248B038D8183AD544056205DDD76E8B4E50EAC174C0E7BE2F97A82987719138F57D561CF838AEF426E978BF4DD23377C4EBB2EDCDAD84E3F5033209CD608751EF8B4A5F6E4E5C1CB400E644C20C9CFE2DDA1A7B3A6F45A0F28CBF2968B5E931995A24BDB4D6498D49845A43D57C79ADBF305C33250C5F30AAB7E45A2190F54921434BF343717FD0B1091AE87E9ED1F4 -00998A05B1AC8BEB34 -00B6A5B0D23A9F6CCB76ACA2ECFC618C8C319E0405570142F2E5222F5A8A0464B70F8C58CBA65EC86EB5685B5BD0AA128377436BBD79F72B9C7377CDDAFED868700A9AAD82F7D1ECCDEC8B44085E67738AD0DB6C2B580B69181D464E82F6D109AF2EB04E1080E1C0FBE6C538475552984B8D4B99CDE4E157DFCEA12DA81A1933D97204AF73E31DB44BFE2F6BDFBB3DFDF7A5E84AE07FEDECA8000E283A69D29EA9A20595AE446E443940FE03934E5A6D99AF911EA4DF09AAA33A726D2B444EFA864045FD9D084102224278ECCDF092710FD6DE81FCB860D86816E08059206521537342E7276231969B3A8D942F17B8F19D79675EDB44B1082A69C65F573F29573C -008C456ABC19D1CBA7 -009437BAC19C37189D23FFE631567F68789BF9B5C89593C94CCCDC6A742C3F92F14367988CE328E3132B6F48CD26EF2231EC468560F8F6DA8B05E4FDEAC1A4937BAC608A43AD3ADD7D7A0A67848960386EB25F11B120B06820653491C3AEEFA365DF94EEB3947604EDF4038B6CAC85B01754D6B359850F05B6158D29293B42AD5A88AE85706A7C8E36E54A43A6E3C877165C92B2AF6A03C0F3F9017ABD4DB1FB724DB68FA9DD0365014AFBE0322D61BE779C4074EAA48A538CECBC6A1AE3E76EDD1AFD78E6633398B1A88DB84B49CB0F46B8AF22410B31246FF315AA038CF402B9D2107F00A2E162FB27F67825C10CCA887A8378C19150600581A679262A944355 +00BF6E5CEDF50B285C +3337728A566B3FB90B86A80D3A32F008BEA456FF62A778C3F3E7C545D88378722A179EBE7C10AA342B86A52B81BEDB3B2B3D341D11F3B0B667B2A0E23065A4DAA7BEB9B65551A231CE2D2AED9AEDE42BB449C8057DDDE3230A4F4885B7459D146FB5FA581647EF39C60291BAB3E3EF68A535AAF531446AF382B7674A1DA726C4FFA7B34D7F3191C50EDADB9B4D3FB68C4079BEBC9F23359CEBD10D3DB46A88CBC29EAA20583675E64ED8E65C33804099F0D105C200701706B5D80E1F140C873910210A79988A6DBA752BECDD6D3A3EB674411FA7109740E368113FE56805E531DDCC01947A46A2A10AE73280932FA6BB76EDE9834D80E30D0DB4B626FAAE483A +00BF5356372B0B0FD2 +00881CA5DE0AA854432B01C3C5F5B0FF8AAB3CC87265C91CA0776A8D4CFD360A6F7D138DC5B389B9C5A7192FDD3E3DD4717F6EB820FEDB5B748F243B994E0202D7C2C73DA418B0CE96DF8045398021AF5E0F4AE4BAF21974526F70428A9B83C2BBB5CD0BD5D4A93B8A7C9C5EB200A3E5035711ADC32A9C4D407F19E51280CFD15C4FC9836EDA449A1DD8FAF630DD9EF554C2336427E74F7631E7BA4F16D3ECAE74FBCD9E7A58C3FB1C16D152A3E51CEA04F9640F0E0EEFF8901FE3B8B9A0FAE16673B091DD65FB3194D24ADDFE6A0BDABA5791B3BF0D361F0F28ACA14A833BA5D97EC37C25D1AF93D5068CAA675D06DA02B441B5E40EA6416CF28635928742A03A +00A4B480CF231FBBD0 +0BA819775CCBFC8FADA5095BB689E8758A279BBD20AB90986ED622B2EE011E5B8FC0AD0C23668DFAB085D6A4B4142A93CB8D6A6C0CB4EDE8DD251C29EB974969FAFCA6929969D394C080720E9EB818F600F7FF5F20A908F515FDFE5273D9D7C4622C33060053999F720F2DC5373730F9983817C05FFBF283F682AA4181AB19661A55677463EAAF47F55DB5AA73438B4963963458CED8492DEE5DECDE9661B4AEC2124F439AF95EE944FFD940A778DF1CA0F594244C54271A224A70759173D0FD1811074DF728AD2EE94548EED83284FEA742F586BD03997C4747E274EFC75194A5DCD2C0389DD53EC44AF8747DD9FEA51F0D404DAEAAF461F1E38F3D8ED89753 +042ACA0C22E35E05 +009A37FBB85EED3AD760CB2EDEF57109466E1A8396855ECEA1497545416074C04A280664B0A4B90F263D39D22E2C245E015942B2716DE966D27213FE95F221EA373EFFF5FEB026FEB72B9650D99CDAD305B4F4EF4880D1A2148B88B57CBFBE9F39F75146907C098B021AF1B3D4C23606A9E7CCDD986104DBE5DC2F4F3E86BE165C15FAE1DA5431AB940AD0A5FA0A9904A5A2B9854F4386DC7FB75E829F0B5C3A52F823D591819361DECDE5419F7AA5CC5BDC952844C57D9DFBAAF9D833E065FD1BAD6FBBDE2918E9D9D376C9F0D6BAD8D1DADB8276202BCFFEB1CFC23989E03D97C15DD9756B1AFC94C36CB1BA0D0C6EE7C72C4BEB8F5B1F8643D1C32245D3BF64 +4DF476122D03F8A9 +698F795C0414DB4D1C31964F5CD4FC2DDC8C3474981C27AC571017404BCFCEC0E99C0D7E837220B3F3031DF2BD050EF4D91F6DC7FD58B31C9EEE944CCFC186E387B1FFCD1E16E084A6A2FEA1876B4AEE5AF3798852CE96D026EF8DEA6720816B4FD223ECA890DCD781C62ADC3375885ED7B683B0CE1F471FCC0CC5FDB457A4B3078CBB7070D9FF89179EB630745F7D66008250683FDAE692FD32D5427EF667A0A2B9831DC76353D25BF4A72CAD46220A20A264C49294D6F147A091311276D487CA0B2397C7159F43AD17963FC632737967F64581800A262ED1B7CD2233204E2C6B08AB56304BA95A525E00CA7CDE32D71D70BEB0E1DEEE076F723FB32866FFA3 +2E7914F4E3B6BBB3 +00875E12A4C50FF89E00113DF3E88A847E1604C97878E63FA2743668516444966460D5ACC0339994FAA8A3A055BF43997207A511FFC6D65E29E914AE1CE04131583AD129C767B30BE9DF7305FE2CD165BB09967FA1288DD5C129C614D17DD85FBD3B42B4E3F5DA4EA0F5428698196560D2058F9C3E065A3FB2F5D06F9B83B7ADACFD6CB4525EA72F5363C3C23CAD7D98FDE6E4B66965F5E5C865676A76E176943014459082A16E0ED054C8DB0D4A9293EB01FB7F0FC5A59324C6E55729E07BB4DA028D9F7E26F6FE62EB670F01039760DF5A53E5183089189A7CE7EE968B4B1E673E9364CF2685BF22907F7DFB427FB338D087CE21C9082DD836C5D366155C406C +3731A70BD4C4B84B +009E31504ACD87D72BF55326B742FB4B7B9085388FA2490781BB8F2DB663B0619A8CC99FF7FA5485501305001885ED07F24D845BC17E60E14758DA18360C19B38EA9F3B83EFA02C8301C7F85A0DF6F1BD5D6BB68D43190BFE6F7828146F7F8AB19CF9E7C4E9873DB0B7D889304FD74F486DA9F7C7CCEA448CDC5FA585E45FA8DEAADF496DB5A7F75FA2F71254A3A83CA1870207BC59A6A8270446A41D2263824B2B29B83AA2E31362904C93B1B7DAEC83CC5F2067961A2FD1D72D6E08B3A31400E17D6A8207E0DEBB612B54CE22BAD55B8505DAA5CF2A2D659282F47466FA2218B1E4130529D92263645EC223284C9FADDF471043F3F7C82CDEF242B28D198A66C +28EE6065562F5349 +1403757D1A957F99ECBED7CCE5F70EB25918DA4984E2A158D4156D3ED44C1AF485A98E0C50C73F2C8E2B1DAA5DFD3F03658B1C88B24B0D6E576508EE5812B7668CD05C88AB60634363CC091D7D622AD8D3BE1FAB37BC86D69A6105CF1B654C42CCE7FBF8B0E86C8CC34C993E31202E3803EDCBE3E2314A67D7661BB42AC61AD7EC5A365161C23491CBD002ED8877FE5B6CC36B338F0F8E282B891D5B08FEA9EB8A8FCEBDD601C2C8D7754FCD812D5EF5F7F11ABA2AC1CDE80DFCB9B96E08BA61C622F6815C246342A17EB7CC00EA9117A4E822BE9288DF29F12E296539D1289E77A4263021BF596DED2EF8B8E8B0FA89D4F71FC9F5AEC42EDB1CCED52EBDB94B +567EBDFE1A2937A3 +04ECADF2E3F57081BD29B042FFAF51A52EC6F0D36C692860E246951AD0AC2C25EFBC9DB0997688346505E744D2F07DADE83445356B43601A23CCE6DC9797A9E400DBBD0C015E9D57293A88C1F6FCB919143B0F8FAAB0A2DF5B29E8BD79BC70B13410A62B11D1608B461DF4EB7025225C32BEBC0112421D5FB579ABC23BC548B0FD716064C8F832C3B4AABAEFB3A737046ED491AD2F004D7480044CA523F992B5EF5BB9A2D59624B349807DCDE007E3772FFFAA99371B32879766C53AED37A3FA851FFA6B358221B90394781BCB1D55E7DFF1EDF62CB4435E8BD11F98004CC48655121334207BB948A4D7DC46023A6951D75E2C8F819A6ED1F3A918CC795835BD +2A2A3125A9FBDACC +34C4F499A451AF2D7F4C67EDD17950E509814357DB4F0CB799BB67FED6D036F701EC62E7992427E8C9D23D2769BEA766C72DFFC659D05A211CC4EA72E10AF06CA1285CA88ABBB51E20B39EA574A399B39D10893329BD8CDF89DF4698A51FA3BC9A3B21ACF084BD126E2A55B192D1911B977B67C8559293537503255AF1A9FD0A5C5EBF5D0E563C829DDF91EF7FAF236867516D655AED6163CD8A085AD3034D871E393DC737B0A85EDED776438E430D291ECEB192A99D6EAC3038B650711214734700667D8CD62F84EE9F7EBA02E768132BF07331E9EA9F5E5C686AAF9EA31F28CB4D1069285878FAC8AC036EE96DF25C008BC5E733F3CB861F0A955FAF260A17 +00A280350E5177C936 +00929A765243117ADC58C45AA33612C4EF399E268F5C4D33BCA795B91DA484ABFD50F9C3302051F1DD8EE6DEAC7A40D7BAA6D5B032B8F6AA9653143F5F8353DDDAD9E51A5FA79A330E454328DB5CA7F5C3BCA713F5DE5E08E8DCA31EDA2C1988FE8967955C0C6E6F24E79BC1BA1C6F83074A7E16340CBB5D6A3CE2C6779DF05FC140A2A2EF10CD8D4144E918AF879977D2359D3AD70110A8FA46C6B8A7B7B8DDFA9DFFC18DD5F3AFF884DE8A597425D04E81763D1A6C1EF7A75A491D94AABAC44A3CF17A77F5B713DD051922D4AACA4F24FD3BCBFDD2A31D0E5C95B095FE47937AB5C458DEE7755AB9958A710588C85AC83C78EAD838C6320B49903CF44904E503 +00A9A33119AAED7AA6 +00893E79DDA64719D8A99342FFADA7CFE114F5E20F4E1899CF7E3FDD89220A1AB8DF5AE147E5DBD209B2B27D45FC32C16E9ABAB5814BDC113D2CE81D7D2A72241BB9C2C2B00C44EF340D37802E45EF267EE075D37DB81A207286A85EFE9992EC872F6E547D82D7B99AB46B1019C3DA380AC4126B06488AAE3E300B090CD275CDE40647D19BF946971DA12944143D7F533FC949CA4E367D240A28E42D5567869EB8001CE85A31BC4692635277A1FC8C3EB86CF09FD822D44FF502770DAA270265B9FD689B7AC20234761592F77AC0E8D02EF507432A93997B1F92FF7D4B7BA4C7B373B12426D70C176494C8C87C09C641E659660B9A1B21CF1BA64ED172432FD11C +5598F3AFB34D4E87 +6F8C794258D734A0E2A9BBE89CB01F7656E9C93EAAFCC4C4D63EF6F198933FCD8C114A9B3EC5FFE39CEA981B1504C164B5E808CF548223DF798B48949489B995FAF27548ADB3FE188971568C6961DD763C1CC9D71CAC97262BA8AAE86D32F5A10EE3D5E4CEA523AA690C987C1F59929AAD687A5DEEF254E72D8EE803831152F8E2DD1A54690FE348CCED938EFA0787A10A7F18F6F24540404360A5E0392B5FB094620A1ED5006A4349225A5448021416B71031F5441AEF6C4F3731A5C549C078D406E63A41BDDA98FAAA6873CEA4DD777FAFB6EB89DE0EC54DB0C9B59E264EF910CE5A64989ACD91882CEA3092A0E73008F293D99299E2B442F683586A93CBE4 +008482B8E24507B7DC +00A6A42EDCADDE6688A1E87D13C8DDC8D5A004052762FAA6EFF2A9BFF6088E859D520F802E1041CF3D40730B76ACE2413AF258B1D36DC054F4A7329C1BBE6A86E6BED348380A065013FC8C5157D900EB1A01EE5543F841102F31E944A850FD54B06D229B1432A7E5981515BF695234BCBD8D33C553DA1719EA4D6D435CB68E2954BBC84C5E9105C721B809044847D6028871EF4D2CDD8397D9449B0724FE59AE165A1FD93AB88576FA8A21E537D5F60D0A1D1C24AB7E72CD723583867A7BF5288D0D1C9C0DCFDB3B0552994A6247C30B58B88F5CCF2A2549F875142B261DBC2FCFA1125B142FA903B322DAD81D59098C112AC196760EAC3995146953D02F4E2C28 +7CD1658F7A2216 +114DCF44BC9FFDDB255093817A34F2F3BB50C511AE7A6F01672A55A85105942A6A81FAA4D0B270A69727088B29227EA62197E9861F0615467902EBCB754A714D3F85EE32FFE2DF4674D2C9BEC2632A1990D1B8166AA370FADD18E714022A5D3A7969A0E35B49A9ACFE5D80B0CDBF3EA0E3A25A199916F5D561E94D1C24D25FE9DA27DEAB4F72E5199729987CEF3CB7C3149794EB0102E8E0E6644DCECC00E2F05831CB0AACCABC5FD4F645ED3AF70669BA7A59FCB1ED5D4B172560EEEDDF34309944D3433BEDB6E4A46C23A67DE5CE9B8D1BD874284A7549988B6DC2C8CB76232A2F1DEE4A81661392FAC079041D9751CC4664F5F85AD43A347213269135E92A +00DE7C6D15A9B5168F +62FF0EAED045BD97EF5894E2D9811F7EBD7F0967BD823FF85E9EF2A2E2E258EC14D224A571E92737D49C345585EEDC6DD1336D4034CB67CA088A48956266FBB90671A80C603E7EE3172CE4D9B16592B4367BA042BC192C4EA517C0D9C466A57A25C46AF7B3D4FD504068460DA33363C58133407FBF905B05509B573C9E78DFEA9F64B896B2350B12E2F07C4CA3D695C6DBC7E1A684CFA0175F7932A02F8EBE80E4E6F362BB85A1B7A749B69F2FD6915F1A9C6969030489F482B62AB0B26B666B6C21370DFA538210F988BD43308AB8835F05D1789E36399E383FA396356D5E7BA981C91069276B06F65DD729CACCD9505C6C496780996ADFFB28FEC8BF6C8AA4 +03F38EF043B3E9D5 +008BF1B47E2FF2A54F458D9100212EE8B6B4E9CBB0655355E70F85ABACB1CAA05928D40CF1184A1C5D6311C54BFB56BCE021C239C84371E3214DF3C78C53AC3E5135139D0438AD059B0C9A07398041D346B1358308D04E3E5AEC094F4183489356CDF20241F9CF1679496A8FB236DB980F387BCA26B86E7CC63AEFFD88F15B2CB3103C464F80466EF28092E82A855CF11E4C2B243992FED02C4EFAE13C937144F358AD7ADCAE37A56627086B041F848156F9010F9A301E2D2417CA4CC34AADF2547C20A84106AE8B783319032F6D0ABBFE9B6C1A70D00C04CE8B2A54325BE4464A1A8D54476CC692AF9708EBFEBA16FF59C8054E74EF275F9D5DFE8A9BC8BADBB1 +00F6FDE7C4751D059D +0EB990F23B40209C464422F92E70B0E5F7C03FC909FA20985259D0BBDAF75C887E9328A80140CEDE290AC8128637DC53DCBAD928F0D685DB02A16ADD245F0C4746567FA62616B320F54E55BDD04A28A2FBC7DDCBAB5A4313F5611DA3F6900CAE087ECAEB7ED83A2625FC6ECFCECB16D3876C1958C67924CFF4FAED9486ECC4102BE21899B3FDEF51DA51E3CC4531BFA80CDC39E7FBE95074A62253CD5C465FF410F3FD37C87307239738AD31A43D280D2D0BE7318B6B019F38A3A12120887842A95C29EE700F93491997B68861E9415DF3B8E2D4EA4158B2678EB2390CBA3F051F04531905F58FC10B34AA5F6E17864F887C706FD2665FEAE137473E4784DE98 +5C93954BD560DAC3 +0080918B810F41E24C3C4C7C49BC68D9427045149CB1A598D5B3832F632467E0F9DCA251A1789FAD2C122636493466F4A19A2C7B2DB2D85CDB2BCB720D6BEA91FC318B8B68735C46BCB85FB277025F6E0025AED533805CD99745555FEDAD16EF514EED10BD4097A2484B47C4DCA428FA2E9327F599FC0EC19A20EE8BA339E0C395B68870B472253E389EC6D419278F575D2AAF059EF04BB23143797A041FD773D076EDD54ACD7059A014B37C604D2D2D8CFE4FACFF19860202DFBB8556A02327DBF7607E16F69D48B4A848C080C7CB49FF95AAEC3B1BDB59FDA85B41ABDF00E1E8B8BA924B3AE4A8608B1F3ABFF3E742BA6341A975D3C16ACE2D4F80B1D45720D6 +09595D8FC4458500 +685A640088DA7071F792377C9C063EE87E46F6396E8EF3A93F43F2AD213365053CE42F4C6E75ED5755F9015CA448184DFF528F9F178B2254CB3D882601617CCB5527EB3EEE2C6CDF63360B6BA9A28F4F8082B6B48EEB5CA46BA175B6A91C86C101BE869404A701D8FFE1A12D5D24FD331144A17A7866FC530FABFD3A7D41136634EE101A3601D0E1827C369292950266EBB29FA2AE46256607803FB1D9FF1F3AC89ECC9B9A36FA77AF63AAE03097F751DF66D7AC19D42B1ECE59E3381B29E12A7DD9827CA15021CAE5A777E4D93670E0E123A074E05DDBF6A7EA34F97F9587AEB5FC54DF4EBD368B37A7B93BDEE674B8667D62B94042686614EBDE456F30B143 +06E750C5C48A3B60 +00A30BE61F30BE13DBB763A621E779C21A80024B700F576CD6632E6AB67B2DE177CC4B8B842CFE4C62966ACA2B9B9B204845DB654558F584FB7372ADC92D4149A9F209BE203DB3217E1E8C00A766FBD9658BDF69468BD95167C63B9C9298FBD706E43EAEBE703E8191D67F088BEC504EA1CF9D7814D0D795AE2352E2EFB081072394024CB9C7D94B5FA77CCFC382807DB8E2CF04FCE74AF639776179B583FB67506F7D8720665BC532B9BDC42B9A9DD3F337F62BCF5853B9EB2B0B3BB4E83858B4E98E0EF97C14BA018F626F9A13FEB37125E8541D484453FC625E4B7D578C8F30CC26C0AEA3ED7D52F2ABF20822BB0106B242228FF00C6DFDC81A0AB5352BA1CD +00D5B84E370C393D81 +0CDC2B14D3032A88F6F27B75CE3DD6E56C015C498379525747321DE1F6CB99AB1981E383F5757861A0DE58DDD44E0A56683D8FD6C88319F1777B876E5335518D0399CFA51BCFB9E65FA1A28E4387DDAFB430F0EBBE5BF4D433F2A8DDE6664CB5569411007FB966BA442D17D794B8586B5A2BE6CE48309295090814E932A8F7AE60B6FDF10F3A0F78B785E7E2062A94BCC1DAE2F0A072ED64E6CA4ECB062FA3B38932FB9ED9B04F35FD9C7274327D51F14B4AA6F7814FEF17D659016F6FA39B070B8324924A31101FCE7A8C51805FC7906E6BA72BF70F85103B9581A1515E043F228E3012CE88D549F08FF4B0606E0CF1E45D102AF150502CDB2D98E64BCB6163 +68363BC954A9E246 +42608B170E3786F005C71BB89EE2EA725B2E8F24816616ADFCDB047D439A0168145FE93A755A712693C183C7788A0BDF2DDF70619B19E5EEECA70F69B3A95E8A760ED729FC67F8BB66D52559FAEA54F625D775741FB913FFB908FAF893F1C320D91AF589A3F6E541B2179FB64E3B71A962DD52C9797A11A02F165CC73ABAD27DA089B2EE9F368A08B43759854C217C365087B8D32C0386677738D26ECE1B2A0FE76400BF91141EBA0C7E5C2EBAEB733156E3E970B7D8862C9583A0267CF25FFDDA631CCFEAA53CF5B7AE6BCB0C2AADD80E0577990B4C2330BF054D4ACA8F103FEF9B169B6286D367536F291912A4CCE393C6F979A07850A17DE198B40A9F9F08 +561309CF30848AA7 +7799CEB0B87912A9C1792B52F65263FD402D172987CA3E405D56EC13A42BD2CFAB1D73BAE15D1DB746E2A42C55CF2DFDCE627BB3DC666557B0BA3B8689608B6755ADABE9EF9425F36ABF8BA1BB872656DEAB6CE6339AFE8222D295A9CBA7B7C3CE371C8E15ECCCCD157AA98F2B170A7EA136917B8168240E0BB4C4E66A63399944534191C75077E660A277E8D353B77E846BB8CE9AD32286A9407B8D4E5484A58516AFA2DF92BBC397CA9E637FC882E79982D946E2B569E8CB18E3D69E162A578716D74556A3BDF27D8F384298426714B93CC4FD362C7F56633F0E83CCE49BFDAC0F229011CD63ECB353FA62049F2E280CB5DB79CFEBCE2203FB2B757842F509 +791459E60C5323DA +788EECA97B5079D2E0AD0134BB9FCC4B0DA1EC7797D23E15DED3CF8A3489ED60EBF0FD467903CCAA1BA500214A39075D262928E4C5F054FE36912111FB71F9766B67914482147E82AC4699F16E6108FF79D16D94372F625D8758B0127C9D3A39B4BE393AF2A51D377B037B8865A9BF55951DC6B6550BA830648ADE81D20B7F15739983E2335423673964696ACCCC5849662F791B6BCF70258F11238D5563BC28457EABB9550A7526E0042578DC171B23E0A032C61C4E01B58A19C610A45A4286E58BF4B62987525BDC00D58044ACDA227F58FD59B18CD8046CC93D733D9E97559B54225C0D81175931E08C5E8145C8A60306D3A5991E319ED52800A47D6937AD +00EACEFBB9CE8543A7 +78366233E06BFFD75C48D22046AC544580D5476288AFFB9E72989F92074AEA58753ED113E91730EB079D611046541AE1558077865B36D2A783C5E9C3F1918FE4ABCA784D348689422FE8B9D2A64A6F5A59E4E120A251A58306F2CBF80C40FA7E788419CD1CE087CC959ACDAC65B0F7444C886249C7C0D8E970EAAC20824CE15C834A77AB9A4AC62244C540D9682D138454BC354561E89C93825B4A27D1CEE47BF6BB63E122C3F8F6F6E65BC7C1EF3E7A6E987D25821BB8834D7D862559E8F0EF3F6E63E01BD85A5256307F43485DC69D85522F93664717FB4683216BBA1CE5BEAFC019A36CCEC6C8FB24C1A2193F86174D80C324D7558E4856C62B57CC60B39D +00E05CE50696268BB9 +162BA1DF28BDD0C5C8DA2CFD97196A15C1719094C6801063E37D9ADB56C56C963089458DF3DEEDBF29F6CC42D0CFAFB0B46890D9F433264ADD15098111C745135D66DE5DC184BB0B915DA706802AA1BBF664DCFE6DEA508720E340A29CCBB7266AFFB381E369DCDB5B2FEC883B272FD8DA8C9B921DDC80E9011E17800BB5DC20AC19E5E9A6BED95F4BB398FD7C48B17643A0D85FDB915FE334CB305A8488C04F72FB41B7E71D3FE73569FAE09046C78058106B101EB048F3D43629E34557983213F6B58DFB3F7B59DEC7E27F95407904D766FA5895CE51E34D72A507E110B37E1BB4FB61CA63E61675F47CC8E6844962CC36831C7A25F26B7E880F236267F275 +0082758531EE44776E +41C7CD4B3253F94C6F593EB0534305C406CBDA902276EE3235D5A4FD403C57F143B05DE3CB1C920B48CDA9929EEDC6FBF2E74436E785D6EEFF2DA389D7E84FCDA449DEC96D10191D7421D90C12DC1FE5666D6829D7D81DE9BCAD7C90EDDFA1574AAE1994A4A85119B415B4BD68D1132E594B42165EDAF2E349FA781DAFB762A1887805DC5E69F372BDD153AF9F61BD9AB3206FCA33C073832446604C424CFEF7D0D5048CEFE1829B0273E46485821B09699E53281D7A502D8D3683FCD320A609D9FFA1A8D6BB131E31AB9B2747C952FFA33FCB032F751C94FE23D484829E6428D7DC8861C74E720B44E49625206399A92F92F0398E9A59DA33816E50CE37FA32 +04CE06A4A7038121 +58FDF57B0FE6CDEA14BE178AE0517EBA7F512FF7C900F55F8E98569BFBD1139366C829B8B761873141C1F6A7FE8783C685DB060FAB41C617BE9BE2527544A3FF40684166BEFA0E2C32A0B55BCB17A25FFF98E69C2B041EBF7124997A5B2A4275753192283D4B2476666F1E18430952962D8AD16B34C62721D15899F04952DEDCB4D287A5FEE2E9F2682D3C0487C14DBFC344808B48798CA3B0C2960FFEE766ED4EF126B38E4FF034EA6AAE6B7F3FA608C2BD30541EC3C0E2559B68A1CA5579EF0757D3FC31C1254A211DB730EACAA408CAF345779B5BA22A7926B2DFDFF928650CA3C0B18B281AE05DEC3414495A9368049C9AE9B3ACC51D352D11B11409F057 +6CF55172499AA9C4 +4B1D7AF5E2141274B3428BF73FCA084A247A4B6F682F0163D5B1CF3300E1D5420FC46B823475D96EBE93029548705E5BFA06AE3EEB758FE91AB8917D64E2436E1F3B9D044472DCE3CCF1534E045A953C8A5E4DCBBB617898EFCC9AB219DCB23E13A194B1F11A8DAA7E29A77B7180FCBC3AF25CD7F5E072F6F71D338FEED73A0D329DC2A23DA7FAFFF75304D668BEDEAF3146F0A0126D379F3D720C32BFE62C90080365948CCCF091BE2E4C778DB8B662A7D40128107ABE29F14999C9C96A35F655F14FFE13E95913FC2361FA0507E5062EDA8EF6DD62D30E822B0878816D83AE9018964180E71E4FD66BA484A82B391809D21966B4F75082945AA6B33631F781 +37F01720E8459A66 +54D72EF2E5772B1C875EC2F35E73DCAB149D9D2EF1EBE629D349523BE3E2F0061923D9A175589AADBBBCFC045638FB87F747FB0D444EBBD48BEC367A1407D7D526E9B7B8E29A71667F98B4670C851BEEE71DA2B018C0406B47FFDF07690B22B4BBE556D9B64848CC8C670506ABE194E2CB1DB28BB4384CAF2CA696408B70152F81EDD00713BFEEF97A66BA474612C7B0D65F42D2E66AF4552100173E863FBCDE06CDF1E8AB282F8D7EED40D7D77FB00701ABA380C6E7A70A1C371DED4B46382A26802BAD23BE94562BC8A1A792AC97BC044B9DAD6AA162929C9C036C47D4E68995A166BEFAD0A25B07CD7C0366062495013875526C3FF89A3E2812D440391235 +00F5C69B7711664675 +7660407ABAF75035638BB1898A21CB04BA5D7F3903192A072CC837CB0453D8ADF4C7AE8C238F4982A38CC9935030E17436E77043D8F4B70CB674939BE05240229ADEFC18D93E752C5CBAE5DA1A4710ACE8B1AE61563141B093222EB8932480B00E24B4692CC0BCBBFD463315A36E53B78DBB43C7EAB4FAC3FEC4D3EB26B93BB8C73B63CDACAFB94B96F26A43F5BC0400BD913AC30E8E20896C88E01F74F6E0075FCA25249F9688C5629DD885DB9DA49936BC678569FD674AE5550683901A3C4492A5AA5E4E733C0940E12699FE4A26CD19D7543C79B56E41ADA5AF8ACA95EC5C2A5B7082E82A92DF5907AE83B3373ED9EC8E5A475ADF8DFD3840F8F74134E80A +71A1366EAEE649A1 +23D18107B1D1B0785A2C3DC8E42987284B8D126E049CFA089783B9DA60AEBC9027AD325C8E3E109691BAE207621B786F6F6DACC00AD33F4600D372499D573AA2CFCB84290414A1249C13E7BE97AD970505DA04147752E2F0C6292CFA1989A5390C6FB134B24B03B67FD54DA60F32FD8448229628EA544C3602BB76493CF455C1956C397CA5215243BA08888A816B66DBE9418DC784FC9DF3B8141BBECFBF75895291E917961D3967C4A50335459924DD8FF2A438033FD8A03FD988179A304E490EF6116C23E62466C31FD7FEED5AC6A328447101260C831E484BCF80D4B935341BF9FFAC2D068738F9AAE5C9DAED3C2C39783BEC7D29674C6EBF61B6FAE2B2B7 +00EFB44368AE41A729 +369F4C2739479C4E102ECB755B7873C89FF4152DFFAE491092F20FB8BA36721A158B4FF8D84E2E329636344BC66F62ABB03676921E092F0F8A4752947296477497AE737558A3F5DDD5848F8FB7900E7B7E84E27E201B4B19699229D3535F9C40BD056F6845F34EF7077E64B1950FD92BB66B211490E45D163BFBBB0E1C3A3067CEBB75C46625FC0D3B98C26524A9FEB42BB4BCDC9A1FE470E99F00733B1D4BD25E8EB9D6C69B27C7073C608BCCF97B165D7E3C7EAF0FEDE7E604934AA3DCF025C52B18483E65018886FDB1AE4F124537C7BF6763EB9802A8AE145CD8EEEE92A77CA0F3F3EBE779B339B15521FF7E6969A269D5FCA726EDD1FBD324FB845E26B7 +541DA96DA4E6F561 +49BEBA1CE1AC0E63DC9946BA01AD6FF9C2820725127178FF1A2961CCA28F6B04CC703EA49C9C250DAED44CC5594D650BD8DDC76BD04DE64A7F3883562E66382FE3DD79603F6D972E601A95864AA823B2102A359AE19841D6DB411E349A92647ADA5A689E0C40D768F3340ACD1DF8F77086D9643FE9D8724649E010DAB5B38BC6E2676B1A7F4B3F325922FE3FCEDEB5DE3C5531440CF6CBAC0C934C7C9ED436CF06E69EA17D324B436DECBDD71EE144A0FA876B44CE46F75BB05E1266C045E7F6B379C1F07B141E32BFAEF175F5345D3D2D83E0EA202BEA003A8B16C56E4B11BC0FC57834BA0670E7EF581CAE9F62EA96BCFAAD2937C4AE2671CF1B875401D8F7 +00B07DA65D2654085F +5C1FF625AD07E9D83F2BBDD1860DF5257EB61F0CA4A631E720D79F360F1162351CECCED055D3BBD845BDF5D8585238E1D2ACCF342E2ED4FCBF92C6D0CC8F16AF5A8684892DAF8238E0E920E642A8EC96619815D1FD1DD0D3E57A0B92ED3510A1C36B0BF24C6D0F52E7EC8B50AE7356AF976F18678B678D28FB022DF3C333FA2278BD5F121D84B1F73946C8A44C7380BA3A6FDBE8958AF81ED90FCF6554352CB6B37BA7AA26B99F0E592D67AAC733F2D3336A6F07249A4844D1B78788D39285376EF228854D65F503A5849FB1A9EB2101600AE1ADC2B02A3DB8B2FE85B11D98DBA0B499C9CF81C6A8BFC4771B3CB65C92629A2F82ABD55B835C6955EABCBBFADA +6EAF0BA4923C3BBC +00A57672AF824BF95683726446A39C9BFE5BD2B7CB2EC71B6BEBEC0048C94FBC24F3A01AE65C52AAB3E58F63CE6A1C1B827AC2F26E3482A2BBAC02778D868DFF9C36CD8896D506485A7535953666ADB951FD0ECB5D3BC01BF2F40B328C598C536A633889E1D3347E11D20046D9DC2A1AA0CFEADD8DDD01E632EEF8FC9670BC181AFA0B87965E2F8B704DDD3648EE48CE372BF873ACF7223D96EA13A0796C897EF45C97D151EC8E96B517A307C13679E3AC77DBAA2E830CCA517B5F5205A2D713FC0ADE8E077947D1CF22F9416B6AD92358FF429C62354581B83E40B99878378C34B530217A4F696986556D115E22E8B776FD5461ECF3B5E5B0FBCA6BB27E09A15C +00F918205B16E96DC9 +27B52B552D3A7160957BA658F7C632B70A57F0D98D94FF84D126E8A57543B79842BFA7C242003226E04D777F08898FEA930DD12B2F6BF85247FC2266EB18ED93A22E6CD14D578BDD81021E24A2DD9041D8220F1FE4B4B41B2FBB4B571C61BDE6FB57CCA7ABE451FBC56C920F1734104306B425115B6D09D70821AC46878AFBF40609AE5AE4171188BA5834F606C87EA5B8EB847E264DA089ACCD62F9ABDD9BA01D032BD4BB1833D4488226A42FE655FFC3D02D3348307F443426794B0A32F8300621CF02DF4EF278D1F34248B2A59A6748619993CA6C57AB55F67930649624B8F8EF184DBD63AB18D64BC92636DE5E1EF839524B1E2B9EBF5D88DC1C6B9796CE +7773CA15ED5377D0 +009119462F8409C8D17663D98D211FA3F77EF58847837BD16154A806B31F2F73EE58F5FE3CE07983693BDC935C84C40B01229BC282F23875C6707ED88304125676860D89B46DD722EC3A99423CF6B1B5AB0ADD6D5D73319AFA486C6C5D8E3D6C1DB63DA2E998DFBA768BCF693116D60C3F48F347EA511E5ADB2DD65534E1D7EE49A317FF3EFC60AB6A250EE265C81A51FA54461D655E837EE7B3A40AA5C27F10AE7AC597F82DBE1FC14A78C3FD34ABABD631989631FCC9E5D397688FBA1BAF0F2C4389C55C9FC4F8B76E70541F4302EEA351539D800CDF126C53ECD27A245CAD94423AB370795B6951E0436ECC13950E15A354FFDD492FBD98886E6CED6926AB53 +00EAC1F0EDAE52DDAE +00A0C68E9A5A62791A13642EC5AB1F0B6B4C11AF8F62E50DECC9EAAAF910AF62D9E18AC4D8162947CB6BDF3C6D5F4846ED6A6DEE82E517C8EBB46B796E45A206E41A3428D2AF03A6C7DC0440049E7CF7A8D1BC57F643AECE530B6831EB42197AFEA79583D90D1B34D5221347E1D756E70C71BF87A3B081EB1B75295942B4C60FE0100C25E927213FCF15E13016409CA05FC9680E18B42EF361FD98359AC19B60DF41FD2B453E495A958CD3A1FC9507B93DC7DE88F3DAEB34910DAC36AD4FFB779784CE3955A1ED6D07BA02C32FE90C4A36157B90AA26297AF2CDD04DCBFD850F399B502D0ED7CD2F018B5777997A3944B9D86C946AE120B7AA9A76B5589C23A3E8 +246B3BEFF678BEE2 +330B7DB548316C159389ECC0AD555F7F8F62DB0CCFF041FE831A89C1475771A8DE254E53699A3CC328553532F2BD46560FA16CC9C5533AA980BD1534F402685CC8946D0B5A8F786D1AAABEDC9620221B69597B47EC6587970412AE2F3E03C910E69E0792B2F808514CE86EFB1E0870C4330C0A2A93EF001CB94006B6D194FE9189D96992074488391695561E7D4D2A28D40C918A10B53B346910711488495C645011C103284521545003C6B471DEB044A7C6D136716966CD4A8E523E66349CBF42E36B209A33EE8FDA1E59952F250C2EA409A7F40C5040EE6AC34C512BB76F04B5351F5ABA0F66484F10C885F4312737487A3BD6B3A7EB5B51335A094FFF2FB7 +3D5FC04196CF7C98 +008D1BFE47D48DF302E36405E8598AE60D3ACDF3047F37AB1228CBCFBC3B700E213248D649FFA65B08CC03204E425D4D8B9BFFDC0EA2BFC3361751C7C39CB9F458AAB6F755892F2ED2AAEA95B0D9C01F5B672CC52A87BA1AEDB65C6E904C81F3CDEB4A3A6221C507E02402F8189481AF37628327CA59713F83F5841FFAA1AF32EFEA895F52A67DE473781246C56F4097664F73E29F935780677320B3D5EFB90577E655D8D76A1FDE7C7620E6BABA2D5851330CD6D743E7DCA7D0F73C3D20832EC5555280F4D6934313503A1CB475B7F11A150830997AC9EF991E3725EDDA08AF19C270565D84C998D3BB23E5A81ABEB216A729CE4C0A0440101A7FD36E0860A9F9 +00F69E733A92F1FF57 +009FA46FD992302456ECB0AA1F654F12E0321F207A483321859035EBC25C912944D19BE6BCC4E09ED8C152098903DF951F099DC05997C4D9F6278F03D05ED881CAA05892A9FA5E945FE9AB7E0BF137B22A685492E4B2D0B3BCBFF985918C2C2FD77C44E4F2EE4C65DFE0392BACEF36831B4E9AF807A79B83CE15CA3148D92342A88EAEC85DE8007273ADBC279577DC894F5CF51B20D9DE61ADE37CC46911889F550055D595152263087ACBDB9FF14950B74AB6592B4E411627E16806631E454D3A6A83AB284BA0E7796EC9642EBF544979226D719E8FB3F4D0502D602771BAD5B5689D2B84B7706E4715F596BF8CD27B133D5E78540E3B4F50AE15C52A5074717A +1C64774332858C6F +213D1F4CCDDCE43C494A27E631C8E7DAA065D4E7EBABCB7298C880B4E834ED22C4EE8EC88447F35CC3121966647002BC75D97C4A1EB8985C90DDD3F199556170C179177D1770FC51BCD78C955C99536249342773F00B2F663D6A8DD49936CB2DC03628736EADDFDE0C926DF223919B32C02A7BFD3D06144F11BCB31E17BEB7F5AAD01CFF4D0D602A9C495E06C22518F893857800983DD206DBEE07EF393C40D2777F22C8825D1ECC3123935C9E15E2D069300FBC4620A016A22260595C50FBB588755F8743E35A0963AF81566F1C4B5A5761AA6AC054F304C2ABA9F454836B552E6F88FDEF96DC96FD6F8BB368281B0D81523F765B3C1505B6070BACCCBD9898 +00EF469DB302B71F5F +008106DB15D26F3CC28D234DE2B987FC8161DF2BEFC3157DD7AB9BD397DEE9509ADF4D517C0E7161B21DB9842269AEC04F9C81CA2E0B06B9C2ED20734E3F5FD943E1423885970F0A79C56F2076FD0A12E6305FC8058967C1873A16A308C3EFE1F82846C65A97556D3F4F3C751D6C176820C71220A5189660CFA6B622099D5F5FD042296C7F8D184B7C49F29363CE644CA548A3F14D2A588E9DBA43C38C82DDD512D9C8699E8524E295631E7F187E0E5B208255619C4A9F44E28CCEBEADAD03891C4C06D5281D9D7BAC4ADFB6BA7043A04DCBEAAAE50E7E5A8320C93615CAE5136E0B5695EDA6CF0761D77977C44C23EBE7A84A49EC9F894C6210B3ADEEB76D57A4 +00B231F6BD13473AD9 +0D54045895A9543C39ECABE79EFF22E69A43576B714FC6570E0AF1DA7DEAA7B9D60B3F4FCB3DD892D8055123CBC62DA799D3BD1F14C5CBE5B71990F91D5F8BBB01FBB468DA3119F7C0B411575859108A1F0369D50AB39241120130D853DF9EC1A0D3F699376BF77EA710DD6C1912FCCF733D5C01358E7D08F509690F33FD10848AB11EC99F5547F2D62A197BD53D3FCC95AFF54ACF094378C42FA34D750249B1C9B19683A69FDF790811A654C883DBC5FD676FA843AC055644282E18865C30011CBB835372A2D2701D66E6C3F1492F3DBEEA162B9B4AA07B64E8DDB1101EE0443C03F0C4538E34EA933853EA5FBF60D6A923DC5903DD201BF988E974BC7A0AEB +041A5DC51DE640B6 +453A8C3AA39BD6321081B59FADA5A67446A5147552E5F4CD1B71647721D1661534564B345AE7D5DD5A26F76D347CD86C7A52E717BAB952ABE061E076080A3F03AD06794632759EA7B5770B634A4B250E05FF81DC3FEAC8AE9A9D192C8ED65F97316D9B0C972E2858FA5ED9B016229C9495C79A7ED1EDA6D09A125AC568B3223F777E9DB0C3D116EE6225BB57BF77E167BF8F797F499D30985706890D1D54B355C03E31F9C95983E2BD79E8240348C088658D88808B388C8F607357F0A7EA3AFBF16ABC8BFF704A25C21FAFFA2A39199B0ADF9E7D112DD2737CBF073015998AF50AA1AA3F3BF511C5832A4EB09CCAC2C4C76F24AB4EDAAD74AE76D3360B7315E0 +658B73DEAD644260 +136CF13ED9BEECF24A1E52E6BF84E63F34063FD5A69B6A3F78C400A80F3CDAA8E477E425FFFA3FC6CC572960E605266424013C06FCBCECDFB09BCB0D2F39B2CA8EE17A833886E13356753D145A1B0D9DAB7D5C3CECF3ACCD6B9B02E0E6C0239119CDEE4EF7BEDE1FD680A5F678EBECAC8D1B7BD766560E96763693F9E593C3D41E38EE57D69285ACD51439694901BBA63EC402FC4A49414CFF6DE94933095D96ACE56A3BBDD4BC68E22CA3A04ECB639DC5DEF60557ABE8C6446E6B937BB1329D195E99740FA4C7B40751111693C61BC87ECEFAF2491C64FBA0AD0F92904DD96C290E808590F54E52A98C6859C6A08A5CA0E06C184A5AF4179506506643E4E55A +5585AF0C6C43F0A5 +3C5F688BD1DCF8D90162EA32C7AE3FBDE11F9030FAE4A8746E1E2F3F45540A01361C7AF039B7D44096A00474D6D4AFE5BB001EE7E28F62498541282C7CC642703BBFB0863B7DD2752E64F865D301AC49104DA902D583BD4C080809B3E15E45AA2D2355EA6B9C37098E7CA0A184BCF76EDAD5C964355FFF640A2BC4168A75AECF1F3827A6F42A4DB58EFB4E7272EEE5DF2FB8A30127792BD569C4184BA8F975C1F64A292A3AAB499A72E10B56B95ED213656DCB7655780DADB49042DF6BC1969E2E28C5606FE217905A3262A84A2CCFCBE9D20C04B2D7E02A55B85CA57D83903D731BBBE1F5BEBA2701291A1DD55477259D57B6F1F269FD9C4EAF928BB8980B7B +00E282F94961962B5B +234F5727780BAE29822659042D8D6613EFFB18EE39B934BAFC41DFA84AFCBA30EDED22FD7476A91F18322B512C540F97785B9DE4027B76BB9A84C78C698FD8BD83712D548A76DC5B93DCB1969CCC596AFC0C39A92C90A2659069B588A2FCFF114EAE7B20F13F7CFA9F906CC23469644496CE4AEF1CC4003894E2532F945EAAC767731FCF0F5F75A76DC8F2A1C43ECFE18EB240D004DC720E95C4C2DA1D2B7855B8DB1CBDF453698A84B7DC78A00C5BB339B700602CB79E204BAFD228C5424B2C632B48A6A9EB81338E6537798DA9EBCD4B584490C70A051C3D2C4D7096906D2558A985A4718945C6673CEEF9CBEA6BB73631338E37B7BAD0AE2CA65D077E8E7B +10A47E1DD29B3FD9 +00A7C553FEEA7E64CED4E60332A782868B301BD48C7D2AE20D270C5B236055984946313F07AD8FA6EBF6747389AD8892225150B0B1A92DC7CA5B256C9FEC006D83C9D8AC80FEEB46251EAE4B65E6071901D3147144FF0743F5B14018ADC1F4B81158400A17CCD137F77DF6256AE2B2F12AE4BE69003B43D4242D0F752CEE6A2E0EA6070FBCA6C71F85AFB6CD5A8E41B4788108580DB9F2A0522B629317F8CE06DE0D17A89BA49CEB9F199A81ABF7BCB59D376CA4EC3BBC6925420454DAE312EDF4503BE5C92E2029B3E00A6B893EF03DDC8C130E193EFA6AEB681221DE8C2AA93410FE3A6195C464D458160CBF97D6D6ECEC36FC6B9F44EE77DE3B9641A9F2A38B +00F00C4F6B1937EA5F +3A5F6383DF1544A912F5D38C298C242207341F8F074C2E46AFD781F89426188DE7BE6C2424EF4B96DCBEB9C59AAD9E5B8510F51B0807B8F4605ED8574129A31DB456A37BADA503C9B1DD62FBA801D065A93BA3E19341A850C150589DA4E45BE3210CCCEF603D441E2F4D357C230FCF36C6C8C133D3F2D4FF1606CCBA2A2C78A0E9BDBC50F3CD775BC20E05969FD1EEF85355700BCAAC05AD701D949949E8E0E6CC9357CAE08D6D00CAA664D3AEB41FEBA24EE5663F4C798637E9978B6426C4A0F48B73EF12638B5AAD391E527B66B76125EE81D02ADA44D303C6FED16AE8105B3BE35E11C53EA36BCBD4C21F3581C9F4ABFB0DEA62B944A694D119D4577BB2EF +00C29B8CD9F297E469 +13689224FB9CF7AB8A588E3581EE7AF1A3DF232EB2CA1BF5358CEA00A972270C7398059580D21709B80F5ED6C530D75B45D77CFCE847EC28D81A945FE7FF5026DFE55F7C68199E8EAC2191CFCF026BBD32470C1E37A23CA8FB41F899EDCE5B8D7DD249E094E82C9FD1EBCB6ADD16BE3E101BF63BAAAF359A00063D0BF05348D83A115583AE0416A654D55A3A513872E5C01BED90D5D74828E6F10A0A588C665373CB6F81273B824EAAB08E03EFC782CEEFF4C6E124FE6FAF17C39784F6BD4F06061AF75A82B7922F3FD08290C250480E05595459C1D6F16ECCB888D56E2381E5CC801DCE6B2A3959A66BE75245706B59C209E1EB3C1D1ECE14D6E8E62FAB07C3 +38B55949174C8A53 +3488423C80F20BDB3BCCA31F0F266A86EB519024597314C89483725A080130F8C2F911B072DB19F69B884E35AC0B7995AB4CC784FB81756B8CE42D9939F5A992A8F8B4C9FF6E20DB5D6E7303E2B350087D11F29B260FED52266DAE986BA9D5526D5CFC5829EA806D23C8C475A157B29146043B8721191D270D96BA98FC9659C82F702E5E6FFFB5A57996DAF9C32E2ACA5085D4388042194CFC8E559798F298FF0E7BE83D4E55266EC56329DB5E2F56BCC44CDA3CE488019397E8882313039147833596CDB2904C47495DE761C9414B8C6DA779B99801C39A35BBF463F40E8F4800C57ABE5267F2DA40BFBE26A81CC211B9188BCFBE389A4FA65227CE78C84C0F +450F0AA878BA66A3 +64B7EB08EB8251C4BD70FA7089798F357051EA208251E0A7D1353642CB6728EDD75989F3F39AC968F6E53E8A8B3E64B3B53C0D99D91AB36017A9E1EFC54AA459BEE3106E83839197779598EE62DA2B1DF15C53244EDCCBA8748E53E65868A221B211344420D43D4FFAB0922B0AB164D7E1039556743ED1F492C11892F966F65C0BCBCB71E6CB3D35CB9BF1E5B93DCF4119FC5DC5A93E6A7DF07AF528FC8AF657B302B8F1F99188F7E0B1643E062DBCC4B19E0B478EA65B51A041F9353EC7B5FF78D337EE4C132412EC263FCA57D3DA44587360FC45988D5DFA66982104AFC551C04668F9A6931895CF3530D477F9769B6778BCF4290E01CDF1E60BA4B4F083EB +00A8E057910E38F2C6 +192354F9A2EA59CA58CE6292786A66856EB3F9FBF857C2FA6F9D28AA4A0CB1982C697A97D5B131F6FA21649B23D2C27551DA82049A79073F0375972D6D5291B90BF0DE808E0CBC3263293096B571C085C44FDD434C4B1CFF79AB318CCAA8119C5E41EB995E24064A53326E0F064978EFF3C3524B7832AD9BBE81B714E83969D936608AD10A1C13C351C17445899AE04E53C17E6306C707EF7E028109E3B02D5B9F68529AB01EC284C0C0B198CAC1DF29E77C1934F2EFCA71BA0DF87687DF2BA20366C5DE042DA20F3D6BF14E1B8875EF1B7040176AEB118F98CDA8684C8B2E2639653C692CB1A848CCB79A47A8D822E411E44B7397183671EB2D7B5FE53E2E8E +0120575A877A8219 +00A4D450152146B948129507623AE7D2DAFCF230A5A6045E064BD8513A7AD2BD93A6EC09B36DE82013ECA8503E5E7F58415E3C450B66BA06F12B3D04F681C27047FF10510D49DCCA6A8414FCBCE7CF90CF3D0596435BE219642A536499512D087C01E1F6BDD1BB5D7B8C10B2241FCF2FDA6200DD328E8806F22B80ED693B7FE0F2624AE37E2E57078D96036F134B447A1AAF9BC0BBCD8226A8980B7993478D92D0DC7B4E2F4775D8A4522657D9FFED2E76C13D6ED654EC0B487A086415D77467829CDAA1E5159075A6AB39FDC7DE351EC09B2FDD7E36457F12EA20F3A5370E885F142573C43B2BB2FA06543E4BFE3BA8811C12676C599CE562DBAC1EACB199F784 +00F60C1D2958548BF2 +0C0B21A73627E63194F1FC14ED15B1830E9CE4041222FF3A923EC899DC0770F0410526339576DACBCFEAD57604E46BBB25CAE50348CDF396F795341C91AE80B47933CE4EEC09F8731C553DEE0FE635CA35B005347801E0D44919E938870F6BDBF03F5475E30882814EE27AB4C386793695C194FD5855B5E7EDCF2BDF38D0E8D1CEBC9EB26040749FB5C1A2BA4C7EE22631209C702311F6DA59BF3C5F595F55B89F0D402E58C8ED6BE3D9E6FACA5C5E2A1CFF42357BB2EBE7AFF03EBCE09617600A0525E0AB5160A9908E7E51D73C99D02FFF8C1EA58B11494366447F23CFBA14AE6A765E64D6FE08FE6943893860CE4474EFDD9857039F790270C51C44E22B78 +51835AB520F6AC21 +662F8D49159D221BCD70C65284C2076C00DD6A75BD93DF60140B04DD10905C7BA9ADD229A146FA213733B9B91544566B589E3E4DB01AAAA74382D520FBBB47A1EE02DF0938B05118D51F1E3F50F56168077CAFF73F18D9D6E86E943B1F641558CB4755758DDBC3D57D4DC00D0B0A16D2C85F7E319853F62E21AB83734B126B245D634FAFD6005D8894B49BFCA24C78CE86F5BAE15120F55327A53DE2D20BC14FCB6510A8CF9FA0674EF5C62C14216D41677D2B46A496F86C1F82905CC1C1F6507EC22B727F9057BC38687C972C70AD7B230AC6B23890CB88F67401A9CE9C27EC6CC3FFBDAECED1C33703E81B6E0FE99C2EB9D106622660DB2AF034FAE7B4DF23 +00AA2F7293F87EAB38 +2E83A9152DD5E8B0D88EFC49E8A70E9BF37A02E7F410D1517D45DFFECC7C7D52C5005F73221DA49A0014DD42FBDE43ECF6877F85040421F9B59006A03EE0D5EFF61D096FAE1F90EE8C2C4A1F71323DB69695FAA2F75159308CADCE1334E55E4EA06A837CA1CB3AD54EE5099880D1630A9459555E09B531AC43B20DB651B56F5D01DC77B1A732C521B4079D03F2E778A2AAF254DACC2252AFAC5881EA48C209D38F10F0333755BABF3AACF456EA0D35E549359EE8CFA83907B80A390A3C9BA74E1E6929E5E507F82C3381B64052D468B62570407F4BF0F5CD04971239F0352C4F7936D2D1B00B56C0385162D7F3B8AA70FDF681837A4F92BB278496365072D1B9 +29306A57442DD88D +7B7EEB5272CFD93ED7E973FF7D58D90B6C93279572088458E1DAEEC65126F0F9FDAA5B0B2881AD8270ED216D2FC7393532CE46218B460A1014C55F686D89B76A4B728110010B6277A107C401DD83116DFB37FB44CFC1B06FBF3762D17F51F8F04BA764DEDC260426592F9DA8E2137F63EE1A109350E979D37151E52C6F737DB5761242ACE767F54011FEC5097CABAF276DDF40F96EF8D1492B2C5728F0867931E03429402DF714C4A9B93C95C5012001FB999D3EF4EEB16D9FF4B1748B12F259A324A08FC01DD19FF1B88EDF783E04098D81F3300108BE81E668ED998137E09768365555700BCFDDCCBFA35D94A3E528B3D1ABB66B4FC87823BDC1B30FCE0C50 +00EEAF34BD4852FB2A +3B829D066C6FB7F8FDD3119ED62CACBFCDC981F738771267E77ED365C1C95C3BF9CCC8FB671398276CE0154E1597ABE414ED6324D44D748FBB8546D00ED58FC52A00DCC5074243DC1DA393EA993B1C7F9E2AEFE3E1648586BA82376487AAF1DD7E9B89D709619AA2869FA39FF0260741CA8F263DE7821E639FDE793A4E2A7D5F3A0C8693831B5D181C16A1F1991DA833BD69DBC5BC617981A499619C8B5C57FD5DC4DA187E490238F050ADA6DCD9D15C4FC4210B111DF9EF5F34EF03C0E05159879F3A7C23744FBADA32B0D6D9C8C0F236849E2CB9A4FFDD0F87D5904BEE6D2BCF1B88DBC2207F49AC83D12C996E0ED65A3B84E1B9144500E58C6D49A276C535 +61CCA16A41894332 +00A6748F204EE39979CA7CD0077548552E492433AFB5B9979619D4BDCFF33C212CC8842D72A3F8AADF18004B04539352DFE3F9DA72FEA57C19BC48A7FEAB877DC4EF6D13BD9BAA21067D01FFD8263784CFBB8D623F18FFECC64BCA9E0022EC85A05138B992FE18F82A56CABA0C599AF397454FDE7E3F3DE5D22A2F773FB4361535B40780B6061910D858DE8DC9E3EB43B2082F30235928BEB20326A9F1CFC9C1979034A0C425ADD258097F227B60EB7766AFF3ADE339B3D776445DD7B1AF8837BC415AEF0D0353C1ADDEB72920B7C8E93D198EB24377852C7398C0BC308CD4568B5A8F53B9F91A10D98D7D82C95CD54D3DEE687D7EF3B7CB04A4D84304D71AE621 +008851830BA90E7DE8 +2873BB5E18820F6C5906509F065D7CB3D86DCF6F0800B154E0FAF1FDF757141FB7764C2FF6BD5549D676AD3B60CC3FD01CDE75E46C9AFBA1977ECEE0B749958239F81150AE3A51A59B368DF3E5A4E22B0AFE4F55F61113D74E3A67F59E614D75180A4AD6AD9F96B8A11C8611B6A8449D22BEE1F3924CD87106B9C4B88FEFB132F4C040ED670F221F48CF21F6B14574C23AF160E4096C7BE405966562FF89409413B2F6B07169DA7DCBE84D0B564A80598A006A606A202435E734AEA60E958DFD74A94AF3FB71520EAD074BCE99CCB379D0C036A742A1DC49D1031458EAF45339DB3E28644B87FE170B935BA4BC19AB6FC8EA0CF7B012825FE8D81B566AF80947 +00A50194A876328061 +7F1F276140C3518FE4DB8F6C37CC3CFD3359EFA8B341799FC066D59295F5E39DCCAFC220AFE9AB7DB1E79E7AAA5E9C75793007690925BB7AD6ACF88A43B9D1D00F12819644C94DFBEBC339646413F648047C4DB47BCA05FA7B78D5828E35734EFD5CD9895258E12E31A43F2188818DB27904531606F3898FACD6DDA02ED2D2D93FF80312F85B2EA56090BFB37CE2EE080DC3B6594C63CE948E8CE35901A71F851D190DCDD239B57C191BC70DD137499A8910DE62D1C6E1FEE02149251E592CA201AD8E28BBE0187A9ECCA4D44232653B802F8D47B2C52A23270363232BA1F9DF99BA36B5E7EDB971BA6E252CDA9868499D372C3CF8C2F8CB1FF03A11204CF727 +00CF0C39A712DC627F +0CA30B9A171619CB850C844B5CA5E26F830B235F4B04FF21A101DC2D79F3146F1CBBB021F37AC7879E1C62CA19C8A106DCBCAD6619958716B21440C73B09DBD482B233D0876D060D546136621F82274E8A85951F08DE5BA8D6F7FF6392D5D4374CFD8CCA37957D54FE00F2E79252C5879DD834881B36EC8B1218A295CB219E053BEF3D895A5AC833B86F97571ED993E9D19085FB2DDBE6047719CF5D6660AA0C3FA87F5CD22A47B6195A887DDCF8AD2448AA81869DEF0CABDB9936C6C15BB28309BDE43D628550162F6D206C834E2A8D5D17B221B86658D5C81589947ADD4B992275F82954D43AEA5303F69229A45D3EFC169CB465C4579D80F6C8D65C5DB33D +58E2A9DC0572B1F1 +3F1C821626DC798B576A4B4A6233EC55B589A34C2F98641715AC210B2122575B8C0A812713098B0E92E0AD3FEA6F33F0A3AF6712C488E007ED0B68ABFA50A2170034E3405D23F8AE7F5FD02507309884251223E4A75BB301704069D6BAA64FE73DE17F299E10BC04C66EF2D87A398C5EBF501CDDDAEA0DB22FD6ECF2DA72F6A7834C97C45C344181FB8C412FA9A011FB9BD8C77EBF61FFE9D8333AC9F1141EB4B7BD70C70FB4665766653AA3048F05BD83777E14233A68B84B216E3C047C845F48FA671C994E04279C7294E005A4EF378F416ED9970D0D52EAF0A5B7C37590E09D089DE6801E762BDC72276BC72DB11EB0C9200477FED298DA1D2A787E6F9A84 +5208E4F18DF1377E +3513A0EC4173F439A3B8DFE402AEDE3EF1E35E409566D6EF18DF8BEA05D4F3F56CC8A629B5D50048FD466FCE30C5FCE1E8BCF8EFB5CB434121DA565CD4C046D57E552D52FF13AE1A5761FD737DD15324AB6479880EC86F2D620A28D4918D5EE1CDCF17FB920F88986C0CD1448278E25F0506B0AC31BC064F1956D95305D75157904A8DAB5773AC73B1E5D12CC0A919FFFEE56A97C810F0C1BF3A2A815F21F82FEEA595588F0B65D506FBA8D5C9DB412D7A368BCF013DA50D2AD6B1C14DBBE4C873CD943147976EBEDA71D7BD4BAE5BFBD13017EDE53BF03B37A5AAA600705C2CE9DA70822E5E518CEC712A9B1EEE0A65FAEBD79B514AEEF6625A3AAEB79A744D +00A85D434DB391FF7C +3E74298D86E06E869FB99A7B9409F66AB89E3F07C9313AFD8220A650E8C0EFCCD0F6505D2FB1D71FAE5EFB9FF0202CB02EDC1DB112FDE771F73B4235096E61AA57732B0674A6BA3E4E516A9C63F121FD9BA50BE55B0ABDF63E2F2C0563603FF876670F751AB289BD798DA5DC7FC3F930FCFFC405B427D31E5487116C82A3CD20288A6B8DA6882BCE9A63C072EA37353711218D590A050F73BA27B7B5E4036F9899969D4FCD6288E521E605B24E9660F28D59AC24A196A18B210CB0863DCFED533D3AFC3A1AFEE08BFEEDD9D7DC131B84E79D258C612FD639F10C0187DFC703CDA11EF09FD00B133F159339442C5FD21F072629671E8506992B0A28E64C17164E +553CEFAA798C64D5 +0AD063F732366729366E4E2DD743EFFF48F63F0F34A26AB960212A994874F3447A5457F9D6833FCDD9704926079E3E62A2AF86C5AABD39A752171BD3F63B605BC295D3E5941453E6099DAD0BB5E42EA0B5D08995A57EB7029F79EA49DD4E9F8E822AC3CD697A5AE7E3D028E97DC06E690FDE58EEAF565163EA8FC292630DB67B7C21A89246589A714881F281B88F5D4315F05399F1A4C65296C26E936447DD21B6BD969AD3AF3E62291E26DD9628C0B10E0BBF073811C698D6E169C1D8EB30B443C602A3CD2FADE7A29B8BC33CABC1C10DB1EF611154F8930337AEF30D2F5C75D0C8DA85B4E89D6B83175D8F100D7AA627C0575E1685CB63232F90765B967197 +00FF5A567322193A56 +009D2B213FF78A45839583E309015CEDF6FD3C13EDAC3FD8990063F51300ABEA02C0132F2E3E4AC00C409FD66FEC1B248E81678F64C8E2520495452CF33B5E480772847EAB5D1EFCCAAD6FEB09035C524323ADB3C42564129C3B43498B2543142235FFE8047C063F80B23FC82F2BD6F3505676EBE0B5DB29BB2C7EC2E8F8D1A963493C016AA3EB787430AF46388B7D335EDFCC1D5CBFEC40C894570967EB8A57F46EA2AC0C520858F6D3D8D716C52A0BC18BE5EF6DB49C6AC1CEC42FA1B0D363F2DAFC24D50CA0208DA4C91ED551082BF477AF85548A16CC46EE9DD205FE94B153EB953B300B7504DC39EF25512A726F06EBD7B32B5A60517C0BAB8FA252B350C2 +00CC11CF9808BD5869 +42278AE7EF19247E11195BAE2810F6C0D74062830295C6E45C5572F2654047A2FD035B8D36241464DD0A8FEB65BA49FCEED7DCFC324CA96C60FFEEC851E7F73C343AE01EA88A1C028E75AB54C0070DF6F6CAACCD66386D0F76FB6C4DDFD90A62532BA7CD48C95FFFE184ED4066CE9F8F3DAFA4482F8441C98F96303DFEB4458ADA1669E62984FBA145AF0F86FCBB6E3F841BBB781733877A0AA0A5FD235E4C8BA8E77298243D10173231ACAEC23FE3859F17162077D9D31A58A1773C43C322DC9066A0ED9B9DE44EA61E50494EB1C9607C30F8F5D60F418E1712ACD305280A7F08322E6E95290C9255C0FDB068744D6938EEF71E8BFA48001D73635D03B47E5E +00B3F872D7DD8A1716 +496FD744F966343E23A13C4B852B585EF310962F1185A9E96AFF8EE7C807DED9F9BC9D7FFD9D7856F704CA1390FDA20A3E226316DEF8351E62F7359DC3382A31F270CF16E2C212DDBDC743467CCDB1D09E44F7D85B05A495AE103B3B071D29926F06F96A3CD4DF8476E018FB152949A5D163EFB02C6C76F75A236B24A86D6091BC51F7617265A221A1910ED1B65CF476726C57DB6F09A272227531342B8D179D54A818260641CC00CAEBCBEA478B8580202C354F2FB72B637E731622F42A4C736DD0335ECD8C3BC3860E6CBF0C2BD650BDF4FC195677724A777089DE228880C0F951725EB7002F70B5941581B0705ECE9D0230F212A4124147761FD8BDFED55D +00C775AF169BF74F4B +5D701331E22C37BF654DAE27FF09D5493A75B7154D294B8F8A684DD1A134F3B340AB6E3596BEF533EB533391303F2F729F961F64FDB975919B2E940A4B6917C405D1AC8E43246595BEE1BBC55D138111FDD13E3AA2011C56DB74E67AB17092DB93300CC328B225A2ADACDCD83307376DD2BBF432FD5E5687E6B78EABCA50FB5221123E6C1891679EDFFB105B0C3EEAF9E782A2EBA97FD38560D289A24E3D45899E7DD8B0A4316C2A63AC5D5A59EDF77EF44E708CF6BC088E88FFD2FE4A7D7869982B262A98BDB633A2971AFA466F34671845B88FCC00E6D0FCB3FABF6C49539AE02E0A22B484799E960266C055AA8DA63C85C504D5E0EC27B57A9B0C85AEF212 +356E6D733A3254C0 +2BEBDCBDA91625E0FCB0F074BDB9EFEC93B164B52B1FDF5567930A9D08C5076424F85D390C0E8891297C4701D670EA6C1704E7FDD9768E085823682894A506E48EF2340D429AA49A3EDEBFA1674FBB5FB1D4707B8EAB2965F3A92E8F6D9680FD9BC471D84BA20E1B9BA666E2743238089897C998B5740C5223E521933BDAD41EB366F093956C9B979C7572C82297CFC285A0BE6CEDD036E50D7197327E9701EB83A0482EACA62E0BD6BF2A6E3B08E54E235A2B1103A4C7CD2E35654C332D7A2E6EAA0D33FC583053F7437810B7F50E9C4CBBBB612735D619921E44237D13F1B6A05D4EE526A68FCC51D5A51865B205DB5D375DEBAF199F43B0B0CAD2D360CD1C +0092EEA48A1BA9914E +4AC85CDCDDC73193097695A6B837E50420CC3C0C7F6E1F912120A86171915969FEF805D6EE4883BA79EA307FDCE8AF5131A5F20F3E2CA265CC667DA8D47865BEAEFC7E34EE18E0FA6FBAAF53DC803DFE3EBFE4D74AC0A8A8B5A0D9F30A9390C6B915E2FE6243B48BAF106EB6B93A7393EB9D3D95857F080BF4430980732C5999BC89FFE6AF2F1B84CBCC6D8477327112340DA55BBBEDA69100DCDE40D58BC5E5B7F8DF587A29D58723FA6CF0CAA06776F5B3FF7F22687138F485DC163262FA2DCB5987FD26398B7D8AB1F86C4C8BFDC7F5B2BA377DF9ED4EA1F5D469043BB818FA0A3854087DBE4A58256565A91A105BC5BF02ECBAEB06D394624968282860DE +00B18161B214D431E2 +11C94C127D9BCE60F7117DA4861218E5AC6D9599503CFE98A81496D6BF6558330BCA66D6DF2DC6ED89AD719C4E79B1C309A84A538A516BACA1DE3135A98DA9001D13E408F02631BB82506066B52A7DE18D8A7B414C1170B71C63F4A95198DB77AC4DCEA413CBBDEAAEFF9B09005DBF55C69349C83130CD15FE0AF12FFDE3D5EA3E2857D7306A91C33A29CFCC312000D8B139B1897F23DCB59042364A6082BDFB98D23734273E37224501FEEB4C60BC4801C4EA89993C63588A8E61E1A3D19D782B1A86B9D68586F4C06052E1763F9D5E53D1F222E68826AB98EEE84D1065E3EF007BE631D57698DA748512D1A3B7ACCEFFD53F28AEC7C62728FAAF6440268C5D +1E89B1DD39065CD6 +35A6A2A1B7786144AA85B03E300C26ED371D300CDECA79E5DC0D63A3F76CF92B5CAC71286FD9934EE818CE5A56FF8BED038BA08120E4BCD1E77F891533079BDE69B68A1AAC063AF334589617C56ADA0A6E822DD1D6A810779C947DE1DF292EE1E6147307C5A54904297ADF2CAA1FF886AACD76C36782AE2FB3D15B1B5ADC56F71C54E8C9245613CF3F7E8B9EF4FC75484334DF5FDDB5E901B991D4AA8E20AAFAD26A29080A8F13928C6954D774274C383F9A92389742934700E0328D28B9320469F54E2D5186AA6BFA61BD49108D76F99D2AB8B00565840BC7C8E3B07122B0144B6A17A25514E23AA9F36F0D104B847C4A4C80B05E524B7690EB2B206CC7A72A +00A0F31C306E48EA18 +009D63230B260D78606229CA1E998ED6EA2F451A9F77521DE2490AE2B97B1F98FACE66027594410848C0679634B476FC6DEA909E7571CD28BF13065B7BB31EB4D906631FFBB55F6DD7BCC49FF1BE10430D5E3AAE1AEA44714020D4A81E2671F95216CE43CC0A3A6B80E2F89B8D2526ABCA98D4764B33916206CD2F738EA9ED7E08F00DFCE4BAD8FAECBF61A59993922739F41BE4352E5490BC7A781B073521BCA44EC7A823CBEACEB8390CF37AEFB0065DCDF583B20318EBE6182FBB7E58C5E4615693C4786F2E3C86F5C1C387E10EF2904A09D59576E5D758C5D8C5909CF3B9B512B09FAE638FDCB4279FA208283427754C3BCC43BEBF8CD8478F2350024629BC +33E7B82F9DD2D0F7 +009E1A862BE958C6D6535F63160CA176682B60567571903F29F1DA7DF3DBF16A17BE4B52279F66B899B2EB4838110A2A501461630596B32E6CD3BD3CAB067F0C47A1483646133A78B4CE1189D3534868FF8102F73A43FE063CA1E8E78F72FDC75E3F86406ECB97DB07BBFC079FB3E4B30DCC4DE105D08C856651D2658E07123FB9F03BD1CB2680B022B1B6CAFE593E0C997E9E03F3331B2C18111FE10F77406AF17E9F586128B3241F05D7A56B00D6B8C8FC126A24CB0D1B5B56B2F2A83E00C8BAC62A3C9868C5F20A03BE55C77F8D75EB9D93724D16980EE95A627E50F6F3433C8D8BE064608E268A08ECAD9DF87BC6846CCE6EF4456FDBAD998647347477EF9F +02E6900111E329ED +79C89463CF52144008E4DC4C16636A0952A2E1B9401C4864BF279D3D5C08FED2E3CA02CAAEB1A47AA13033809128CC87F528CEB53BA561782A0544C2D0E423720148C2819D4602F85D1EB65B6CC790B3CE720CD97BFF1E4679A7037B2B269E37C2822FC26F98DCF6798E865799433D85ACED54D0B764A22B10F92C56362DF88BEA7C56FAA76E70B09B351FCB2E636F308560A6B244B969F09A1718C664C003B4895AEBC31DD17150DBD19F196711497D7D8E75A2D04F94632A8BB8A9E7252D832AC24BFA3E90C8D06556E42D692E9245A7EC3A8BDB5EA5C02157B86F6DD56574A4966063997464F28EFE4F94FCD78089C36F68AADD90CC7BF1A9BF9AC0AC798A +00CCCA047C9F4DAD14 +08E15CB7B0BD8D48114F4944AE2B4BCCFA6C617C23CAB864FA620D819A46F9CD48DE17D0F115AAFB164DAD5A30AD9B1F22CD263541BA04FF250F676D11A37ED5F8369B6156219591548B4AC03FED51F0FB628DCE8361BA258F4D82181386324AC3A0509AE530B08D314FB5828AC730579E86CBA4153F783B73BA86D434CECE7C1FA67B4401F1BA99D2399754B7796AE8B7AE338A346E0A74E0F28C8915D4363BDDE1AA3B82E6647C88A301C6B53C4D989436CF707F89933FD7571330A59DA1615E99948F8BDD5CFD4431866297426C1D46894F961F7371E14F4028FD7D9236FC8090FC0CAD22C9B1BE53EE5EB94756EC743C19F6263C8B063CA3C62F9A1DF977 +00BC7DAC7918ED828A +1C80CE97F6992D49B512F67512B0F6DBBAD2538177949D010CD1D6CA40F3F92268EC61627FA58D6B52E4DCCD4DD4364B0A00ADD45FFAC1CD779B7EAE9849AB9645434CC7E51A73613309BD7276A14C1548BA5DDD7F037CD13E9D41B78A760977FA427B7A02B8B28CCB6619EE461096EAB90096E1171E75A785C71AE0EA28F598B0C9C6E698F6BFB3AD361A29A9D7F29189E4167323CF3AD8CEA670BFA96B86120BCABF88750F1B84CEB4B9857514574DB07508DD172E90272336281B2678C663C67BE19B29E7EE53E3B7FD9574ABD35A34650F47CEA8186E1C2DBB3046723AFFF130485C7AABE6920390579F91FCB6E325B6CFE2EEE2188542271711104A0A9B +0DE5F5C7FD1797E7 +00A883EF72CA5CA6709E83FCAA1160088E0268610CCB31E6B1916B38BE573F8CBFAA0710BF2354A256D7E9D4DD05C40FDB07EC7E454AEB755F5C4E0702336FD63AFD66B706E35B32D81DF248A8052689D1971277F0209293D51B9D61F27C0696C623A8C97AB3A40E40D775F96706C50F0CDDA8AC12D944049A7CB465372D8DE91C8AF328CE52FC3AF291136DC1E43A2BFF4477AACA4A5F8D5FCB77143F1A43BCA88DBDE3B5F952BFD9EEBF87FF8320317FFF1D15356FE913FC488CFA13F19381AA326B5BB0CB7E16A9D21B46973303EBB7AEEF35128F168293D3CF786B9ADB49091FA2591FA3611C5DF8F22FEF2350F0A1601F4563099B62CF65A6D3B13E466577 +4D39B7A212D0B342 +239A80CDDEF6E9FD2C9C835483713BFFF700DFBB42065BB4EB3DD60262610BA92B1607E1D6A08F4F4ACC3F293561B413CDA2205CE4CECAA609DEBABB487195BAE0910A622FCD5ECE10FE0A38D83A85A7B2BF2398F6FB1DAA8D2116FD357A276A5C320ABEA88AE30B3D09988595D37B1A33224EA676C5F4E51184DA72794D00A82B43F8EB9A9007C7F853623944AF7C4696330632072ED39DE483326344471939406BC7D25152E47DB3BE5653B51F8E2E927AF41E5B7113B2479C834D4C060AB4267B2B0CABA3CA4704F40FFD07B05D87BDB09807F8A533E681DADF9185F23E27FB5A6DF1A462A286B33022FECB8CC6D3B8C859979B2B0F8D1B6FBBAA9CB74BB3 +5F561CEF4DC5F9CD +0087594C8FAF2855E726F8F3C258038474D9179A2AED4D35131DFD77E1C10C2C2A037DD8DC3A032B4F2893E3309D5579CCAEE5E4C67FEDD1CAF80CDDBA05521199FDD61A4AB98D7C3AD3A0826D84FF09CD03C05E09AC73A0C48ADB5B071212AC1A4AFA128DE58521E6C680E8EC2964EB4672E6FAD1E64D960EE50E74A650482F35B44AC171D1EE53CA89A3F401B9AA18F3B3D5629DAD9C1D922B7E715FCEDE524D35911F1E949FC96AD2323B34646BFC35AD89021B748F2E6C06E670012CF50B0A8C3F62004BCCCD6EE834FEEB23497D60B6A6959AD3A6DE4474553F7A2CD9FA78705D99AB03093D78673ABEB7419007B3EF193B408CC7A3E2E057A509D1ABE9FC +10D818E1B3BA43F4 +0964007BD9A80DD64B4523E409D6D355EECA71E33AABAE9A61820F57EF8A903436D4BE21CC81748F605FEEE80FA3DE4BDE736A1FDC35272E80CAE7CAC7350C41217DEAD1B68130305D9D636BD65609108F762C9187C9D5275A783DBFE4A8D475AA48354F8441939B809827653B582F48B801ABF80F83ED5EAFAF191572FC28599D178185B89E14F0C298C1711445D89FBD9D43F2B3E4D065EFFCF984E7A82C28A35C5690F76365E7EA362935C8FA6220EB52E7463FA2DBA127CFF636A118A56C7C0C5F5BAA0FF956D2EF0920FFC95AAB7EB44F1DE1653C14D51EA8FB0BDF2C531E08539693B6088D59A0349A77BFD8F7DD6909CE10BA969459944521DACCDA1F +00C0E4500C0613C1F8 +0082E03DB22107DC4E377681FAFC4A076B728F3B06BAB63BBFD75468C2162FBDDF5C8CF5127B680AE45BDB594689917221356745BBB34136D34277B3F43FBD7B0EBBF668B9DE130FABF4A13B6A44C4E09692DC396EC9AA9AD3ADC300A4F683C19F7CAD40E5BEDE380F182AB31AFE3E8D03DA32DE1CE84FC3B44E457015A6C81017B9F16AF12361B74CB44DA9D6B283D0854B85086CCB18CA13E96BC9D6FF58CD2B2FA291564F83EC72A36512F076BC6AABC80B1D3D2AEF73F892FB35A5B87B717873F17227525D3C3A3A93B5A97B09131D218FB7756BC8B2E9B1D059FFEABC5DC71C45ECDFB32DAF19A9993593CE4146E79564056E120A515C974A9C4508928451 +5020FB0A59241839 +00946C596CAA3E50DA645356043A5FEC1C9A381414FC2D29D0BA381058CE4284D08A2AA32EB7AE94DE4A55712986DF7A2DFEC7913EDB1FF1528BD266A235AB65A7B2EE80140B7B8D33FB86845A712E5FF04488EDF73CFA8FC9536F182941C00B4E15BD0B88E2E09837C635935E9BA644F3A9288A2A89E5414D2537DF00E8A7846CF0001A02D559A635E4BEF9121A5AFFFA33204394712F3B034F06FBC962BD8B7365B4A874E542F115079E8FE03B4703DBB9F977E08290C963057A4209CC2B3EDD9A3A75BF0AFEF9BCE0D72265B26ECAC2AE9280BBFCE3240146A80432CAC1B724F0B33987E0FFE42E73AC4FDA0677A018863A47E22B803F68811BC4F33393025C +030F9F6C010C12C7 +5799DFB4F300B46DE542438BD9FBE9F801520B2BD0ECF1EC31EFE99BAA49DDFFD5863FB3B00C3FE39D8CE0276C3276C0A18109588CD03DB939B98F690A86FA1C53789DFC0C5FFC6C9ECD2CB80AA4A51F086A11B9B9B45FFF8BA102D45738F724AC4A168D537DC659FB737A02A1E4B15DBACF90303973E52B17986DF7C7647ED057A6FCC3078CBAB9397A6560B1B951AEF5E9E972619992A43A52E6E2DCFD8BFF91A0485AF7865FE6CCB44127CFF7C68786FC56F31A24F032FD19FF907F569C7E7FC985C048514399EE80D75D94AA5223AC9946E316A7709F0D497FC44302A8C1B62C7555616AAFE280D6D9717FC050C9A2F4F01694E95678C64DDBCC8F140175 +471398C862C39B91 +048CC5A233EF64C46924DD798F75786551DD688CD9C35BA0824B60AD3B2F17A7E80CC1E16920C59BAA4FEC160A1D0883AEE5241047132FD1C61D3D859231245EB395282CEDDB86CB89C542461D5356A5566CA344AF82A076DF56CDC9AF842F1AA50E120A6A4E241EEDD627876E155F1BBDD1D837CECD8133F48C4F431A112580DF81C152906766AAADC30BEE123546D4FC32EFB4FB8A83B9511502C897090A92E9C344C0E94878CF14A9A9687F770EA76A7DA145EC192553A07A9BB62EB8CBF1F76BA74A49B0EF66F5529F67167AEDB1D25F608D13648D682A60F9F3ED3A032F83B93DE0A4BFD8C5ACF077950403895D7D62BD521819789ADA726A69E0C99842 +69A45AD631E9BF54 +00A3EF0E8D2C4BC617024179FCAC2BEE08A2F1310A6E7F6A61EC7E4D436DA54A62D86562141D51568A058B2E42E3E3BE9BCCC830A7F498E10438F7279321C76FB24445A3FF2FCEB096CAC67DC707353ECD0EE4CEBDEAACAFD2EBA0CF17A7584C74F235836EB43A220C7373CF00DB51A2EA9827AFB78D0BD06C8D86E7E07355A9807DBAED7D8768A5630DC992E2250F9892AB5C1B7FB0F9BCEE50D358C95FC19A1AFEC696BA4960310EAFACC835D2C141FCC90256C02A7CB8BBD1AF4F4BC6EC76B1A593944A619056F9901F4A30A31360C0A9B28990E32B7E8CF8A41C198A416A4497F528DB9D8210F72089AC8D939D125A53BF8EAFFE699C66AA80359250C22072 +6CA8485282E388BE +009779CACFBC4C9E8545A4DEFA2AFF22646C392D50DD2EAF45F969EDC8F0DF140C7DFC3212DD791CD8E9C8BE2FCCDB89A7ACBE83760A5E797F0DB74A78733B3E0143A64AB87639B4C93E917B0A64DBDD012BF0AA21CAB9D4CD480176D39079F022F0494028DA5D82E77B75FD33C4FF53B6B5C4A1D926F13CC3D590BEAEF1E8238C48B66C82EB51C7471F398E700161D10E9295642FF5C1D7EEACFC346C085CDDEF460D27E3849FC8407581482DBD808614BC4FF934728E246E4A3FF20E2BCE66678CF5A3EE08E20309C7EE31D4B1EF569E600D7A2E8562FE54DD1F734DC316BEA0EB8E0BE8EB0A1E82D3DA89F0692F90B18242EDE2F5C5F339DAFBAD083A84F3DD +27BF7659A6ABD124 +17A3ED0620A389072BB96DB60749161C0AB18A489EE7B40FA6F5A3E7348301598260CEDD8FE66ACD5019BEF84D4659319E3D8271DF94558963F438104C1E751B753F8A4EF1AABBB0CE137962236000FF1ABB9586B35957C5A3137D3F68D4D10C99C135212F2502F4375B713A0F8C6534FD43A79CCF9B6FC71F34BB04120B7FF6C91A8B9D6543F7E60B92B2734887108E23757839C177DC0AF1FACD08F3739BAAA573E72DBDA469E21DD53C2C0EE97191F633866AA42D57EA574EEA719718AF203306661B5F1B344AF9E06FC4CD6D1AD3ABE1E37C98074C27FC9639FAA168DB2B39C358FB0326A73F2F70E074FADA733F4AC6DBBB9A80792649DB7405D89AF4B5 +0080F4813D48058DA3 +00943F950139A4E29AF2AF49530ABEA694669B5472F0A6B237387C0B05BCD05F4C79CAC81D4B933A096C5038AD56ABD03E9092599F2AB270BAFF7DE39F1241F5A7CE92DE7F4E27D9EFA755906F173F2544E11680C9C55B9E35255B15ED3560D4DAF3445F6F9F36CE7CD874D4356F766228EE4BA08BC9BE18678082891871DA2F0A05A911350126FEA50B9C2657865629D9730490241166024669C182D1CEA0B900B50AB7B875AF7EF2C7F77C57069C6014639A05334BBE30F62E11190E6809726C1D4D0E1EC31447E62501143C9B12DDE1C5C211270996981E448EE70E02994B0AF0E0572D6824ABB80642404149A548294834F56B977DA955175DD69EF282888E +00C3DF180E243A52E7 +630CD895448AF380DCD6DA40155F158C673D980FAFCD3EEA7AE81D3C1849E6687B9BCF80E71BF1D7B59CA4541B6F01E2B3EAF3A02B85877956C04BB33D1599F98044BE0CAA9640140A6E39A97102885ACB986C74DDEBCFFCAC626DBBD747139429C79E502B595A5216E5989944FC15F4C12AB1AC5ECFA3B8C601ECCB432CF79D14D4E442BF1D54F86F0D6CECBF7DFE1F3CCD69EC8FA4D90FB4A0D07A5CA5F5C739ED78B4B6B055EA63F04029BC6EA99277F51F0727F2F56B4F5B74A6F6C2FA954F7FC03F866F05E9E7FF146B5ED8A094182F28E78820187ED066F59A35E1D3493435D909609CCE2F81CDE806175198FD178126EFADA99DF16B99EC45B8959DBF +00C5936B80DCE0C75C +20A780874CF7890EB785B2CC3CF8170F873E617F6131EDABE2AD6F01B3303E6EC3D84D150FEE64DC9165B1007AB849E9F125BEDF9F37F841477473D5385A83597626BF5E99BA3FC5367D1E87771DFC88066EB6C27187E7C2E71B8108D7E3EF98AB414D9816585D5BD732ECCA7E5C2BA0695E2845111AD7F7DA48058349CD0A23344AE212C9459F11A8B609B9B86DF79B979A24321BF761D3CA8C90DAD08BDE509AD418964D91F8F26CE35BA6637634ED5E3C3C6A2DA9A56E95E51BA896B453BBC3E1BD9B64666E950D56BA87B49EFBDF0EF8AE3ABF4A8CD04583135BB2B5B3E1B4590371019EFA55E06BAF92993F5116F99E5DC907BF98DF01AC057FE3EA5CB0 +009AC7BAE7A9438DB6 +2FFF8F12005D90A28F896EF3C4E0CB8E6B03698555A90B84938D9B5AE85989832C76E2E666D13B0892E925DABE27C048B156D3A1077177543EBA2C6BE32AF4CB62DCF576C42756A540D226741BC84EA687BFF189E895080302A2F25849159CFA3F581C1263C7B8B7B7C4BCB8BAB20EB51C59539A5134CA467DA303D175EB7455948AFC9929FF9357057A1F6EB89C0334288AFE3710A27AE147095B625D1F42F1C65D98BAAE483605DCCD7A934AC94C6427B9EEF328F70558514F17E73ACBC7F17B416D174412545D5415ADFB4A05A0437C6B81F1562CC8C7BB4A96F9CEC17F3733038F26C7B16872622C5533802E67C2418F9118FF435AC25DEAB203E4461497 +00D76EA83A7DD2E002 +139720CE6BEDAFFE9141B5D272B199C4F27B0A12773ABEB1232715437570AC8DB7091774ABCF87E50338B437C9C43F1B9CF8FEE1A6AD23283A87E144C9B7357B1BE9A3FF95B7057384545930CAD3CB6C5A31F060F6A4F499502C2FF60C7C8ECAE53E08BACB82BF98DA0CD1D31E883F7FAB2D52147C9A28D0AB0579AD8DF95BFFBA915C06AC2D2B4B81FECC611409EA5BA79745515A5CCC49B2AFB17AC6962A497B36A577C924B3881112C9A2EBBC1C7A3DC8DC0D6B489F27A0EE74BF94A7ECBE1D365A2F82FFC4938A8E86381835426DC9EDA11C86C7A93EB2D880AD2A02164AC9DE318CD83F737202CA38B6901C728102AEE8BD0CC78DB71FC9D476911F0380 +1F7FACE8C4D865A8 +42CD5E2418534ED4C3123E9BCEC3B5D7D7F87C36240331490E30E79AF1337C1655C4C94AAC8BCBF707BA784313C6058B7E8FA7CF8F87FBB4C0B4FE3ABCEAB296CDC096B0EFF083ACEF3359C035CAB40554168B27F9AEC9E6D43C2BABA82B4AC9D0A46728175CDA00C8CE7A59173A0A274A1AB95A51460B7F5CBF31A192F333CC3F67B7A3CC66CAEF3890E1F0E0413E2B53370BE0C69108D802570C27ADA962304BAA848F9DE6FCE174C0C8DB3D2C0625D104A204B9E9EBA9FF8DEBB5A35340F0F74519617FADC41F0B05DD68AF65506EB3FC80ED284B56D303035F146CAEE682F081DE868FF6FE373EF98747D9804EC22DDF4D0C584932EFB53E2869C173096C +3A627C7E74056449 +4AEF56DAEE548B2926CBEE1738CD883D9E4625E15E601EF9FC99D2127C786ADF102B7659B2AC2E9B0E37D3261697F9209E7934891E5688C20B1B899E5A82A3FD090845478271A5C5285A539F01842B09F551851E83BE9BACB3E423B23710EACA85A79C9B5B5AE0DBF239E3DAFEC8CF7B6947035773685A6BFCA534620E9E77C04FD2C64C76B3C976EE3EF125763CC099F9A01BCA41D3FCFF67FF06CB716DE3A24B0D7E102D4BD33878908E86EB401915A3A80A381BA2458690836A2DA03D9F1F195CCDF2D7A614339F0C203F4F1A81277822117090B7660B61B9F8E001E2D468302EC57DE7E9A663E1996246A0A34E765A976D54D31CCE868D9567858A6458EE +00A216589C9FAA0514 +2588A353606578FEF37A478063AC7DBA627EDFF24A561C5D1C2E3F3C1ECDBBB69A5171982092C73157FB1E97E645D310AF8EEA0378CB3620F186CDB4137EED68A03A48DBB0E65C9D96C46D867914C123E45C19F6224913763BE2C6930B3162B065B9CC7D1356DDD83530CD91E54A333A3D74439212AACA72926FF8F4F186F5EC7A0A82A2097C545D43CB69754F67C83CB7DDE26FB621AC8A4FE63FCA104AF688B5DE956FC9D02F949897CB1097B8EAF2DA59D3AF6DDC248CC022FD60439CFD5D1B71D6ABCC8ED0095B6E096C1F0145E7E0261B0C345FEFD72E04E6C9DFE0BCA949BEE415B0BCC5BA30965DC10A8A479237749B916401C2F021D533C9EDA2A21A +009E06E749553B72C0 +6AB96BDB42134AD08B65E2486D3376BB9EBCBFEE2652673AF294AAE9A42354F4C1E982ECA6EBB68AD8FA020BA6576C68DCCA9C06C5D010F33C963BC45B620B0900A906C94AB8C49C04D05C732A92CF54D59CC8CCE259C9017626CC01D8915F38C228D72817FF8C2131CAA05A598D18D501AE3920CF2A5392E9547E5C20A01B126626267744B36E85041972640C74C1793737C174F0FF0622960B946BB9A06D39206E42E3DFC11F1AB18FED4295A6D875830CBAB6C5A9F9FA76A46A9982FCC93D329482EE5457C540973EC8D516730F359B002B8C10CFDC05555F767DABD65943EED4107A75C0F24A7D39071182CC13F7E4A50263B32CEDA4B9F111EA70AF4D25 +5C2CFEC942147595 +3EDB2DDDF979728FA3AD1AB72A3762E58781A2519E3D570A43CDFDDEFD6B58AF9CB0363969B7A480797B5D836BD26B247C2603611287AB58FB4CBE9661E4C567A9C313F5F462F0DC13CD4BEC66ADECBCF38420CEEFE48124400BD4D9572DE7DBC5A8DA7B3ED1CF9DF712244A1F6FAB792248B76B9297B8C48DD89E0727225B4F03A06FAC8D91B6156A25C5E394718E9487FB8305E7B0BAE5B8D57F6154512D3559B744AFCF15D756AE01E515D5C60B7FF3292D04EC686D25E54623C2E689358D87AD5350902F1C01DADA4CB96242C409EFF6A3B5AAC92439BB04D0976B1FF399763429FC861F3CBCF45B69BCD484E49A21D66D3573985AFFCACEAC357C73D658 +6FCC5343AE3F850A +1762A018FFE11BA29A40AC22FDBC8EDB9FD4A725BECCF8ACE7F22E0A19AF3036F1814AEED625D202B19C0D5AC379AF481EDBE694DFAC236336270EABF08999F55C755A6613DC14440CEE14DD8EE95337AE550DA22E63C22C4DD8FEF5BBA28AE9F1CB135E385C12A7515C2FDEA3C41D20F344B17A4D1DC455E6FFF648B1B71D99BC39C528AC78C93E970D3626EDB3161C67D7ECC2F0B8231EB500614FF0656D796ACE31992E06B7054FA5FA4BF560F7F9A72C40FC32246850417090745BB63E4B9B7EA79C2CC606AFBF19489B92E40CAA0BBB3DC6FFF02F53F50840C6E937375AD1A4FEA247DD6DF4DEDD6BDB09CC631094D01CB198058A7F7F7D2F4A39B32F25 +00A750BF9E39EEC560 +00892B204864E18FE3FA0CF1D42D4B464A7CF2294DFA1386746EC2D9CE6F55D969DD9E6F38C9A32CD107ADD4BD8B7026B9FFDA4B7B32417B7B09A8EA9DCEA68E518D15D2BE65A231C6786C023807CB95EBDA663628F85E7BC497376A7B1859431091AFB3D2F1949A15BE6A70CEFBB3CFD8516E5301F948504855FBC7266CD48E2EEDB9996557D9067CA62FDD2F7E90B9FE549EF020EF73B713888FD2DCA9FA61B34137C88DDE7B1BA565C72AC7E8BA68AFA4EDB7E919C9B369B0F98D9B142566BBE08037E323ED4F2D172CC211BDBF6CBA2F16AE08B40D4AEA460714FA54AD4C8CC39D83F4DE7B41A177277A6B67309B67EA410CEC2A5CA2F587C5ABBB731B79AB +008DC33238266E0B58 +39C1C56423DBD6C2C9876A98D6912282B92856B94C3DA2EA38912CB554D4948F285107211CDC904EFD9177074605F5708F44BDD0355067C27EB06D84A0C5EE543F29E4CEE2D85CF5B4ED94D6A8FE831FC779AB4C38456FCFA29BE56E0EE59E1E1107D7F7E5FCCBC99B0E394E351CE35B9DA6EAE21AB6B36533E356163CB89FE5148266B69E3E1143877DA9A2A6CA0397468627E308AF0E75C402D0C9C0ED43A753F96766A8465113A3DD0174FCC068579F9B1F0B11D18C6A5D01B610B943F1BA878CA8CC4E448B1C93ACC3D03798E505AA285D97CCC635F0224FB2BE7DA70D6B0658F3941C7DD150047F063BE1250650F89813885D7167CB7EDBBDE5A49F01E4 +00CA994398BE1FD042 +00878006D00B3D1E1C6A1C1B95BFF933AF1DDC3029E39B6D12BDDBF3F38A2CE3EA61456DF0F3EF6063C7913291615B9A8C1A7A2C274454B44CDEEFB2A128A8443534DF393AAEBF93228B268936876DA486240A7A2CC68EF9C3E62A5270163F200E930B0A425E7194C0446D53FA131CAD1A59441A1A0D9F42CE1FDA1F884560D6767B512C562649D9220B7423A327C1F51972583419C3F98A3114A904FB70523642474A712229C4A136D92490F9256B9FDD950D321D0D0A7E1836557AACC8E5322F11E223D875281F4503F0442DF658212B1B5F358D1E2CC57DDBA0EB9C1E5FD2EE77408720B2F0DC2E4FFBE6BC71429F9C5EAB33BDB2EAE61AE0B7474027F500EB +00A78DD370566BFD4B +53265B8EE32A16AD66EBA19F3417577E47F80F714F14B8C20CC20FC12E6DDED2A03274E062F7F2B12424E9C4F3F2D2660C63EEFCC8A658BA2CE31DF81EE13E7A06259A706280C0F7B8AF69E7CA132595287FB0A532D2C52844EBCC09F10CF0A9EF2C5D3FDB62BC78723F324CEA6BD1C817B3B26740461091F7B2952B321D44B923D47991E57095D2987FE0F1BD3B379F2BF277CAED677691BAF0B64F6AEFC7D91610AE1A917014E128314E4D837DD4A63985EFB12F70DDFE425EF10B923B9C3C3FE188E594C0FD74BF36F36812D53C4ADC702AB45A0406CFB2819286C9A4709C1693F7D798375CFFBAA85E00A42FB0E821EE55D04AA11DD94B1A17C57FD811A8 +1781A2244A817E0B +008E6874C05D616AE80E8516991AAFF2F23AB32AB57FA0A196E0F4D9C7719A88A21F71CCDA98A92E390C58DB94A5619F4269B7BC555CC4BFF4CF130E16885310CE5AB13F49FC9F25AEE73DFB231BAA885D65FE590AB9A15C692EECE6DB208F3ABD8119C7199183EBE7429192E52F8BB477160AD5C7DBB5A5C74EEB1D965220914DEBD084376FBE112B263B926D58A488C6F5E84DDCAABCB296810101419620AD53D101D25F4DD14ACFC894870BF9F768A3427D069C8166B4DEB7C432C8738EFAA06ADF58840DCD77CE4E50AA8717038539828E64DFF641F2C19EA70BEAD973216D6A389F723CBB92269C7E3C9B4600CA22944C18C298D49B550B69B7F3E3A00252 +00DDB9FAF21E9050E9 +6E1AF0CA5AEC4ACC108FC790F0CAF6EAE979F1BB56D26A03D05714C48987FCF2B35F18E604CB2F8EE18C70E09DC15837165BAE8B9A05F950AAAE9A8B94F9E358DBD9E151C6E87444EE1D4FA8B5983FD69372CD6A38DEBAB98AD669C72759756A2B227F81E9E05D517AAD0FA68DCEC437B366483D1DEF145CE6818FAD9B3A209A30F134C885408AC75A7BB0956920B59443E0FFB692CB259B299F0DB4247427835CFA57FA0874E92400EC41A41BE15C7AE2C243BAC3888A15CF26720F63F1B83E3B0ECF7CA8015C4EAD234D52BE70A842275D056CAFDC9361F91AD3C9E179F22106EA2D3CFC2FEE84770A77AE6B61B1EA909A15E1C14A6C6DE918EF9C13E2C874 +00E389F4AE4132A8E4 +2FA6D279ECCCEA81608F92B16079DB5B96EB5CC6EC4B05979243F61DAC84BB9497D646E794DF06BCE49D27B99CC65A4C6DA54799A3AE3B7A1447A774138B34E8716DD9160EADF758CA6B07F1BADEF05CBB0BC8A4E5C6B1B9D1268A3CABD806E11A22D073A43D0B07C580E7C317C36635FA080EA43E1DFC6626FBDB1786B2C39237F839496E9E40BAACD40B311BE88213C8717C3D7A1BC94AEBDFA7EB6826E27A796A1033682BE97D972898E4E6908040483E1E57755D4177E57CC7FB29A887A87C039E00D2B45DB4CD275EACBD05E2C37A7C4426FDEF1A9BEE862F4DE8E4B656E7978E431488E1A3A89FD0116873A6FC158A8F94FD027E05AF0498F94901B777 +00E9C29912FBAFFCC4 +03B7E26FF29A338F4AA09E7BFB82955F7F2A5D43EEDCBB5C04D61110FD994DEC96C6C1F625829D24163719ACAD40D8338AC85929DA1C76D3DFE9AF0664DCED00D4DA927C115C2C62ACB8568BFAE648DA5CF94CDFC25039551DC722589214BEBD737B16653BFCB3197AFBE9F6B7B3B17A424B3842E8C118981155A4A746ECF908AFBD14DD7028B8390452F56CA5C205223ECD7806FEA1754D6E8CC2F4A042708071D49889383D1ADECFE15B6015AF09F97EB2ADB702B94F9E46F575E2AAA6DD1C6D4EA0A4DA3CCE551AC7F6A09453A6056CD1E8884F4EB9EDB3ACB46E3D379209F050109A02BF322C6084920246C95C9B82A8A6D3DF640DD3E178263EF02FE4AF +00F9DB46C64006FB2D +0081F82CCD4C02E2B3B97DFF991DE9DDC09E24FF0A68AC1E576B897550F84E2B3A64C3E8EB9A4C0307BC4887B4E0D0322CF7BECFFF73C30AB27F2A75CA96B55865DFC4BDDE21F81425AF7CA524BA35F7D540280094F442941BE7274FD7948DE6921EB26AC040B0138488D2E09F25F241385166510FE57E92F2162FCE5928BD5DD3DB727DDD90B90BC02B4D93DCB57DBEC4E2C393DF4E1F256538E54F366D69B2D259F9344E4044589AD6E2532F5E73EC5A30A113733E0E3BB37D726484F9487B12F32782F88C742B24CFDED13BA828CC3E317F7799E8AEA45DC1D5FBB77A2EF72DFD6C8AB3DE9BA8217C78FB928224A916596E47AE5812AF36B452E0461ED49A65 +009002AF2236047EE3 +26940B923B54174FADFCE952A8CFD801EECEF91B38E42FF28CC307BCFA19859150D31188AD3454530EE960DD8858451A015686435D7BF78BBE702D735AA3150CA99D426891D5623E82A190B2FA9BD076FD4961952ECE10FB0003736A00EFE212876C9F4DC7C3867DAF952ECBB49E52BC7250D537E9889AAC7222D3E5854D8929AB51C5A35528BF5AAFF9E9529FFEA00698315D09BF75540F4C5FA5ADDD2EBFF3AC3BD7738642AF85EC468897AF7A6E2AFE47F06A9038C519417C71C2256B5006C9693C2D94C5613FC1DA3553B5EDB18A05E637CB9BEC9E1E8D8A037AC7A7E0E21DDA4896664DCDAAB96AEEC7781B905B0BEEBB67403ED0E0BE5731798CDB7D79 +0090E7B9271D3F0333 +48BA281C2634FCB030732FDB1A26ABC7BCD89A1B7BC2CF64085AD9ECB1350C4F9ACA7AE80E7ABDF64B25F32AC04006A591FFA916BCD58FAF3190B87AE1EDFF9E3636D065A46991C0C1D67860B3CB549F91BE02B7D0F1F3DB78B18B5AC062C9FB735DCBD2200AF99A55CDFC43CCAE6473B968743F5740FC96A1463B310DB9CB063B7DF34FF3919F50DA6178FB4685CE9D1AD8ED913AD1E4AFD5E97E9AE5EAF44C222F18AD2CF33D858907FFCF1D178A638AA4B8B09D273189249FBE2BB77F592FBFA28A60BED22ECF8967B9627A114AE7CB2E045C3B27FCCE841C67CBFF680265A7773552B3395346DA7EFD1714061CA4B3F19BA5F57349D3D34CF54D2F8336B2 +1497A794B8C9EB31 +5FE854FDB4DC7AA4812E6DB6865A19C60BD5C9C6925DDA38C7DAB2854A1E5D3AB507D360E185EE11646A4E020FF72CDC3AF0E57C7F7FD7239C9B4909F280DF5002623EBDE5C82C9743585D6055DA3A4D3F79EEB975FC1589B751394537A62657C62DCC6AC1B8E7466FB29934C7D7CB375DAEF805F008D2ECC8CFBB152051D2DF7139AB22B6C205B95111B35E73CA31B50698A3840F2A81668E8EA8F83554D11753740D7704AE931D8AF3394E957DF228FAE22F1335D968B2D22D98C2ED3F3C61DC331CDB241E7D39026C158FA7F04374DDCBCF7B8EBDA8018BA61824ADC6523161EA89EA46C465EBDEDA185D8E8FA2138A2BA17510A02B43F333F9F7C7EDDE71 +59F0A101EC5A4789 +226D8A8E90025A56B7C06901C2606B23B61F88D76EBF70482254BF36FAAD6612E84D696E889FF07BEECB4F769361FA613F8C0C46598868EAF00BE2D9013B7F3054AC9A4624655EABE16BE8B44EA15201ED1B9D270030519BCEC9758BB8CB15E61C4A16C017ECB280D0972FEC29B871088809D7AF7451F98A0596F75DFC558A3AA7F0B6FE5119EE7A50340642CB21C32CACF572DF313D988DDD0D2516317B6740382782B779548C6181C85BE0A9E713B1678DFAE1A8018795F98F7D779B20232C748D9702A8836CB0EAD30E05CA54D04790737D520D76A3BA8768AE7EE5E0C97BA4E1027BACAEF86A18604A80EB92A4893F4ADFDC897A0A8BD90871004D9C5303 +52977395BF191F6A +4B594B3DD8F4F612C1D898DBA2F3AF8AFF22689B467BD2B66188B386F12D276E357F1BD4279F48362DCB641134575BC0C2DA484868EFEBD4A6B8602679002673A9324D82C4BD143C2A94108B006C28908ADA69B1D27277F14017AC4434EA40AD9B426F7C951FA162C4962068D6E4BEC0961384BED298FF01EA1605B41E36D39CC6B6E2BDCA956236398C342DDDC40DC13188F029B94FF5E945D6F0EB5D1F9CF2F839648099CA6487D10C97D163D6FE5C1FA185B47C122A69C4194AC7C879EBD591122AF939511D59553C503C4F7FA2E1E2E79FFF7EF61AFB00C1D227674C31F9C232023CE2FCBBC2C8D4F7EC96A3B2A62D3A9AE017CCD6F87F7BDA14A108257D +00DF5B40263176EDA2 +37D1429119B06122B463B1833D10B4C73A157BB3022316DEA4596AE43C7F0E73F470C4C8EF4C159769596EBB6A1B7268C3E4CC4A5C9224B5D1A9A7B5DF07B6C9253315FA839017F41D43AC3F30DEEF410C24376587D00B8F6BBB0586C4CC17CD5BE3063B75228121C00013F8F375FFB55A72436290C761481C8CC9F184A7C55705AE3B4FB8266E10A00C314CE5400FE493CE278AEF6A34AE72C04B4CBC3E39152FF8E8D4F179D789F7B8125482D452BC97521949341CBC0D387B5014C10360E2820DFEA6056B81CAED4B54F95C2D450031F538C42B6C55478FEB004FE07BDD818C386D771B732B8EC5EF969460D452178BD53468A7CAD5E2ACA29AB1FA655859 +07E6EB2B2A9BEED1 +4F4EFE2C18DCDDCDBC9656C4DCA9B75463C903EDE0B54231A1C0DBA59A7C13C47A9FA9F5F8D7D93C1512C3E1A199CA4F6BF855E93B7816D623AA0A9540F02C4F062DD17C9EB78B6C44CEE88711671499448CED23765623A87C0F0858D0421EFC3A4CD4FD050949A790128B3ECD2CC3A12FF1E34FF528AAB3D693F75A3D938A789184960C1530C6C1C940FEEC4B63582F6A8269BA3CFA11FB065E719361B10B15FC9588E5884977DF8848386D85E7255917599517EA76EB9ED493FA7007B7D3E6E00F55DAD890C3C4920553823FA804CB50504E1A0B0D122934F05D50C672956A307D310A7E66BA7C5BB0EFCF8CC2BACB1BD9A82915E11FCED549BF9B7EF8A73A +06AAEA5DA9D3FEAF +48641C33C3ACEA5BA8F6DEDF7F1A373574AF25611F0A8588385701832492A51CB666C2F56F4CCE12AA5573114E0F563DF2EF5E608EACF8255DB105F3BBB2C06121A3D075718A881BD1496BCECB8E6F38FAA0FC0D04E77E2BD7AF2EF72A41EA2C314C5A04C2880536628CCE46E9AC068F7EB90D59CA04448E2C4208AFC5A3C14B20F077048545280499C59CC23DA763B07799593263F9E60ABABDF8CA9617DADE866E3E53C0E2B924B26293CE7946C44B84ED5429A67DAD46AEFE6F587022B3452949F8C9433BD88C17387B7AA86DB87D99BA9EEC52F8FE10CFB6768CE916F5D41BC16C1346B58BC6868BBD03F3B807A23128C70FED78C9332792288F4B0A0861 +00CBFE25143E7375EF +365401DAE098E318C27BB41C86C8A92EE6534E1AF2ADBE879372585FC9A685D4F3A076CA38902CDB9C818EF76316AA6F884CE59FD92C45BB5FF34BE1626E313296F9751B7FFFD11899F437A413DA3546D09B88B9AA88E2DBDED15F3DDF7DF1471793EC7BACD5DFA3FD0333F865024232225B5D94984BFDFF32770B2B9206B524E090AC438BBCB47EF83A4FD5D7D0FEC2C8E4BCA91497FD9E91ADD56BD5B457E44E9F5C4E3259462CA1076853A33C402DAF0D8B46D281C3AF523D03387F3C7B29AC51C71D782A68AAE35E80685EA7DDF7395E5790D955408517F0BF2AC8934AA5B8276CDAF047647B686DE48AD7BDD27A472560D85A3E518292FD7BEA9A45994D +00AC1469380E7C8D60 +5EA9F1A67C4D9AA0C4ADFA03B4D89EF1838CD2A46961883F7F13FBD94E2E75A05C5659A4BA366DDE17FB73D53198EA6E77F95B8C67C5DE23A93ADCD1021C0781C540D0E71DCF23C592BA5BAB39C333E01E50AB6EFC331CBD47C275F60D81B93DE2D5B0FD37434396470CBEC9CC0279815B6A2973AEC561981431D421F5645D92FABCDFCED618CB5D96DA2BDFDBF691503B71B365CBAF329AD4A077040BB14EBF3F2E9D9974E71F9BE73B0C555EBF1AAB5C56B46D56EA945DE87163AEFDC1CC50FA715E6BEECEF353B2C7B9DDCE2CD807BB5F8D66FB35954595872A0CC387E6DDB446BA4F6C803AF813FD6A803EE626F873B515B73CB822C548D8CE0171733DF4 +00AA984137993C59FF +30BBCD096071FB3CC2F41D6F9A675EF4C4E6C00B509CE65A4A2C79258C9A0C635ABF8601D1649FE6230D9853D0DDEDD7E4D4B49C3340DAC7A1FECC12775C657EB43C8A69CC45360ECF0B4D121FDA130E2DF0A24A67894C98EDCE433F096D95CB5371BD1EEBB313A08608F461835D84E2522F5673567896350FB74955AE7A087FCAF9AF29010FF31B343E11DE802391229543D300025C6992366B6501738021C6B75F35DE1E656694E3C240B6F83E7D176B64DCF7756D24AB9D0EB178DF8DB6F11D434494DC59D579A6CAF7354A7E508D182DCDDFA439262BB336CAC05A553264C09AB4F75B410884C37B3B755CD9B06D45BC0D636509034576C8CCAD3C56AC4C +0084334B3A87E8C44D +0090CE7D05A9A41315AFCE861EBC4BB35B397E674EDC4D7DB66B27ADCAE193964BE665237C5A13E4B98ED6AD023AC00B67B98C96021D2498F20D55289DC1F12453A8F1224FD0A4E1A24B31F177DEEDD453383DFD03D011E2644E50779DB5A8920A70793F3B41B976BFAC55FA7F16BA66C8DDDEE1B05E85F7169056789672ADCDD7C3DC066D63F0AC870F09DF15E161B940C5AC2C1A90CC19323A2E1B8F57F7E29280CFAC9867955BE2EF3E432552F2E46AC6674BDF6070997FE70D7D3A1CC56FC383849DCD3033703A66BFFEBE8B37B436BDF751AAD628C63738FBF20151D454E8D2BB15413E2EAB5626FBD90BEAEF773719B027F854278D6EF57AC3A272D2DD47 +7F258D27F98C6199 +5CD0A143AA41621566C77FBE84648B8288A873B49351CA34D7EC513306176BDCC24E8B4E64A0CA7789DE78A88EF759ECCB9F892B23A5225D31B8CCADD1D85366672383D4EC7996E55D830D7F906C6624AAA47E0B10FEF0F2195CC61188421E054EBF01A61995960DAF2CDCEA0FD27F1730835A4FB75F6C592E7BAD5F7664ADF101B2FE83F6FF7652EF84D92479125AEE116E42FC7B4234488B8AB94921E444198CE8C4C424BE114F97CD424A8AC4DC83EBA5C3BEA12572EB91CF547ABE88AB94498848B817F846C04E780D26FB8490CE5AD569E4AD19D3080D1CDF16DB7733E494BA5227B6722028CAF343B78003BC5BC834BFB37AD8EC63E938599E39102848 +00A9395C2DB787665E +276B1028FC78FAF92F1CE261CE2D65AEF049A2DE37B382AE3B020829B593D09CCFD79B84ADDB794EDFFCA173DAA655B94862C45D3AA1C7AAE89F0BF56923D593D49ACFA73B174070D1486165258F8E99A23676BAA1F191BD543950C1D561BAC9AFA01B7E9D8AB899B2473893211EFA4BDD6A1B8B121AB3165207D4A50468D97001CB283B9A787E573BB3783F48ED492ED44B6CD7DDBC4D6DA129C4AD541E9CB84C1CDD656C6368A092344A9B9E776E6539A784AFDA66FFFA1DD16C7F9097CBAAC37079EC326FFD31602649EFEF19D65F1A94972E50F431E4329678ABBBD36B23D33C9906D1745158134DF4A3BC10A021CE3E6B7BDAA8B13D847BE62EC72DFF55 diff --git a/xcode/lib-gpu-generate/publickey.txt b/xcode/lib-gpu-generate/publickey.txt @@ -1,2 +1,2 @@ -00BB5175E55C2F1BBAE52B0C1225F43385FF54B3BFEA88B42B21044328815B8742E303C843ABE76D147861AE92D563592EFD748BF2E5BE4D76793FB32FCF6B38F755D408D114C9DF89B3FAA77EDF0C9358AC3BC23C90CDAA8337927A3530DCF2AD6EFC023C96A7932F8A7935B9B3F5C84668B41FB39059A1B723A40D59A7B1BD03F56933D641409F2A49E614BBAA9F2573ED24899840585B73329A01071793332BA92A0C9033D7004B45FD01C3A850125FA2E4A40818F8E233B7B7595ABAB04B84AE88E4F7B516359EAB7C285F399A3EFF467113DDBDB17981F2F4F2DE405BA18863046570C1621AD9446CE8A3884893CEF50933CB60053B6862E2443CC8554121 +00A9B5C2B78D572C08FE06BF23F89F2486BF07E750142997C0050EC5D2EAA9A385440AEE5D257CBBCBF2AED6394D626776881DD7CF368EC07E243C25C19A32A94413B6165000AF807803863F0C5DAAA1245CC8C158F881E7A9E56662736FE4CB9F5AD5D76159B2CE08ACBF2611BB59D593FF79FF469BA927306B9E4251F483F0BECD5E3FF5B5A03570A171BA96C3606ECB3FFB87EA5A3FB02FEFC998DB649D2644549EEE23C250785A7A7FA7FFF0D05C3A81749AD720EBD289BE0920CF4DDAA72969EA4C9388A2163DA1D3D07B500D0E54FDCBEA2891BB00E80DF77F4357FB3370909411E74F83A655CA85A14B0B0A5BA463EB53BE55D59A6E28CB305BAE74965D 010001 diff --git a/xcode/lib-gpu-verify.xcodeproj/project.xcworkspace/xcuserdata/cedriczwahlen.xcuserdatad/UserInterfaceState.xcuserstate b/xcode/lib-gpu-verify.xcodeproj/project.xcworkspace/xcuserdata/cedriczwahlen.xcuserdatad/UserInterfaceState.xcuserstate Binary files differ. diff --git a/xcode/lib-gpu-verify.xcodeproj/xcshareddata/xcschemes/lib-gpu-generate.xcscheme b/xcode/lib-gpu-verify.xcodeproj/xcshareddata/xcschemes/lib-gpu-generate.xcscheme @@ -53,7 +53,7 @@ </BuildableProductRunnable> <CommandLineArguments> <CommandLineArgument - argument = "32" + argument = "128" isEnabled = "YES"> </CommandLineArgument> </CommandLineArguments> diff --git a/xcode/lib-gpu-verify.xcodeproj/xcuserdata/cedriczwahlen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/xcode/lib-gpu-verify.xcodeproj/xcuserdata/cedriczwahlen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -1278,8 +1278,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "610" - endingLineNumber = "610" + startingLineNumber = "612" + endingLineNumber = "612" landmarkName = "rsa_tests()" landmarkType = "9"> <Locations> @@ -1461,8 +1461,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "597" - endingLineNumber = "597" + startingLineNumber = "599" + endingLineNumber = "599" landmarkName = "verify_pairs_with_opencl(bases, b_len, exponents, e_len, moduli, m_len, signatures, s_len, n, pks, result)" landmarkType = "9"> <Locations> @@ -1914,8 +1914,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "567" - endingLineNumber = "567" + startingLineNumber = "569" + endingLineNumber = "569" landmarkName = "verify_pairs_with_opencl(bases, b_len, exponents, e_len, moduli, m_len, signatures, s_len, n, pks, result)" landmarkType = "9"> </BreakpointContent> @@ -1930,8 +1930,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "651" - endingLineNumber = "651" + startingLineNumber = "653" + endingLineNumber = "653" landmarkName = "rsa_tests()" landmarkType = "9"> </BreakpointContent> @@ -1946,8 +1946,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "576" - endingLineNumber = "576" + startingLineNumber = "578" + endingLineNumber = "578" landmarkName = "verify_pairs_with_opencl(bases, b_len, exponents, e_len, moduli, m_len, signatures, s_len, n, pks, result)" landmarkType = "9"> </BreakpointContent> @@ -1962,8 +1962,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "642" - endingLineNumber = "642" + startingLineNumber = "644" + endingLineNumber = "644" landmarkName = "rsa_tests()" landmarkType = "9"> <Locations> @@ -2904,8 +2904,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "440" - endingLineNumber = "440" + startingLineNumber = "442" + endingLineNumber = "442" landmarkName = "verify_pairs_with_opencl(bases, b_len, exponents, e_len, moduli, m_len, signatures, s_len, n, pks, result)" landmarkType = "9"> </BreakpointContent> @@ -2920,8 +2920,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "915" - endingLineNumber = "915" + startingLineNumber = "926" + endingLineNumber = "926" landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" landmarkType = "9"> </BreakpointContent> @@ -2936,8 +2936,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1052" - endingLineNumber = "1052" + startingLineNumber = "1065" + endingLineNumber = "1065" landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" landmarkType = "9"> <Locations> @@ -3029,8 +3029,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1047" - endingLineNumber = "1047" + startingLineNumber = "1060" + endingLineNumber = "1060" landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" landmarkType = "9"> <Locations> @@ -3107,8 +3107,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "952" - endingLineNumber = "952" + startingLineNumber = "963" + endingLineNumber = "963" landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" landmarkType = "9"> <Locations> @@ -3881,8 +3881,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "695" - endingLineNumber = "695" + startingLineNumber = "697" + endingLineNumber = "697" landmarkName = "mont_pairs_from_files(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n)" landmarkType = "9"> </BreakpointContent> @@ -3897,8 +3897,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "730" - endingLineNumber = "730" + startingLineNumber = "732" + endingLineNumber = "732" landmarkName = "mont_pairs_from_files(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n)" landmarkType = "9"> <Locations> @@ -3960,8 +3960,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "755" - endingLineNumber = "755" + startingLineNumber = "757" + endingLineNumber = "757" landmarkName = "mont_pairs_from_files(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n)" landmarkType = "9"> <Locations> @@ -4023,8 +4023,8 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "766" - endingLineNumber = "766" + startingLineNumber = "768" + endingLineNumber = "768" landmarkName = "mont_pairs_from_files(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n)" landmarkType = "9"> </BreakpointContent> @@ -4039,10 +4039,102 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1119" - endingLineNumber = "1119" + startingLineNumber = "1129" + endingLineNumber = "1129" landmarkName = "mont_rsa_tests()" landmarkType = "9"> + <Locations> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb37a22" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1122" + endingLineNumber = "1122" + offsetFromSymbolStart = "238"> + </Location> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb37a22" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1122" + endingLineNumber = "1122" + offsetFromSymbolStart = "206"> + </Location> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb3669f" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1149" + endingLineNumber = "1149" + offsetFromSymbolStart = "206"> + </Location> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb37a03" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1121" + endingLineNumber = "1121" + offsetFromSymbolStart = "206"> + </Location> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb37be4" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1128" + endingLineNumber = "1128" + offsetFromSymbolStart = "206"> + </Location> + <Location + uuid = "4156F803-B4B2-4ACF-BBB1-7E71EC1C7D77 - 6bb13900dcb37b68" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_rsa_tests" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1132" + endingLineNumber = "1132" + offsetFromSymbolStart = "206"> + </Location> + </Locations> </BreakpointContent> </BreakpointProxy> <BreakpointProxy @@ -4055,10 +4147,73 @@ filePath = "../source/rsa-test.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1065" - endingLineNumber = "1065" + startingLineNumber = "1078" + endingLineNumber = "1078" + landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" + landmarkType = "9"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + uuid = "B98A9FDB-BBAD-4C87-9572-BA62388B7EE6" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "../source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1047" + endingLineNumber = "1047" landmarkName = "mont_verify_pairs_with_opencl(bases, b_off, exponents, e_off, moduli, m_off, signatures, s_off, n, pks, result)" landmarkType = "9"> + <Locations> + <Location + uuid = "B98A9FDB-BBAD-4C87-9572-BA62388B7EE6 - 2905f85b306cd23e" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_verify_pairs_with_opencl" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1047" + endingLineNumber = "1047" + offsetFromSymbolStart = "4113"> + </Location> + <Location + uuid = "B98A9FDB-BBAD-4C87-9572-BA62388B7EE6 - 2905f85b306cd23e" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_verify_pairs_with_opencl" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1047" + endingLineNumber = "1047" + offsetFromSymbolStart = "4110"> + </Location> + <Location + uuid = "B98A9FDB-BBAD-4C87-9572-BA62388B7EE6 - 2905f85b306cd23e" + shouldBeEnabled = "Yes" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "mont_verify_pairs_with_opencl" + moduleName = "lib-gpu-verify" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/cedriczwahlen/libgpuverify/source/rsa-test.c" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "1047" + endingLineNumber = "1047" + offsetFromSymbolStart = "4111"> + </Location> + </Locations> </BreakpointContent> </BreakpointProxy> </Breakpoints> diff --git a/xcode/montgomery.cl b/xcode/montgomery.cl @@ -417,16 +417,16 @@ mpn_base_power_of_two_p (unsigned b); void mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b); int isspace_gpu(unsigned char c); -int strlen_c(__constant char *c); +int strlen_c(__global char *c); mp_size_t mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn, unsigned bits); mp_size_t mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn, mp_limb_t b, const struct mpn_base_info *info); int -mpz_set_str (mpz_t r, __constant char *sp, int base); +mpz_set_str (mpz_t r, __global char *sp, int base); int -mpz_init_set_str (mpz_t r, __constant char *sp, int base); +mpz_init_set_str (mpz_t r, __global char *sp, int base); //void mpz_sub (mpz_t r, const mpz_t a, const mpz_t b); ////void mpz_add (mpz_t, const mpz_t, const mpz_t); @@ -2403,7 +2403,7 @@ int isspace_gpu(unsigned char c) { return 0; } -int strlen_c(__constant char *c) { +int strlen_c(__global char *c) { // rather naive implementation – we assume a string is terminated, and is not 0 characters long. @@ -2484,7 +2484,7 @@ mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn, int -mpz_set_str (mpz_t r, __constant char *sp, int base) +mpz_set_str (mpz_t r, __global char *sp, int base) { unsigned bits, value_of_a; mp_size_t rn, alloc; @@ -2593,7 +2593,7 @@ mpz_set_str (mpz_t r, __constant char *sp, int base) int -mpz_init_set_str (mpz_t r, __constant char *sp, int base) +mpz_init_set_str (mpz_t r, __global char *sp, int base) { mpz_init (r); return mpz_set_str (r, sp, base); @@ -2836,10 +2836,10 @@ void printmpz(mpz_t n) { } -__kernel void montgomery(__constant char *signature, __constant unsigned long *s_offsets, - __constant char *exponent, __constant unsigned long *e_offsets, - __constant char *modulus, __constant unsigned long *m_offsets, - __constant char *base, __constant unsigned long *b_offsets, +__kernel void montgomery(__global char *signature, __global unsigned long *s_offsets, + __global char *exponent, __global unsigned long *e_offsets, + __global char *modulus, __global unsigned long *m_offsets, + __global char *base, __global unsigned long *b_offsets, __global unsigned long *valid, unsigned int n, unsigned int pks)