diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57abd0ff6b..11b35ade74 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,10 +11,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - - name: Setup Node version 10.x - uses: actions/setup-node@v1 + - name: Setup Node version 16.19.0 + uses: actions/setup-node@v3 with: - node-version: '10.x' + node-version: '16.19.0' check-latest: true - name: Yarn install, webpacking run: | diff --git a/app/firmwares/dalgona.hex b/app/firmwares/dalgona.hex index 2a09a245d8..060124d36f 100644 --- a/app/firmwares/dalgona.hex +++ b/app/firmwares/dalgona.hex @@ -1,35 +1,1120 @@ -:107E0000112484B714BE81FFF0D085E080938100F7 -:107E100082E08093C00088E18093C10086E0809377 -:107E2000C20080E18093C4008EE0C9D0259A86E02C -:107E300020E33CEF91E0309385002093840096BBD3 -:107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 -:107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 -:107E6000A2D0813461F49FD0082FAFD0023811F036 -:107E7000013811F484E001C083E08DD089C08234E0 -:107E800011F484E103C0853419F485E0A6D080C0E4 -:107E9000853579F488D0E82EFF2485D0082F10E0AE -:107EA000102F00270E291F29000F111F8ED06801E7 -:107EB0006FC0863521F484E090D080E0DECF843638 -:107EC00009F040C070D06FD0082F6DD080E0C81688 -:107ED00080E7D80618F4F601B7BEE895C0E0D1E017 -:107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 -:107EF00018F0F601B7BEE89568D007B600FCFDCFD4 -:107F0000A601A0E0B1E02C9130E011968C91119780 -:107F100090E0982F8827822B932B1296FA010C0160 -:107F200087BEE89511244E5F5F4FF1E0A038BF0790 -:107F300051F7F601A7BEE89507B600FCFDCF97BE46 -:107F4000E89526C08437B1F42ED02DD0F82E2BD052 -:107F50003CD0F601EF2C8F010F5F1F4F84911BD097 -:107F6000EA94F801C1F70894C11CD11CFA94CF0C13 -:107F7000D11C0EC0853739F428D08EE10CD085E9AC -:107F80000AD08FE07ACF813511F488E018D01DD067 -:107F900080E101D065CF982F8091C00085FFFCCF94 -:107FA0009093C60008958091C00087FFFCCF809118 -:107FB000C00084FD01C0A8958091C6000895E0E648 -:107FC000F0E098E1908380830895EDDF803219F02E -:107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA -:107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 -:047FF000FF270994CA -:027FFE00040479 -:0400000300007E007B +:100000000C9464000C948C000C948C000C94DD1007 +:100010000C94DD100C94DD100C948C000C94C00E2C +:100020000C948C000C948C000C948C000C94551146 +:100030000C948C000C948C000C948C000C948C0010 +:100040000C94740F0C948C000C94420F0C941C0FA5 +:100050000C948C000C948C000C948C000C948C00F0 +:100060000C94BE0F0C948C000000000024002700AC +:100070002A0000000008000201000003040700003D +:1000800000000000000002000000002300260029FC +:100090000000000000250028002B000404040404D4 +:1000A0000404040202020202020303030303030125 +:1000B00002040810204080010204081020010204FC +:1000C000081020005612851D11241FBECFEFD8E066 +:1000D000DEBFCDBF11E0A0E0B1E0EAE6F5E402C08A +:1000E00005900D92A437B107D9F724E0A4E7B1E059 +:1000F00001C01D92AB34B207E1F710E0C3E6D0E0D7 +:1001000004C02197FE010E94A920C236D107C9F779 +:100110000E94A6130C94A8220C9400000895089540 +:100120008091E9039091EA038230910538F0880FBD +:10013000991F880F991F05970197F1F70895E0918E +:100140001804F09119048E179F0798F530911E043A +:10015000332361F0639FB0011124672F349FA00106 +:100160001124452F329F90011124232F3091240414 +:10017000E0911F04F09120045091210435131AC01E +:10018000DC01AA0FBB1F8A0F9B1F8E0F9F1FE091E0 +:100190002104E80FF92FF11D6083E0912204E80F9C +:1001A000F92FF11D408330912304830F911DFC0131 +:1001B00020830895880F991F880F991F8E0F9F1F06 +:1001C000FC01E30FF11D1082E2CFAF92BF92CF92FC +:1001D000DF92EF92FF920F931F93CF93DF936C0107 +:1001E0007B018B01040F151FEB015E01AE18BF08E8 +:1001F000C017D10759F06991D601ED91FC9101909A +:10020000F081E02DC6010995892B79F7C501DF91B1 +:10021000CF911F910F91FF90EF90DF90CF90BF9003 +:10022000AF900895FC01538D448D252F30E0842F2D +:1002300090E0821B930B541710F0CF96089501970E +:100240000895FC01918D828D981761F0A28DAE0FFB +:10025000BF2FB11D5D968C91928D9F5F9F73928F82 +:1002600090E008958FEF9FEF0895FC01918D828DAE +:10027000981731F0828DE80FF11D858D90E008957B +:100280008FEF9FEF0895FC01918D228D892F90E0D3 +:10029000805C9F4F821B91098F739927089582E19B +:1002A00093E00E94430121E0892B09F420E0822F92 +:1002B000089580E090E0892B29F00E944F01811180 +:1002C0000C9400000895FC01A48DA80FB92FB11D56 +:1002D000A35ABF4F2C91848D90E001968F7399277C +:1002E000848FA689B7892C93A089B1898C9183705A +:1002F00080648C93938D848D981306C00288F38953 +:10030000E02D80818F7D80830895EF92FF920F937F +:100310001F93CF93DF93EC0181E0888F9B8D8C8DB1 +:1003200098131AC0E889F989808185FF15C09FB7A5 +:10033000F894EE89FF896083E889F9898081837068 +:10034000806480839FBF81E090E0DF91CF911F9117 +:100350000F91FF90EF900895F62E0B8D10E00F5F38 +:100360001F4F0F731127E02E8C8D8E110CC00FB60E +:1003700007FCFACFE889F989808185FFF5CFCE01A6 +:100380000E946301F1CFEB8DEC0FFD2FF11DE35ABD +:10039000FF4FF0829FB7F8940B8FEA89FB89808129 +:1003A0008062CFCFCF93DF93EC01888D8823B9F0A3 +:1003B000AA89BB89E889F9898C9185FD03C0808170 +:1003C00086FD0DC00FB607FCF7CF8C9185FFF2CFED +:1003D000808185FFEDCFCE010E946301E9CFDF91DF +:1003E000CF910895833081F028F4813099F08230E4 +:1003F000A9F008958730A9F08830C9F08430B1F4AD +:10040000809180008F7D03C0809180008F778093E2 +:100410008000089584B58F7784BD089584B58F7D5D +:10042000FBCF8091B0008F778093B00008958091CA +:10043000B0008F7DF9CFCF93DF93282F30E0F90103 +:10044000EE58FF4F8491F901E155FF4FD491F90126 +:10045000E556FF4FC491CC23A1F081110E94F20117 +:10046000EC2FF0E0EE0FFF1FE957FF4FA591B4917D +:10047000EC91ED2381E090E009F480E0DF91CF91F1 +:10048000089580E090E0FACF1F93CF93DF93282F59 +:1004900030E0F901EE58FF4F8491F901E155FF4F2B +:1004A000D491F901E556FF4FC491CC23A9F0162F42 +:1004B00081110E94F201EC2FF0E0EE0FFF1FEF56CA +:1004C000FF4FA591B4918FB7F894EC91111108C02A +:1004D000D095DE23DC938FBFDF91CF911F910895DC +:1004E000DE2BF8CF9091000189130BC0E6E8F0E015 +:1004F000E4919FEF90930001E13049F028F0E23061 +:1005000061F060E00C94440210926E00FACF90917A +:100510006F009D7F90936F00F4CF909170009D7F4E +:100520009093700091E09093B0009091B100987F0B +:1005300094609093B1001092B300E3CFCF93DF9318 +:1005400090E0FC01E155FF4F249185569F4FFC013F +:1005500084918823D1F090E0880F991FFC01E8591D +:10056000FF4FA591B491FC01EF56FF4FC591D49177 +:1005700061110EC09FB7F8948C91E22FE0958E2305 +:100580008C932881E223E8839FBFDF91CF91089568 +:100590008FB7F894EC91E22BEC938FBFF6CF80915C +:1005A0001C0490911D0497FD08C061E00E949E020A +:1005B00060E080911C040E94440281E08093170453 +:1005C0000895CF93DF93C6EED3E061E089810E9466 +:1005D0009E020E94900060E088810E949E020E941C +:1005E000900060E089810E949E02DF91CF910C947F +:1005F00090000F931F93CF93DF93D82FC8E061E053 +:100600008091E6030E949E020E9490000D2F10E050 +:1006100060E0D0FF61E08091E7030E949E020E94AB +:10062000900060E08091E6030E949E020E9490008C +:1006300015950795D02FC15011F761E08091E60321 +:100640000E949E0260E08091E7030E949E020E9449 +:10065000900060E08091E6030E949E020E9490005C +:100660008091E7030E941B02C82F811105C061E041 +:100670008091E7030E949E020E94900061E08091B9 +:10068000E6030E949E020E94900081E0C11101C019 +:1006900080E0DF91CF911F910F91089561E08091EB +:1006A000E7030E949E020C949000EF92FF920F933A +:1006B0001F93CF93DF93182FE92E062FC42F0E948C +:1006C0004E0380E40E94F9020E94E1020E944E0360 +:1006D0008C2F837080540E94F902F12EC12FDE2DE1 +:1006E00089910E94F9028C2F8F198017C8F30E94FC +:1006F000E1020E944E038091E8038F7080580E94AF +:10070000F902DF91CF911F910F91FF90EF900C9420 +:10071000E1021F93CF93DF93182FEB0161E00E945A +:100720009E02209739F460E0812FDF91CF911F91D5 +:100730000C944402CF3FD10511F461E0F5CFE12FD5 +:10074000F0E0EE58FF4FE491E33031F140F4E13056 +:10075000B1F0E230E1F0C038D1057CF7E4CFE7300A +:1007600029F1E83059F1E430B1F7809180008062DE +:1007700080938000D0938B00C0938A0004C084B51E +:10078000806884BDC7BDDF91CF911F91089584B566 +:10079000806284BDC8BDF7CF80918000806880935F +:1007A0008000D0938900C0938800EDCF8091B00085 +:1007B00080688093B000C093B300E5CF8091B00013 +:1007C00080628093B000C093B400DDCF3FB7F8944F +:1007D0008091790290917A02A0917B02B0917C0283 +:1007E00026B5A89B05C02F3F19F00196A11DB11D8C +:1007F0003FBFBA2FA92F982F8827BC01CD01620FC8 +:10080000711D811D911D42E0660F771F881F991F82 +:100810004A95D1F708950F931F93CF93DF93CDB7E8 +:10082000DEB729970FB6F894DEBF0FBECDBF80911B +:100830001F0490912004892B09F47CC00E94E603D8 +:10084000009125041091260420912704309128045A +:10085000601771078207930740F460932504709333 +:100860002604809327049093280400912504109176 +:1008700026042091270430912804601B710B820B01 +:10088000930B6C32714081059105C0F2F894809110 +:100890001A0490911B049A838983E0911F04F091BC +:1008A0002004DF0111968081898790911604E091E0 +:1008B0002904F0912A0480912B04992309F445C05E +:1008C0009081982B98879081809589238F838F8141 +:1008D0008C8388E08B8358856F8149853B812C818F +:1008E00089819A81508347FD252F3A952083262FB1 +:1008F00039F0441F00C000006083000000C0F2CF48 +:1009000038E04D9160830000019761F7F0932A046D +:10091000E093290449873B832C839A8389837894C5 +:100920000E94E603609325047093260480932704B5 +:100930009093280429960FB6F894DEBF0FBECDBF62 +:10094000DF91CF911F910F9108959081982B9887F7 +:100950009081809589238F838F818E8388E08D831A +:1009600058856F8149853D812E8189819A81508387 +:1009700047FD252F00C000C0208300C000C000C07C +:1009800000C000C060830000262F3A9541F0441F4C +:10099000000000C000C000C000C000C0E8CF38E0C8 +:1009A0004D9100C0608300C0019709F7F0932A04BD +:1009B000E093290449873D832E83AFCF8F929F9286 +:1009C000AF92BF92CF92DF92EF92FF926B017C01C8 +:1009D0000E94E6034B015C01C114D104E104F1045F +:1009E000B9F00E94E603681979098A099B09683EF3 +:1009F00073408105910580F321E0C21AD108E10816 +:100A0000F10888EE880E83E0981EA11CB11CE4CF8B +:100A1000FF90EF90DF90CF90BF90AF909F908F901E +:100A2000089520912E02260F3327331F21323105DE +:100A3000ECF420915202FC0190E080E0243069F057 +:100A400082E00895A0912E022191AC01425F5D4F9A +:100A5000A40FB52FB11D2C930196861798F38091A2 +:100A60002E02680F60932E0280E0089581E00895C1 +:100A70001092520281E0809354021092530261E07E +:100A800082E10E94440261E083E10E944402E9EBBA +:100A9000F0E080818E7F808380818D7F808388E4F9 +:100AA0008093B80085E48093BC000895CF93DF93D2 +:100AB00091E090930D028823B9F0C091B800D091D5 +:100AC000BA008091BC008A7B8093BC0060E082E128 +:100AD0000E94440260E083E10E9444020E943805C3 +:100AE000D093BA00C093B800DF91CF9108950895D4 +:100AF000E091110380911003E81730F4F0E0E85121 +:100B0000FE4F808190E008958FEF9FEF08959091C0 +:100B10001103809110032FEF3FEF981748F4E92F4E +:100B2000F0E0E851FE4F208130E09F5F9093110389 +:100B3000C90108958091100390911103891B990BAD +:100B40000895CF92DF92EF92FF920F931F93CF936E +:100B5000DF937C01CB018A012091E701222389F0F8 +:100B6000EB016B01C40ED51ECC15DD0569F0699152 +:100B7000D701ED91FC910190F081E02DC70109951D +:100B8000F3CF642F0E941105C801DF91CF911F910F +:100B90000F91FF90EF90DF90CF900895CF93DF9368 +:100BA0001F92CDB7DEB769832091E7012223F9F0C8 +:100BB00020910E03203258F021E030E0FC01338315 +:100BC000228390E080E00F90DF91CF910895809193 +:100BD0000F03E82FF0E0E953FE4F998190838F5F78 +:100BE00080930F0380930E0381E090E0ECCF61E0EF +:100BF000CE0101960E941105F7CF20910803309194 +:100C000009032817390771F49091060380910703AF +:100C1000981741F0E0910603F0E0E957FE4F80811C +:100C200090E008958FEF9FEF0895EF92FF920F935A +:100C30001F93CF93DF93DC015C96ED90FC905D9762 +:100C4000E114F10479F481E090E013969C938E9383 +:100C5000129790E080E0DF91CF911F910F91FF906C +:100C6000EF9008955196ED91FC91529750968C918A +:100C70005097982F90950FB75E962C915E97122FF4 +:100C8000127021FD6095F8942081112319F1282B11 +:100C90002083E7012197F1F728E0462F50E03081CB +:100CA00060FF1AC0382B3083E7012197F1F7BA01B2 +:100CB00075956795215089F7112381F080818923EB +:100CC00080830FBF5C968D919C910197F1F781E035 +:100CD00090E0C1CF2923DCCF3923E5CF9081892B48 +:100CE000EFCF20910803309109032817390771F4D9 +:100CF000809107032091060390E0805C9F4F821B48 +:100D0000910960E470E00E948E20089590E080E0F8 +:100D10000895209108033091090328173907B9F481 +:100D20009091060380910703981789F0E0910603DC +:100D3000F0E0E957FE4F80812091060330E02F5FFD +:100D40003F4F2F7333272093060390E008958FEFD2 +:100D50009FEF0895E0910803F0910903E817F90760 +:100D600069F4A389B4899C918589809589238C93A2 +:100D7000109209031092080381E0089580E008951D +:100D800010920604109205041092040410920304B9 +:100D900010920204109201048DE991E090930804EE +:100DA000809307049091F703963108F046C02DEB2D +:100DB00030E030930204209301042BE931E03093BA +:100DC0000404209303042CE231E0309306042093C2 +:100DD00005042091680084E0983048F031E09E30AE +:100DE00008F430E081E001C0880F3A95EAF7822BE1 +:100DF000809368002DE630E0983050F02BE630E02C +:100E00009E3030F02CE630E0963110F030E020E0FB +:100E10003093FF032093FE03292F30E09830C0F574 +:100E200081E001C0880F9A95EAF7809300048091D1 +:100E30000704909108040197F1F7809105049091BF +:100E40000604892B21F1809108039091090323E086 +:100E50008B3E9207E1F0009711F00E94AA06809164 +:100E600009048E7F809309041092070310920603F1 +:100E70008BEE93E09093090380930803E091FE03C7 +:100E8000F091FF03808190910004892B8083089565 +:100E90009E3040F42850310981E001C0880F2A9526 +:100EA000EAF7C3CF2E503109F7CFCF92DF92EF92FE +:100EB000FF920F931F93CF93DF93FC01C48121E036 +:100EC0002093E701C093860110920F0310920E0346 +:100ED0008385682B8FEA93E00E94CE05D0910E03A4 +:100EE000D13208F092C00E94E6036B017C01809130 +:100EF0005202811165C082E08093520281E08093AA +:100F000054028FEF8093510210927602D0937502B3 +:100F1000A7ECB1E0E5E5F2E080E0D81385C01092DF +:100F2000770280917702CC0FC82BC0937702809113 +:100F30005302813009F07CC0109253020E94E603F4 +:100F40006B017C01809177028093BB008091090244 +:100F500090910A02A0910B02B0910C02892B8A2B6E +:100F60008B2B99F00E94E6030091090210910A026E +:100F700020910B0230910C026C197D098E099F099A +:100F80000617170728073907E0F18091BC0083FD99 +:100F9000D9CF85EC8093BC000E94E6036B017C01F5 +:100FA00080915202823009F445C0809151028F3FF6 +:100FB00061F180915102803241F18091510225C04E +:100FC0008091090290910A02A0910B02B0910C024B +:100FD000892B8A2B8B2B09F48ACF0E94E603009180 +:100FE000090210910A0220910B0230910C026C1937 +:100FF0007D098E099F09061717072807390708F08A +:1010000076CF809108020E94560510920F0310922D +:101010000E031092E701DF91CF911F910F91FF9086 +:10102000EF90DF90CF9008959D9191938F5F75CF52 +:1010300085EEB0CF8091090290910A02A0910B0237 +:10104000B0910C02892B8A2B8B2B09F4A9CF0E941B +:10105000E6030091090210910A0220910B023091DF +:101060000C026C197D098E099F09061717072807BE +:10107000390708F095CFC5CF089590E080E0089536 +:10108000FC01EE0FFF1FE651FD4F20813181232B24 +:1010900039F421E030E03183208361E00C949E023A +:1010A00008958F929F92AF92BF92CF92DF92EF926C +:1010B000FF920F931F93CF93DF93CDB7DEB76B975C +:1010C0000FB6F894DEBF0FBECDBF8C01F894CE01F1 +:1010D00001967C0188E1D7011D928A95E9F7C80144 +:1010E0000E9440088091AB02898F8091A9028A8F6B +:1010F0008091AD028B8FFE017996C7015E01BCE144 +:10110000AB0EB11CA701A1918A2E912C27E030E0F3 +:101110006A01C20ED31EB401022E02C075956795F6 +:101120000A94E2F76170D6016C932150310980F77F +:10113000485F5F4FEA15FB0531F7980122503109EE +:101140002630310508F0EDC00330110509F052C01A +:101150005B9825E50F920F900F920F900F920F90D2 +:101160002150C1F7E8E1EE0EF11C27E030E0FC0170 +:10117000E20FF31F4081413009F07BC003301105BD +:1011800009F04DC05B9A4AE10F920F900F920F90B9 +:101190000F920F904150C1F70330110509F054C070 +:1011A0005B9849E10F920F900F920F900F920F9062 +:1011B0004150C1F721503109D0F60896E816F906DA +:1011C000A1F60330110509F097C05B9A78946B96ED +:1011D0000FB6F894DEBF0FBECDBFDF91CF911F9148 +:1011E0000F91FF90EF90DF90CF90BF90AF909F90C6 +:1011F0008F9008950430110511F45C98AACF053042 +:10120000110511F45D98A5CF0630110511F45E9813 +:10121000A0CF0730110509F09CCF5F989ACF04301A +:10122000110511F45C9AAFCF0530110511F45D9AE8 +:10123000AACF0630110511F45E9AA5CF073011052B +:1012400009F0A1CF5F9A9FCF0430110511F45C988B +:10125000A8CF0530110511F45D98A3CF0630110514 +:1012600011F45E989ECF0730110509F09ACF5F9870 +:1012700098CF03301105C1F45B9A4FE00F920F90A5 +:101280000F920F900F920F904150C1F7033011054C +:10129000F9F45B984EE00F920F900F920F900F921F +:1012A0000F904150C1F786CF0430110511F45C9ABC +:1012B000E4CF0530110511F45D9ADFCF063011053A +:1012C00011F45E9ADACF07301105B9F65F9AD5CFDF +:1012D0000430110511F45C98DDCF0530110511F4CF +:1012E0005D98D8CF0630110511F45E98D3CF073042 +:1012F000110581F65F98CECF0430110511F45C9A88 +:1013000065CF0530110511F45D9A60CF06301105E7 +:1013100011F45E9A5BCF0730110509F057CF5F9A41 +:1013200055CF9801285031092630310508F04ECFAD +:101330000830110509F03FC0289825E50F920F905D +:101340000F920F900F920F902150C1F728E1E20EFB +:10135000F11C27E030E0FC01E20FF31F4081413037 +:1013600009F06BC00830110509F03BC0289A4AE12A +:101370000F920F900F920F900F920F904150C1F764 +:101380000830110509F043C0289849E10F920F90E9 +:101390000F920F900F920F904150C1F721503109D9 +:1013A000D0F60896E816F906A1F60830110509F0FE +:1013B0008BC0289A0BCF0930110511F42998BDCFA5 +:1013C0000A30110511F42A98B8CF0B30110511F429 +:1013D0002B98B3CF0C30110511F42C98AECF2D986B +:1013E000ACCF0930110511F4299AC1CF0A3011058B +:1013F00011F42A9ABCCF0B30110511F42B9AB7CFF8 +:101400000C30110511F42C9AB2CF2D9AB0CF0930BF +:10141000110511F42998B9CF0A30110511F42A9851 +:10142000B4CF0B30110511F42B98AFCF0C30110550 +:1014300011F42C98AACF2D98A8CF08301105C1F42B +:10144000289A4FE00F920F900F920F900F920F90EB +:101450004150C1F70830110509F528984EE00F9268 +:101460000F900F920F900F920F904150C1F796CFAF +:101470000930110511F4299AE4CF0A30110511F44D +:101480002A9ADFCF0B30110511F42B9ADACF0C30EA +:10149000110511F42C9AD5CF2D9AD3CF093011050F +:1014A00011F42998DBCF0A30110511F42A98D6CF10 +:1014B0000B30110511F42B98D1CF0C30110511F41C +:1014C0002C98CCCF2D98CACF0930110511F4299A48 +:1014D0007DCE0A30110511F42A9A78CE0B30110511 +:1014E00011F42B9A73CE0C30110511F42C9A6ECE98 +:1014F0002D9A6CCE682F82E193E00C9485010F93B6 +:101500001F93CF93DF938B01D82FC92F82E00E94C6 +:101510007A0AC801AD2FBC2F80938101909382017C +:10152000A0938301B09384010E947A0A812F0E94C4 +:101530007A0A8D2F0E947A0A8C2FDF91CF911F910A +:101540000F910C947A0A8FEF0E947A0A85E50C9429 +:101550007A0A4F925F926F927F928F929F92AF9290 +:10156000BF92CF92DF92EF92FF920F931F93CF9390 +:10157000DF9300D0CDB7DEB78C0149832A83660F95 +:10158000771FF801EA5AFF4FE080F180EE0CFF1C54 +:10159000F801CF01801B910B8E159F0514F4119259 +:1015A000F8CF8981F801E60FF71F81838A81808354 +:1015B000680184E5C80ED11C60E0F60180810E94BC +:1015C00044025801F2E5AF0EB11C480180E5880ED7 +:1015D000911C1E141F040CF5E1E0EE1AF108F8014D +:1015E000EE0DFF1D6080F5015080F401408088E021 +:1015F000782E662D661F6627661F842D0E94440282 +:10160000660C61E0852D0E94440260E0852D0E94F9 +:1016100044027A947110EDCFDCCF61E0F601808155 +:101620000F900F90DF91CF911F910F91FF90EF904E +:10163000DF90CF90BF90AF909F908F907F906F90F2 +:101640005F904F900C944402CF92DF92EF92FF9202 +:101650001F93CF93DF937C016B01EB0183E0CC0FF1 +:10166000DD1F8A95E1F76096CE0DDF1D11E019921E +:1016700020E0412FB601C7010E94A90A1F5F19305F +:10168000B1F7DF91CF911F91FF90EF90DF90CF9056 +:1016900008958F929F92AF92BF92CF92DF92EF9276 +:1016A000FF920F931F93CF93DF938C01D62EC72EFB +:1016B000EC01C05BDF4F688379834C0182E5880EC3 +:1016C000911CF401518340835801F4E5AF0EB11C25 +:1016D000F501318320837801F6E5EF0EF11C81E0FE +:1016E00090E0F7019183808361E08D2D0E949E023E +:1016F00061E0F40180810E949E0261E0F501808139 +:101700000E949E0261E0F50180810E944402D8821D +:10171000C982F80170961192EC17FD07E1F7D0E04D +:10172000C0E0F70180819181C817D90784F520E0D6 +:101730004FE0BE01C8010E94A90AF7018081918192 +:10174000C817D90734F427E04BE0BE01C8010E9456 +:10175000A90A20E049E0BE01C8010E94A90AF701D8 +:1017600080819181C817D90724F4BE01C8010E9465 +:10177000240BF70180819181C817D90734F420E048 +:101780004CE0BE01C8010E94A90A2196CACFDF9190 +:10179000CF911F910F91FF90EF90DF90CF90BF906E +:1017A000AF909F908F9008950F931F93CF938C01CC +:1017B000C62F0E9455076C2F6460C8010E94550710 +:1017C0006C2F6B7FC8010E94550783EC90E0019756 +:1017D000F1F7CF911F910F9108950F931F93CF931E +:1017E000DF938C01D62FC42F607F642B0E94D40B13 +:1017F00080E1D89FB00111246C2BC801DF91CF91FB +:101800001F910F910C94D40B40E061E08AE094E0CA +:101810000E94ED0B8BE39FE10197F1F70895CF93C1 +:10182000DF93109211031092100310920F03109285 +:101830000E030E9438058EE890E090930D0380938C +:101840000C038FE890E090930B0380930A031092AF +:101850000F0480911304823018F098E090930F04E5 +:1018600090911404992339F0813029F480910F0468 +:10187000846080930F0462E370E080E090E00E9457 +:10188000DE04609115048AE094E00E94550768EE3A +:1018900073E080E090E00E94DE0460E38AE094E080 +:1018A0000E94D40BCBE4D6E4CE010197F1F760E3BC +:1018B0008AE094E00E94D40B2197F1F760E38AE07C +:1018C00094E00E94D40B83E592E00197F1F760E287 +:1018D0008AE094E00E94D40B60910F04606240E0C3 +:1018E0008AE094E00E94ED0B84E08093100440E0D5 +:1018F0006CE08AE094E00E94ED0B0E94040C82E010 +:101900008093110440E066E08AE094E00E94ED0BD1 +:1019100040E062E08AE094E00E94ED0B8BE39FE1FF +:101920000197F1F7DF91CF9108950E940F0C88E0A5 +:101930008093150460E08AE094E00E9455070C94BF +:10194000040C41E00E94ED0B81E090E0089542E03C +:1019500050E061E771E082E193E00C94E5008FEFE5 +:101960000E947A0A85E50E947A0A0C94A70C8F924D +:101970009F92AF92BF92CF92DF92EF92FF920F931E +:101980001F93CF93DF93C091A002D091A102CE010B +:101990009927FC01E155FF4F1491FC01E556FF4FDB +:1019A000E491F0E0EE0FFF1FE957FF4FE590F49050 +:1019B00010927C0110927D0110927E0110927F01A5 +:1019C0001092800161E08C2F0E949E0260E08C2FBB +:1019D0000E94440262E170E080E090E00E94DE0438 +:1019E00061E08C2F0E9444028BE990E00197F1F7AF +:1019F00060E08C2F0E949E0280E991E0F701208137 +:101A00002123B9F40197D1F780E090ECA9E7B4EC79 +:101A10008093740190937501A0937601B093770140 +:101A20008093780190937901A0937A01B0937B0120 +:101A300062C080E991E0F7012081212319F001972C +:101A4000D1F7E2CF88E2D82E00E8C12C80E991E0FE +:101A5000F7012081212319F40197D1F7D5CF0E94F6 +:101A6000E6034B015C0180E991E0F701208121232D +:101A700019F00197D1F7C8CF0E94E60368197909D8 +:101A80008A099B09693271058105910538F0EC2DB1 +:101A9000F0E0EC58FE4F8085802B8087069511F48E +:101AA000C39400E8DA94D110D1CF61E08C2F0E946A +:101AB0009E0261E08C2F0E94440260917C0170E0E4 +:101AC00090E080E00E94A81D6093740170937501FE +:101AD000809376019093770160917E0170E090E0B1 +:101AE00080E00E94A81D6093780170937901809333 +:101AF0007A0190937B018090780190907901A09079 +:101B00007A01B0907B01C0907401D0907501E09093 +:101B10007601F090770162E370E080E090E00E944F +:101B2000DE048091E702882359F00E94A30AC501D0 +:101B3000B4010E947F0A83E10E947A0A0E94A70CE6 +:101B40008091E8028823B9F00E94A30AC701B60178 +:101B50000E947F0A82E10E947A0ADF91CF911F9151 +:101B60000F91FF90EF90DF90CF90BF90AF909F903C +:101B70008F900C94A70CDF91CF911F910F91FF9044 +:101B8000EF90DF90CF90BF90AF909F908F9008958F +:101B9000CF92DF92EF92FF920F931F93CF93DF9339 +:101BA000EC016B01F42EE52E198218861F86188A27 +:101BB000198A1A8A81E08E878B871C8692E09D871E +:101BC00088838B01000F111F060F171F1D830C83C5 +:101BD000C8010E94AF209A878987009789F1A801E0 +:101BE00070E060E00E949A22DB82CA82FE82EF826D +:101BF0008981882341F061E08F2D0E949E0260E080 +:101C00008F2D0E9444028F2D9E2DFC01E556FF4F23 +:101C1000E491F0E0EE0FFF1FEF56FF4F2591349156 +:101C20003C8B2B8BFC01E155FF4FE491ED8BDF9159 +:101C3000CF911F910F91FF90EF90DF90CF9008957B +:101C40001D821C821B821A82D1CFFC01808191816E +:101C5000009711F00C944B2108950F931F93CF938D +:101C6000DF93EC0188819981009759F02A813B81AB +:101C70002617370730F081E0DF91CF911F910F9148 +:101C800008958B016F5F7F4F0E94D421009759F018 +:101C9000998388831B830A832C813D81232B59F7E9 +:101CA000FC011082E8CF80E0E7CFEF92FF920F9324 +:101CB0001F93CF93DF93EC017B018A01BA010E944D +:101CC0002D0E28813981811114C02115310519F09B +:101CD000C9010E944B21198218821D821C821B821D +:101CE0001A82CE01DF91CF911F910F91FF90EF905B +:101CF00008951D830C83B701C9010E94A122F1CF71 +:101D000050E040E063E771E080EE93E00C94550E04 +:101D100085ED8093BC008091090290910A02A09108 +:101D20000B02B0910C020796A11DB11D23E0B695E0 +:101D3000A795979587952A95D1F72091BC0024FD0A +:101D400003C01092520208954091090250910A0274 +:101D500060910B0270910C02452B462B472B69F3C7 +:101D60000097A105B10541F025E32A95F1F70000A0 +:101D70000197A109B109E1CF809108020C945605A1 +:101D80001F920F920FB60F9211242F933F934F93F0 +:101D90005F936F937F938F939F93AF93BF93EF93D3 +:101DA000FF938091840290918502A0918602B09168 +:101DB0008702892B8A2B8B2BD1F190917F02E091A6 +:101DC0008002F09181028081892780838091840242 +:101DD00090918502A0918602B0918702181619068B +:101DE0001A061B069CF48091840290918502A091B2 +:101DF0008602B09187020197A109B10980938402FC +:101E000090938502A0938602B0938702FF91EF9191 +:101E1000BF91AF919F918F917F916F915F914F9102 +:101E20003F912F910F900FBE0F901F9018958091AA +:101E300000010E947202EACF1F920F920FB60F921A +:101E400011242F933F934F935F936F937F938F93BF +:101E50009F93AF93BF93EF93FF9382E193E00E9430 +:101E60006301FF91EF91BF91AF919F918F917F910E +:101E70006F915F914F913F912F910F900FBE0F90F7 +:101E80001F9018951F920F920FB60F9211242F9347 +:101E90008F939F93EF93FF93E0912203F09123039D +:101EA0008081E0912803F091290382FD1BC090817D +:101EB00080912B038F5F8F7320912C03821741F049 +:101EC000E0912B03F0E0EE5EFC4F958F80932B03A7 +:101ED000FF91EF919F918F912F910F900FBE0F90D7 +:101EE0001F9018958081F4CF1F920F920FB60F921A +:101EF00011242F933F938F939F93AF93BF93809120 +:101F0000DE029091DF02A091E002B091E1023091F7 +:101F1000780223E0230F2D3758F50196A11DB11D3E +:101F2000209378028093DE029093DF02A093E00278 +:101F3000B093E1028091790290917A02A0917B02A4 +:101F4000B0917C020196A11DB11D809379029093FE +:101F50007A02A0937B02B0937C02BF91AF919F91D4 +:101F60008F913F912F910F900FBE0F901F9018955A +:101F700026E8230F0296A11DB11DD2CF1F920F920A +:101F80000FB60F9211242F933F934F935F936F934C +:101F90007F938F939F93AF93BF93EF93FF93809122 +:101FA000B900887F803609F44AC0F0F5883209F418 +:101FB000A7C018F5803109F49BC0B8F4882309F450 +:101FC000F9C0883009F494C0FF91EF91BF91AF91AF +:101FD0009F918F917F916F915F914F913F912F9141 +:101FE0000F900FBE0F901F901895883109F488C08C +:101FF000803251F78093510214C0803409F49DC09F +:1020000040F48033B9F38833F9F68093510285ECBC +:10201000B0C0803509F485C0883509F496C088348D +:1020200099F60E94880ED0CF883909F48CC038F513 +:10203000883729F050F4883611F0803729F683E08C +:10204000809352021092500257C0883809F47BC026 +:10205000803919F0803809F0B7CF80915002803272 +:1020600008F071C0E091500281E08E0F8093500221 +:102070008091BB00F0E0E05DFD4F80833DC0803B80 +:1020800039F0E0F4803A09F479C0883A09F09CCF3D +:1020900084E08093520210922F0210922E02E0915F +:1020A0000C03F0910D03099580912E0281110FC050 +:1020B00081E080932E0210920E0209C0803C09F448 +:1020C000A6CF883C09F4A3CF883B09F07DCFE091EF +:1020D0002F0281E08E0F80932F02F0E0E25FFD4F30 +:1020E00080818093BB0090912F0280912E0229C0A5 +:1020F000809177028093BB0085EC8093BC0064CF15 +:102100009091760280917502981758F5E0917602C9 +:1021100081E08E0F80937602F0E0EB5AFD4F8081D4 +:10212000E9CFE091760281E08E0F80937602809174 +:10213000BB00F0E0EB5AFD4F8083909176028091D6 +:1021400075029817C8F285E8D8CFE091760281E051 +:102150008E0F809376028091BB00F0E0EB5AFD4F2A +:1021600080838091540281115CCF81E0809353027F +:1021700084EA8093BC001092520226CF85EC8093B3 +:10218000BC001092520280915002803230F4E091F3 +:102190005002F0E0E05DFD4F10826091500270E06F +:1021A000E0910A03F0910B0380E392E0099510920D +:1021B00050020ACF1092510234CF1F920F920FB6E5 +:1021C0000F9211242F933F934F935F936F937F93BD +:1021D0008F939F93AF93BF93EF93FF93E091080387 +:1021E000F0910903309749F0A685B7858585968DCE +:1021F00091FF14C09C918923A1F4FF91EF91BF91AD +:10220000AF919F918F917F916F915F914F913F918E +:102210002F910F900FBE0F901F9018959C918923BE +:1022200061F7A389B4899C918589809589238C93D2 +:10223000868997890197F1F7608D718DA685B7859D +:10224000558538E020E0CB010197F1F7822F90E02F +:1022500095958795282F4C91452309F0206831509A +:1022600091F7868D81FD20958091070390E001967E +:102270008F73992730910603381799F0A0910703BF +:10228000B0E0A957BE4F2C9380930703828D938DA6 +:102290000197F1F7A389B4898C919589892B8C9347 +:1022A000ACCF868D8160868FF1CF1F920F920FB6D3 +:1022B0000F9211242F933F934F935F936F937F93CC +:1022C0008F939F93AF93BF93CF93DF93EF93FF933E +:1022D00080918501C091DF03D0E087FF24C0109278 +:1022E000850010928400809185018F5F8093850125 +:1022F00080918501082E000C990B8C179D0724F402 +:10230000809185018C30C4F180918400909185008A +:10231000049680349C4908F47AC08091840090919E +:102320008500049676C080918501082E000C990BDB +:102330008C179D07C4F6E09185018E2FEE0F990B47 +:10234000FC01EE0FFF1FE80FF91FE554FC4F8081E1 +:1023500086FFC9CFE09185018E2FEE0F990BFC010E +:10236000EE0FFF1FE80FF91FE554FC4F808160E07E +:102370008F730E944402B7CF209184003091850072 +:10238000E09185018E2FEE0F990BFC01EE0FFF1FE0 +:10239000E80FF91FE554FC4F81819281820F931F52 +:1023A0009093890080938800E09185018E2FEE0F35 +:1023B000990BFC01EE0FFF1FE80FF91FE554FC4FCE +:1023C000808186FF11C0E09185018E2FEE0F990B61 +:1023D000FC01EE0FFF1FE80FF91FE554FC4F808151 +:1023E00061E08F730E944402FF91EF91DF91CF91E2 +:1023F000BF91AF919F918F917F916F915F914F911D +:102400003F912F910F900FBE0F901F90189580E471 +:102410009CE990938900809388008FEF80938501D9 +:10242000E3CFCF92DF92EF92FF920F931F93E82FAB +:10243000F92F05C0015011092109310961F190817D +:1024400096239417B9F305C00150110921093109E8 +:1024500011F1908196239413F7CFC12CD12CE12C4C +:10246000F12C0AC08FEFC81AD80AE80AF80A0C152E +:102470001D052E053F0579F080818623841791F391 +:102480006C2D7D2D8E2D9F2D1F910F91FF90EF9024 +:10249000DF90CF90089560E070E080E090E01F91C1 +:1024A0000F91FF90EF90DF90CF9008951092150359 +:1024B0001092140388EE93E0A0E0B0E0809316033E +:1024C00090931703A0931803B093190323E331E00B +:1024D000309313032093120325EC30E030931F0355 +:1024E00020931E0324EC30E030932103209320033B +:1024F00020EC30E0309323032093220321EC30E0E2 +:10250000309325032093240322EC30E030932703FB +:102510002093260326EC30E03093290320932803F0 +:1025200010922B0310922C0310922D0310922E0365 +:102530001092B2031092B1038093B3039093B4034B +:10254000A093B503B093B60385E491E09093B003F4 +:102550008093AF03EFE2F4E02FEF48EB5BE0809174 +:10256000DF038C3008F0ECC091E0980F9093DF030C +:10257000808390E0DC01AA0FBB1FA80FB91FA554F0 +:10258000BC4F12965C934E931197339684E0E734D8 +:10259000F80729F78091DF038C3008F0D3C091E071 +:1025A000980F9093DF0380932C0490E0FC01EE0FD2 +:1025B000FF1FE80FF91FE554FC4F88EB9BE0928367 +:1025C000818347E050E060E470E086E194E00E949F +:1025D000C80D10920D0410920C0489E691E09093BE +:1025E0000B0480930A0487E280930E0480E18093B9 +:1025F000120482E0809313041092140488E0809304 +:1026000015041092EE031092ED0388EE93E0A0E023 +:10261000B0E08093EF039093F003A093F103B093A5 +:10262000F20387E591E09093EC038093EB03109223 +:1026300002041092010410920404109203041092F8 +:102640000604109205041092080410920704609189 +:1026500009046E7F6D7F609309046695617081E067 +:10266000682783E00E94440261E083E00E949E02AA +:10267000E2EBF0E0E491E093FB03EEE9F0E0E491BB +:10268000F0E0EE0FFF1FEF56FF4F8591949190936E +:10269000FD038093FC0360E082E00E949E02809133 +:1026A000090481FD04C061E082E00E94440282E0EE +:1026B0008093F703E1EBF0E0E491E093F803EDE9B8 +:1026C000F0E0E491F0E0EE0FFF1FE957FF4F859136 +:1026D00094919093FA038093F9038AE08093E60340 +:1026E00089E08093E70384E690E09093EA03809387 +:1026F000E90360E08AE00E949E0260E08091E703C7 +:102700000E949E0260E08091E6030E94440260E025 +:102710008091E7030E9444021092E1031092E003CB +:102720001092E3031092E2031092E5031092E40387 +:1027300050E040E063E771E080EE93E00C94550ECA +:10274000208323CF8FEF80932C043BCFCF93DF9355 +:10275000CDB7DEB7AE970FB6F894DEBF0FBECDBFD4 +:10276000789484B5826084BD84B5816084BD85B56C +:10277000826085BD85B5816085BD80916E00816078 +:1027800080936E001092810080918100826080931E +:102790008100809181008160809381008091800020 +:1027A0008160809380008091B10084608093B1004B +:1027B0008091B00081608093B00080917A00846045 +:1027C00080937A0080917A00826080937A00809171 +:1027D0007A00816080937A0080917A00806880938B +:1027E0007A001092C100E0912203F091230382E06D +:1027F0008083E0911E03F0911F031082E09120037B +:10280000F091210380E1808310922A03E091260356 +:10281000F091270386E08083E0912403F091250363 +:10282000808180618083E0912403F0912503808181 +:1028300088608083E0912403F09125038081806883 +:102840008083E0912403F091250380818F7D808334 +:102850000E94C00614E061E0812F0E949E0260E0A9 +:10286000812F0E9444021F5F1E30A9F70E94CF02F1 +:102870000E940B040E94950C68EC70E080E090E0F0 +:102880000E94DE04CE01429698A78FA382E193E0D6 +:102890000E944301892B09F43DC782E193E00E9425 +:1028A00043011816190694F782E193E00E94210172 +:1028B0009091D902853589F591112FC08091D80268 +:1028C0008F3F29F481E08093D7028093D9028091D1 +:1028D000D7028F5F8433C0F58093D7028091D902ED +:1028E0008823A1F28091D6028111D0CF8091D702A6 +:1028F000843060F21092D9028091A7020091A80260 +:10290000E02EF12C2091A602223009F4E1C00CF552 +:10291000213039F11092D702B9CF8093D802992390 +:10292000B1F2E091D702E23039F48093D602F0E0C0 +:10293000EE55FD4F8083CBCFE330C8F39091D602A4 +:1029400091509093D602F3CF1092D7021092D902F1 +:10295000C5CF233009F420C62430E1F60E94AF0C25 +:10296000D9CF873009F040C01091A902812F90E0A3 +:102970003091E902311129C02093E902F0920C0153 +:10298000E0920B0190930A0180930901F701EE0F89 +:10299000FF1FE651FD4F21E030E031832083880F97 +:1029A000991FFC01E651FD4F3183208361E0802FA8 +:1029B0000E949E0260E0812F0E949E0262E370E00E +:1029C00080E090E00E94DE04A5CF20910B013091C1 +:1029D0000C01E216F30691F62091090130910A01EB +:1029E0002817390759F696CF90E08231910581F486 +:1029F0002093E802F092A102E092A002F701EE0F0C +:102A0000FF1FE651FD4F81E090E09183808382CFEC +:102A10008331910519F42093E702ECCF89309105B9 +:102A200071F40E94C00660E082E00E949E028091E4 +:102A3000E60281116FCF81E08093E6026BCF0A97A7 +:102A400029F40E94C00661E083E0EFCF80910B0182 +:102A500090910C01E816F90639F0809109019091E6 +:102A60000A01E816F90691F41092E9021092DA02CE +:102A70001092DB021092DC021092DD02F701EE0FE1 +:102A8000FF1FE651FD4F1182108244CF92E0E916FC +:102A9000F10469F48BEE93E00E94AA061092E6021C +:102AA0000E94800E1092EF021092EE0233CFE3E00C +:102AB000EE16F10419F78BEE93E00E94AA0610922D +:102AC000E6020E94800E1092F1021092F00222CFD4 +:102AD00020910B0130910C01E216F30639F02091A0 +:102AE000090130910A01E216F30651F41092E9024D +:102AF0001092DA021092DB021092DC021092DD02D8 +:102B0000853109F428C30CF05FC0853009F4F8C0A2 +:102B10008CF4833009F4EAC00CF029C4813009F048 +:102B20001DCFC7010E9440086091A902802F0E941A +:102B3000440214CF8D3009F4FBC47CF4883009F0D2 +:102B40000DCF8FB7F8944091DE025091DF02609173 +:102B5000E0027091E1028FBF01CF8E3009F404C50D +:102B6000843109F0FBCEC7010E9440086091A902A0 +:102B700070E0A701CE0101960E94C80D86E1FE011A +:102B80003196A6E1B4E001900D928A95E1F78A852D +:102B90009B850E944B218F81988597FD03C060E043 +:102BA0000E949E020E94CF0210E000E020E040E080 +:102BB00060E0C8010E949F000F5F1F4F00341105A5 +:102BC000A9F70E940B04CACE8A3109F469C30CF537 +:102BD000873109F409C30CF4FDC2883109F418C324 +:102BE000893109F0BBCE8091A90290E09093040155 +:102BF000809303018091AB0290E090930601809353 +:102C000005018091AD0290E0909308018093070147 +:102C1000A5CE8C3109F420C30CF44AC3813211F1E2 +:102C20008B3309F09BCE8091B202877088608093CD +:102C3000E803D090B802E090BA02C090BC0202EA69 +:102C400012E0F12C0E5F1F4FCF1409F4F2C2F8010D +:102C5000828D89834F2D61E0CE0101960E9455033C +:102C6000F394F0CF0E940F0C0E94040C88E590E0D2 +:102C70000E94AF208C012091070130910801409102 +:102C800005015091060160910301709104010E94B9 +:102C9000490BF801EA5AFF4F8081918118161906F5 +:102CA0002CF470E060E0C8010E94240BC8010E946F +:102CB0004B2120E040E060E090E080E00E949F0037 +:102CC00020E040E060E081E090E00E949F0020E092 +:102CD00040E060E082E090E00E949F0020E040E061 +:102CE00060E083E090E00E949F006BCFC7010E94EC +:102CF00040086091A90270E0802F0E9489032ECEC7 +:102D0000C7010E9440088091A90280937D028091B2 +:102D1000AA0280937E0280917D0290917E029AA702 +:102D200089A78091AB0280937D028091AC02809351 +:102D30007E02E0917D02F0917E02FEA7EDA71E16B5 +:102D40001F060CF004C2809100010813CEC0E6E813 +:102D5000F0E0149117FD02CE61E0802F0E949E02E8 +:102D60001123B9F089A59AA52C01712C612C60E082 +:102D700072E18AE790E0A30192010E94C71E6901F7 +:102D80007A0191E0C91AD108E108F108123009F07E +:102D90009BC1E9A5FAA52F01712C612C60E072E1BD +:102DA0008AE790E0A3019F010E94C71E49015A01D2 +:102DB0007A016901F1E0CF1AD108E108F1082FEF9B +:102DC000C216D104E104F10409F00CF450C160E42E +:102DD00072E48FE090E0A30192010E94C71E690196 +:102DE0007A0181E0C81AD108E108F108123009F02F +:102DF000F4C082E09FEFC916D104E104F10409F0A8 +:102E00000CF46CC060E970ED83E090E0A3019201E6 +:102E10000E94C71E69017A01E1E0CE1AD108E108DB +:102E2000F10883E0FFEFCF16D104E104F10409F0CB +:102E30000CF454C068E478EE81E090E0A3019201C4 +:102E40000E94C71E69017A0191E0C91AD108E10800 +:102E5000F10884E0EFEFCE16D104E104F104F1F1C2 +:102E6000ECF164E274EF80E090E0A30192010E9433 +:102E7000C71E69017A0191E0C91AD108E108F10879 +:102E800085E09FEFC916D104E104F10439F130F176 +:102E900062E17AE780E090E0A30192010E94C71E00 +:102EA00069017A01F1E0CF1AD108E108F10886E062 +:102EB0002FEFC216D104E104F10481F078F075011E +:102EC00064019AE0F594E794D794C7949A95D1F762 +:102ED00081E0C81AD108E108F10887E09091B100BB +:102EE000987F892B8093B100C9C08F3F09F036CD00 +:102EF00000930001E6E8F0E014911F3F09F42ECDA5 +:102F0000113031F150F0123009F442C017FD26CDD6 +:102F100061E0802F0E949E0225CF14BC15BC84B5B1 +:102F2000826084BD85B5816085BDF701E556FF4FA0 +:102F3000E491F0E0EE0FFF1FEF56FF4F8591949163 +:102F4000F701E155FF4FE491E093830210E004CFD5 +:102F5000109280001092810080918100886080939F +:102F6000810080918100816080938100F701E556A6 +:102F7000FF4FE491F0E0EE0FFF1FEF56FF4F8591FA +:102F80009491F701E155FF4FE491E0938202E4CE82 +:102F90001092B0001092B1008091B00082608093D6 +:102FA000B0008091B10081608093B100F701E556D7 +:102FB000FF4FE491F0E0EE0FFF1FEF56FF4F8591BA +:102FC00094919093810280938002F701E155FF4F25 +:102FD000E491E0937F0212E0BFCE2FEFC216D1043E +:102FE000E104F10409F00CF46DC068E478EE81E0CE +:102FF00090E0A30192010E94C71E69017A0181E05D +:10300000C81AD108E108F10884E011113ACF8FEF16 +:10301000C816D104E104F10409F014F483E02AC0D5 +:1030200062E17AE780E090E0A30192010E94C71E6E +:1030300069017A01E1E0CE1AD108E108F10884E0E3 +:10304000FFEFCF16D104E104F104A1F098F075016F +:1030500064012AE0F594E794D794C7942A95D1F7B0 +:1030600021E0C21AD108E108F10885E003C081E03F +:10307000111134CF95B5987F892B85BD29A53AA527 +:10308000220F331FADA5BEA50E94A22028EE33E07B +:1030900040E050E00E94281F1130B9F1123009F4CD +:1030A00046C011115BCCC7BC20938C0230938D02BB +:1030B00040938E0250938F0280916E0082608093C5 +:1030C0006E004CCC82E0D4CF91E0C114D10421E059 +:1030D000E206F10484F068E478EE81E090E0A30178 +:1030E00092010E94C71E69017A0181E0C81AD108C5 +:1030F000E108F10893E0113009F0C0CF8091810020 +:10310000887F892B80938100B9CFD0928900C092AB +:103110008800209388023093890240938A0250935A +:103120008B0280916F00826080936F0017CCC092F9 +:10313000B30020938402309385024093860250931B +:1031400087028091700082608093700007CC802F8E +:103150000E94720203CC8091A902FF24F394F80E1E +:1031600020911E04F21609F4F9CB00911F0410916E +:103170002004215070E060E061F08F3FF1F430E016 +:1031800050E040E06FEF7FEF80E090E00E94C71ECC +:10319000B901F80140911A0450911B04CF01801B22 +:1031A000910B8417950798F44081469FC001479F73 +:1031B000900D112490833196EDCF8F2D90E0982FB4 +:1031C00088270197622F70E00E947A20E2CFF09268 +:1031D0001E04C4CB8091A9022091AF024091AD02A0 +:1031E0006091AB0290E07FCDF090A902E090AB023D +:1031F000D090AD0210E000E02D2D4E2D6F2DC801B6 +:103200000E949F000F5F1F4F00341105A9F7D9CC12 +:10321000C7010E94400810E000E020E040E060E0CC +:10322000C8010E949F000F5F1F4F00341105A9F7CE +:10323000C8CC6E2D70E090E080E00E94DE04D110DA +:10324000D2CC19821A821B821C8240E064E0CE013B +:1032500001960E945503C7CC88E590E00E94AF20FC +:103260008C01209107013091080140910501509196 +:10327000060160910301709104010E94490BF8015D +:10328000EA5AFF4F80819181181619062CF470E0DC +:1032900060E0C8010E94240BC8010E944B215ECB54 +:1032A0008091A90290E0909302018093010156CB96 +:1032B00088E590E00E94AF208C01209107013091B9 +:1032C0000801409105015091060160910301709140 +:1032D00004010E94490B6801F6E5CF0ED11CF601EE +:1032E00080819181181619063CF421E04CE070E0D1 +:1032F00060E0C8010E94A90A2091010130910201F9 +:10330000F60180819181181619064CF4203131059F +:1033100030F44AE070E060E0C8010E94A90A88E049 +:10332000E3E1F1E0DE01119601900D928A95E1F75B +:10333000CE0101965C01780199249394F5012191C5 +:103340005F01F601808191811816190644F4F70196 +:10335000208B492D70E060E0C8010E94A90AFFEFB0 +:10336000EF1AFF0A939429E09212E8CF95CFC70194 +:103370000E944008C090A90284EB8C1508F4EECAA4 +:10338000E0E9F2E090E080E021913191E216F3066D +:1033900051F0232B09F0C4C0FC01EE0FFF1FE057D2 +:1033A000FD4FF182E082FC01EE0FFF1FE80FF91FD5 +:1033B000E15DFB4F80812181928180932C042093D9 +:1033C0002D0490932E048C3008F053C061E0802FC0 +:1033D0000E949E0280912C04282F30E0F901EE0F0C +:1033E000FF1FE20FF31FE554FC4F902F9F730081E6 +:1033F000007C092B008310922D0410922E042CE0E7 +:10340000622F0E946E20829FB001112430E020E0E4 +:10341000AB01420F531FFA01EE0FFF1FE40FF51F20 +:10342000E554FC4F908196FD16C02F5F3F4F2C3026 +:10343000310571F781110FC01092800082E08093F6 +:1034400081001092850010928400B19A80916F00E3 +:10345000826080936F00E0912C048E2F90E0FC013D +:10346000EE0FFF1FE80FF91FE554FC4F80818064C9 +:103470008083D0902C0480912E04B8E5EB2EB2E02E +:10348000FB2EE81AF10887FDF394EE0CFF1CEE0CFE +:10349000FF1C80912D0408E810E0081B110987FD2E +:1034A0001395000F111F000F111F4801012E000C72 +:1034B000AA08BB0897010F2C000C440B550B2819C8 +:1034C00039094A095B09AC2DB0E00E94E61E24EBE5 +:1034D00030E040E050E00E94C71E820E931EA41E02 +:1034E000B51EEBE0ED1508F439CA801691062CF0F4 +:1034F00087018E149F040CF4840102501109000FFF +:10350000111F2FB7F8948D2D90E0FC01EE0FFF1FD7 +:10351000E80FF91FE554FC4F128301832FBF1ECA29 +:1035200001968830910509F02FCF90E080E03BCFE5 +:10353000C7010E9451086AE070E080E090E00E94BC +:10354000DE04C7010E9451086AE070E080E090E06C +:103550000E94DE04C7010E9451086AE070E080E02A +:1035600090E00E94DE04FAC9E090A902F090AB025C +:10357000D090AD020091AF0210E08E2D90E00E943D +:1035800040088F2D90E00E9440086D2D8E2D0E94E6 +:103590004402B8018F2DB1CB8B3089F134F48A30DD +:1035A00009F49CC00E94AF0CD9C98C3029F181313B +:1035B000C9F78091AD029091AB022091A9021092BF +:1035C0000D0410920C04211115C027E220930E0463 +:1035D00010920F0410921004109211049093120490 +:1035E000809313041092140488E0809315040E94C1 +:1035F000950CD8CF2FE3EACF0E94040CD3CFB09024 +:10360000A902A090AB020091AD0210E01AA219A28B +:103610001CA21BA21EA21DA250E040E063E771E0C5 +:10362000CE0181960E94550EEFEACE2EE2E0DE2E0C +:10363000035F1F4FC601825A924080179107FCF426 +:10364000F60181916F0189831A82EDA0FEA0FFEF40 +:10365000EF1AFF0AB701CE0181960E942D0E882332 +:1036600049F329A13AA18DA19EA1BE016F5F7F4FB1 +:10367000820F931F0E94A122FEA2EDA2DBCF88E061 +:10368000EBE1F1E0DE01119601900D928A95E1F7F0 +:10369000809113048B1518F4BB24BA94B80EEB2D4B +:1036A000F0E0EE0FFF1F81E090E08C0F9D1FE80F10 +:1036B000F91F60816A0D606840E08AE094E00E9432 +:1036C000ED0B4DA15EA169A17AA18AE094E00E9470 +:1036D000E500CE0181960E94250E64CFA2EAB2E0F9 +:1036E000FE013196BF0117968C9117978193129620 +:1036F0008FA198A5E817F907B1F7FB010190002009 +:10370000E9F73197AF01461B570B8BEE93E00E9410 +:10371000E50048CF8BEE93E00E9471067C01892B77 +:1037200071F18BEE93E00E9471061816190694F75A +:103730008BEE93E00E94890689831A820091E4034C +:103740001091E5030F5F1F4FB80180EE93E00E94D8 +:103750002D0E8823F9F22091E0033091E10380914E +:10376000E4039091E503BE016F5F7F4F820F931FCB +:103770000E94A1221093E5030093E403CBCF6FE0F6 +:1037800070E080E090E00E94DE0402EF12E064E06E +:10379000D62EF801819191918F01892BD9F460E0A7 +:1037A0008D2D0E949E020E94A30A8D2D0E941B0255 +:1037B000BC01990F880B990B0E94AA1D0E947F0AD9 +:1037C0008D2D0E947A0A81E00E947A0A0E94A70C3D +:1037D0000E94AF0CD394FEE0DF12DBCF53E2A52EA4 +:1037E00051E0B52E10E0F501819191915F01892B97 +:1037F00009F060C044E1C42ED12C55245394012F0C +:10380000006400937C0080917A00806480937A0049 +:1038100080917A0086FDFCCF8091780060917900DC +:10382000762F682F072E000C880B990B0E94AA1D7B +:103830003B014C01552019F06BA77CA61C012DEC17 +:103840003CEC4CEC5DE36BA57CA5C1010E94091E1C +:103850001B012C0126E636E646E65FE3B301C40110 +:103860000E94091E9B01AC01C201B1010E945A1FB6 +:103870006BA77CA71C01F1E0CF1AD108512C09F0ED +:10388000C0CF0E94A30A6BA57CA5C1010E9438206D +:10389000072E000C880B990B0E94AA1D0E947F0A1C +:1038A000812F0E947A0A82E00E947A0A0E94A70C65 +:1038B0000E94AF0C1F5F163009F095CF8091E9028E +:1038C000882309F46FC010910B0160E0812F0E94E2 +:1038D000440283E090E00197F1F761E0812F0E94BC +:1038E000440283E290E00197F1F760E0812F0E94AB +:1038F00044028091090190910A019927FC01E15548 +:10390000FF4F6491FC01E556FF4FE491F0E0EE0FAC +:10391000FF1FE957FF4F8591949100E315E720E0E1 +:1039200030E0462F0E941112611571058105910545 +:1039300029F06F5F7F4F8F4F9F4F9F700E94A81D90 +:1039400020E030E048EE51E40E94C61F20E030E065 +:1039500040E05FE30E94091E4B015C0120E030E083 +:10396000A9010E94A31D811185C08090DA02909068 +:10397000DB02A090DC02B090DD020E94A30AC50128 +:10398000B4010E947F0A80910B010E947A0A809103 +:1039900009010E947A0A87E00E947A0A0E94A70C15 +:1039A0000E94AF0C8091E802882321F00E94B70C9E +:1039B0000E94AF0C8091E702882321F00E94B70C8F +:1039C0000E94AF0C8091E602882309F482C02FB7D1 +:1039D000F8948091DE029091DF02A091E002B09114 +:1039E000E1022FBF4091E2025091E3026091E402B4 +:1039F0007091E502841B950BA60BB70B8C3291409E +:103A0000A105B10508F065C00E94A30A1A821982B7 +:103A10001C821B821E821D826091E0037091E10373 +:103A20006115710541F04091E4035091E503CE0129 +:103A300001960E94550EDD800D2D1E8184E00E94AE +:103A40007A0A8D2D0E947A0AE016F106F4F48D812F +:103A50009E81E816F906B8F489819A81009799F059 +:103A60008E0D9F1DFC0180810E947A0AFFEFEF1AE4 +:103A7000FF0AEACF8092DA029092DB02A092DC0287 +:103A8000B092DD027ACF80E0EFCFCE0101960E94A6 +:103A9000250E82E00E947A0A89E00E947A0A0E943A +:103AA000A70C0E94AF0C6AE070E080E090E00E94FA +:103AB000DE0480E090E0892B11F40C9442140E9403 +:103AC0004F01882311F40C9442140E9400000C94BE +:103AD000421450E040E063E771E080EE93E00E9422 +:103AE000550E2FB7F8948091DE029091DF02A091DD +:103AF000E002B091E1022FBF8093E2029093E302D3 +:103B0000A093E402B093E502CECF80EE93E00E9452 +:103B1000250E87E591E09093EC038093EB038BEE09 +:103B200093E00E94AA0680911F04909120040E94B5 +:103B30004B2180911C0490911D0497FD03C060E00F +:103B40000C949E0208950E94E51D08F481E00895FA +:103B5000E89409C097FB3EF4909580957095619527 +:103B60007F4F8F4F9F4F9923A9F0F92F96E9BB27DD +:103B70009395F695879577956795B795F111F8CF59 +:103B8000FAF4BB0F11F460FF1BC06F5F7F4F8F4FC4 +:103B90009F4F16C0882311F096E911C0772321F0BA +:103BA0009EE8872F762F05C0662371F096E8862F52 +:103BB00070E060E02AF09A95660F771F881FDAF7A9 +:103BC000880F9695879597F90895990F0008550FD6 +:103BD000AA0BE0E8FEEF16161706E807F907C0F093 +:103BE00012161306E407F50798F0621B730B840B9B +:103BF000950B39F40A2661F0232B242B252B21F475 +:103C000008950A2609F4A140A6958FEF811D811D14 +:103C100008950E941C1E0C948D1E0E947F1E38F079 +:103C20000E94861E20F0952311F00C94761E0C94B1 +:103C30007C1E11240C94C11E0E949E1E70F3959F41 +:103C4000C1F3950F50E0551F629FF001729FBB2793 +:103C5000F00DB11D639FAA27F00DB11DAA1F649F2F +:103C60006627B00DA11D661F829F2227B00DA11DE2 +:103C7000621F739FB00DA11D621F839FA00D611D68 +:103C8000221F749F3327A00D611D231F849F600D89 +:103C9000211D822F762F6A2F11249F5750409AF0B2 +:103CA000F1F088234AF0EE0FFF1FBB1F661F771F3E +:103CB000881F91505040A9F79E3F510580F00C9409 +:103CC000761E0C94C11E5F3FE4F3983ED4F38695B4 +:103CD00077956795B795F795E7959F5FC1F7FE2BA9 +:103CE000880F911D9695879597F9089597F99F6785 +:103CF00080E870E060E008959FEF80EC0895002474 +:103D00000A941616170618060906089500240A9440 +:103D100012161306140605060895092E0394000CC6 +:103D200011F4882352F0BB0F40F4BF2B11F460FF55 +:103D300004C06F5F7F4F8F4F9F4F089557FD90587E +:103D4000440F551F59F05F3F71F04795880F97FB5F +:103D5000991F61F09F3F79F0879508951216130619 +:103D60001406551FF2CF4695F1DF08C01616170648 +:103D70001806991FF1CF869571056105089408957D +:103D8000E894BB2766277727CB0197F90895052E7E +:103D900097FB1EF400940E94DE1E57FD07D00E9480 +:103DA000281F07FC03D04EF40C94DE1E509540955E +:103DB000309521953F4F4F4F5F4F089590958095D7 +:103DC000709561957F4F8F4F9F4F08950E944A1FB6 +:103DD000A59F900DB49F900DA49F800D911D11245F +:103DE00008952F923F924F925F926F927F928F929F +:103DF0009F92AF92BF92CF92DF92EF92FF920F937A +:103E00001F93CF93DF93CDB7DEB7CA1BDB0B0FB683 +:103E1000F894DEBF0FBECDBF09942A883988488840 +:103E20005F846E847D848C849B84AA84B984C884D6 +:103E3000DF80EE80FD800C811B81AA81B981CE0FCD +:103E4000D11D0FB6F894DEBF0FBECDBFED010895B2 +:103E5000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F8E +:103E6000EE1FFF1FA217B307E407F50720F0A21B00 +:103E7000B30BE40BF50B661F771F881F991F1A946D +:103E800069F760957095809590959B01AC01BD0197 +:103E9000CF010895A29FB001B39FC001A39F700DF1 +:103EA000811D1124911DB29F700D811D1124911D42 +:103EB00008955058BB27AA270E94711F0C948D1E8D +:103EC0000E947F1E38F00E94861E20F039F49F3F2A +:103ED00019F426F40C947C1E0EF4E095E7FB0C9488 +:103EE000761EE92F0E949E1E58F3BA1762077307C9 +:103EF0008407950720F079F4A6F50C94C01E0EF403 +:103F0000E0950B2EBA2FA02D0B01B90190010C01E9 +:103F1000CA01A0011124FF27591B99F0593F50F401 +:103F2000503E68F11A16F040A22F232F342F442759 +:103F3000585FF3CF469537952795A795F040539551 +:103F4000C9F77EF41F16BA0B620B730B840BBAF021 +:103F50009150A1F0FF0FBB1F661F771F881FC2F78C +:103F60000EC0BA0F621F731F841F48F487957795A0 +:103F70006795B795F7959E3F08F0B0CF9395880F5A +:103F800008F09927EE0F9795879508950E94DA1FFC +:103F90000C948D1E0E94861E58F00E947F1E40F0D9 +:103FA00029F45F3F29F00C94761E51110C94C11E28 +:103FB0000C947C1E0E949E1E68F39923B1F3552336 +:103FC00091F3951B550BBB27AA276217730784072C +:103FD00038F09F5F5F4F220F331F441FAA1FA9F3C2 +:103FE00035D00E2E3AF0E0E832D091505040E695B0 +:103FF000001CCAF72BD0FE2F29D0660F771F881F11 +:10400000BB1F261737074807AB07B0E809F0BB0B03 +:10401000802DBF01FF2793585F4F3AF09E3F510517 +:1040200078F00C94761E0C94C11E5F3FE4F3983E2A +:10403000D4F3869577956795B795F7959F5FC9F700 +:10404000880F911D9695879597F90895E1E0660F81 +:10405000771F881FBB1F621773078407BA0720F0FA +:10406000621B730B840BBA0BEE1F88F7E095089563 +:104070000E943F206894B1110C94C11E08950E94C3 +:10408000A61E88F09F5798F0B92F9927B751B0F026 +:10409000E1F0660F771F881F991F1AF0BA95C9F7CC +:1040A00014C0B13091F00E94C01EB1E008950C948C +:1040B000C01E672F782F8827B85F39F0B93FCCF33F +:1040C000869577956795B395D9F73EF49095809549 +:1040D000709561957F4F8F4F9F4F0895991B79E0A1 +:1040E00004C0991F961708F0961B881F7A95C9F788 +:1040F00080950895AA1BBB1B51E107C0AA1FBB1FD7 +:10410000A617B70710F0A61BB70B881F991F5A9563 +:10411000A9F780959095BC01CD01089597FB072ED6 +:1041200016F4009407D077FD09D00E947A2007FC8E +:1041300005D03EF4909581959F4F089570956195B7 +:104140007F4F08950E944A1FB7FF0895821B930B6B +:104150000895EE0FFF1F0590F491E02D09940F9341 +:104160001F93CF93DF938230910510F482E090E0AB +:10417000E0914904F0914A0430E020E0B0E0A0E092 +:10418000309799F42115310509F44AC0281B390BE1 +:1041900024303105D8F58A819B816115710589F13B +:1041A000FB0193838283FE0111C040815181028112 +:1041B000138148175907E0F04817590799F41097E9 +:1041C00061F012960C93129713961C933296CF01BE +:1041D000DF91CF911F910F9108950093490410939F +:1041E0004A04F4CF2115310551F04217530738F036 +:1041F000A901DB019A01BD01DF01F801C1CFEF0187 +:10420000F9CF90934A0480934904CDCFFE01E20F89 +:10421000F31F819391932250310939832883D7CF9B +:104220002091470430914804232B41F420910F0141 +:1042300030911001309348042093470420910D01E0 +:1042400030910E012115310541F42DB73EB7409153 +:10425000110150911201241B350BE0914704F0919C +:104260004804E217F307A0F42E1B3F0B2817390769 +:1042700078F0AC014E5F5F4F2417350748F04E0FC2 +:104280005F1F5093480440934704819391939FCFBD +:10429000F0E0E0E09CCFCF93DF930097E9F0FC01E2 +:1042A000329713821282A0914904B0914A04ED0121 +:1042B00030E020E01097A1F420813181820F931F1C +:1042C00020914704309148042817390709F061C04C +:1042D000F0934804E0934704DF91CF910895EA01F9 +:1042E000CE17DF07E8F54A815B819E014115510534 +:1042F000B1F7E901FB83EA8349915991C40FD51FB6 +:10430000EC17FD0761F4808191810296840F951F5F +:10431000E90199838883828193819B838A83F0E07A +:10432000E0E012968D919C9113970097B9F52D912D +:104330003C911197CD010296820F931F2091470463 +:10434000309148042817390739F6309751F5109203 +:104350004A0410924904B0934804A0934704BCCF88 +:10436000D383C28340815181840F951FC817D90719 +:1043700061F44E5F5F4F88819981480F591F5183C7 +:1043800040838A819B81938382832115310509F0C3 +:10439000B0CFF0934A04E09349049ECFFD01DC01C5 +:1043A000C0CF13821282D7CFB0E0A0E0EAEDF1E2F5 +:1043B0000C94F31E8C01009751F4CB010E94AF20A6 +:1043C0008C01C801CDB7DEB7E0E10C940F1FFC01F2 +:1043D000E60FF71F9C0122503109E217F30708F49A +:1043E0009DC0D901CD91DC911197C617D70798F0E0 +:1043F000C530D10530F3CE0104978617970708F32F +:10440000C61BD70B2297C193D1936D937C93CF0199 +:104410000E944B21D6CF5B01AC1ABD0A4C018C0E19 +:104420009D1EA0914904B0914A04512C412CF12CBD +:10443000E12C109731F5809147049091480488153C +:10444000990509F05CC04616570608F058C08091DF +:104450000D0190910E01009741F48DB79EB74091E8 +:10446000110150911201841B950BE817F90708F010 +:1044700055C0F0934804E0934704F90171836083C9 +:10448000A0CF8D919C91119712966C9012971396D4 +:104490007C901397A815B90559F56C0142E0C40E3C +:1044A000D11CCA14DB0420F1AC014A195B09DA0102 +:1044B0001296159780F06282738251834083D901EE +:1044C0006D937C93E114F10471F0D7011396FC9382 +:1044D000EE93129776CF22968C0F9D1FF901918350 +:1044E0008083F301EFCFF0934A04E093490469CF4E +:1044F0004816590608F42C017D01D3019ACFCB014F +:104500000E94AF207C01009749F0AE01B8010E94E3 +:104510009122C8010E944B21870153CF10E000E097 +:1045200050CFFB01DC0102C001900D924150504080 +:10453000D8F70895DC0101C06D9341505040E0F779 +:104540000895FB01DC0101900D920020E1F7089530 +:1045500010E0C3E6D0E004C0FE010E94A92021962D +:0A456000C436D107C9F7F894FFCF65 +:10456A00FF08000C000B000A000C000D0000004BB5 +:10457A0004800081C3A5A991A5C38100004000144D +:10458A0000540000000000000000000000000000CD +:10459A000000008501E5001201D201430121013525 +:1045AA000100000000CE05A1053D0877059A0587A0 +:1045BA00057805000000001506E5003D087705713D +:1045CA00068906FD0500000000A10CE5003D083C37 +:0445DA00080D0A00BE :00000001FF diff --git a/app/modules/KKMOO.js b/app/modules/KKMOO.js index ba600a218d..ec6cbb450c 100644 --- a/app/modules/KKMOO.js +++ b/app/modules/KKMOO.js @@ -7,13 +7,13 @@ class KKMOO extends BaseModule { super(); this.sendToEntry = ""; - this.receiveData = ""; + this.receiveData; this.isReceived = false; this.isPlaying = false; this.isPlaying_old = false; this.cmdProc = ""; this.sendBuffer = []; - this.test; + this.test = 0; // ... } /* @@ -36,14 +36,15 @@ class KKMOO extends BaseModule { 이 두 함수가 정의되어있어야 로직이 동작합니다. 필요없으면 작성하지 않아도 됩니다. */ requestInitialData(sp) { - this.isConnect = true; - if (!this.sp) { - this.sp = sp; + if (!this.isConnect) { + this.isConnect = true; + if (!this.sp) { + this.sp = sp; + } + const initTX = Buffer.from("^ET"); + sp.write(initTX); } - const initTX = Buffer.from("^ET"); - sp.write(initTX); return null; - } @@ -63,12 +64,11 @@ class KKMOO extends BaseModule { } } requestRemoteData(handler) { - if(this.isPlaying != this.isPlaying_old){ + handler.write("data",this.isPlaying); + /*if(this.isPlaying != this.isPlaying_old){ this.isPlaying_old = this.isPlaying; - handler.write("data",this.isPlaying); - //console.log(this.isPlaying); - - } + handler.write("data",this.isPlaying); + }*/ } // 엔트리에서 받은 데이터에 대한 처리 @@ -79,7 +79,6 @@ class KKMOO extends BaseModule { else{ this.receiveData = null; } - //console.log(handler); } requestLocalData(){ @@ -101,7 +100,8 @@ class KKMOO extends BaseModule { var cmd = "^AN"+msg; this.sp.write(Buffer.from(cmd)); - //console.log(cmd); + this.sp.flush() + console.log(cmd); break; case "IR": @@ -144,7 +144,7 @@ class KKMOO extends BaseModule { break; } } - + this.receiveData = null; } disconnect(connect){ @@ -153,6 +153,7 @@ class KKMOO extends BaseModule { setTimeout(()=>{ connect.close(); },500); + this.isConnect = false; } lostController() { } diff --git a/app/modules/bridge.js b/app/modules/bridge.js new file mode 100644 index 0000000000..6b8f9a3c17 --- /dev/null +++ b/app/modules/bridge.js @@ -0,0 +1,441 @@ +function Module() { + this.sp = null; + this.sensorTypes = { + ALIVE: 0, + DIGITAL: 1, + ANALOG: 2, + PWM: 3, + SERVO_PIN: 4, + TONE: 5, + PULSEIN: 6, + ULTRASONIC: 7, + TIMER: 8, + }; + + this.actionTypes = { + GET: 1, + SET: 2, + RESET: 3, + }; + + this.sensorValueSize = { + FLOAT: 2, + SHORT: 3, + }; + + this.digitalPortTimeList = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + + this.sensorData = { + ULTRASONIC: 0, + DIGITAL: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + '6': 0, + '7': 0, + '8': 0, + '9': 0, + '10': 0, + '11': 0, + '12': 0, + '13': 0, + }, + ANALOG: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + }, + PULSEIN: {}, + TIMER: 0, + }; + + this.defaultOutput = {}; + + this.recentCheckData = {}; + + this.sendBuffers = []; + + this.lastTime = 0; + this.lastSendTime = 0; + this.isDraing = false; +} + +var sensorIdx = 0; + +Module.prototype.init = function(handler, config) {}; + +Module.prototype.setSerialPort = function(sp) { + var self = this; + this.sp = sp; +}; + +Module.prototype.requestInitialData = function() { + return this.makeSensorReadBuffer(this.sensorTypes.ANALOG, 0); +}; + +Module.prototype.checkInitialData = function(data, config) { + return true; + // 이후에 체크 로직 개선되면 처리 + // var datas = this.getDataByBuffer(data); + // var isValidData = datas.some(function (data) { + // return (data.length > 4 && data[0] === 255 && data[1] === 85); + // }); + // return isValidData; +}; + +Module.prototype.afterConnect = function(that, cb) { + that.connected = true; + if (cb) { + cb('connected'); + } +}; + +Module.prototype.validateLocalData = function(data) { + return true; +}; + +Module.prototype.requestRemoteData = function(handler) { + var self = this; + if (!self.sensorData) { + return; + } + Object.keys(this.sensorData).forEach(function(key) { + if (self.sensorData[key] != undefined) { + handler.write(key, self.sensorData[key]); + } + }); +}; + +Module.prototype.handleRemoteData = function(handler) { + var self = this; + var getDatas = handler.read('GET'); + var setDatas = handler.read('SET') || this.defaultOutput; + var time = handler.read('TIME'); + var buffer = new Buffer([]); + + if (getDatas) { + var keys = Object.keys(getDatas); + keys.forEach(function(key) { + var isSend = false; + var dataObj = getDatas[key]; + if ( + typeof dataObj.port === 'string' || + typeof dataObj.port === 'number' + ) { + var time = self.digitalPortTimeList[dataObj.port]; + if (dataObj.time > time) { + isSend = true; + self.digitalPortTimeList[dataObj.port] = dataObj.time; + } + } else if (Array.isArray(dataObj.port)) { + isSend = dataObj.port.every(function(port) { + var time = self.digitalPortTimeList[port]; + return dataObj.time > time; + }); + + if (isSend) { + dataObj.port.forEach(function(port) { + self.digitalPortTimeList[port] = dataObj.time; + }); + } + } + + if (isSend) { + if (!self.isRecentData(dataObj.port, key, dataObj.data)) { + self.recentCheckData[dataObj.port] = { + type: key, + data: dataObj.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeSensorReadBuffer( + key, + dataObj.port, + dataObj.data + ), + ]); + } + } + }); + } + + if (setDatas) { + var setKeys = Object.keys(setDatas); + setKeys.forEach(function(port) { + var data = setDatas[port]; + if (data) { + if (self.digitalPortTimeList[port] < data.time) { + self.digitalPortTimeList[port] = data.time; + + if (!self.isRecentData(port, data.type, data.data)) { + self.recentCheckData[port] = { + type: data.type, + data: data.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeOutputBuffer(data.type, port, data.data), + ]); + } + } + } + }); + } + + if (buffer.length) { + this.sendBuffers.push(buffer); + } +}; + +Module.prototype.isRecentData = function(port, type, data) { + var that = this; + var isRecent = false; + + if(type == this.sensorTypes.ULTRASONIC) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if(key === portString) { + + } + if(key !== portString && recent.type == that.sensorTypes.ULTRASONIC) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } else { + isRecent = true; + } + + } else if (port in this.recentCheckData && type != this.sensorTypes.TONE) { + if ( + this.recentCheckData[port].type === type && + this.recentCheckData[port].data === data + ) { + isRecent = true; + } + } + + return isRecent; +}; + +Module.prototype.requestLocalData = function() { + var self = this; + + if (!this.isDraing && this.sendBuffers.length > 0) { + this.isDraing = true; + this.sp.write(this.sendBuffers.shift(), function() { + if (self.sp) { + self.sp.drain(function() { + self.isDraing = false; + }); + } + }); + } + + return null; +}; + +/* +ff 55 idx size data a +*/ +Module.prototype.handleLocalData = function(data) { + var self = this; + var datas = this.getDataByBuffer(data); + + datas.forEach(function(data) { + if (data.length <= 4 || data[0] !== 255 || data[1] !== 85) { + return; + } + var readData = data.subarray(2, data.length); + var value; + switch (readData[0]) { + case self.sensorValueSize.FLOAT: { + value = new Buffer(readData.subarray(1, 5)).readFloatLE(); + value = Math.round(value * 100) / 100; + break; + } + case self.sensorValueSize.SHORT: { + value = new Buffer(readData.subarray(1, 3)).readInt16LE(); + break; + } + default: { + value = 0; + break; + } + } + + var type = readData[readData.length - 1]; + var port = readData[readData.length - 2]; + + switch (type) { + case self.sensorTypes.DIGITAL: { + self.sensorData.DIGITAL[port] = value; + break; + } + case self.sensorTypes.ANALOG: { + self.sensorData.ANALOG[port] = value; + break; + } + case self.sensorTypes.PULSEIN: { + self.sensorData.PULSEIN[port] = value; + break; + } + case self.sensorTypes.ULTRASONIC: { + self.sensorData.ULTRASONIC = value; + break; + } + case self.sensorTypes.TIMER: { + self.sensorData.TIMER = value; + break; + } + default: { + break; + } + } + }); +}; + +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ + +Module.prototype.makeSensorReadBuffer = function(device, port, data) { + var buffer; + var dummy = new Buffer([10]); + if (device == this.sensorTypes.ULTRASONIC) { + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.GET, + device, + port[0], + port[1], + 10, + ]); + } else if (!data) { + buffer = new Buffer([ + 255, + 85, + 5, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } else { + value = new Buffer(2); + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 7, + sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + } + sensorIdx++; + if (sensorIdx > 254) { + sensorIdx = 0; + } + + return buffer; +}; + +//0xff 0x55 0x6 0x0 0x1 0xa 0x9 0x0 0x0 0xa +Module.prototype.makeOutputBuffer = function(device, port, data) { + var buffer; + var value = new Buffer(2); + var dummy = new Buffer([10]); + switch (device) { + case this.sensorTypes.SERVO_PIN: + case this.sensorTypes.DIGITAL: + case this.sensorTypes.PWM: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 6, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + break; + } + case this.sensorTypes.TONE: { + var time = new Buffer(2); + if ($.isPlainObject(data)) { + value.writeInt16LE(data.value); + time.writeInt16LE(data.duration); + } else { + value.writeInt16LE(0); + time.writeInt16LE(0); + } + buffer = new Buffer([ + 255, + 85, + 8, + sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, time, dummy]); + break; + } + case this.sensorTypes.TONE: { + } + } + + return buffer; +}; + +Module.prototype.getDataByBuffer = function(buffer) { + var datas = []; + var lastIndex = 0; + buffer.forEach(function(value, idx) { + if (value == 13 && buffer[idx + 1] == 10) { + datas.push(buffer.subarray(lastIndex, idx)); + lastIndex = idx + 2; + } + }); + + return datas; +}; + +Module.prototype.disconnect = function(connect) { + var self = this; + connect.close(); + if (self.sp) { + delete self.sp; + } +}; + +Module.prototype.reset = function() { + this.lastTime = 0; + this.lastSendTime = 0; + + this.sensorData.PULSEIN = {}; +}; + +module.exports = new Module(); diff --git a/app/modules/bridge.json b/app/modules/bridge.json new file mode 100644 index 0000000000..c68d08a405 --- /dev/null +++ b/app/modules/bridge.json @@ -0,0 +1,27 @@ +{ + "id": "550101", + "name": { + "en": "Bridge", + "ko": "브릿지" + }, + "category": "board", + "platform": ["win32", "darwin"], + "icon": "bridge.png", + "module": "bridge.js", + "driver": { + "win32-ia32": "arduino/dpinst-x86.exe", + "win32-x64": "arduino/dpinst-amd64.exe" + }, + "selectPort": true, + "reconnect": true, + "firmware": "bridge", + "hardware": { + "type": "serial", + "control": "slave", + "duration": 32, + "vendor": ["Arduino", "wch.cn", "FTDI"], + "baudRate": 115200, + "firmwarecheck": false, + "byteDelimiter": [13, 10] + } +} diff --git a/app/modules/bridge.png b/app/modules/bridge.png new file mode 100644 index 0000000000..9ce7d03e75 Binary files /dev/null and b/app/modules/bridge.png differ diff --git a/app/modules/dalgona.js b/app/modules/dalgona.js index 404ce64e6c..6dcd4bac36 100644 --- a/app/modules/dalgona.js +++ b/app/modules/dalgona.js @@ -56,6 +56,7 @@ function Module() { GYROY: 56, GYROZ: 57, PULLUP: 58, + // FNDINIT: 59, }; this.actionTypes = { @@ -172,7 +173,7 @@ Module.prototype.requestInitialData = function () { return new Buffer([1]); // return true; // MRT 개선 코드 구성 중 : 주석 처리 시 자사 다른 펌웨어와의 연결 오류 없음 - //return this.makeSensorReadBuffer(this.sensorTypes.ANALOG, 0); + // return this.makeSensorReadBuffer(this.sensorTypes.ANALOG, 0); }; Module.prototype.checkInitialData = function (data, config) { @@ -630,6 +631,64 @@ Module.prototype.makeOutputBuffer = function (device, port, data) { ]); break; } + + + // case this.sensorTypes.FNDINIT: { + // const fndClk = Buffer.alloc(2); + // const fndDio = Buffer.alloc(2); + // const fndBrightnessLev = Buffer.alloc(2); + // const fndOnOff = Buffer.alloc(2); + // const fndBlockIndex = Buffer.alloc(2); + // const fndDelayMs = Buffer.alloc(2); + // const fndDisplayStrLength = Buffer.alloc(2); + // const fndDisplayStr0 = Buffer.alloc(2); + // const fndDisplayStr1 = Buffer.alloc(2); + // const fndDisplayStr2 = Buffer.alloc(2); + // const fndDisplayStr3 = Buffer.alloc(2); + + // if ($.isPlainObject(data)) { + // fndClk.writeInt16LE(data.clk_pin); + // fndDio.writeInt16LE(data.dio_pin); + // // FND Init Block Area Above + + // fndBrightnessLev.writeInt16LE(data.level_val); + // fndBlockIndex.writeInt16LE(data.block_index); + // // FND Display Block Area Above + + // fndOnOff.writeInt16LE(data.onoff); + // fndDelayMs.writeInt16LE(data.delay_ms); + + // fndDisplayStrLength.writeInt16LE(data.str_length); + // fndDisplayStr0.writeInt16LE(data.data_0); + // fndDisplayStr1.writeInt16LE(data.data_1); + // fndDisplayStr2.writeInt16LE(data.data_2); + // fndDisplayStr3.writeInt16LE(data.data_3); + // } else { + // fndClk.writeInt16LE(0); + // fndDio.writeInt16LE(0); + // // FND Init Block Area Above + + // fndBrightnessLev.writeInt16LE(0); + // fndBlockIndex.writeInt16LE(0); + // // FND Display Block Area Above + + // fndOnOff.writeInt16LE(0); + // fndDelayMs.writeInt16LE(0); + + // fndDisplayStrLength.writeInt16LE(0); + // fndDisplayStr0.writeInt16LE(0); + // fndDisplayStr1.writeInt16LE(0); + // fndDisplayStr2.writeInt16LE(0); + // fndDisplayStr3.writeInt16LE(0); + // } + + // buffer = Buffer.from([255, 85, 26, sensorIdx, this.actionTypes.MODUEL, device, port]); + // buffer = Buffer.concat([buffer, fndBlockIndex, fndClk, fndDio, fndBrightnessLev, fndOnOff, fndDisplayStrLength, fndDisplayStr0, fndDisplayStr1, fndDisplayStr2, fndDisplayStr3, fndDelayMs, dummy]); + // console.log(buffer); + // break; + // } + + case this.sensorTypes.NEOPIXELINIT: { console.log('NEOPIXELINIT'); value.writeInt16LE(data); @@ -685,6 +744,9 @@ Module.prototype.makeOutputBuffer = function (device, port, data) { buffer = Buffer.concat([buffer, dummy]); break; } + + + case this.sensorTypes.JOYINIT: { const port1 = new Buffer(2); const port2 = new Buffer(2); diff --git a/app/modules/dalgona.json b/app/modules/dalgona.json index fc40c2ced9..1a543f0131 100644 --- a/app/modules/dalgona.json +++ b/app/modules/dalgona.json @@ -11,9 +11,9 @@ "url": "https://dalgonaedu.co.kr/", "email": "who@nugunaplay.co.kr", "driver": { - "win32-ia32": "CH34x_Install_Windows_v3_4/CH34x_Install_Windows_v3_4.EXE", - "win32-x64": "CH34x_Install_Windows_v3_4/CH34x_Install_Windows_v3_4.EXE", - "darwin-x64": "https://entrylabs.github.io/docs/files/drivers/CH34x_Install_MAC_10_9_AND_ABOVE/CH34x_Install_V1.3.pkg" + "win32-ia32": "ftdi/dpinst-x86.exe", + "win32-x64": "ftdi/dpinst-amd64.exe", + "darwin-x64": "https://entrylabs.github.io/docs/files/drivers/FTDIUSBSerial/FTDIUSBSerial.pkg" }, "selectPort": true, "reconnect": true, diff --git a/app/modules/kaboino.js b/app/modules/kaboino.js new file mode 100644 index 0000000000..3d8dc2deeb --- /dev/null +++ b/app/modules/kaboino.js @@ -0,0 +1,677 @@ +const BaseModule = require('./baseModule'); + +class KABOINO extends BaseModule { + constructor() { + super(); + this.sp = null; + this.actionTypes = { + GET: 1, + SET: 2, + RESET: 3, + }; + this.sensorTypes = { + ALIVE: 0, + DIGITAL: 1, + ANALOG: 2, + PWM: 3, + SERVO_PIN: 4, + TONE: 5, + PULSEIN: 6, + ULTRASONIC: 7, + TIMER: 8, + SET_LGT: 9, + SET_TONE: 10, + SET_BODY_SPEED_TURN: 11, + SET_WHEEL_SPIN: 12, + SET_WHEEL_BALANCE: 13, + SET_WHEEL_SPEED: 14, + SET_DISPLAY_STRING: 15, + SET_DISPLAY_CLEAR: 16, + SET_SEARCH_LIGHT:17, + GET_DUST_SENSOR: 22, + GET_ULTRASONIC_SENSOR: 23, + GET_COLOR_SENSOR: 24, + GET_SND_SENSOR: 25, + SET_BALL_HOLDER: 26, + SET_LIFT_AGV: 27, + SET_ROBOT_ARM: 28, + SET_ULTRASONIC_ANGLE: 29, + SET_COLOR_SEN_LED: 30, + }; + + this.digitalPortTimeList = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ]; + + this.sensorValueSize = { + FLOAT: 2, + SHORT: 3, + }; + + this.sensorData = { + ULTRASONIC: 0, + DUST: 0, + COLOR: 0, + SND: 0, + DIGITAL: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + '6': 0, + '7': 0, + '8': 0, + '9': 0, + '10': 0, + '11': 0, + '12': 0, + '13': 0, + }, + ANALOG: { + '0': 0, + '1': 0, + '2': 0, + '3': 0, + '4': 0, + '5': 0, + '6': 0, + '7': 0, + '8': 0, + }, + PULSEIN: {}, + TIMER: 0, + }; + + this.defaultOutput = {}; + + this.recentCheckData = {}; + + this.sendBuffers = []; + + this.lastTime = 0; + this.lastSendTime = 0; + this.isDraing = false; + + this.sensorIdx = 0; + } + + init = function(handler, config) { + } + + setSerialPort = function(sp) { + var self = this; + this.sp = sp; + } + + requestInitialData = function() { + return this.makeSensorReadBuffer(this.sensorTypes.ANALOG, 0); + } + + checkInitialData = function(data, config) { + return true; + } + + afterConnect = function(that, cb) { + that.connected = true; + if (cb) { + cb('connected'); + } + } + + validateLocalData = function(data) { + return true; + } + + requestRemoteData = function(handler) { + var self = this; + if (!self.sensorData) { + return; + } + Object.keys(this.sensorData).forEach(function(key) { + if (self.sensorData[key] != undefined) { + handler.write(key, self.sensorData[key]); + } + }); + } + + handleRemoteData = function(handler) { + var self = this; + var getDatas = handler.read('GET'); + var setDatas = handler.read('SET') || this.defaultOutput; + var time = handler.read('TIME'); + var buffer = new Buffer([]); + + if (getDatas) { + var keys = Object.keys(getDatas); + keys.forEach(function(key) { + var isSend = false; + var dataObj = getDatas[key]; + + if (typeof dataObj.port === 'string' || typeof dataObj.port === 'number') { + var time = self.digitalPortTimeList[dataObj.port]; + if (dataObj.time > time) { + isSend = true; + self.digitalPortTimeList[dataObj.port] = dataObj.time; + } + } + else if (Array.isArray(dataObj.port)) { + isSend = dataObj.port.every(function(port) { + var time = self.digitalPortTimeList[port]; + return dataObj.time > time; + }); + + if (isSend) { + dataObj.port.forEach(function(port) { + self.digitalPortTimeList[port] = dataObj.time; + }); + } + } + if (isSend) { + if (!self.isRecentData(dataObj.port, key, dataObj.data)) { + self.recentCheckData[dataObj.port] = { + type: key, + data: dataObj.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeSensorReadBuffer( + key, + dataObj.port, + dataObj.data + ), + ]); + } + } + }); + } + + if (setDatas) { + var setKeys = Object.keys(setDatas); + setKeys.forEach(function(port) { + var data = setDatas[port]; + + if (data) { + if (self.digitalPortTimeList[port] < data.time) { + self.digitalPortTimeList[port] = data.time; + if (!self.isRecentData(port, data.type, data.data)) { + self.recentCheckData[port] = { + type: data.type, + data: data.data, + }; + buffer = Buffer.concat([ + buffer, + self.makeOutputBuffer(data.type, port, data.data), + ]); + }; + } + } + }); + } + + if (buffer.length) { + this.sendBuffers.push(buffer); + } + } + + isRecentData = function(port, type, data) { + var that = this; + var isRecent = false; + + if (type == this.sensorTypes.GET_COLOR_SENSOR) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if (key === portString) { + + } + if (key !== portString && recent.type == that.sensorTypes.GET_COLOR_SENSOR) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if ((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } + else { + isRecent = true; + } + } + else if (type == this.sensorTypes.GET_DUST_SENSOR) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if (key === portString) { + + } + if (key !== portString && recent.type == that.sensorTypes.GET_DUST_SENSOR) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if ((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } + else { + isRecent = true; + } + } + else if (type == this.sensorTypes.GET_ULTRASONIC_SENSOR) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if (key === portString) { + + } + if (key !== portString && recent.type == that.sensorTypes.GET_ULTRASONIC_SENSOR) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if ((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } + else { + isRecent = true; + } + + } + else if (type == this.sensorTypes.GET_SND_SENSOR) { + var portString = port.toString(); + var isGarbageClear = false; + Object.keys(this.recentCheckData).forEach(function (key) { + var recent = that.recentCheckData[key]; + if (key === portString) { + + } + if (key !== portString && recent.type == that.sensorTypes.GET_SND_SENSOR) { + delete that.recentCheckData[key]; + isGarbageClear = true; + } + }); + + if ((port in this.recentCheckData && isGarbageClear) || !(port in this.recentCheckData)) { + isRecent = false; + } + else { + isRecent = true; + } + } + else if (port in this.recentCheckData && type != this.sensorTypes.TONE) { + if (this.recentCheckData[port].type === type && this.recentCheckData[port].data === data) { + isRecent = true; + } + } + + return isRecent; + } + + requestLocalData = function() { + var self = this; + if (!this.isDraing && this.sendBuffers.length > 0) { + this.isDraing = true; + this.sp.write(this.sendBuffers.shift(), function() { + if (self.sp) { + self.sp.drain(function() { + self.isDraing = false; + }); + } + }); + } + return null; + } + + handleLocalData = function(data) { + var self = this; + var datas = this.getDataByBuffer(data); + + datas.forEach(function(data) { + if (data.length <= 4 || data[0] !== 255 || data[1] !== 85) { + return; + } + var readData = data.subarray(2, data.length); + var value; + switch (readData[0]) { + case self.sensorValueSize.FLOAT: { + value = new Buffer(readData.subarray(1, 5)).readFloatLE(); + value = Math.round(value * 100) / 100; + break; + } + case self.sensorValueSize.SHORT: { + value = new Buffer(readData.subarray(1, 3)).readInt16LE(); + break; + } + default: { + value = 0; + break; + } + } + + var type = readData[readData.length - 1]; + var port = readData[readData.length - 2]; + + switch (type) { + case self.sensorTypes.DIGITAL: { + self.sensorData.DIGITAL[port] = value; + break; + } + case self.sensorTypes.ANALOG: { + self.sensorData.ANALOG[port] = value; + break; + } + case self.sensorTypes.PULSEIN: { + self.sensorData.PULSEIN[port] = value; + break; + } + case self.sensorTypes.GET_COLOR_SENSOR: { + self.sensorData.COLOR = parseInt(value); + break; + } + case self.sensorTypes.GET_DUST_SENSOR: { + self.sensorData.DUST = parseInt(value); + break; + } + case self.sensorTypes.GET_ULTRASONIC_SENSOR: { + self.sensorData.ULTRASONIC = parseInt(value); + break; + } + case self.sensorTypes.GET_SND_SENSOR: { + self.sensorData.SND = parseInt(value); + break; + } + case self.sensorTypes.TIMER: { + self.sensorData.TIMER = value; + break; + } + default: { + break; + } + } + }); + } + + makeSensorReadBuffer = function(device, port, data) { + var buffer; + var dummy = new Buffer([10]); + if (device == this.sensorTypes.GET_COLOR_SENSOR) { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } + else if (device == this.sensorTypes.GET_DUST_SENSOR) { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } + else if (device == this.sensorTypes.GET_ULTRASONIC_SENSOR) { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } + else if (device == this.sensorTypes.GET_SND_SENSOR) { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } + else if (!data) { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + } + else { + value = new Buffer(2); + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 7, + this.sensorIdx, + this.actionTypes.GET, + device, + port, + 10, + ]); + buffer = Buffer.concat([buffer, value, dummy]); + } + + this.sensorIdx++; + if (this.sensorIdx > 254) { + this.sensorIdx = 0; + } + + return buffer; + } + + makeOutputBuffer = function(device, port, data) { + var buffer; + var value = new Buffer(2); + var dummy = new Buffer([10]); + switch (device) { + case this.sensorTypes.SERVO_PIN: + case this.sensorTypes.DIGITAL: + case this.sensorTypes.SET_BALL_HOLDER: + case this.sensorTypes.SET_LIFT_AGV: + case this.sensorTypes.SET_ULTRASONIC_ANGLE: + case this.sensorTypes.SET_ROBOT_ARM: + case this.sensorTypes.SET_COLOR_SEN_LED: + case this.sensorTypes.PWM: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + data + ]); + buffer = Buffer.concat([buffer, dummy]); + break; + } + case this.sensorTypes.SET_SEARCH_LIGHT: + case this.sensorTypes.SET_LGT: { + value.writeInt16LE(data); + buffer = new Buffer([ + 255, + 85, + 6, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + data + ]); + buffer = Buffer.concat([buffer, dummy]); + break; + } + case this.sensorTypes.TONE: { + var time = new Buffer(2); + if ($.isPlainObject(data)) { + value.writeInt16LE(data.value); + time.writeInt16LE(data.duration); + } else { + value.writeInt16LE(0); + time.writeInt16LE(0); + } + buffer = new Buffer([ + 255, + 85, + 8, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, time, dummy]); + break; + } + case this.sensorTypes.SET_BODY_SPEED_TURN: + case this.sensorTypes.SET_WHEEL_SPIN: + case this.sensorTypes.SET_WHEEL_SPEED: { + buffer = new Buffer([ + 255, + 85, + 6, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + data[0], data[1] + ]); + buffer = Buffer.concat([buffer, dummy]); + break; + } + case this.sensorTypes.SET_TONE: { + var time = new Buffer(2); + if ($.isPlainObject(data)) { + value.writeInt16LE(data.value); + time.writeInt16LE(data.duration); + } else { + value.writeInt16LE(0); + time.writeInt16LE(0); + } + buffer = new Buffer([ + 255, + 85, + 8, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + ]); + buffer = Buffer.concat([buffer, value, time, dummy]); + break; + } + case this.sensorTypes.SET_DISPLAY_STRING: { + buffer = new Buffer([ + 255, + 85, + 27, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + data[0], + data[1], + data[2], + data[3], + data[4], + data[5], + data[6], + data[7], + data[8], + data[9], + data[10], + data[11], + data[12], + data[13], + data[14], + data[15], + data[16], + data[17], + data[18], + data[19], + data[20], + data[21], + data[22] + ]); + buffer = Buffer.concat([buffer, dummy]); + break; + } + case this.sensorTypes.SET_DISPLAY_CLEAR: { + buffer = new Buffer([ + 255, + 85, + 5, + this.sensorIdx, + this.actionTypes.SET, + device, + port, + data.data, + ]); + buffer = Buffer.concat([buffer,dummy]); + break; + } + case this.sensorTypes.TONE: { + } + } + + return buffer; + } + + getDataByBuffer = function(buffer) { + var datas = []; + var lastIndex = 0; + buffer.forEach(function(value, idx) { + if (value == 13 && buffer[idx + 1] == 10) { + datas.push(buffer.subarray(lastIndex, idx)); + lastIndex = idx + 2; + } + }); + + return datas; + } + + disconnect = function(connect) { + var self = this; + connect.close(); + if (self.sp) { + delete self.sp; + } + } + + reset = function() { + this.lastTime = 0; + this.lastSendTime = 0; + + this.sensorData.PULSEIN = {}; + } +} + +module.exports = new KABOINO(); diff --git a/app/modules/kaboino.json b/app/modules/kaboino.json new file mode 100644 index 0000000000..646bd56371 --- /dev/null +++ b/app/modules/kaboino.json @@ -0,0 +1,23 @@ +{ + "id": "560101", + "name": { + "en": "Kaboino", + "ko": "카보이노" + }, + "category": "robot", + "platform": ["win32", "darwin"], + "icon": "kaboino.png", + "module": "kaboino.js", + "url": "http://www.kabotel.com/", + "email": "sunnytel@naver.com", + "reconnect": true, + "selectPort": true, + + "hardware": { + "type": "bluetooth", + "control": "slave", + "vendor": "Microsoft", + "duration": 32, + "baudRate": 38400 + } +} diff --git a/app/modules/kaboino.png b/app/modules/kaboino.png new file mode 100644 index 0000000000..6ce10925bf Binary files /dev/null and b/app/modules/kaboino.png differ diff --git a/app/modules/robotis_openCM70EDU.js b/app/modules/robotis_openCM70EDU.js index e510bf4f83..f927fc735c 100644 --- a/app/modules/robotis_openCM70EDU.js +++ b/app/modules/robotis_openCM70EDU.js @@ -35,8 +35,6 @@ function Module() { this.prevLeftValue = 0; this.isRight = false; - //this.touchSensor = 0; - this.humidity = []; this.temperature = []; this.colorSensor = []; this.touchSensor = []; @@ -104,13 +102,16 @@ Module.prototype.requestInitialData = function () { var sendbuffer = null; - //this.touchSensor = 0; this.colorSensor = []; this.temperature = []; - this.humidity = []; this.touchSensor = []; this.irSensor = []; this.lightSensor = []; + this.ultrasonicSensor = []; + this.magneticSensor = []; + this.motionSensor = []; + this.htHumiditySensor = []; + this.httemperatureSensor = []; this.detectedSound = 0; this.detectringSound = 0; this.userButtonState = 0; @@ -167,8 +168,12 @@ Module.prototype.requestRemoteData = function (handler) { handler.write('IR' + i, this.irSensor[i]); // 적외선 센서 handler.write('LIGHT' + i, this.lightSensor[i]); // 조도 센서 handler.write('COLOR' + i, this.colorSensor[i]); // 칼라 센서 - handler.write('HUMIDTY' + i, this.humidity[i]); // 습도 센서 + handler.write('HUMIDTY' + i, this.htHumiditySensor[i]); // 습도 센서 handler.write('TEMPERATURE' + i, this.temperature[i]); // 온도 센서 + handler.write('HT_TEMPERATURE' + i, this.httemperatureSensor[i]); // 온습도 온도 센서 + handler.write('ULTRASONIC' + i, this.ultrasonicSensor[i]); // 초음파 센서 + handler.write('MAGNETIC' + i, this.magneticSensor[i]); // 자석 센서 + handler.write('MOTION' + i, this.motionSensor[i]); // 동작감지 센서 if (this.maxPortValue[i] != undefined) { handler.write('MONITORPORT' + i, this.maxPortValue[i]); @@ -374,6 +379,7 @@ Module.prototype.sendPacketTooController = function () { sendBuffer = this.writeBytePacket(200, address, value); } else if (length == 2) { sendBuffer = this.writeWordPacket(200, address, value); + /* } else if (length == 4 && address == 136) { var value2; if (value < 1024) @@ -381,6 +387,7 @@ Module.prototype.sendPacketTooController = function () { else value2 = value - 1024; sendBuffer = this.writeDWordPacket2(200, address, value, value2); + */ } else { sendBuffer = this.writeDWordPacket(200, address, value); } @@ -464,6 +471,7 @@ Module.prototype.requestLocalData = function () { sendBuffer = this.writeBytePacket(200, address, value); } else if (length == 2) { sendBuffer = this.writeWordPacket(200, address, value); + /* } else if (length == 4 && address == 136) { var value2; if (value < 1024) @@ -471,6 +479,7 @@ Module.prototype.requestLocalData = function () { else value2 = value - 1024; sendBuffer = this.writeDWordPacket2(200, address, value, value2); + */ } else { sendBuffer = this.writeDWordPacket(200, address, value); } @@ -572,7 +581,7 @@ Module.prototype.packetChecker = function (data) { } }; Module.prototype.handleLocalData = function (data) { // data: Native Buffer - //console.log("data!!!! " + data.length + " "+ this.packetChecker(data)); + // console.log("data!!!! " + data.length + " "+ this.packetChecker(data)); for (var i = 0; i < data.length; i++) { @@ -717,6 +726,7 @@ Module.prototype.handleLocalData = function (data) { // data: Native Buffer } jx++; } + jx = 0; for (var ix = 30; ix < 34; ix++) { // 터치 센서 if (this.receiveBuffer[ix - 5] != undefined) { this.touchSensor[jx] = this.receiveBuffer[ix - 5]; @@ -736,6 +746,46 @@ Module.prototype.handleLocalData = function (data) { // data: Native Buffer } // console.log("kjsDebug port3 servo : " + this.servotemp[0] + " port3 ir : " + this.irSensor[0]); jx = 0; + for (var ix = 42; ix < 46; ix++) { // 온도 센서 + if (this.receiveBuffer[ix - 5] != undefined) { + this.temperature[jx] = this.receiveBuffer[ix - 5]; + if (this.maxPortValue[jx] < this.temperature[jx]) // add by 191029 + this.maxPortValue[jx] = this.temperature[jx]; + } + jx++; + } + // console.log("kjsDebug port3 servo : " + this.servotemp[0] + " port3 temperature : " + this.temperature[0]); + jx = 0; + for (var ix = 46; ix < 50; ix++) { // 초음파 센서 + if (this.receiveBuffer[ix - 5] != undefined) { + this.ultrasonicSensor[jx] = this.receiveBuffer[ix - 5]; + if (this.maxPortValue[jx] < this.ultrasonicSensor[jx]) // add by 191029 + this.maxPortValue[jx] = this.ultrasonicSensor[jx]; + } + jx++; + } + // console.log("kjsDebug port3 servo : " + this.servotemp[0] + " port3 sonar : " + this.ultrasonicSensor[0]); + jx = 0; + for (var ix = 50; ix < 54; ix++) { // 자석 센서 + if (this.receiveBuffer[ix - 5] != undefined) { + this.magneticSensor[jx] = this.receiveBuffer[ix - 5]; + if (this.maxPortValue[jx] < this.magneticSensor[jx]) // add by 191029 + this.maxPortValue[jx] = this.magneticSensor[jx]; + } + jx++; + } + // console.log("kjsDebug port3 servo : " + this.servotemp[0] + " port3 magnet : " + this.magneticSensor[0]); + jx = 0; + for (var ix = 54; ix < 58; ix++) { // 동작감지 센서 + if (this.receiveBuffer[ix - 5] != undefined) { + this.motionSensor[jx] = this.receiveBuffer[ix - 5]; + if (this.maxPortValue[jx] < this.motionSensor[jx]) // add by 191029 + this.maxPortValue[jx] = this.motionSensor[jx]; + } + jx++; + } + // console.log("kjsDebug port3 servo : " + this.servotemp[0] + " port3 magnet : " + this.motionSensor[0]); + jx = 0; for (var ix = 70; ix < 77; ix = ix + 2) { // 조도 센서 if (this.receiveBuffer[ix - 5] != undefined) { this.lightSensor[jx] = this.receiveBuffer[ix - 5] | this.receiveBuffer[ix - 5 + 1] << 8; @@ -759,19 +809,19 @@ Module.prototype.handleLocalData = function (data) { // data: Native Buffer jx = 0; for (var ix = 62; ix < 66; ix++) { // 습도 센서 if (this.receiveBuffer[ix - 5] != undefined) { - this.humidity[jx] = this.receiveBuffer[ix - 5]; - if (this.maxPortValue[jx] < this.humidity[jx]) // add by 191029 - this.maxPortValue[jx] = this.humidity[jx]; + this.htHumiditySensor[jx] = this.receiveBuffer[ix - 5]; + if (this.maxPortValue[jx] < this.htHumiditySensor[jx]) // add by 191029 + this.maxPortValue[jx] = this.htHumiditySensor[jx]; } jx++; } jx = 0; for (var ix = 66; ix < 70; ix++) { // 온도 센서 if (this.receiveBuffer[ix - 5] != undefined) { - this.temperature[jx] = this.receiveBuffer[ix - 5]; + this.httemperatureSensor[jx] = this.receiveBuffer[ix - 5]; // console.log("m : " + this.maxPortValue[jx] + " t : " + this.temperature[jx]); - if (this.maxPortValue[jx] < this.temperature[jx]) // add by 191029 - this.maxPortValue[jx] = this.temperature[jx]; + if (this.maxPortValue[jx] < this.httemperatureSensor[jx]) // add by 191029 + this.maxPortValue[jx] = this.httemperatureSensor[jx]; } jx++; } diff --git a/build/entry-hw.nsi b/build/entry-hw.nsi index 7cbfd4f6de..00c49a8634 100644 --- a/build/entry-hw.nsi +++ b/build/entry-hw.nsi @@ -14,7 +14,7 @@ !define PRODUCT_NAME "Entry_HW" !define PROTOCOL_NAME "entryhw" !define APP_NAME "Entry_HW.exe" -!define PRODUCT_VERSION "1.9.42" +!define PRODUCT_VERSION "1.9.43" !define PRODUCT_PUBLISHER "EntryLabs" !define PRODUCT_WEB_SITE "https://www.playentry.org/" diff --git a/package.json b/package.json index ebbbb060cb..4240f16650 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "entry-hw", - "version": "1.9.42", + "version": "1.9.43", "description": "엔트리 하드웨어 연결 프로그램", "author": "EntryLabs", "main": "./app/src/index.bundle.js",