diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf index 2df4d0e345b..0920f117544 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf @@ -1,12 +1,12 @@ - +
- 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 - +
@@ -1490,6 +1490,24 @@ Title + + Subtitle + + + Copyright + + + Width (pixel) + + + Height (pixel) + + + Tags + + + Size + Duration (h:mm:ss.ms) @@ -3387,6 +3405,9 @@ Use start time inference from start mark passings + + Control tracking from start and finish times + Number of queue messages sent @@ -4512,19 +4533,19 @@ utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - + http://appstore.com/sapsailinsight @@ -4824,6 +4845,294 @@ Maximum number of discards + + Active regatta configuration was set, using the "By Marks" course designer. + + + Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"? + + + All races have been denoted for racelog tracking. + + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + + + Choose a language + + + Solutions + + + Blog + + + Official event website + + + More info + + + View analysis + + + Overall leaderboard + + + Please try again... + + + Reload page + + + An error occured while loading the data for this page. + + + Regatta details + + + Choose chart type + + + What''s new + + + SAP Sailing + + + Search + + + Days + + + Days + + + Hrs + + + Min + + + Sec + + + Day + + + Hour + + + Min + + + Sec + + + Live + + + Watch now + + + Upcoming + + + Last Score Update + + + Not Tracked + + + Jobs + + + © 2011-2016 SAP Sailing Analytics + + + SAP Sailing in + + + Legal Disclosure + + + Privacy + + + Feedback + + + + Search + + + Show All Events + + + Latest Events from the Sailing World + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + + + Photographers love Sailing + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + + + Recent Video Entries + + + Search + + + Your Search + + + Type in your searchkey + + + Recent + + + SAP in Sailing + + + SAP Sailing Analytics + + + SAP Sailing Race Manager + + + SAP Sail InSight + + + SAP Sailing Buoy Pinger + + + Post-Race Analytics + + + Training Diary + + + Strategy Simulator + + + SAP in Sailing + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + + + Help sailors analyze performance and optimize strategy + + + Bring fans closer to the action + + + Provide the media with information and insights to deliver a greater informed commentary + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + + + Official Technology Partner of Travemünder Woche + + + Technical Partner of the European Sailing Leagues + + + Title sponsor of the SAP Extreme Sailing Team + + + Official Technical Partner of the Extreme Sailing Series + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + + + Title sponsor of the SAP 5O5 World Championships + + + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + + + Read More + + + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + + + Learn More + + + SAP Sail InSight + + + With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. + + + Learn More + + + SAP Sailing Buoy Pinger + + + With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. + + + Learn More + + + Post-Race Analytics + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + + + SAP Sail Better – STG Training Diary + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + + + Strategy Simulator + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + + + Learn More + + + Imprint + + + Last fix + + + Filter device mappings +
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties.xlf index 02d250f25c1..52cf650493c 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties.xlf @@ -1,12 +1,12 @@ - +
- H4sIAAAAAAAAAM29bXPbSpIm+h2/AtMdd23HSvTLme7dOR2Mc2nJ9tGOJbkl+bhn1zcmQBKSMCYBDkBaVnec/37zeTKzqgCSkk9v340bYVNAvaFQqMrKypcnl0Vd3JSvLotqMT6N11lbzMqjZrms1uuynKxW4wtJyLVEm0sCS/xSlXdlq3lfeZ0ti9VRU6/bZtFJg6t8ZjfZSmqOP8hPtpaqV/L/zdeyXnfjK7vN9T7r7qquu6qWVX1jJS5jihdCG1/K+evyumnL8c9Vt27a+7y5zi0jL7XcTVmXbbEYv9O/2UJKorvd+L1c5bzUxPKmWK8LT7e77K6q5+NP8iMvVpebr2V7db8qMVS8Yf4HuVm8L6blYnx1W3W5/Fvfljlq5czL726r2W3eNfl10SJ71ixXi3JdLu7zcrla34+ytrxuy+52fKF/5X7ZfC3lFn/4lMtm085K9iXX62xeLFdlLaNyUq/L9qu85rGn5J6ED4IPwe/FL8WrbqyvbsM1tr8yFLX88RHCtY3RulqWY/kGJa+ummaxrlZM4Mvijcp1JV8h72T+SLWmlgx510V5M8rfSjqKXVetjK4kaR6HYiM9nefXbbOUcSrrYXOrouskH6ndumildlWXo2y1KO4vV6V0/YNc5R0uY+LP5WI1/tiV+e9e/i6XKZK35c1mIYOPEodTeVetcZD/7pUWmDeb6aI8ZCpLsVAhgy2franZ9GkzL99X8lnwE1IuSlyN9U+OFA7RcYlU/sZ79ut9WXwt9cPn60a6xorFOi/aaSUfQiYyKnR/ykt8xLwrZRHNu/xpOboZSY//+EK73NRlLmtisy5zufudpdaS/AwrYY4H5lOuEBk0eeS8WBf5NQaKr3lS/2vdYHnxnZ9+qZ9l+ArH5c34Lb7G03l58yyrG06AfyvXMrtLaaqQ/7V0G6n5fbkeZetmLXPv8+bFD5MfslnRtvfjyWy2WcqIy6fN4sccH4XLJLVLkrs0/bJclDNpYfy3F78+/9vLX5Np0cmoaOZIeni5md3KqM7LdtoU7Xx81uSdJMlEC2lZci0E6rq62bTFumrqcVIx7+VkdXl33Kz13/isvBuNRlk5r9aXMxnSbvxGLvMPTSV0BjmzZrFZ1meFfLmT2rue9opkkvl5VedeIk+KZMV8Hp84mc/RblvWUicmX/AeObZoL0ir65rNXTXeMJLxNBJYX8h5KIipF/oQukYCcNUc8V1IAVBOb7NNjdzxR/5JB5SPSceRTc2KeiY08Yh/ZLmURVe+wYyesPwHJtgcL3K8VK/Q66ZYHy1k9Q9LyiPW+Qw52bzqZL4pvcKc/bm5E9J8fwlCYWTsvB4fayldMFgNmLtKTUAq76r1bX7b3OVC4u81WYak1a0hvtQnKQb6js5PFq1k3L/5JptF13tzNkbihhfKCy2Ylyzp/b26BZFvFvPudNOtX5dnm2XZVrPQ0XXIz5dSQBZxXmuRfS1MullZz+VtHmqj8ELeSlIeqT4iGEnp0rRsz691K7j0sSKZDmOlY6QTtDfTmTKc2TqLrpq0pMxxm12YZ2mFZCpgxGUHkRWoU51zc8f0UfpX3un31fWYNV/G5/+aLct5sUDt8Smuct0I2U2mWo+Z3MgWumv9nkv67mXbFrIsLuSHV745Rqr25EmXIwfrHhtZq08nj3HBunqdaxsx4zua0sKZsAnC3yzY2rlea2tJxuOtdTLHsNmDoF/s658M7KJYdeX4MCu/rWSLHP9XWSc34/eYVmus9pP6VLgbIezHlpAV6MVNeZnuO583r169+EPOtF0FApMhHbNs3bVzvFN+0wrrMM/nmxYT03mNg8/1rFjMdOvx1ShbX/W16oSmk0XkvXYM/OLXEvzK9J4Z2HllDpVz7Cz4TpN/RMfQ0D+4Z/WXd0VVc9bluApJae/m1fW17NlozppfNV2FzU1XMnmtTSsl1uR1WKItv1bNRjm3rCtWOBDIm0zqYnG/rmZCDTQhDykpmUypYZreI5O9GpflGrSlT0c9Mes8N0nBEpyspXi3Pq+F8twcl2ucYHRxgpUCcViT4IPZnDM7szflp8QaeccPFdig83cPl0gH1gdt67MLh9DJl8I3viKjfFZ+W38q7lfgE8AXkJcbv7mafFfB9JmhvE6F9a2854BZxvTolKksZjq/amk2v7N2D/Jp0TlzntYEIfB3klnXzCphTpfyOfKbphE2WTrTVfJxdEZjcm7KHMcSmWKtjLnMqFF2U6ycusc3fSeHQOmQfu+dRfwd39j76fHpaVwsz4TnbCs5zOiL+2tbd8OMthlO9oCDIwtPDlySJlOhuJWHyhIM7+8L95fTd9w30iYxZ7AcuEhXZSv5S67J8j836EWj7dsDudvo+7GlbjPtpKA11I0+1/h6NxiHcrHodPsEe1oW7aIq2+FHvGs2i3l+i0PCbUE+TfbuO/LeXeyknB2r7rOc9YT5x5Px0UELki72u2bDtmqb/9AdzAf1e8azP46jzOfIqTT9TmaILyIZzX156VTeNcX0kGyHZ0ytO6EDzxdlib+20DC8mxUyn8+bu5oTEGN8IBNeSsg8lJbvD3L7nsWiqW8OySYnDXBtYCLz62T+KN+rrpp3TdjAPllmQpYb6e+DlfxFPw3fIbQRae/OBRi+gH1FYdr8Y2Bm/m8MQuzB94xD5BPe2uef4OuHwZGl/dtrPT469qrJirBxSFL68zHlq/4/Gp7P9Vmz3k10d9MapMi0F/orPHJXtJUsWKxEp6Dsa3UtS1xY8pkQB6xeZFY8Hq4Wki9nW5yU9GAGqcEbCA2EFT4ur4vNYt0TJVCKoel6MhR+mdIyPQDmcqtSMc0tpotSmfsrv3VRD+7xeawixV/GZ/Lk5twgj2xsksl8WJKoCXqqwBanpwjScE08v+YDcArRLJff4TAikz7Jf2NLwHOtO94Vv+/GQXKnj+23H6p362aV5DWrmDXTA7IsP8glwnV2qzLG8+skMRU8JvUy+QxVXcqAx7LjY6bhpCLfIRZOD/FdOKrrwUoO0JcyDBfYTHDOlJO0cOgyEq2leGcnKFRYG/ZMbmA4fFpjq6aVJj7gN4M06LiQ4XvvYiGMSFvOmXjJS00WHrYbf7w46bL/6Jr6Y7sY/4/L87P848V7NoLm2GbOlo5jSzHHmmMe6nxsK32uNGuFkWTFkKiy20SkoTOpy4/C1mcDld023Zpr5Ge7kLGfCXNKAc7RbTn7Mm2+yZC0YFJUJPtatl2sM2Grj2NZ8vqX6Zyxc6bf5iZUyFbFpisnm3UjvEo1M4Ht+ANS88KTcxPoZki56At3Yyk5l91nlNNFfolywvxp90wzXpfru7Ks8bzJ/CuIkxeZag5bO9ys5uScqtrFhT9qfRMwNPUZFgaElzwXsAWXC9zINFmTD5EJ9teybbLZbdN05Uc26pLk8+vIcmtnx0csluvD5dlaEKuhx4Jrj7KybZvWuHh8CaFjPHu/QXpufL4ylaS/OCSzzttyTUqMSic1mTF8sn79ayukDVSx2KCxT7fVorxq76UoZGXrT0G23m/vDuWELNyTYDfoX/47tk3K0tke87v8elHcZFWtpFbG32hsM1438nspXDOuOuH6nMGdk7hegg+MPD0ag6AYFEl1HZySerKRXRPFVYRoSX6y75fws78XWvjhyAvIaSlkqojkVBr6uBp/XCX3x7JzjvFDusGFnKwQoeC2OtghXxl4x/N6ce8ykkSsq2/bSGYQ3KbSXFbdUQ1fW6vigwor+k057F1N4JXel/XN+nZ8JZcy/3DNldQlIlHh6choqvxaee37ZpMvqi9k7oQHgDz+p0zrx4X5PmlvLeu4u5KPJ2QLlzmus9pkZq4d6oKeqNvOS9lhzXTGxzVNnatSqkSVst3QSY3X2t3c3qZachdrIW2y6eA3+49qKmPzP/CbrUo52a/vj6p2tpDED3qb230Upp10Z5vFQkVq5Gdk9W9Ksj0yB5s7Cv9TWXtfvp6q1NKxUupzdCuzyknMDDdBvnRlopEgX8o9ZatIXxoyFK0ERhx8taqXIs/9uU5YT2PNeQC1o3QVWfKqq588kVNSVVdyRDPJ0fHf15UonP7tfVGmctiZ4YHsvXC841/8CIbUHMmqFYpiDxZT5RASc01Nj/AsgQP+lctuM/ZHJvf7ppiPVTnC47/cavvaYvhOUURY1UI9M9u9PtbVetz53QfIgDfcME9lGmvm87NTmYk4UvB+KfudbGSl3n3evHgxfZHNFjJ5xkf4pWKpaMujgd4J6qyUjMzLbtZWK+PZwnWGBaRCccq/bJFl1F+299IU/2Z188N72cnK9qiRlsYfazLWMgLXlcnXTs6P8h8OFyx0OEOpEaTjEIVjy5Y3wgYvf0gUuQqMfHIRdJxb+5URE50EJl8s1rv0EKOH2xCKYuz19zQWaYpWGmU4/siG8jOYz80qmwrDNbkr7sfgvPLiDgpRITmkO7zqyVOXGEiSQpCl3XQLtIqkile7q5Oe7a7eI2+Bus1428/c3fSqV2PPQ5ZF++VD0XXYz0/lmops7OrIYErWyHRonezJVPlSy4YbaHY2bzY3i0Im/0ZY3VbXkuzJTJQ+MFXXf5ddVwuZTtzfXt/zNPaWKbbNCa9L5liLCb2uin6xJZJCMZ5JglhWT4Euh80Knlug/KQGNLlPlxaVo+m6isVS9WnHa8uEguV129x1MhpUtsiI2r2VuOiZRSRNUm+hTeq1V5DXD13NearnFCY/GIt8TDWbw8zeQ9PMN9/AHP3l9P1Yr3L5LnKXvM1x0d0myqOjBlLZkGifI5WL979KKj4PH6ews+fEDptVp0Yb45Mu16vsXsbi32QM6mZ81sgZSWYTKPiEc0iOSqDm/Cl0/pjsQJnC2jTIIIBQpPsNacZJ96+YpMJLYoP6SBZYmUDjikkqlDXGzmhnubHb9tgkElYbk0UOB9Ifn2jsxd9e/Co90OJvsd+gD9pIfgcR6DU3ISsSLAS8UGANpUQ6rqGp3pAmDXZCm2a3bnDEG/bH7IhkrzRrAbugqQTtJDKhCtVC5o78ZuBwcbi1hsANq+3FoJ2zZj35KsON3SG0qYyTJ6sEQ47NZa+wSjJ44NpTPCkCKQqTID9hwkapzH6qE9loPTp+oDBS5j/F/gljHbTKzm9uHSNH2TUpo3IDZBjjsWz8VqmmMQfGusT8HzkVIgX5QDsg0M2JvqVku3EQbENkc/rbq18zcqA2vbTiZM2iyH/5648sJB2Vk7cuaB75jhueATQ9vyvqtSpRuOIDY/XkiTT05MlPOUSBP4LFNQF7Y5M3kH9ZBpJZLLoG6gOMLaUW09LanP8TN3c7h+nu7uvvVk6Mqdr5Z7nvWbIMCnRbJfQ4lbbBBwzb0NMQK6uICLVOi5WWXhYrlkICyyCht6jSxZe0HZdgkgjecdXX8N0waZsGatG9hNDqBXI446w7K++GTYyPmLNdd6tf++2BmD2wCoI4GKfozrWFci0LXRjgmyRl//EO5wVZ66ruGIiSU93OwcBC5eVWv7e72rOakA0KguGEid0ymmjqQxUeJ1xvxkF6iMHcGtGHrV5GmU3t8+utb2QrAGOz/Z3KwGN0ckgStht7/hTyiAl++7PxnfdarUW2yX2/q6X2FJRBNwDsh7BhpQQFF9lduZBPIzzglgL8k+bQhGryId/Wh++t+rqZ349RZ9pyy+us6nVRdzlPK+GYJ9/mjvRUN3wlqyV2bbXpG33OPueYXthfDtMXLetbCgrV5BK1vq3AFPG8eSujcHNLUnfIE6TpHWS+UdPHQ1pn6s+atqTCsd5UdQczTpzq2Qk1/mGxmp1aVl0HfkK53LCf6HjLG1t3o31sV8EIFqppvLG8Kgz2sFViTNB6sDei7hNtgUbLeU1OGA1Fvlj+i2r2ZSK7XFvImvufTbM8qeXAV5nx5lySXTu0WmC/lBfH8/4qJSVDTWt5LqVwuDNbyHX3LBP6DkmXHIc+Xh2NJwtVP/O8IwmU7ML2lNy0WqEqF90X7+JBb+UTNu0YvZPvgWvWxv0Ykl32JiRdNTFRupqkwySuG/M3Td0095KK3ySVcs2y7hrTYkJz0JERtyLn19dj+Z9UueJmxN+QukuWx/egLG/d7JbFTVXGPjZZOweB1YRLKVeX1V9LZS7eKctwJfOVkqRLyZWJ8ddyt2z6RagexXKxSpR9uzl1sIt2yXsQUUOKNyi01aO/+CO2au/sHEiJPz+OhZ3f4/DlTNkyYokFxlcyqNiBh3sDWzqwAe9L2GOxBxoWruik/lqtdZvDU0pKyj0pf3N4im//6COCyYe8Sn0DEY7do4+SoIIey1QBkmWYiEYYDCHicgPe2SzQP/qV6i2ks+CjYU5t+g4wWKQPS0n7UYh/whSf9Thh2258c5Gi3BxSfkX3gsCpyMtNq1oF86oMgEySHMiRZUHS03bla9iP7CyG3Px9ITTKNKwsajJ/GZwdlWKm0iGu0B3lTuUrbFrpw1053ZVd1Jti4LOxo5jZ/1oBpZycjNSDUEOrhNOtg25NBgnVh1ugZW6cMP5gF4l3Qvexc0JqCTlSVPHiOhfVKsX+dVfNm2+zxWbumpeoczHFkmpdrEFJLrV4UOxg6f0I7j6DcTsM98dv7UJPRdDwgkAHTfBz6nxXmpRNKYOiZf//2CxXOU3/cS7BbItS1qyTze+DuxhQQ3KJ7XAVHBByGBzkdmrM203Npu6UJUeBUPvjyhZGUlkmJF5oQ40VTSKKGxj2gRiAA09OzJLynEw5zki2qLAtCA2/5dCOJ/WNyh2pVyJ/f1IPrdG5l+0xkpfiW0wmyytvBq+Fys7EF/G6r7CzDGqVB1o6q08tsx71zCBrMu2axWZdHrVN11H0xJrB6MSsRv9y9eY7a+yy1pyhqOr881InnTJdpOgm2JN5f7OETMG19WoLYrJ58jW4FSIarFerG6EUj/c8/6/PD7+rzq6+R/ssN+Ij5SnAfXVsbKehEQstq/l8UdKF5k/5C+FXCjJ4/ZZ6hWpTG6tqp2MVee3r9eEtnWNkEh5YlwaF2urmNinVs6b9Oz5ZYVV+27frHv94JCM4y0epVadnNTfczWVUm9ZokvlyYfEFQ6XhsA237qrrmRJ/7xe3r/l3Tdp/xIs/8PX3v/tDs2GU8eR5KjxF2QaTDbSlSflJbcogtRWw829CX9xYwE/GCRly3wThV8CKPcc2Qa4jyn1uy8XqvfSxG8MRi901QyGkmtwMqZkqz5j6lpeaXMAEYy0fgzkTv9NMHYtTDgXzj7YGJ1vCFkwOUzfQqJs66dTTcgqRTVrw9EVq0QUddvt1Ua6TepeaktaCHVSFkSznE3gK+Q2lXy9+jVRbnTzsQ1zEVB3EpX4NbKsybAf5st/Dv/0g6S8lPY7wP//KbeqTn6ZMIE9J0l08WKmpkRUMbONW4cBgdlrjelGW6/Fb/GbT4BaEDS/nJeTKZBJtFxd2xkxcbBffJRf5paw3W15IX5E4SotzUsgB841JUgcVuiiOBaXDYdtEraMokdWjBQ7t3spVcGdkVT9QmLeeG31qMxQdPyCPMZOTx4QwfLUx39reTxnibUcrZ/8TT6uRW9g9qHg0u8BHOqJOJg81pCUea4ez4qFmWOC7Wul0cnXWt7HpkDpZF2vmCLcml9oizGToyyi/agthE1hdi6zurKi1zYtNfVJ/KGCVUy7sOfmsUP4Qlp6WJccUNonjCZ/Q/0qukh1+o6B1LeZz7Sp8qrSj8+bfms0FhdqfhFJdNSbytqYel3rbB/2dUILf/aTSmyjZtoLYQXpalSgJ1+r/pNQcOgAhIdT+mUGerPAPbfMVjgWdUfaFllLFoIyDl4PduhZUblHf/6LshDjCZfuqOVmCOIGsuR9Iy9wc7t14sYoFSOGy5nrcXGu/zqdySqy3e+Y9ajx/q0+dUkvvGbcdEAFdjlBKYCjiIsIelK820wXtMsB1gZKSeEJqdkNtoxJ34QOir5vMZWbrYUcpPXfq5vq6mlUy5/RNu+hooYLAxA+uy/T1z62Kjlw31lHbagnupSZJWES/msUiK1arxf14gt+s28xg23y9kemjp7q56XYvkxw7xc1d18tBZ3Efc6gD06OJjvvGilg9Pf8nLxcOfT0zIrVy+3Rb1lHwcdLxXCtHU1d75WuU5dmWmw78znv8Wj7TGllXqRvzpMPOQmXRpSWB5eYRkSphLwiCJIMsO9JY/zhRV3IvC159tmUex73suCm7s2Z9CiFo8N+1VcqtwoVsqs4HqILMyWRqgVqSMVXvbD2vd6R3XfTi0Floaixn4WLbRknyM/fu5lqfllyUtGrSEiSwb2HLqTXjBqIe4jJ8PdGRkxF3swlPTPs/ypVQ5arQccbHKz/tnll9mIOhe5Lyk/QIfRMOhgZGQgKD5YoQQbvGXNbJH0AebNb7PR27jZdRwYwzNurITD7O2Dm7U0GPs3gLFftMN809BbHZDTb5d1C4ThPprLthjd3Pi7yQrLAtS0kQ1Z5AFYd7CrXI9ahcizPqLSAVoBa9aqsCh/6EjVW7I0Au0ALFS2S6yHUQPrYLSDhJKY1Cfrx4b8vUJJ/kwXtVQHJtnbahjBPc2AxprxHsbWJxMezGTrKxu1Hvn2xB273rQtc0e7sN20V2sIWwcR/weFJ+pHOr9xTOsa2WtWOStd0t61XBvO2aPxqLvmzWJXh7uMjpcaij8YksCk0OxyS1J1hoKs0IFlZk+PlMD6WZ3faX6+ULkbL29366QXs7P9yeNvtfbk/H7Ls92C0Zx14+v8fuGulH6dfpfZLdlfVpPRmm8gzJngXMGzV0GYgwlXvobVwzK6vtCvVTiygd2fF7UE0m5JoiVKMF+2GWUB/rbrPClJHtTBmycirn7dL9jZoVjMj/ar5uQpaEA9Gao9x5R2GJoXtu1BulVCgRGkALNZHd6ltOPYUwN3BBKu9APQCAQTKSGaSPGhMh5fk7WqPQ8Sfd3JWDIe0cbOnGmCBr7xSzmrtpQqxvbMrVXYOugJV4RxsYZVnWdw3Ul1+419vOUuQ3NI3Z/qCyfbGR82u5SnwBtj6nmmmj2dQHNH2hHa1vDcfOZrdakmlYtsEzWI+RQZVxwszg3xt4DVds9CtPrnGg3Ve3uFa0Gasqa4IjiVXFnQx8GFm223JZvm/uOAEu77t1uRTac6dQKLkm9Av/XN3cpqVx/z3F33Sd+TNsV8nfXF7m7u3w9OWLZ4+28fLVo628+p5WUoMKXag4xSkODFyMarX1kBNeMXMLx/zlKytykL+SI8Jh/vJlSBD2Y5RPasD+lK6sNueO/M23tVDDMtgY6OkSi11W9Re1kbwuvmKZb/tNBluHJaRikxkOw9Djn1yrNe9c2E4SjamsjC+m4ykP7Oyn25N2B1TKGpBOgSfcdOAId48WaNhrNNldVeX2oB/kJHLUR2mxXMrtnl86nu/kzPw/y7bZmmcHPuAokaNIv5lY/S0EQzu6ktb/g8H57Gvjsvr2WBN/fKSJN5CDPtbIf9/ZSBheHhMuaCCxqyVm55r/eAvpbL5Sz+s69UVZm69MfoOevXSHA04Kmqsw/YUbIj/02hO4bwmNWTULFebuHwYfgYM81sBpbPcUWd++WcBliq128IaESU8XH//ivyUzh6sircBDu1bpf4cXo/+280v8pienAzzJvxZgwoP8fNHcHSr1tQfIXzzhQNYX7sq0mwRh6LiBSnV6Y8Ax+Q2MihVzpLst9MQGHTmsK1UrZDSjhxhzEAA/VExGFAE0TY+GLmouP9d9OzRUuZUPB09nk1X7wU7PGoqD8bkWKlPA7QEQA1AvYLZ0lrAuvpTq44w3LWVeocgrO61WbejOSL3L9NE/JEfIZXWoTRnsxs4PpIKFm01pxDuVMoQJcQCiF+jp9J5k2z7KZsmpXisBlIzf/Jz084Nvh1OEffxNB6gGjrdh0umeBNKq4g5ol2124HHkYoxWS5cPeoBoHCFFfwid73J3bylaRZLRa3dClyIRGEZ9dW7Le92zZPKoxglTSt7c9w3ZemQOqtDva4n5FfYM7l/pSIatQ+rv+URC+bkH0FrivMbOoHscbKf3fiRH8WDjNr9hkfR3POPv+EDf9W04vmQPrDWdrqlsO8DomUXDXBERFWoFd9dkYNOvTFgQ/crKWezbgykXAAU6r9N978AJfErOH2viqqz3N7Gb9O9s5Lwdbn972sqfygj/933M2I4mv4cnc07sxYAT+5cBIzaYxg8xWPI1SBdlJpLF4tdUb7yKtt7C1XdKQHaujRR7i1NZnf+4/B79sFd35eJr+eiYvvqNY5q2+luG9VEG9zeM69ZGw4f8wwdWTyOXvvPqUURPiW8X5bdquuhZ4ptB+bVl9SxntJYJFHdUchnodh3D8thfdSAJ7TUBE+ldXaW7086OosaOZ7HCrifMe90bH/c7k8letWNvBfSqn6rSxuxUI1s6cQi74K4eUjJI5scQ5Zujkxw/1VGB0jYFHMSvm3p/aMtrYctdYA2qCrH3isnZsvhWLTfLPZBfp8W3HLBfD5bqwX718HrU/LPbgQIGmwda7A2YLsNKha3dJd1fjg2hJtqzXqGAWp05fM2jldIurmP9waIyN8UAivNI19S5a2fH1GDkkQq/qVNmgvJIly4Mkmdnpxyv59FKv6ljQtl7QECPdXFX1/aW+U09GbLvPeTk1Gm8gtSOzQ090K1Pbh62u9B2p4I52c6e2LNSnMS4hgLIo6yyB4r5Myd70RSNF+099/Z2uezU3/v29sfl8seui0SDFiaFaYLUqgSmJLRJUnsMg1Y5rWqhAwpLRvgC2Y5cRRbtMhRrhY5m0tTfXv06SptKrMYfbqhvMf5SWmm4uxaLsV/0QHB/QUNbRipIHGU4RK9hNvveLjJAWVmSX8UBUYASjIbiMlERraZT1HnEW6oxIGUGtMX40i6yqtMycDTVytmmDsU+hstQdYAAElLzFO+ZPhOESR9PNvOqyf9L/ouwv022kU6hI0ugIxJ0/eT0Tc6dQaougEa+hrG3+20d20X+1ObCaAknjvmcDhq0tOPb8ynP9RmS+2/NZr2ZljHfErJ7/XsyH1tKfjLveQ4m7T5oSaFeIWq35y6EfdsOsx8ZmnYYGmvfDARS6S0bECigDbhE3efgwg+FijBysvkCZIGGxuY7V4GoMVvP2TZJ3M+txHwIN5wNDuORMhlSKuUPY4UeA8H1ksq3KVcEOYUqLwJwAFK6XE7LuRyDxm/sAh+o0mUhTwse6ZOQykYCMqi0vW6rGQzaKyg6Uyhs6DiZSa0/s/tqdQOz7dV5w6RBOehsLyI0DzyD5CwYjNGDH3UPQfks+AAqD9PL3QJpMgu/3rpf9zwJA1PbGUCkfX44KhAyBYbgxb1MXX0hwwZTNBU0Bb8rzFmbROYByhvY0EwWC61iihR+KPd4DRisA5Ron4/1npfFwftsOB48ODmmSXgjDLJ9EdTi15gspNM4LPOjJGz9LYCK1LFqrL5WfUXUSXca8J8HmigKOWm3pU3pVFLNixuWvJedJ5qOLBpsM7pRnSYlhnbeocL7RyrssnYOWy6e5lDCgNxeav2RNwgQjV1PR3rvycOC3/1U4nCE5wF1Y9fzkN573rDgdz+PwB1yRrsthOZf4jdbFQBLqccf9C9ccMsaSMP4Q1C5Ma08k9Ahk1Z4tq+Oiy/zIg0iYplzjybSc1qgS8wulwX1h4kOC2aqFjczhdQzA7aEgUMVjRDgSXaaQgXq5Gj4pW7q147aQdsmnGMVCOlC3TSzGjbAhAI5K9cuekH5M8/YDfNdh9K7UMh/e2U7/ykx9E7SdoVnbwVsaraOhhFbwo9+KV70Dq3p9ulyr5K92T5xmpLdsZDGfpFtVvI1oEDxiwxAyWOAMGcVrBJvyNVUNDzkdaZgA1fN2EOSNGz7plipq5vsOTOAUVNg3QdA1gKPFe2dNNX+yEQjNwqirO7jRPPtKvXmNfFGsPAffa4n0WzfCDEs8LuIXYrW7gpZcCUkEPIqf/pcF9Fsf7tStWZ5eaSWl9Up7NNVQyQ1hWTwl/lUdFSB0Niu/aLSeQ7W99TxEQBqXnS2cG27WpUFVwbpkbU+MmySEJyFc9vsabCjTNqyn9e5sQ1nca+mJvXyB/UtUYt8gYyAZ5AvshB5p0z7314c6Ege/P7FSFZ2yL6gX+Qw+1DW+3YFjV+0Lj80i6K9vIV57ztLypmWMzGDgqwFvCeSjqvipi2WnaaygC7PrRq8lAMQpB8gRnCt/YBDWbG6HVs6yZct/hUPZJL5ePVwpJMFySqdO58IqcdXaxdcvknrbrvI/Tz/WkH6vrgnfjbsXAqK9mIEGuwebaEeLnN7ZasrzNhnCjnMm31hGJ7CU29o6UrA+wDoRAL94CvRnW7fiKhR3aPVfURO6pzo7BwV9aNmZJ5iKucMbczGKlhRctVWcCrUTn+upde7B9FtNjkQI5iKVTd1Je9coNqKID0h1AAHjcboU8haheWuTfFIPU+IIbJjcHC+Jss/B65AGBqetGchXc+qj9X2kSFcznX1zd+fjZmMvUhbpWQgDkroJ6bG55qmCWqtntSBjNiO8S94KHm5461in8znNrxY0pIJ976jdkrRl3sbUkcs1yZxAtsuyymiqtRqjY14Wi7MM3zw5gdRiQd1BAAA0ZKBz/uDtsdAURLAoS3h5YzBoywcLuEdMQy8cpcO10c5WcrHwmd8V2xuFE0YUl9OZ363G6RbzCmK9N0L6JFmfMxe30NLrO6JC5XqRyciTOH4FGxNsGabzXRx3JXBR/hmoyKHJX2kEXCtVo+o2J/OseexDq6LRVdd39toglzaKtnx9tF9u//6ZUiPbx5cmh5rJnl9X4kl3mzTBlfoQfvr22EohgMOgSyk/ivYbg7y2TZrGtLNN9xnq1rWaaWD8rmOXy59aRV6nG/WiFnQORxaY/f504DFqcrZYiWMk5C5Z3ubCKvem2DHFB+Javh4Pug3aZMajjMKAOkUrJj/h5ykURvLJO28PUOO7KXhus2rTeeP5gJQN5O6rG5up00rB2Uc91Hq0WbSVa5VVIVvi3jwFjZin+v40GJx07RC8JYPddlojOwms0CUmof7L5vTrKSH4ve1m75IrIu1xmbX3m6y3TwPXHdM/FyHOCTTUjcxim6LOqFcKiL1+auESyskCnCpYa+YjoxLHYi+jontbjJRqHDrWe7+wo2aq6QlKx5bo8/iulytqCNQxZACplgiviMZtz2VTotvPvehURr1YkWYZ+1XREB7rHbgfqG3LYRkffPpdK2A1MCks91RN3l1G9KzSCADfFqPWtN57XUks525syHBcBUeKh36hQyyW0lFRfpFf6eENM27CJ43LeYplbZ1m+4t5kxVY4LIIqYtIoi2LG2h07qNmyMLyJkU+VyTyCvF7wsUldh1eId8iTTgCylmz1P60lo0pHXaqWcj9WnazdbQ0Sls3QPm5oGKgde7lpNcSUz/ddALGF0AmrXwfF/L8DlJNcxhx58ZCXPKOZisxI4HjL6DIjxaYDq11XSjUvHkxh8cl8EoCJfZ46tqFaTQtxElkvaoK7VBk0EHOJb85Qt2FpgmgK+kUg4P+KZDoZEP3a6wDE5s61uLiKqVRkTaPZn3K0OwYHhWi+Im8T4H6G6wZOsiMO+2UYEGzeo3e5VY2lJssd2fLW0XA1z2mzGcY+RUrrcy10CLpcUzp2nKgqxluy+qb0ukLbAjfqAzn+vLRk3zgkUUXuOAxyiz0+DEIIPyKWjBblYdU959uPTwD8V6wzh/8ierG+QGEDXj4YCSZlJmOkm5UoGG/4HgjgNVDmJfNOYyq/Bx2KiJr3jmmUANiOHZqjXByvqK36XimvDk/adctZl1r0m1puzoGfin/Kgp1bFRz3m/wPjSwCVfMTssKGPYf4RLJn22/mdTl3Tbyv8qV5kS4iD11I0/f7p85tC7JhQYoO9aakArrBsvuB1Q1csypirjJcIJYNKWqsN0nA+5Nx80ZHXugob0LslI03f5OSWtD9SLyYNGfeXTdp2ggupVgkjq40p23LeyWMe80jAJyHjf3FkGrzRDab/belw12xYqrzdrMMshK8RaLnaZrYygxiNbSI68cNsR3SiJpR81VMo3A3Sxt7pyhnGplLraRkUjqBBPhHe9rLd0DNdcNf7DxpMsYMh4qzoKeA1L+lwm0JwSR4Ojfm73SjL0sTrfbc1gX1Nbbg0Aeu1YBUnUnKuAXRTRWtXJYxhuZzRsL8AVPNyc+Zt4hKrQmg0h0J9kSGSeW8AW08Tp+AY7V9qOtjH0TQgRrq5AUEeGKOHmnKU5DBdjkIOw3Ww35rptyNv04fJEB3w7QyANg3SrmzsGA3JNkQYDcu2QelgmeRi1kGk6KwXOSjD5f8zZf/yX929rj8HL7m8sJRRBT++adh6LrCwFgUhlc2/aNzD37Mb6J6SeNWumXDWEP6NNKOZ3KPAeMSpgkfDe2e+tLGuZBQBb1X9CatXwLjFc2FXAWvJi240dqc8y4xPxIn2RkIk32SrAcafBl34ClQ7F4aHBvWTiQrPUYl44p/W98B3h2nakAbDxVVSs7o2IM4qBJRpgu0yokWRvYhAKgo3UPPEwZ1AHHigm6Tcvrt3V/9D1XMaHYRnSR1+ev4tPG5Tb8zhUeeQJ8J63BRTr0EfeEXn2j4ZzM+lbxbjt6OzAVOm7BumRVq8JG2ph0hMMlcfGLx5stsyNtvv5XcO7v8Xf1MfhF9jfLD/LwGDM9VOxdbYBQxUlYVcBGe8qDb9QKPbfTmTizqNfNdYSQwIhlXtoaNyCN0smIx/1SzEpKZUYOu2yeHBDgvRM0SlnlYaMz5UDy8BIKAM7BnuRK0+bmJCk6OO4Jmf8tvr2Xp1qUmMWsspvedZ+ql4tPxyopk3+Mvipgls9y4Wl+6TNlF0KSMkz8qE2kZyO4mwP48BNlh8Gk3lr8WHOwwtmenhpoGNYJ3vX43c2u29FGYS3PSlZYxFuzI1nmEe93HdNwmCIZl+QMDX65WIgB8tT82XL9MHTvG4cRtlKdG6yzbuf4ZV85J6+WkIRLBu/U3ujbq1h+8I8GhkrvxdOSGs/gick0y2Cr2qXjtpKfitl43vIGNbkzAp4D0KFt/18N7sZNBvsbgbNWWvpgYSsh2+cY79QU8ax6mqSvVM3ypPL86Y9OT9CrBrdLGOJJAoAPFU0qk0uNXKUzqnXgI6iDFnnR8xSla0GFwehxbE14GN0ASCjw8z2UJU2OY41xedHWQ/y39RpdqvEXijBIGQZaIOZcASjjacQxubA+VSwX5zEY6xGEw1AjAn3tQ4Q4Abm8gz2HcEu/Wdq0vCM0nA2OWlAkMr855Pj4zdnavcILLC3pEk0aRCqpOIe8rZKrEaAUE0xjwZWlbvgl+27N2vYrYRPr7dyoFidJS28vr/ofYgr4X/xsK1iPH2wnJ5DvKAB38DExq/MqLV7XSCQCy+nRRsgcuQotwaAbCtDAI+6cr2h0HOzYmQ1hnC7tIv8KaWvz7Kmm1UL8xs9j9cxXd70PF5nxRLSStjCTvwqu2bgzHp2P37rV0K+qw70ugKUgDpZhwDnOV9kqXzkebh0f4GrTVvTiYCCOt5Z4C/Tw1i8vqD6AUB9PR+roXwGQ3zeuz0/3l6G54YIZOEya5Z11VFlPT4Pl9IzbLKbmpJU6Vy4y5ay58zHp/iVN1gWK/RxZXAxbxB5EBeHCAki+ehwD+BG0rrNUuj6/fhS/7JYCVkPoQILSXBBkAuB4iygjcHPaqQyNhsF0z/RWEgSIcxjbAm5xp8MiJIcifeAllTEWugbmHaBqzwdn3udUy/Hg/tB/qtB/qtB/g+D/B9gV/a+mJYLWJZxYPQOXzFhQTQxrg1MqxIOt+N/LcuVxxftsrvbYn1ybYgPn+Tm8OQ6NxChxAtHN7sEq0iXuc1Btdresgy2CUqksVjnO+Uzo0RM5NEOxrjJPQiCFRCOqLqpQxGbH3OmxrJ21g/F/HgfCkQObJcFbwgshdmhEQZoVRclXLQqu/ac9FUGlQK+06CGi9ZChEoSZeGOZDc8lkkcg1OqkAicD/b2OSa2VQmxZy82jIpgJq+MyxaidrSaF4xkYb+tgX87xQKS5TITBgv1N4BqUmdQjRfcOebCPBSSBhFwEUg3aiIODsLMwu2lHmg+REN+9AFdOGEDQkGlTda3NK4TTsIq1soUIhQyWoU3Ugt+g3FFcq7phrxlKC6O5vK5Vg6NKG7bQToA9kU3i5e9zJD86led+SHhh18TnLBR/5mYl3fgiBhM9OeCyrLGE1WnsDVTDmgbTb0MdJlqza8m/OqfrkZkw7nfjyTjo++5g0AyPFdc0HDtrKnt04F1OYKG4a1igKcSD8ZrmcdyVDjcHxpauCJUBThcw3b1aNB8gYiVawivnYJFGYvjhf3+qtluRFMCWhowfBMA2xCFufwmu0JVv0mKnaVhmk1tpKogry078oY2Kr6MIHi1lpI3+3kY8zlpbMc7PtremxT5TfnbZbC8DBC37NwoP4myz3UCsRf8I6j11yc/9CyGx6aavWnXUSnmIzF8qsu6g8TUFe4mz6WYWmgp+Nldj72M4MG7YINzD2G/MbvWWTprFEQ4N0hPhW3X4OKzEkKNhx7eRQxihxnuQpOItKJ4Aga41dnIPfvRm0mCrQ9no6sjC//Qw7YK721s7qzZ1eBZkzD5/Tattfh5R7nGSMD32loW+ZScrY2gecPIOW+08/lws/AxGfZB3S3CcFP5FnUa/nlaH9FpYiwkxGkyX3LoumZBGOJmFR8b3pqS7hS6v+jeIwjiRMMIIg4gSA9kX5O6lg7MyjmUVh9Keuqaya3thmP7a6mKma2HD7vq5chs8AtLhzv6fAMfxXBlOSc1+7G6LTrHNuS12cYuLkoE2jGzWACY4lZ3tA9CIBAyAZFo7UqB2Kcyf5kerjhKcHrxD3LcyvCkZ79G3V98yJ8eY4HKbtX90zOHaDPUvs4aGU+urt6cXZ2cn/2oKzjOzYRemJWMtzzKj5v87PzKLcCL+p7nttxRde8Me2OuIhvq8fPy+lr62f1TNpdu2+PjNx++jCp7sGMrzYNe50hR3RI+V8+NbzBz6yLgAwUpiPSi2wFVqZBBbrjmogjZKldtA2dpqks+6LW6u6Y5Niu6yXpcQlC6I2+ueTJylPipsK8znWOE0FOoOJnFp8KuKNTRVSMMHVbaEsLXViNMrZGYXW9a2BYDmr9YdBN5MeGA3moicfihWymYnAl/v7jnRCRiIe5MPGqBzClLtIhnihirie4a1gtcojN1srapXazNWUFSDHlekmwUoOCQdB89jpDkWkxHj+WoJ5fmRk+fi+bGuRSmua6UyVSCXXhx04m1oZpmKLhqOQ/t5SlaX95attIsbEqwRTBkVnMjk1Y6A2nth00EYcSmpAFU6SKwIBS/XWREh53U83fN4vrjSgW7wdUtP8xpl+ZSmJy4NCqYPIyiRxk9oV1m/6rofyaTZOvH3tx26xTabzeerYpVEavpl8MJUK1TDkGv2131pjBEf6iiPBxqM9prBwPPsjfFHmj+r5vF5qSGXOmBR6jGuTJE5e9uG6+s9pu7GoUwUyttve7+St/3srubDq+6v/kuAkc98s67H8HJgSnhj+D0cAPVw0RBRItpEonsWyskBh37Ws03YTuS0rcy9fsP1gPA5WbawX0beMG9LczqrBsgWNb3273W94uT263IZCPh2UqGf1Oizw9OcOg2dovtr33r1tAV3tqe0aBy5HsaygNYGKkbtwCgnJEB1VrZjaz2Pc/h6q0sWKIceurujkBhwpbURb1mnOOFMAgPvLQNnLMEklLv2hN2Nf2zUN7Fb2r6evcmMmz8+9vcqrpnoIbTww7y8JML0122x6+0xPueYeN8L5xh2jdqaYuPjdZWi3sGy9v87qayaVt8bWLxHr/hqkyW8cHrlSB7kdFGoi3L2AxvdxFHFL1LnncF2Nmdxc7rpL3znXRHS3nHLnZRGeyyqnWm3c+YAhfuv6pZfh7dSGUXv6MWkp5Yaj78tKrhHUGu0ozvnwWIdABN81hvmNOIqPNjbtl0ktWM92C9cJt6cFrEXGhUrcbHdmFaDY3SZwatdP5PvWsTOY+iFBj6LRt5V6570byJQzJ+9+Zqu1pOyb58SY09zYeEoECKkUfvURhfaeNntHa8KNebti6jwSP9Cy3RYaVMXmLyJd6o4ua7uqKhUPUMwE5ERObS247BpJcKtxVU1i7WwsJqhT26JIqzCqM9TbWQ7hEGuKyaVrc4rldz481D91VztBV62dHxA+rBdvTlXhNR3QmkDEWoC4FB+/rO7XC8IS5HNi9jwInj0msvzG7efBpddZT6OWaUpxmaC1F26F0rz/QQhTL/hYV06BlqhmAvptE8aQT7vrj532zGFeoXaCV4WSnBoa+u4hWozETWiTw0RHJj5CCHvrF2Q7TRzK3q/rxRRZTb4+X/qQlQWxAg5X15o/gotKA+phorV8MKk0X3YoKrfDeF52q3rC6jCLkXX3wmd2105T7CbR7us3YoFNjUk46MjmxXMLmSjAyEenwM21qMTJAL8PAW3LSlJgvTin/MXxK/Cd0gle6pS6TjDqAvNQNQISQIDpuGUGAZvgCRNahjrua7KrmzOmuhA6cMCfO6rGe3MIHwcCrskOblITO33KyLnUp7Ee365aC4WcwDNNH4aOBI2QVpdAJKFLwZZSvB8+l+3J2VcKd+XdrqJHpy6r+qMXOt1eh64a7jo2C9bc411s6rQUTzbUeb1PdnqVZONMOVJm2zUeNpdLBDD90Q73LNmMG0yTe/JnN/6bkTDR3VQ7P2dmeJB9SH2XpHq3t8pHqPCQ/B2C7h1SMDLC9x3kKe8CG4nk3akubU45Akk7dczNMxZYj1kYIbfLqVrcACEXABXjXqm23BhuDoh60CxRKEg2I+h49+Xd45gKgZ4xBnYeR+4mAKtzzF0UTi+Q11ISbAUVxB8FLOoi9JWIvvQlJYkf+UPCp5QKZ8p9BuPiO4BxaUEjG0ViiR5Lmuk901MxYWJ4XpL+Nd67dJVmxvic62V/QjS1nXaG8Ba1LGjer1/VhZm+l9FhyY5NsVixltGsbhKvo3ZbL7t/e2+PmVhQYqdtWnplWfII3GDt6Ei1JmomM1Q/nl8aTr5s9oKo1gzLYjWj9IbBp3HFRzEImc6Hzca//944phc/RPmkFMLWcAaARHrvLNt1U5j9F+rTBC0ZzMNSLNyfzHNCtFUeo+qXR0D0qWBUAx/D+3MXPeAyNDXdtPn+vzqKFV9/gV5ZxT8/JiEwwhaM5xlInSi/D+rrgfpf1zeKPf2LUAgPSP7Y1OETWasMF3D2UMPzlh6Q+dWkZUf+pzvc0djb2BYxQPD1r7qVR9BpAJqayHAGv5B2v5n3/d0Qh5W/6aBdJ2jMdgPdrcELiAbm5VV00r2oeZaiuJAdlTX7n34Z6YkL+h8eD8vPsBuyN8J2g3UyrIUa/hEXQYdBrsq7bICIB7YoEH1Atz9QtuWeauFoNF5U+J36Du3V23WdIG5SCitETxkk+wOonU+uw7YoyHt3PSZL7zSVTgIK5ha93eMOTBXBT1Z8VqzV1Kg4U2U+xVihJQBRzdbjtYuTdy6r74MMtkj5QNeSiCea8Dy7SB8DYcMAayU0E8PIWh3uDuopaPIdGbc40aVb4MlpM6kUYH/HX5ba0buwLsUOtsK9sxWuZJ+RjZ7HONU1ijVSDh0miBc/W4cdMv1cEEQzBkOW6pZl0EdFO5UwMyzTBjMrw87uOKiXCiBuyp7k0hqHGQKcjkdnyIYSC8lYaWc8Adtcn8XD8FYxOMfpOJ+iz0w1/lof70kWitY6EFf+OHWgjQrDtb0KF5qH4KO+u1qffUDdx3MaWDZ03c2qniDTs+VXu2EdfN0UZY4iW5hbK9pEn5lUwfbeSKqB7MytXcHLXJIcLtUnpXd9TSvlOuY6sLcy+CLtwYSzLogT97WNcfDIzlQRUTgQjRFfZIeBU5Sqj3G0jxsAtYg60X7jVEruSsWf8CIc/rclZsaFxp3Iow1R0AqQ9k2TAr4b9SzstChOnp8TgUIQ/EeLc9XtmtOzAX+RzaFuKzT4t2/LNCSfGG28zl8CRsVlzd1nnY7MW24a3VXmwHvjXk24b1A/IFaYHHiB4vaM/KfXQpvDxt6A0ggBv7582LF9MXn2vs0LS/vy06bM/LPESd3hfQVWHsHo/nSqOp7qcHm3m4FQtt+uLXn/iuY7giZE0a7nJf46nR8qMd7XZYNe/tdmz54Yb7Xpg/ua190i83t0+02ea4e5BQ9IPUz/zA8Q7WBVX0J8e07Uz6RPPOxFo09XqBhGa350vyiF5wNIKNpibgwqnh7JRqZAstY5rZvpcDTObk7UdZNR9LX1lUFbOGY6qVaAZAf9QjuwgpTk8D3I3sb6rF5ebfj52XxgL9XPtKJTsz40afv7ieXv/xxX97OS+Ll6/+IHThn4s//HFeln/4w/yPL2f/8i/z8vqfiz++Kkd2mtog6MCYpCDXGzlZSsNMUTBF1WPLMRMRlpXymDxcc1zx7aI7uDkgspoe5F0N7vI32nsRUMmP8nZqBZkGu+9G+KDJmqDe26kpIOw2+9Z/iPac3Hd9Z/BZL2/kMRNJcmkdmzbuQRM9t1874fn044yywidRtLG1edU3rjUMCo1p9BY+nLRldjGSRiAiv21mzWYYv1XBTOS3K1i44VOZ7RflrFrRyt1OzMLmVVSGanI2l5cDf5i++jHTtoa2xqZTlz0z5rI9hY12z4hZ/UMgNXE12VhNRaLezNogeoVXplA9YPMFRD6INNfBshSyTcyakABHh4v+0/ovg7D17nve+4TDTu42M+1XgU/V1wJWr66LNkOpiWXIBB9oqUOd9AgZipvtMCQU91nbdq/+qP5pFxeXr/7ojoblejDvvXa/c0G1PmbcYMMA8MSfy8UKHJMC4fCgEkpFE0hQsdwAjZ88scEOxr5PnlBs5o8nxpAPH4DUPKgG2hRiOBik0AO4zYVWVJtNhdy5HjNI3qa6kVNnf02MjsG4jmyac0D/nqZ1U/Ag3wENeG5kra9jp3HcSM2KYA5B8yg1jwjWEV0+yN8e8uB2545+oW4Ydawz7Z529KExFhoGzb1OGcYLvQxegRiAD8X6Vt4BApAwZ2IaEIDt8u8ZP7r/3aYNcjsfQdWqPUIYSO2QnNiF8Wfia1xa8oLhvTRdQ31ZRrTkiwjoGuiE83Cw4Ls9y2P3sv++VsKI0PGtcvBG9cHSU6odOgHSBCZj59OC3MShfjZ136o5gcY47FZClmWc+03AD2Wt7qWq41inDtTmJgEv1ICXgANmr1Iv4lDAE4fYOzQUICNwXGNQMtrqG7Pn3zopT4NeXCl2hb3KyoA1a1Z3rWUylwncBJAmSVZrQq/XKfJQUN9CvHdXJJG+EEGOghwacfrhJNbUr8Jn4uELLieMfaLvjYKNgCLEBp4yUC9pofLzzzjsrhXEIHb9UUwHBFRjgNbRH89MyEf0zoHZHY7y/J5htkaHnhyWOjzI6zcudtYMM/Q7WjAowqNmkfhDznBnBgE3iG88UajHbnzC29zv+1DeJ/2yAzxvjLdVN+TIGFi6V5PcW/9BFlB6s75t2uqv0tqE/PdVo8WA++GhpWMZPIZQHI23BjQQPJIHwD6fb9XK+Y6W+9x+KLm/fTAxi7mcyx9s9giFCB0V2gwt/ClgRDJFXSTaiFXC8Xinrlw2eNZGiDCi43GjZcLIp6ViFPTwCdixZPxxv+8g2DvTP3rGTA/6P/WRx7W5/hwYYo5bS/0JxKUUBj39nruavOyb0arh1kMNluCTcVqRL+nHlfIQiVhQOJypc0qqd8wQK20x0WwpvUxKZ/75xo5Ck+lp9ko4s8twrv2O8f5Nw/1jDIOyLHvmBkfUmb4uFSV9nmA8oWAf4OlkDcmtncvUWH6e4ww1ytTe5qoR0ndW3sUNSe2GfJfo7yoOGFzUQpdXq7KOAk46+ST7CTpkXv84EZdxT3G7ZiwNuIeDQYIYp0AwE5zqk03JXG40ADu8nIHBa4hvJPTV3OKm3hAqEbWeRRRN8l5oA8MO2FN9yGjfx+pPvQc/12AK3gCLsU++HILXZ+ZPRpY/BQ3Stg5RW5UJZl2Ro7KcEK1DwTH0stTp8uSJlgIfX0yVN7H+uMNogC2mSIGgJfGoa+/gMvqIKepmVATtkJJacG93SRc0M1A2uiUrPag8J4aYSqs7ijwY9/iwZJSuet6H0azCYD4hEahcH+jbNKArDCjLNqw1Bf/KnKqq0M5jazdjinlqjNTtwCfag66TTcti3QMwR6dVfhnMnHrKpC5Rxjk0I5UUoaXxa7nKeUkZK1TIPAlSS96pUZvrZopF56CTCVyjg5f7qMTzSpTUaRyR5s4MxVRuG6zGBhrzYMC1qaMoua9CP7ADF5aOU5xydDNy/sp0A9YjStsrRUPbJaAKD0Rulz4znOrWFCcpozjFQJvkCtOYZY8DRN0HZfFdNBYzcs+JdguhbNB0xEJBqyFfOTFqkN5k/kKh+jtLiLXbkhzxGYxpx0J7Lba2puaEhoR8vuiIJfsWkafheCQnCOFvLRCngdMyLHXnsYhnodTinp6u6lWisHLKIVhSbmnbpbpdxbpsXsqeAxiOtDQ1EszgDPNKzjPr8XlYQX0Qeg9AWRU0v75P90sTNU/ve/FP2uG+apAmZjGTGtoavEkvpgwDIqg0MQqI816Gqo0JFQigJBsEx0NRWZflmbDLswpaPAjbIZx7OU8wr8Ay+QgcOeIi2A8W7CGNkXfyYVGndBMRqhu7iQXz91SRA7tCBXxEsMjtGuQphX/CDENAkY6S938H7IIK3Y2R1BR8eiXGGEpNs2FFciqVH8rimU/TKrXXHH/Ae4CYugXnMGZfNacRHtAgt2P3yb4ewa+DbYaM/cpBOesexMuRZAS5bN3TidAwgeYKjjjQPwfq4c/PeWo+WUMF5iHB1LhPHsileNXgWQQUvHP73cDWqH0fe6AR4+nlurpPTRvWjUNRXDR3Jyoe10btM4cjvYFItUTaibTuIIn6stX8yETAJ3OX+54cWxLtXy2RJrBL8HDCAmrkQN6gxV5eTLdWcE8uxFry+6xYnza0cFZAzFtVUGMDOC1kSZwLuzierDWUGRgzP2HDqVvbgDxMw5TSX3NZcIkA+CRvwGw+5aXsA+X6WR90tT5Zl0t47a6kxwNYjzqvEI8cGnxECALYvPY8vJK9iloUMPCMmhMQBJ0+NOFVxke41e7YCyRlIdqVfJtZRArl7LoKchUVeKCNThuJ76vkUkYuDJswrO+riDI6vgoSChu3dLDA3S6qgDZaybaAwF/GCoRgTW7Z5wkZ5SMBl4TqzQDGoF1Skk0mYQL2mdAXphBWpt3CW6vfmExLyr8xZ3uG0yCuY/4m7GXKVCbJQYFWU8K0U2A3b4vOmA5Emnc7oV7EGizsurtOmdrjbRVJMOffpSrpHqgXrId6nWTvzC5u8v69z7e+vsoNnlr1IAlqJ571aZOjwgE1ytHkD22FGAj3nrWyeyPY3Itd30GqHVP2bYKnFfHuKDaFr3fqiWCzrBfZsRNK/OLXZ8Qh0KqpzrhNmx7l1qqZ8/00BEqmM7Wukm0oHmYqkm62vmuwefVqvDqE2fihFdRyETQh3RsivEIvqGrs9gf5iikzgHuHkYt+G06WkxFyOp5GdnQZu08b9Suy+cUbWM8oNpH5wpsemHDXZ01/RgQtcQ8SgvDX8X53c+mL72nT2C61jejDcmua6/Z/zFJR0Jtvs3LFw5rbvZDLHafCpfxpyVIyIKSY13EekUd+FkELt71rInzhlt9Ul/ZEU86vg/kNrTO26+STJAiEhvYttmOm3/XDpW8FSt8Rj/YtfEP3BKVVx9GRhtFD+Dw+WLFqTurj4p6h80KMM1g333cPlP5fMuP+n7EctRo5Vt89VLC2korNRKgtCMBioADI4eXLQs7lBa7uYFHY9stAW6/pXuytjNS0ab5slfOM7PfqTaCC90utJXtFSwOvp2nmGY1GLEUSNvFuTj0YLp/9KdvZ0thQwmECLo//26tfdz4ZQZ7/vgeHpE27GHTCGx2fPHkyz6lrYDhWDMVWt0a5AR3kwNT/XAM833uqE2VPVzWz11ftys5au/pi85BaYOuEStF3Pn/rI8UODB/a+wop8uykLhb3sil3PfDZkKqIjkR4WWOl9uw5VrfNuiHGNs7JTQIJq/SOdceMKJ1p2fEH/sm0/JjxqkF3YUp2gl+97vTGymkx4mIw+ePFe3WVZVk6XT7VyxY+rq1ZFr/8799evlp9e6ZNSilrFRWsZSaydU3sVoCXaU9ChUtNyJOKpjGIfmJg8jzSb7Chke2WUlyWBX7qV5BvCKSFz5/oXY5bcPt9MqXyAvPc2CJUmmtqc3i9gKVkWAeytQzroByixohYfCqncpzjoHlSbmkMgs3CsLhGCVImcPVI0JG9Xa9XPz5/DsEvIVtGXbEypL6RzKNnts4kRSYO0MiSB1pqjuTthzrTGh4cMcVCmffNTRM+Om7ipyB/+4GUsv0SDjlkcv2ODC6uSj9Me2RYWSKmcjBg9stFAYiWYHfCbSToHWZaKO+0FB/dCxNNFns+DIhtcp6+/k7jJLVlsVyUO0PyqpG+l0hi8wZHBc/DeC0c6q9fraNMcWFYf71a1EJivS8IgR0qQBSt+Hke4kkj29G+VJEwZWb3ntmF5Pi4kKSRjIN8VfF4liuhR50Q1s81DRuqzhQpN7kHvXfDbZNZv/tweZBHjFCvYYfz6pqc7x21fECKwYbRGrqQBp90Sa20EgFFScO0jc4bmZczoQXqhQYsXDmMbNo6cQJYp4HPzKkHEXYJGH2QvzwEXKoHfYudDA9A/7r9HaQYgloPPL5TbYi0qBi8NsUu0omVZISIRIMpOHCJuC00DpB8cfhwtPlNI9xCbaSlNFufrXAiIVS2z/rzlTnRdR/KVrHy5ABk7r5R5N+EYoxVpmBwKh6Xk6LGFCk1RI4F0+G82sQ8Cx9kwMmpVcWFuR0PTDKCO/LOwqkRgcFXmW1QNyy6dZxKwn24potEXt6sA98O4wm2OQhNDJ2cCsdccyOj7OMexOLG6uMDmVTcMB009Ay/skVh4UkWuj/6FeuHm4UsNTnYVQduKOS3d1abaS7lbdS9IKYIZW1mb/LkiczfJ0+yTVeGcRXSjuhjs5Kms6k+0TPMSjMCq1toky444/4ZeIA2h7pLdDBOYoVPtHmDr4XTJaPHVH/14DH09PRY9FqSuT4d6RScTD9M8On9urQ4NNtTejwMwhSnsRv8nLfuMt8PcmDB9oKcwRmDrRgHHn/PvGJBADEbCZlhJsV/iv7zu0MkWKWwnr+zcwx98dScwQtCbj1zeEzdGfxS2SRQbaFF4KaBLIEzp7Jkka6oXn0rjEFu+nbNMD18D4A7GoufqxBFa2Q3zVXzpifpetfQlImMQkDhRTEvMYGXV09/r1VcwUbOAiQWwBQQqSkpNeyYVGMh5/3N7FbPpnCQ2UBExkNoQhIj71DKwA6PxGQLU2QIHjO6lJtQA7Rt9Aj4Q26dmftP064NH2HV9zzIvBzQuGMQIvL3laPm0ZDY92TkZFPG0dgu9JqIsY0Wwsalzt5UM/PSTw3K3x8VSm5lJI3hZzYIPe89n5RfJ1a/QFhMClLZKEQfp6YyRiwOn5hee3SSSdoLBbbaI2z31+TJpPi9xjCqvd7HItvdU249afC0qEmb5NIb1KRcT0fDQtGF0wE3i828ajh72Ww+W1QrOG3c17PbtqlB4VQTQqnvYmHS3sWCH/uX4F5q8QJiQkYlDtF5g3qHKp8Q+c+i9m3H/PJjTTjRzDO6hp7XY3cRzdyjirGM3BdL4xmZEsHOuWNj2v3c29de/Lk9kpmXwjaahSQ4reihGFBEJquVoh1T1z6fp2oEe66q4Kfubl5ZOG5/wefK05ldhlpAEr+01sCkGOwDtwSQkwGQEYJA+c8XRwwH8Z/s9lhvbaSDfwLJnQ11dFDgyQMHu6T0dsleoXBA0iLhWBwK/GKHXSvw1U+8ocBl/+Br5ew4vKNBkImkU1SleZe6BEGo79YWMSDkiAU7LjtrkEyZJNbE6m6ESmWC+rDW5fquEfYhgS/l6MO24Eao3ChTmWl0KCgMlgFW1wEx7EgRGvAUQopSEEzOq9VbPa2BVZKDwoxAEJi8WsjOarM01+JgKIoSjId0IZPTgmVfHu/9/HnJ+G3SHbOY8VNnSHegcRX3lvPX92O/BFgDdMIGnk6lsF73BQlBEO6Q/ANZQqo4sG4NdHQ7YfptI3Fxe7rdDoUVqTIJJicACBuYilvqwERc0UMtzzFE7Ta0FGH3vZEIuo8ar1s5bJXt281iISw/gGe0oammY0u8Dnn0BMg6ok/plocp3gefUGwqjWj21fTHfTAKEAXV/l2EaGZkhk3HF52KaRvXPetbaL4r1+b0OLTLvBEuXO2ioyTgL//WswD6dnh/6CEpvt17FlLdNggmRGQIFdyClwlMT4LLY7GHjtXVwQcahm3AErZwBBaOyP0hggGbW9w76jxoQt2YGlNF3wnih1s+KXfiRy0SmnRo9GFn5Z3OyeH4aH950ArOnCo4nfUrWqfl3rQKdUMjAQtowC6ZjY5acsjpK7V4NYT/GJMhtXadGfx/iMwwsL9V5Q65TsSPdPOSbSNcAyfXAzw4j2sHM5AiBphBDSZn4nPYH5VAnzsBP7AuvtngHUdTQkLlmJKG2749NbU2LJJsHHoUNOB5/suHDx4tNyL86uiWEUsDpEqmfINjB1RSsLHhjXrDmKG9rDGVYAIQe1n+XN3c8tz/RkMayEzoWfnPFC7Oo/5C6Vzriaygm4wrsl++sCIH+asayIn/Eu5lKo3ySX0vO3YIUu2T7s23tewZ0lOLPGLoYbKBC5H4UjK29HXxFbvPVuRlD5lVqoGEvB1kOB1dN3jynzelcuFTmRZfTP0PW5Db4HZm3SGImjYgnfKY2SMjJzRGDPSkZ0bDlJPaIvYZfZuXoJK/sW5PSpcaQPbMF5TkmfGjGfw+GB8twCuMZMkpBpehx21u5Dgvq+z86HKETZNuq3WxmCxuoCG/XVKeUFlqT3Ag1MXKcB+EYNeCwNluiJTck2IZM2vqFfI0U8hD3TsPjZlO/ppBh9IeQESSFo1SkqLbKni5WdHFOCltKf23CrZk6kisJ3nr13Yb1rcuZPSfa661UgYqwLSr7lerWTteTncYNmCUf0d9Z4sfrm6dA/3p144ZfZFQUtk7L43033zwAntGIG3KKfD5FKfhZL5skd6GJb6zITOJTNpLpPlbbQYr+t5Hj8J9ejSM39DxoWd5V79hTt/krs61JLw8v1brHhDBCVN6sdO0kO+7OwrvwibIELx6sUhKm0WsdojApwOY/OCS5/2TBcDACrh2hNNLTcpPFTaeib1ycVPt7690StB2O+M/uYnLZsrXcIdjsp+qUcKWFfOCKjBqArNNDzVMl5sp32yNBeGfgk5h39NKST+1eoIhz+1QU6017olaMTQ0+lyf1HJGVXsLPSqt0pOPO0O0ebql8rBRzRx6R/q3iCw0dg59DX18CXvb0l9ms3Jg+8rM1JMtAQibc5MQEGfzZD4oAm4aBz8rlEj6kJMjy+MPBtgXhW4M4Qgj1osDJKm0U4FQDB8l553NWwSsv1LVrs9XxrC3tKxpTzfYvRY6M7sxgGYtxeeLDNmqUECj6T3Pbx5wPopHr9qN8Lw3ch6I+yGiotqZeyC9nWvJh1oZH52/C/4IJw5P/M5dhk/qU8ItRh+Fp3fP8+hH/Cz6Mhi2z3YbqftCVE05FFDwtoSk2ITzKhCVoftcx/CnsyTUt7JOB1BaeVVTdDheIqZtkslOlf0oBAd9ZVl0+6zUDtMh8XzTC7Cx8I3SBqWDtAH90nfDmFGHSCsD8PoqCTdVCU618+qamgd9mW5k0Qv/QQOZHOF+80i2KlztD2X+lvFE//85cgYA61CvFDBT7qOwkVzuXMWTbqYEfMzVnj8NCc+0ANj6fomY8izrGjmvywkbJnfT+2xedLcUGxh64LHfx5wzYhG9lh3KbU6sLKXQku4y8DRM8f7KrsG8akIEKB7yBw5QvDX1NOQ5+aaucMgQgrZpy6jxY7mpdkKFCgqYp5bulF+V4UteTj6EE0gwvEl6a30NbxZzQGoCcuH46tPldlYM23n16XhPzY/yEuMvCEu7tzaLCMWLRSAjoT0wxikmm+KJOaa92pl5qkDyYxinhniz/XemKoGRj6+KFUaPsLA87msUoQAmHapdWsTIgFNkzECCVBTL6pFIxrsrO5s8eoLyxGTCmMOl5lRpTOzgb1lYXpxx6YTrPW04Z8+avP/kPbN2dyNh7tI2i46laWtQEJpggnOYBt+RjEW49jVmJzDhKwUExXwM2uigix52h+hgjuXVvb4nRNie92OkjFj4obd8sFl/Y5BOd+1yIX0XHhQQxpDelgPAZdvU4TNrOPjmEAIAp/I7evSuhElUe/99L/tb3nWr5f+z77t3/NNFMvyU0iY9Ah5oJb7Y/obQjpeKbSFA82RN012ctsa4x4algV5woEpIV1ksx/iJScc9j1DhunpOoewADn1J30EVT+p/haqcmnco61P6GPobBCj5OHmJQWtaYjIF4oVaOI3zblf3Lo4omR3naf/amTp/9hv9UNWIdTzO5SJ/kw58aOTiKMdVxjN6eup9yhTZdcPRuZcbk59Ru/txxa3n8OMqf9oFSzPlS5oVDi7LYvUsOARGL0A3R9CEBFnfWKQQx94h9mW/PipWmPHn1xGGewLlGc54c6lUXVeAE37yZKkabi2OTkQIb872uUOqgC0KNV09BegGU/vgENjC6aKk6zS2vjPhQ27HF5qoONbK0Ntb41BQo8wom0Hpe9Uolu8nHS3Zrp7PXBm8Zk6QqWHsDoV1Aq1lE7iBn5PFfdluMNjtdf2G+Slg0UUsyABHHEqrFgQz/qoJS+eqrejkbDudNBPXEB1Fls8S+Mpg+NH9LHv5a+m/BqNTzyZIOw4NVXwWSiZ+vYovM9/ZIIDyFaLvuCoWzY2TOFWiW1Q1CsP1yuSM9oy6uTNTK3Us0vCxPf47xtHRkKI1MTXzIigs6GosJxl9orqJAQWg8aDyeEL/Le8Uj8vUkDScgv/0RibXYtjF1L1Zj9wjQySVqRzsN9pwIEA0rCBlD7iWakhNiACIphXePvFACDmDMup6sFXwXi0Gt5pRd4qYt1WdILLraP+23YRlWlNbRbdaTMurre92m5qc5m41o8rI5JSzY4hSF6Ke8v0oqt1/zAeG8fuGMTCSbmt1TWOx9+VNx1glsfDzv730Szgl1vRFBH6f4YAYHkjG+DVC1E71byYzYTyp77NNu3AX9G4sVOpQjSpMd7DyrL7SVsoFT/ahPnZvG1TbI0SLWW3jKsLWdMXqEsro7rwe86zCGxh3KMjDpeePNWZ5HgtlOBzAjPA9Q1s0d5lyydSPjsmf/rU0hOLy2zpoKiqEoBHe+tu6hxhemWpYswn8EDLUpunDoqgZGlX/WuoR9tJFLzKqFd8RSzU+wc8olyHIWDITlr3OWFFz5PF34BsDaaADZIvMD15C+9j52dqie+oJ2+N7xln2qaGYme8q1EeHqi+Sg8rmnIhUbwsY7ZlojpocuAPhr+bsrOisBrEycTGoH1iRUEDGroYi8hTWPDMyY1A5yJsrJuVFL/u8Lg81PWva2YeyJRYYnrNpoWXvlRWWJSmRswhVWfqCkzowS/2KyDxs6kP8fe43XnRPz1JFY+zkjzn3yryYtU1ntulgEKHb+9Nn2QUOOSExBF0EwsfWi3DlQRjT5U8Vhvu544E/y6kXb+qbQ2PFg+DmqSN+P3t0iHqd3jVaP+aXzeqW8BdkXoTGzOVSLZ46Kl1VTAFst7m5bxf+aZNXKqD3fa46YEL5U9bUloemF4for3vyRDFTQuQWvKkMUxohoEvbh8VU/rsK0aAsGMTvaMEawfzVT96M/IFb6JFlOQqQPCaVad4FJJxYv9Ct1GyQ+2pLbbVVY4x+++mH5d7/HdOuZ0uezMD8eT6cg5hW0GNa85RBxz7jUTJqjsOU5Eg59aCm0zSicdwrg3vNFe3DLjcbx4F/agyOqZ9ejl48AzI3lBNTbLrKIdfxo2CYLCYLraTrYkODFiFxi/JA6q50wF3AaQEfiPxNBcbOJVF+W1lokLatgDiM8xqCdCPOvBxLnnSBVfOFII/yieZZMsmedMEM+pfTd89/OT0aJd9GKdtYGGYncuvdZC2c1GTJnNkbnkIxctUcJ7Rt2HKqGA/fVwf/T71hh9m/6hwqj4rHs4d9qKoefnBMO7jK/NYOD3sUCPT3fVCZZ0G23Cl02L6uhwaDnaMxDqQl9gC6LdrMSgXl6djocz7XT5O53J/kYWa7ZQHebB3H+pmv5X2DGNPpu2By+zRKyBXhOncW2xFTROli6hEVN2U4yDldTWldFcLiBauJQHqe+hbxbFu7oCFCej2brC3+STmf6PqZJGLNtwUiinbryW1ZzKP9B5oYcYL+37IYuNT+QU3vHaB1Xnpj6UIfmIU4LJytavn61/aYvMBzUkIt87MMoV+S7SiSAK6lSB8U/RNhA/On8fM+w8wPWyPOuQntQQsM4rWZdohmqQ11DDEIXfJ1Y66L9FxMkoPvbnClNNXIQW6xVjshmGfNGsrZ15DGHOTW0l1ZYO/5UU8zf97IodOggVVTnaS4lWhayC1E+8X47H4xhVPuFcMhrFeIdmVpETkIQB+cFvqgSb1iAWuriyBbhE2gMYfBcvg1zQdcgnlenzKiTpRV02+FTsVbmhp8bw3AI9tLtLpUE+7uC4ROX+Fy1dQ/ZTfNujnWRHP3GBSREvBXQCb8Gdw+/i/BQN4OfotFserKv8AtkldMDi5K7z5cKi4EQlwSxy6zCaWfd+zrTSsQh4/lFXuPFZQKgoR3nF6wWMFNJr8L15PHw+bB71+MqBtZZNOHCkimDLXHauw5aDu49sAvu254GukVrQlrFmXUaj6364nyyAxIOKnlL7CCBh40d8BbykyzM7lpxqboyYubJrsFD+GJt0y6o2nfWC38MvcFlXNcVY+P3TDYtaYKBOEh/Qy+oxsqf/rnX9g5J8d3osYzECvdDtX7MHxvdeqFu9P499a88j0unHbZQRRWu+EAVV/yXhr6xH1pGXbgfRmHyLxjCU9+C7dQ6njV1YLHhGhgWA9cOle9cB4DQcR4twCibt72xq738X1YrX2ZJEo0gu+VUozgdQWwxreEdFZQQ0RGzhXjOZxdEXIxKXIUk70kkVzHBHwlbmEwAMkLM//Qo/OF28wX1BaHY3Q0mreMbIXZwiHlvMlxmSnEl7oo6dnWnJRmBHz/oGCnajtkGPBpGjDiPJA5pHcyzEDfOlKUVpMyBuxQBiFyC+36uJzJRrZQp1Y5Ststl0+0S/8FI8wVlNijc5yJOzUoqILKYcmVw0UFmCiFWNiShmlymrsl41K/JQVs2KqvyWnuVn3mmdAOcuOr4kuJhWxiDM0wbHJk5atFlAH2K2jbOUKKqzgU+si0EqapYuOPE5x8lTL9NUiYEgl08BpIY2J6YkY22EipTQII5pDqO30e0nW6bZXWqbdduk1CZoZ9WmfiuphOy/lWS1dM3vVgnMq3H8yz+nbpNBwo/a+ESPDtwy1NtJv6EwSQY/5aymQ4jgSP9DiT2+iSoJjC95OktevZZq0bMhEnQ5jJYEe+SLEn3ep9FxBUDwaKUMAKAqzW+BPzU7jYCvTsiMAOBWxuAlEH4CQkqfNTglmoKIUW1UWTBwiGace6pXxLmfx1GbEzQ1ICnLmobm53CLstvZe/tbY0M8Oa/3MfKnUM6pAPcVKHgKootAtOVdPVwMesNKJJjxr7uDd1atqTlk8sfAYVUksf1qCPYz18gKZut6/pW8178bR1W2NvYYf31r2Sx6nY1lmia5rxYSY+efK3l78+ebK7rhGgrQZ21d/UsuZMOhb3sphmm5qyI8OiZqiyVXrVL2eRoobFPGjUXKjkAvag5xruAkCJmpBbCqexrJxFtdIlwmkM8FFPyWYaUWhewi6fAMbvLOgkTPKZMLrRlKfPVF2FXU/jBw2qhOiYdH9qpoT0hrdeZ2Ek1AFbz4tzDS16kE8365jU1dVK1hhFfY7Cyng5Vq+TN2KQR8fcUJBk8jYJQ0vQAuIvVWt4f3QGWEBgj4Wl7XibfqXUSnCrd94xoOehO/oilfl1qBtIdd1/WR8Fc9kxI1mQZzgdXrX3E4yWGZUv3IRWske5WqPrcPJEm18LBVg2MEzrgDk0fyc0V2YHQZcIm3ajCbZFS4lLGjEQfwn5nZovEIlJcq/AP7cxe837mP/GIXqYqzu0EPVGuE0FcDKvKsPJU2wnd6wim8kkgDXEQJJEazCHE/qy01Q7eNNcV2tVzN5Vc7hdMrh8GjkeQF4QCSDk4OpbkFzdIj76Opb6wUr9M0qNQiwJd1E+8Y6h7/FxqGItWRe1e7MQZWJahiiSBvun+jngDKtBtmFpyS4GZkc20484El+Q6ifgupzraq4dTsohqAs20w2xLFrWw8QdyXa2LHlUUNRSq2SwrLO2ATDsaNdOe65apl37LQ7jZK2eEhQcC6QDlPWh4uWqndizdFe+2G5f7QgX9+e1DCUfNdiZg8/bNuC6jIIhb6LiT+mThC3H4k4e1IPK3Pu0udbbC4TZf+CdhtPWd0hjFMYaYwu5/U+5Y8qYJ4+F0uzLD7tomUL54LSsCOkVwB+pflm5YzWVFKPeN2HDNtt6LqhpK72HHKi1r2ebqHUZozjLGRL+3nPrCtiikb+6sUnf9e7sGhRaIUYaK+0bYn8URPD7v0c0vzaGjU/pv3mgvt2+dvojMtqHsKqLwebWfC/oODcYm0mDwR7lbzTiEtQ8EWm2H31Jzeev16TUtM1p3FMb1JT+aVLM0nb4WyvOyOUOb2tFAoFWP7UN6MtDhAz850amdEdkb38yP+FKsfQ0O8B729Af7AHOJmAawsurrVViYmi2SpHGRvepJDqPuUkVWidCeYKcY3D1KYz0ToP5OBNCSXql/vDrLs/hN0IWgXx8Wqz2OQ/T5saKwSLLolA0q7PxVbPSG2ATrwpIW15vYCsP66rz+mcIRoA675my7yOXmmPO9Fv6jsiOcVsuVkzNpqEB4TCaL+Un7irj17EmmBPJyO+Y4zJaF8xqGF/ZI1Iyfi2bsQXyrekSFElGQhhkmKWcun63y/fEv46twDuyQxw6mqCB92luGJGd4od0jcOWlL5JJoGCJVRXYN9z1i6oDEM/Rp/r3WFaGAuh3gi9pfNSsTi/xhLwZUhIcuHY5ie1CrAutJRwE8VXU3Yf0IytM0wQfdHoQ913at9aR584Exm4zCA5t06LwzqciRwAsj4Ol2yn0oC/YBAmr+99AXrDKQKDg5IIxVCLvBSVhIdkp5jEVL+lQldd7RyBJKlAc74+XovTW/IuobobHxmiPK/JAGsGtr0Qq8DgCRVFheFgNY/kyhDZfYy3g5qa5/3O2KYyjp+g9tfMS7J0vRITqAdhizsDZcGwW2gcA4Y3kLV+6D9jDalatI5ZLzJaAZx0Ew14NOk9C675Msnt3aJRvQVH2hVgkIRf+2IAKceG6e92pwlYCvDtQ7qBhc8hHQ4b6qR327fv2pq3D4Bu6DaAmNZfkmpXzbCN82uDYZaCPfxmYDwNoZlBxRQ6IWHE3v+mRwxhsRjKcBvICh6RjlkVol89+qQkHtZiz8N2Qm71yYPvhwOQC8dJeUwG9b2Cp58yS3jfCBPDgCG489QEVRXvjb+UbtNHzVriS8r0I8Hb1Av4lctoCv3dGHKcxrQMYTfz8pvMLQUqqJvQjqYemO+AAxXWNoqY5d5m5/gG3LfLb7KhzSqw6TyZgJh1OPb8Z3t5X8/Gf744xF9fcmdNXBSXZbSBxZOSZdGZ2WvCL3hsvy8lluggtp9zDx7MCxLiXpQ57AOKw2NrkyvSqBH92Mww/OK9xWfcHeQkMRoPFTRmXcyxGHXcjMaKOyvE8qy8e1t9I7EErRrik59jgELciS3UHQ2IsvZ8HoEh4DCqRK8fadKV76FgGnmiW9DY0zf+U5kSCvrSLnM4B3uG9dSzvLfGgUqWwya8vo/sJx4eLNpkF5u3xU0IEiq7G3tc5/YIbk60yoxqrulmvQZfPS0X4BZ7ZI9uH0NSx10uurhW3EoTvhr5qoUlM61aWKhrCJhyVCxXRXVTjzfr5b93sosLtY/Yxv8FqYBl2yzHnfC6ZPmZaMfq8asXL/84evFK07ytWHTlaTKTWDTBTQ6lYm9cPCw73RiQy92Pz58jc3TTNDeLElDLivPyXPaz7vlcQdJ+ksYlB22PvHHZ2tummo9csj6SCvE5YJ7U52ddlv/7D2vT5sKT4KZOr22fEP/QF5tKw6Ok5f4Lvi7mN+XeJ8mKWDwv6+dTlOqeq0TqOV1HqplkHKLCIXNHq/omQ5/QKmyctRsndUdG3XCxvYC+h39iFomV11CQUANDAdt0M7vdXX99sx4WDK3wxS7leCBL89/LOviGw2nFRO0hllOwCVPIOhPEh8BOQhUnV400DqHwEoFTP55QHCqsJpJpc8j0/OMJA/F4wEvQgXkJsFFQiGNeMVEyeQeE6GvwT8jXfUpTlRDBIE4IRc8WCPRbutZVlNOajPM0rF3HDViGNYyDrVyk2BCMczOWCnnXCyOr0SOvI8lKK2nQL9YKlKtXXYN9bT1MoRR2PM7CnY4yED9hDXgKih9FEhPv1Wj1SNHfYXDsAdjXsqw3qjvDCGeGTTM+NTwaIW3Yyl5hTipjdRoTArKVgon9WzmA7TcFLGWTFg+FOg2FnNvrPeCYRRoYJXUdmG6qxfwXNbeRA6zcBOObziKchADQvk0mSVaof1ywYkdDXLh6DuOI0tD4LkOC4+8BR4QII5R+KN6+wu4bgzefOAoYbIUzC0QaN973SWRSDVKD8NVjGoLd7TLrWd81f+H29OobhTYZxCcMRVfSkiyxnjn4/e9//+thsMqwBKyMv73qpw0a+V/XxaJLNYEPtUVZw1aD0PTJW8iUEz4GgZsxQBFLUXgxCpNUcCksccxKSr3pENCs6m4dI9ja8aBNl+olLIfzqKgImUcOU0zt8+GVJeeefpCn3TMExDygMlt4npPhezhUosWiKiQbP5XFAFfGifYZNnUTTPK1275Y7e3ANiFK6vapoUvDX2GzTUvTOp1bMCLEwKtDlSWDB4Ct78Z0AkEtljnckjOABYc/H/BLbu4Nix8OHGt68mlyHtIzi7EUbB0sDlMESLyjbz9NV3Qqu/chMnQqMLnDZdZ5tCJOEUMq0Cy1oZmg8AeAerbBhqbQIVhpatZ0MzlSGLz2eXKT5kDl9W4jx5C0hDKITM5umKnXHiVgfGoXBJ99XTLeyZgBLOxGjWCpxT+urq/VUsTst5DAioaMiGqKjCgUbupgeR/iNftAeHF0g9oqxx7XJlztra0QufuXAm6Xwl+qN7Hfer2I0eB1Q4rWfy/s7KVQW6uP2xz3mntazecLz9MbzeC+ktTjvVa03Vd77P64hgipdz6QnuljKYtnJvcEhPi/cPczBnIMbcVt22faKVlOp8ZwS9EjVTpPEOlZ/WXgUCdnP2CIMVKwHKk1g6a63MvOzq8I/6WRhLGf5ZdNCzxYC6sgh6Efn/Hr65LSL6/XWRODQWBAx2lwCCSkBThyvRJMgWeRhnxgCx7/wap7nlYOmVrTRtmHdytsRsDBw840P98weE8+zuXFDpvrwynMD7qtWqdw7JZLK1wspxpeVk0Q60bJFE0coJBV+qS2DLAhhaw0gbZoTHoaAS2MOXP4y0lt1oTOo3mGBshNrDLBpPIeS1xDiFDeGeM02kGyB7QDcHy65cawiRpmZGUxfoibbeJRDVsWI23elpbR3RYqzAAZlQmuFF9jp/NS+IAIqxoF4Rq2WcXpiSCVKCQhqoqac8UALJoLsQOswK8JEUyd0uL+5Po0Bq0/6YRhgqxDJvaG3V7Ben4GJrLopMYBg32BOY6tuFImwIKZcIIyaBYvtHU/B1P8YYoDVesQQRxPvlduPK0F2aXqvFR9Nc9cvTV2MXwGOExIkfDte284fus5z3vpoUZqO+Vle865XjDEzS6Tgmn86ywdlAnW+ll55wbQ4P0Go6bkAGIMs/HZbuAjYrNhZltkwD1tbKyYeTnbIr4QivozlTQB0QtJuabtL9UzJjEy+7bR7bVFA7e9BkJUh4eftx3Z4dHqw2gVOzpB+AkW/q6AFWnNnaEqRg8rS942ifnA/zm9yeP6EmX5ZBFX6skkU6VrWgI/GsNahDwAFgI/nVzwHfQncINWA0vCS3FrcpQe3ZwcRcgwsD3vsgcxRGN5aOaKWs8itGJd4E5Oht9kU1h6UJNjhUaACIzpiTG5oSZ02f8LRidl0TBHAQA= + H4sIAAAAAAAAAMy9a3PcSJIl+h2/AtNtdyXZkqlHTffsqA1WN0VKKs6IjyapUveuro2BmSCJUSaQA2SKYrXVf79+jrtHBPJBqnr7rt2yUhKIFwKBCA8Pfxyfl015U726KOtZcRyvs66cVAftfF4vl1U1XiyKc0nItUSXSwJL/FxXd1WneV95nc3LxUHbLLt21kuDi3xiN9lCahZn8pMtpeql/Hv7tWqWfXFpt7neZ/1d3feX9bxubqzERUzxQmjjSzV9U123XVX8VPfLtrvP2+vcMvJKy91UTdWVs+K9/s1mUhLd7YsPcpXzUhOrm3K5LD3d7rK7upkWn+RHXqypVl+r7vJ+UWGoeMP8M7mZfSivqllxeVv3ufy/vK1y1MqZl9/d1pPbvG/z67JD9qSdL2bVsprd59V8sbwfZV113VX9bXGuf+V+3n6t5BZ/+JSLdtVNKvYl1+tsWs4XVSOjctQsq+6rvOahp+SehA+CD8HvxS/Fq77QV7fhKuyvDEUjf3yEcG1jtKznVSHfoOLVZdvOlvWCCXxZvFG1rOUr5L3MH6nWNpIh7zqrbkb5O0lHseu6k9GVJM3jUKykp9P8umvnMk5Vs97coux7yUdqvyw7qV031ShbzMr7i0UlXT+Tq7zHZUz8qZotio99lf/u5e9ymSJ5V92sZjL4KLF/Je+qNfby373SAtN2dTWr9pnKUixUymDLZ2sbNn3cTqsPtXwW/ISU8wpXhf7JkcIhOqyQyt94z359qMqvlX74fNlK11ixXOZld1XLh5CJjAr9n/IKHzHvK1lE0z5/Wo1uRtLjP77QLrdNlcuaWC2rXO5+Z6mNJD/DSpjigfkVV4gMmjxyWi7L/BoDxdc8av69abG8+M5PvzTPMnyFw+qmeIev8XRa3TzLmpYT4K/VUmZ3JU2V8q+RbiM1v6+Wo2zZLmXufV69+GH8QzYpu+6+GE8mq7mMuHzaLH7M4iBcJql9ktyn6RfVrJpIC8XfXvz6/G8vf02mRS+jopkj6eHFanIrozqtuqu27KbFSZv3kiQTLaRlybUQqOv6ZtWVy7ptiqRiPsjJmurusF3q/8VJdTcajbJqWi8vJjKkffFWLvOzthY6g5xJO1vNm5NSvtxR411Pe0Uyyfy8bnIvkSdFsnI6jU8cT6dot6saqROTz3mPHFu056TVTcPmLltvGMl4GgmsL+Q8FMTUC30IXSMBuGwP+C6kACint9mqQW7xkX/SAeVj0nFkU5OymQhNPOAfWS5V2VdvMaPHLH/GBJvjZY6XGhR605bLg5ms/vWS8ohlPkFONq17mW9KrzBnf2rvhDTfX4BQGBk7bYpDLaULBqsBc1epCUjlXb28zW/bu1xI/L0my5B0ujXEl/okxUDf0fnxrJOM+7ffZLPoB2/Oxkjc8EJ5qQXziiW9v5e3IPLtbNofr/rlm+pkNa+6ehI6ugz5+VwKyCLOGy2yq4VxP6maqbzNQ22UXshbScoj1UcEIylduqq602vdCi58rEimw1jpGOkEHcx0pqzPbJ1Fl21aUua4zS7Ms7RCMhUw4rKDyArUqc65uWX6KP2r7vT76nrM2i/F6b9n82pazlC7OMZVrhshu8lU6zGTW9lCt63fU0nfvmy7UpbFufzwyjfHSNWePOlz5GDdYyPr9OnkMc5ZV69zbSNmfEdTWjgTNkH4mxlbO9VrbS3JeLy1XuYYNnsQ9PNd/ZOBnZWLvir2s+rbQrbI4r/LOrkpPmBaLbHaj5pj4W6EsB9aQlaiFzfVRbrvfF69evXiDznTthUITIZ0zLJ1187xTvlNJ6zDNJ+uOkxM5zX2PjeTcjbRrcdXo2x99de6F5pOFpH32jHwi18r8CtX98zAzitzqJpiZ8F3Gv8jOoaG/sE9a768L+uGsy7HVUhKezetr69lz0Zz1vyi7WtsbrqSyWutOimxJK/DEl31tW5XyrllfbnAgUDeZNyUs/tlPRFqoAl5SEnJZEoN0/QBmRzUuKiWoC1DOuqJWe+5SQqW4HgpxfvlaSOU5+awWuIEo4sTrBSIw5IEH8zmlNmZvSk/JdbIe36owAadvn+4RDqwPmgbn104hF6+FL7xJRnlk+rb8lN5vwCfAL6AvFzx9nL8XQXTZ4byOhWWt/Kea8wypkevTGU50fnVSLP5nbW7l1+VvTPnaU0QAn8nmXXtpBbmdC6fI79pW2GTpTN9LR9HZzQm56rKcSyRKdbJmMuMGmU35cKpe3zT93IIlA7p995axN/xrb2fHp+exsXyTHjOrpbDjL64v7Z1N8xom+FkDzg4svDkwCVpMhXKW3moLMHw/r5wfz5+z30jbRJzBsuBi3RRdZI/55qs/muFXrTavj2Qu42+H1vqV1e9FLSG+tHnBl/vBuNQzWa9bp9gT6uym9VVt/4R79rVbJrf4pBwW5JPk737jrx3HzspZ8e6/yxnPWH+8WR8dNCCpIvDrtmwLbr2P3UH80H9nvEcjuMo8zlyLE2/lxnii0hGc1deOpW3TTE9JNvhGVPrTujA81lV4a8tNAzvaoHM59P2ruEExBjvyYSXEjIPpeX7vdy+Zzlrm5t9sslJA1wbmMj8Opk/yveqy/Z9GzawT5aZkOVW+vtgJX/RT+vvENqItHfrAgxfwL6iMG3+MTAz/zcGIfbge8Yh8gnv7POP8fXD4MjS/u21Hh8de9VkRdg4JCnD+ZjyVf8fDc/n5qRdbie622kNUmTaC/0VHrkvu1oWLFaiU1D2tb6WJS4s+USIA1YvMmseDxczyZezLU5KejCD1OAthAbCCh9W1+VqthyIEijF0HQ9GQq/TGmZHgBzuVWpmOaWV7NKmftLv3VRD+7xeawixV/GZ/Lk5twgj2xsksl8WJKoCXqqwBanpwjScE08veYDcArRLJff4TAikz7Jf2tLwHOtO94Vv++LILnTxw7bD9X7ZbtI8tpFzJroAVmWH+QS4Tq7VRnj6XWSmAoek3qZfIa6qWTAY9nikGk4qch3iIXTQ3wfjup6sJID9IUMwzk2E5wz5SQtHLqMRGcp3tkxCpXWhj2TGxgOn9bYou2kiTP8ZpAGHZYyfB9cLIQR6aopEy94qcnCw/bFx/OjPvvPvm0+drPi3y5OT/KP5x/YCJpjmzlbOowtxRxrjnmo87Gr9bnSrBVGkhVDospuE5GGzqQ+Pwhbnw1Udtv2S66Rn+xCxn4izCkFOAe31eTLVftNhqQDk6Ii2Tey7WKdCVt9GMuS179I54ydM/02N6FCtihXfTVeLVvhVeqJCWyLM6TmpSfnJtDNkHI+FO7GUnIuu88op4v8EuWE+dP+mWa8qZZ3VdXgeePpVxAnL3KlOWxtf7WYknOqGxcXvtb6JmBomxMsDAgveS5gCy4XuJFpsiQfIhPsl6prs8lt2/bVRzbqkuTT68hya2eLAxbL9eHybC2I1TBgwbVHWdV1bWdcPL6E0DGevd8iPTc+X5lK0l8cklnnXbUkJUalo4bMGD7ZsP61FdIG6lhsrbFPt/WsuuzupShkZctPQbY+bO8O5YQs3JNgt+hf/ju2TcrS2x7zu/x6Vt5kdaOkVsbfaGxbLFv5vRCuGVe9cH3O4E5JXC/AB0aeHo1BUAyKpLoOTkk92ciuieIqQrQkP9kPS/jZ3wvN/HDkBeS0FDJVRHIsDX1cFB8Xyf2h7JwFfkg3uJCTFSIU3FYHO+QrA+942szuXUaSiHX1bVvJDILbVJrLqluq4WtrVXxQYUW/KYe9rQm80oequVneFpdyKfMP11xJfSISFZ6OjKbKr5XXvm9X+az+QuZOeADI43/MtH5cmB+S9payjvtL+XhCtnCZ4zprTGbm2qE+6In6zbyUHdZMZ3xc09S7KqVOVCmbDR01eK3tze1sqiN3sRTSJpsOfrP/rK9kbP4Nv9mikpP98v6g7iYzSTzT29zuozDtqD9ZzWYqUiM/I6t/VZHtkTnY3lH4n8rah/L1VKWWjpVSn4NbmVVOYia4CfKlSxONBPlS7ikbRYbSkHXRSmDEwVereiny3J+bhPU01pwHUDtK15Elr/vmyRM5JdVNLUc0kxwd/n1dicLp394XZSrXO7N+IPsgHG/xsx/BkJojWbVCUezBYqocQmKuqekRniVwwL902W3G/sjk/tCW00KVIzz+y622ry2G7xRFhHUj1DOz3etjUy+L3u/OIANeccM8lmmsmc9PjmUm4kjB+7nsd7KRVXr3efXixdWLbDKTyVMc4JeKpbKrDtb0TlBnpWRkWvWTrl4YzxauMywgFYpT/mWLLKP+sruXpvg3a9ofPshOVnUHrbRUfGzIWMsIXNcmXzs6Pch/2J+x0P4EpUaQjkMUji1b3ggbvPwhUeQqMPLJRdBzbu1WRox1Eph8sVxu00OMHm5DKIqx19/TWKQpWmmU4fgjG8pPYD5Xi+xKGK7xXXlfgPPKyzsoRIXkkO7waiBPnWMgSQpBlrbTLdAqkipeba9Oera9+oC8Beo24e0wc3vTi0GNHQ+Zl92Xs7LvsZ8fyzUV2djVkcGUrJXp0DnZk6nypZENN9DsbNqubmalTP6VsLqdriXZk5kofWCqrv8+u65nMp24v72552nsHVNsmxNel8yxFhN6XZfDYnMkhWI8kwSxrJ4CXQ6blTy3QPlJDWhyny4tKkfTdRWLperTnteWCQXLm66962U0qGyREbV7K3E+MItImqTeQpvUa68grx+6mvNUzylMfjAW+ZhqNtczBw9NM99+A3P0l+MPhV7l8l3kLnmbw7K/TZRHBy2ksiHRPkcqFx9+lVR8Hj5OaWfPsR02616NNoqjPter7F7G4q8yBk1bnLRyRpLZBAo+5hySoxKoOX9KnT8mO1CmsDENMgggFOl+Q5px1P87JqnwktigPpIFVibQuGKSCmWNsTPaWa5w2x6bRMJqY7LI4UD64xONvfjbi1+lB1r8HfYb9EEbye8gAr3mJmRFgoWAFwqsoZRIxzU0NRjSpMFeaNPk1g2OeMP+mB2R7JVmLWAXNJWgnUQmVKGeydyR3wwcLg631hC4YbW9WGvnpF2Ov8pwY3cIbSrj5MkqwZBjczUorJIMHrh2FE+KQIrCJMhPmLBSKrOb6kQ2Wo+OZxRGyvyn2D9hrINW2fnNjWPkKLsmZVRugAxjPJYV75RqGnNgrEvMf82pECnIGe2AQDfH+paS7cZBsA2Rzelvr37NyIHa9NKK4yWLIv/lr69ZSDoqJ29d0DzyHbY8A2h6flc2S1WicMUHxurJE2noyZMfc4gCX4PFNQF7a5M3kH9ZBpJZzvoW6gOMLaUWV5W1Of0nbu52DtPd3dffrZwYU7XzT3I/sGRZK9BvlNDjVNoGH7Dehp6GWFlFRKh1XC609LxcsBQSWAYJg0WVLr6k7bgEk0Twjouhhu+GSZs0UIvuJIRWL5DDCWfdSXW33kRxwJzNuhv92m0PxOw1qyCIg3GK7l1bKNey0IUBvklSdh/vcF6Qta7qjjVRcqrb2VuzUHm50e/Nrg6sJmSDgmA4YWI3jCbaZl+FxwnXm3GQHmIwN0b0YauXUWZT+/R64xvZCsDYbH6nKvAYvRyShO3Gnn8FecQYv8PZ+N57rdYim+R+2NVKewrKoBsA9kPYsFKCgovsrprJpxEecEMB/klzaEI1Pss39eE7q75pp/cF6lx13PJ6q3pdNn3O00o45sm3uSM91Q1fyWqFXVtt+kafs885phf2l/30RavmloJCNblErW8LMEU8b97KKNzcktTt8wRpegeZb9T08ZDWm/qzoS2pcKw3ddPDjBOnenZCjX9YrGGn5nXfg59QLjfsJzre8sbW3Wgf29cwgoVqGm8srwqDPWyVGBO0HuyNqPtEW6DRcl6TE0ZLkS+W/6yefBnLLteVsub+Z9vOjxo58NVmvDmVZNcOLWbYL+XF8bxfpKRkqGktz6UUDvdmC7nsn2VC3yHpkuPQx8uDYjxT9TPPO5JAyS5sT8lNqxWqctFD8S4e9E4+YdsV6J18D1yzNu4LSHbZm5B02cZE6WqSDpO4vuBvmrpq7yUVv0kq5ZpV07emxYTmoCcjbkVOr68L+ZdUueRmxN+Quk2Wx/egLG/ZbpfFXamMvTBZOweB1YRLqRYX9S+VMhfvlWW4lPlKSdKF5MrE+KXaLpt+EapHsVysEmXfbk4d7KJd8h5E1JDirRXa6NFf/BEbtbd2DqTEnx/Hws7vcfhypmwYscQCxaUMKnbg9b2BLe3ZgA8l7LHYAw0LV3TUfK2Xus3hKRUl5Z6Uv90/xrd/9BHB5ENepbmBCMfu0UdJUEGPZaoAyTJMRCMMhhBxuQHvbBboH/1K9RbSWfDRMKc2fQcYLNKHuaS9FuKfMMUnA07YthvfXKQoN4eUX9G9IHAq8nJXdaOCeVUGQCZJDuTAsiDp6frqDexHthZDbv6hFBplGlYWNZm/DM6WSjFT6RBX6JZyx/IVVp304a662pZdNqtyzWdjSzGz/7UCSjk5GakHoYZWCadbB92aDBKqD7dAy9w4oTizi8Q7of/YOyG1hBwpqnhxnYtqlWL/+sv27bfJbDV1zUvUuZhiSbUu1qAkV1o8KHaw9F6Du89g3A7D/eKdXeipCBpeEOigCX5One9Ck7IryqBo2f9vq/kip+k/ziWYbVHKmvWy+Z25iwE1JBfYDhfBASGHwUFup8a8WzVs6k5ZchQItT8ubGEklWVC4oVW1FjRJKK8gWEfiAE48OTELCnPyZTjjGSLCtuC0PBbDm0xbm5U7ki9Evn7o2bdGp172Q4jeSm+wWSyvPJm8Fqo7Ux8Hq+HCjvLoFZ5TUtn9all1qOeGWSNr/p2tlpWB13b9xQ9sWYwOjGr0b9cvv3OGtusNScoqjr/vNJJp0wXKboJ9mTe38whU3BtvdqCmGyefA1uhYgG69X6RijF4z3P//vz/e+qs63v0T7LjfhIeUpwXz0b22poxELzejqdVXSh+VP+QviVkgzesKVBocbUxqra6VlFXvt6uX9L5xiZhHvWpbVCXX1zm5QaWNP+HZ+stCq/7dv1j388khGc5aPUqtezmhvu5jKqbWc0yXy5sPiCodL6sK1v3XU/MCX+3i9uX/PvmrT/iBd/4OvvfveHZsMo48nzWHiKqgsmG2hLk/KjxpRBaitg59+EvrixgJ+MEzLkvgnCr4AVe45tglxHlPvcVrPFB+ljX8ARi901QyGkmtwMqZkqz5j6jpeaXMIEYykfgzljv9NMHYtjDgXzDzYGJ5vDFkwOUzfQqJs66djTcgqRTVrw9EVq0QUddvd1Vi2TeheaktaCHVSNkaymY3gK+Q2lXy9+jVRbnTzsQ5zHVB3EuX4NbKsybHv5fNjDv/0g6S8lPY7wP//KbeqTn6ZMIE9J0l08WKmpkRUMbONG4cBg9lrjelZVy+IdfrOr4BaEDS/nJeTKZBJtFxd2xkxcbBffJhf5uWpWG15IX5E4SotzUsgB861JUtcq9FEcC0qHw7aJWkdRIqtHCxzavZXL4M7Iqn6gMG89N/rUZig6fkAeYyYnjwlh+GoF39reTxniTUcrZ/8TT6uRW9g9qHg0u8BHOqJOJg81pCUea4ez4qFmWOC7Wul1cvXWt8J0SL2siyVzhFuTS20RZjL0ZZRftYWwCayuRVZ3Ujba5vmqOWrOSljlVDN7Tj4plT+EpadlyTGFTeJ4wicMv5KrZNe/UdC6ltOpdhU+VdrRafvXdnVOofYnoVSXrYm8ranHpd72QX8nlOB3P6r0Jkq2rSB2kIFWJUrCtfo/KTWHDkBICLV/ZpAnK/ysa7/CsaA3yj7TUqoYlHHwcrBb14LKLer7n1e9EEe4bF+2R3MQJ5A19wPpmJvDvRsvVrMAKVzWXhfttfbr9EpOic1mz7xHredv9KlXauk947YDIqDLEUoJDEVcRNiD8sXqaka7DHBdoKQknpCa3VDbqMRd+IDo6yZzmdl62FFKz526vb6uJ7XMOX3TPjpaqCAw8YPrM339U6uiI9cXOmobLcG91CQJs+hXM5tl5WIxuy/G+M361QS2zdcrmT56qpuabvciybFT3NR1vRx0FvcxhzowPZrouK+siNXT83/ycuHQNzAjUiu3T7dVEwUfRz3PtXI0dbVXvkRZnm256cDvfMCv5ROtkfW1ujGPe+wsVBZdWBJYbh4RqRL2giBIMsiyIxX6x4m6kntZ8OqzLfM47mWHbdWftMtjCEGD/66tUm4VLmRTdT5AFWROJlML1JKMqXpn63m9J73roxeHzkJTYzkLF9s2SpKfuHc31/pVxUVJqyYtQQL7DracWjNuIOohLsM3EB05GXE3m/DEtP+jXAlVrgodZ3y88tP+mdWHORi6Jyk/So/QN+FgaGAkJDBYrggRtGvMZZ38AeTBZr3f07HbeBkVzDhjo47M5OOMnbM7FfQ4izdTsc/Vqr2nIDa7wSb/HgrXq0Q6625Yhft5kReSFbZhKQmiOhCo4nBPoRa5HpVrcUa9A6QC1KKXXV3i0J+wsWp3BMgFWqB4iUwXuQ7Cx24GCScppVHIj+cfbJma5JM8+KAKSK6t0y6UcYIbmyHtNYK9SSzO17uxlWxsb9T7J1vQZu/60DXN3mzDdpEtbCFs3Nd4PCk/0rk1eArn2EbL2jHJ2uyW9apk3mbN18aiz9tlBd4eLnJ6HOppfCKLQpPDMUntCWaaSjOCmRVZ/3ymh9LMfvPLDfKFSFn7Oz/dWntbP9yONodfbkfH7Ls92C0Zx0E+v8f2GulHGdYZfJLtlfVpAxmm8gzJngXMGzV0WRNhKvcw2LgmVlbbFeqnFlE6ssUHUE0m5JoiVKMD+2GWUB+bfrXAlJHtTBmy6krO25X7G7ULGJH/Yr5uQpaEA9Gao9x5R2GJoXtu1RulUigRGkALNZHd6ltOPYUwN3BBqu5APQCAQTKSGaSPGhMh5fl7WqPQ8Sfd3JWDIe1c29KNMUHWzilmNbfThFjf2JTLuxZdASvxnjYwyrIs71qoL79wr7edpcxvaBqz+UFl+2Ijp9dylfgCbHxONdNGs6kPaPpCW1rfGI6tzW60JNOw6oJnsB4jgyrjiJnBvzfwGq7YGFYeX+NAu6tuea1oM1ZV1gRHEquKOxn4MLJst9W8+tDecQJc3PfLai60506hUHJNGBb+qb65TUvj/nuKv+1782fYrJK/vbjI3dvh6csXzx5t4+WrR1t59T2tpAYVulBxilMcGLgYNWrrISe8cuIWjvnLV1ZkL38lR4T9/OXLkCDsxygfN4D9qVxZbc4d+dtvS6GGVbAx0NMlFrus6i9qI3ldfsUy3/SbDLYOc0jFxhMchqHHP7pWa96psJ0kGleyMr6Yjqfas7Ofbk/aHVApa0A6BZ5w1YMj3D5aoGFv0GR/WVebg76Xk8hRH6XFcim3fX7peL6XM/P/rLp2Y57t+YCjRI4iw2Zi9XcQDG3pSlr/Dwbns6uNi/rbY0388ZEm3kIO+lgj/2NrI2F4eUw4p4HEtpaYnWv+4y2ks/lSPa+b1Bdlab4y+Q169tIdDjgpaK7C9BduiPzQa4/hviU0ZtHOVJi7exh8BPbyWAOnse1TZHn7dgaXKbbawxsSJj19fPyLf0lmDldFWoGHdq0y/A4vRv+y9Uv8pienAzzOv5ZgwoP8fNbe7Sv1tQfIXzxhT9YX7qq0mwRh6LmBSnV6Y8Ax+S2MihVzpL8t9cQGHTmsK1UrZDRjgBizFwA/VExGFAE0TY+GPmouPzdDOzRUuZUPB09nk1X7wU7PGoqD8bkRKlPC7QEQA1AvYLb0lrAsv1Tq44w3rWReocgrO63WXejOSL3L9NE/JEfIeb2vTRnsxtYPpIKFm1VlxDuVMoQJsQeiF+jp1T3Jtn2U1ZxTvVECKBm/+Tnp5wffDqcI+/irHlANHG/DpNM9CaRVxR3QLtvswOPIxRitli7vDQDROEKK/hA63+fu3lJ2iiSj1+6ELkUiMIz66txW97pnyeRRjROmlLy57xuy9cgcVKHf1wrzK+wZ3L/SkQxbh9Tf8YmE8nMPoLXEaYOdQfc42E7v/EiO4sHGbX7DIunveMbf8YG+69twfMkeWGs6XVPZdoDRM4uGqSIiKtQK7q7JwKZfmbAg+pWVs9i1B1MuAAp02qT73p4T+JScP9bEZdXsbmI76d/ayGm3vv3taCt/KiP8P3YxY1ua/B6ezDmxF2uc2L+uMWJr0/ghBku+BumizESyWPya6o1X09ZbuPpeCcjWtZFib3Eqq/Mfl9+jH/byrpp9rR4d01e/cUzTVn/LsD7K4P6Gcd3YaPiQf/jA6mnkwndePYroKfHdrPpWX80GlvhmUH5tWQPLGa1lAsUtlVwGulnHsDx2V12ThA6agIn0tq7S3WlrR1Fjy7NYYdsTpoPuFYfDzmSyV23ZWwG96qeqtDE71ciWThzCPrirh5QMkvkConxzdJLjpzoqUNqmgIP4dVPvs666FrbcBdagqhB7L5iczctv9Xw13wH5dVx+ywH79WCpAezXAK9HzT/7LShgsHmgxd4a02VYqbC1u6D7y6Eh1ER71ksUUKszh695tFLaxWWsv7aozE0xgOI80jV17traMTUYeaTCb+qUmaA80qVzg+TZ2inH63m00m/qmFD2ARDQY13c1rWdZX5TT9bZ9wFycuo0XkNqx+bWPdCtT24etr3QZqeCOdnWntizUpzEuIYCyKOssgeK+TPHO9EUjRcdPPf2dj7v1d/79vb1fP667yPRoIVJaZogtSqBKQltktQew6BVjutG6IDCkhG+QLYjV5FFuwzFWqGjmTT1t1e/jtKmEqvxhxsaWoy/lFZa7q7lrPCLAQjuz2how0gFiaMMh+glzGY/2EUGKCtL8qs4IApQgtFQXCYqotV0ijqPeEs1BqTMgLYoLuwiq3stA0dTrZytmlDsY7gMVdcQQEJqnuI902eCMOnFeDWt2/y/5T8L+9tmK+kUOjIHOiJB14+O3+bcGaTqDGjkS7g9rq709sIuskm7uKe5WXHgV9ldPQWWx9m34hOu8qeL+ls1e5bJWVOymfETL0POsoTrcwm8yfoXKH1/qbKp+4gd2kX+1ObdaA6HkemUziC06uNI842e6/tI7l/b1XJ1VcV8S8ju9e/RtLCU/Gg68FJM2n3QakM9UNRG0N0Vh3YkZquybkZiyK9DkxNIwDfsTaDsNpAUddUDXACUN8I0ykYPQAcaNZufXg0Cymw909uEdJ+6CnMv3HDmOWRIytBIqZQXjRUGzArXZipLpwwTpBtqwwj2Afjqan5VTeXIVby1C3ygWpegPC14v49DKhsJKKTS9rKrJzCer6FUTWG3oU9lJi0MmD1U4Rtw7qDOWyatlYN++DzCAMELSc6dwfA9+GwP0JpPgr+h8kuD3A1AKLMmHNCY5cBrMTDQvYFR2ueHUwThWWB0Xt7L1NUXMhwyRW5BU/Dxwpy1SWTepryBvc54NtMqprThh3Lv2oD3uoZI7fOx2fGyOOSfrI8HD2mOnxLeCINsXwS1+DXGM+k0Dub8KMkR4hagSOrEVahf11DpddQfB6zpNa0XBaq0EdOmdCqplseNWD7ILhfNVGYttjTdFI+TEus25aHCh0cqbLOsDts7nuawxYD3nmv9kTcIwI5tT0f64MnrBb/7qcT8CM8Dwse25yF98Lz1gt/9PIKEyHnwtpT95QK/2aIEMEtTnOlfuPtWDVCN8YcAdgUtSpMwJeNO+MOvjsEv8yINWGKZU49cMnCQoPvNNvcI9b2JzhFmFhc3ToXvM2O5hFlEFY1G4El2ckMF6v9oZKYu8deOEEI7KpyZFXTpXF1Cswb2xoQdOamWLuZB+RPP2A4p3oTS2xDPf3tlO2sqMfRO0k6G53wFh2o3jqERx8KPmSk29RYN7eZJdqdCv9083ZpC33GXCr/IVgv5GlDW+EUGUOYCgM9ZDQvIG3JQNY0ceZ0psMFlW3j4k5Zt35QLdauTPWcC4GsKx4dgy1rgsaKDU63aOpkY5kYBm9VVncjBfa2ewyZKCd4Eo8/NOLoIGCGGtX8fcVLR2l0pC66CtENe5U+fmzK6CGxWqpcsL4/U8rI6hX26bInapvAP/jKfyp7qFhr2dV9UE8DB+p46PgJA6IuOHa7ZVwu24DYhPbLWR4aDEgLBcG6b7Q52lHFXDfN6N+zhLB7U1KRB/lp9S9QiXyCP4HnniyxE3ukB4W8v9nQk937/YiQrO2Sf0wdzPXtf1vtmBY2VtKzO2lnZXdzClPi9JeVMy5mYQRnXAUoUSYd1edOV815TWUCX50YNXsphC5IWECNw1Gc4AJaL28LSSb5s8S94+JPMx6uH46MsSFbp3dFFSD2+Wjfj8k1adztJ7uf51xqS/tk9sbphU1NSjBij3WD36Er1ppnaK1tdYcY+U6BinvMzwwsVnnpFq1qC6wfwKBLoB1+Jrnu7RkQN+B6t7iNy1OREgueoqM82owCVV3LO0MZsrILFJldtDQdG7fTnRnq9fRDdPpQDMYJZWn3T1PLOJaotCAgUwhpw0Gj4fgW5rrDcjSk5qVMK8Uq2DA7O8mT5p8AwCEPDU/0kpOu5+LHaPjKE5rmWs569PxszeX6ZtkopRByU0E9Mjc8NzSDUMj6pA3m0iQxe8FDycstbxT6Zf294saQlEyR+R+2Uos93NqROX6654gS2XZZTRNW29RIb8VU1My/0tTffiwpDqD4ANoiWDOjeH7Q5BorIAA5tDo9qDB7l7nA/74mX4JX7dLg+yslSPhY+4/tydaPIxZAwczrzu90g3eJbUX3gHkePNONj9uYeGml1hZypBiE6LGEKx6dga4Ll3GSii+OuCv7INysVb8zpj43gbo16X8X+9I5zj3VwXc76+vreRhPk0lbJlrePruLD169Cenzz4D71WDPJ6/tKrPBmqy64Xa+1v7xdD/uwxyGQhTR8BdvNQT67dkmjvemK+2zdyDqtdVA+N/HLpS+tQo/T1RLxEXqHXmvtPn8acD9VEVwuhHESMvdsZxNh1XsT7JhiMVHlH88HwyZtUsNJR8EmnYKV0/+UkzRqY5mknbdnyJG9Mgy5ab3q/dFcAOrS0kDidNV2clDGcR+lHm0mXeVaRc0FbBGvvYWN2OcmPrSc3bSdELz5Q102GiO7ySQQpfbh/svmNKnoDfl97aYvEutirbHZpbebbDfPA9cdEz83IebJVaWbGMXEZZNQLhXH+vxVwqUVEmW71LBXTEfGpQ5EesfEdpecKFS49Sx3teFGzVXSkRWPrdE/clktFtRHqBJKwVksEd+RjNuOSsflN5/70F6NBnEpzIv3K6KtPVY7cL/QEZdCsr75dLpW8Gvg39nuqJu8uijpWSSQAT5tQK3pKPcmktneXOeQYBgOD5UO/UIG2a2koqIKo79XhE/N+wjUd1VOUypt6zbdW8xxq8EEkUVMu0cQbVnaQqd1GzenGZAzKfK5IZFXij8UKCqx6/EO+RxpwDJSfKCn9Nu1yEvLtFPPRuo/tZ2toVNV2LrXmJsHKgZe71pOchXjByyDDsLoApCzhef7WoXPSaphzkH+zEiYU87BZCV2PGCkHxTh0QLTqauvVioVT278wXEZjIJwmT2+rBdBCn0bESlp+7pQezcZdABxyV++YG9BcALQSyrl8OByOhQaZdFtGKvgMLe8teirWmlEVN+j6bAyBAuGnTUrbxJPdwD8Bqu5PoIAbxowaICuYbOXiVUvxRab/dnQrDGY5rAZw1RGTu06MnNDtLhdPHOaVi7IWjb7orq9RNoCm+UHOvO5uWjVDDBYX+E19niMMpsQTgwyKJ+Cxu1m0TPl/dmFh5oolyvGFJQ/WdMiNwC2GQ8HRDaTMtMhy5UKdDIIBLcIVDmIfdGYy6zCx2GjJr7imWcMlSOGZ6PWGCvrK37niqHCk/efctWcNoMm1XKzpxfin/KDtlInSj3n/QxDTwOyfMXssKCMYX8N90/6h/3PtqnoIpb/IleZEuIg9dSNP386f+YwvyYUWEP6tdSAjNi0XnAzeKuXZfxWxmaEw8G4q1Rf6pgicm/+bsjq3d0N6X2SkaZv86lKWl9TZSYPGg2VT5t1ggpqUAkiqY8L2XHfyWIteKUhGZDxob2zDF5phtJ+tyu5bDetYd6slmCWQ1aI61xuM5EZQY1HtpAceel2KrpRErc/aqiUbwbA42B15QwZUyt1tY2KBlchdgnvBlnv6ISuuWpoiI0nWcCQ8dZNFPAabvWpTKApJY4Gff3c7pVk6GN1vtuawb6mduMabPTacRGSCD2XAScpIsOqQ8l6aJ/RensBGuHh5sy3xaNhhdZsCIE0JUMi89yCw5gmTsc32NTSTrWLYXZCOHJ1O4I6MkQkN0cwzWFoGoM3hJ1otzI3cUP5pr+YJzq43AmCdhh8XNPeMfCQa4o08JBrh9SbM8nDqIVM01kpSFeC//86Z//xT96/azzeL7u/spRQBD29a7tpLLKwFAQ9lc297d7CtLQv9E9IPWmXTLlsCbVG+1PM71DgA+JhwPrhg7PfG1nWMgsAImv4hNSC4n1iJLGtgLXkxTYbO1D/aMZC4kX6IiETb7JRgONO4zL9BCodisND437JxIVmqXW+cE7Le+E7wrXtSGsgypdRsboz+s4oBrFogSMzpkaSvYkBLwhs0vDEw5y1OvB2MUm/eYxtr/6HfuCevh4CIn30xen7+LS1cjsehyqPPAGe+raAYh364zv6z+7RcG4mfasYIx6dXTOL+q5BeqTVa0KUWkj2BK/lsfGLB5sN06bNfn7X8O5u8Tf1cf0L7G6Wn2XNOM31U7F1tgFDFSVhlwGF7zIN9VAqzuBWFOTeI2211hLDDyGVe2ho3AJFSyajLA1LMSkplRhVbbN4cEOC9EzRK2eVhqfPlQPLwEgoA1uAvciVp01MSFKkc1yTM35Xf/ugDjypMQtZ5Xc8az9VD5of9lTTJn8ZaFWBtJ7lwtJ90maqPgW/5Bl5X5tITkdxtodx4CbLD4PJvLH4MOfhcXO1f2EAZ1gnO9fjdza7a0UZXLg9KVljEdrMjWeYR73cd03CYPRmX5CQOPrlYtAIy1NTacv0wdO8vgijbCV6Nw/n3U/wgD5wr2ItoWiZrd+pvVG/1BCBYR6NjJXfCV2ktR/BLpLpFoFetUsHXS2/tbLxAxQOa3JiBbwHocK7Yb6b3aw1G+xu1pqz1tIDCVkP3zgLv1CzyUJ1NcneqRvl0cVp2x2dHiAujm6WsUQScQBeMRpBJ5caOUrn1GtAR1GFrNMDZqnKVgOZg9Di2BqwOPoAxtFjZntYTJsch5ri86Nq1vLfNml2p8ReKMFaeDTQBjPhCEYbTyGMzYEpqsDCOInHuJAmGoAYE65yPeDGDTjmGew7gg38T9Sk4RmVYXpy0oAgVflPR4eHb0/UxhK4Y+9Ik2jSIFRJxT3kbZVYjQDXmuIrrVlwboN6tu/eLmG3Ej693sqBYnGStPDm/nzwIS6F/8XDNorx9MFyeg7xggayAxMbvzID2v5NiaAxvLwquwDHI0e5JcBqOxkCeO9VyxWFnqsFo7gxXNyFXeRPKX19lrX9pJ6Zj+ppvI7p8qan8Tor55BWwu527FfZNYN0NpP74p1fCfmue9DrGrAF6tAdgqnnfJG58pGn4dJ9Ey5XXUOHBQrqeGdBxkwPY7EBg+oHYPjNtFCj/AxG/7x33wG8vQzPDdHOwmXWzpu6p8q6OA2X0jNssquGklTpXLjL5rLnTItj/MobzMsF+rgwaJq3iHKIi32EH5F8dHgApiNp/WoudP2+uNC/LFZB1kNYwlISXBDkQqA4C2hj8JMaqRRmo2D6JxoLSSKEeYxjIdf4kwG9kiPxATCWio4LfQPTzmkCnI7Pvc6pl8Xa/Vr+q7X8V2v5P6zl/wC7sg/lVTWDZRkHRu/wFRMWRBPj2sC0quDcW/x7VS08lmmf3d2Wy6NrQ5f4JDf7R9e5ARYlHj+62SW4SLrMbQ6qhfiGZbBNUKKaxTrfKZ8ZJWIij6xQ4Cb3gAtWQDii+qYJRWx+TJkay9pZPxTz430oEDmwbRa8IYgVZodGM6BVXZRw0ars2nPSV1mrFLCk1mq4aC1EwyRRFu5IdsNDmcQxEKYKicD5YG+fYmJblRDn9nzFCAxm8soYcCFCSKd5wUgW9tsaZLhX3CFZLhNhsFB/Bft4dTzV2MS94ztMQyFpEMEdgaqjJuLgIMws3F7qgeZD5OVHH9CHEzbgGlTaZH1LY0jhJKxirUzhSCGjVSgl9RYwyFgk55puKF+GGOPIMZ8b5dCIGLcZEATAYnTpeDnIDMmvftWZHxJ++DXBJBsNn4l5eQeOiIFLfyqpLGs9UXUKGzNlj7bR1MtAl6nW/GrCr77wakS2PveHUWt89D13LWgNzxXnNFw7aRv7dGBdDqBheKd446nEg7FhprEcFQ73+4ZMrmhYAXrXcGQ98jRfIOLyGppsr8BUxuJ4Yb+/bDcb0ZSAzAa84AQsN0R8rr7JrlA3b5NiJ2lIaFMbqSrIa8uOvKKNii8jCF6tpeTNflqPL500tuUdH23vbYoyp/ztPFheBjhddm6UH0XZ5zKB8wv+EdT665MfehZDcVPN3nbLqBTzkVh/qsu6g8TUFe4mz6WYWmgp+Nltj72IQMXbIIrNytPaBypTOmsUsDg3+FCFiNdA5pMKQo2HHt5HvGOHNO5Dk4jqotgFBu7V28g9e+3NJIHd12ejqyNL/9DrbZXe29jcSbutwZM2YfKHbVpr8fOOco3HgO+1sSzyK3K2NoLmDSPnvNHW58PNwsdkvQ/qbhGGm8q3qNPwz9P5iF4lxkJCnMbTOYeub2eEPG4X8bHhrSnpTsMElP0HBFwca8hCxBwE6YHsa9w00oFJNYXS6qyiV7CZ3NpuWNhfS1V8bj182NUgR2aDX1g6XN+nK/hDhivLOWrYj8Vt2TuOIq/NNnZ2XiGoj5nFAiwVt7qjnQmBQHgGRL21KwV9v5L5y/RwxVGC04t/kMNOhic9+7Xq/uJD/vQQC1R2q/6fnjkcnCEE9tZIMb68fHtyeXR68lpXcJybCb0wKxlveZQftvnJ6aVbgJfNPc9tuSP43hnOx1RFNtTj59X1tfSz/6dsKt22x8dvvv4yquzBjq00D3qdA0WQS/hcPTe+xcxtyoBFFKQg0ot+CyymwhO54ZqLImSrXHQtHLOpLjnTa3WtTXNsVvTjZVFBULolb6p5MnKU+KmwrzedY4TrU1g6mcXHwq4orNJlKwwdVtocwtdOo1ktkZhdrzrYFiMMQDnrx/JiwgG900Ri/kO3UjI5E/5+ds+JSHRE3Jl41IKmU5Zo0dUUnVYT3TVsECRFZ+p4aVO7XJqzgqQYyr0k2ShAwSHpPnocIcm1+JEeN1JPLu2Nnj5n7Y1zKUxzXSmTqQQ79+KmE+tCNc1QINdqGtrLU2TAvLNspVnYlGCLYCiw5kYmrfQGCDsM0QjCiE1Jg7XSRWBG2H+7yIhEO26m79vZ9ceFCnaDq1u+n6uDqElhcmLgqGByP4oeZfSEdpn9qyINmkySrR96c5utU2i/2Xi2KBdlrKZfDidAtU7ZB73uttW7giH6QxXl4VCb0V47GHhWgyn2QPO/rGarowZypQceoRrn2tCbv7ttvLLab25rFMJMrbTxursrfd/Lbm86vOru5vsIUvXIO29/BCcHpoQ/gtPDDVT3EwURLaZJJLJvnZAYdOxrPV2F7UhK38rUHz5YDwAXq6seruLAJh5sYVZn2QIts7nf7LW+X5zcbkUmGwnPVjL8qwp9fnCCQ7exXWx/7Vu3hsnw1naMBpUj39NQHoDJSN24BQBRjQyo1spuZLXveA5Xb22BGeXQ0/R3BCUTtqQpmyVjKs+EQXjgpW3gnCWQlGbbnrCt6Z+E8s5+U9PX2zeR9ca/v82NqjsGan162EEefnJhusv2+JWWeN8zbJzvpTNMu0YtbfGx0dpoccdgeZvf3VR21ZVf21h8wG+4KpNlfPAGJcheZLSR6KoqNsPbbcQRRe+S510C4nZrsdMmae90K93RUt6x821UBrusap1p91NQ4ML9VzXLz6Mbqezid9RC0hNLzYef1g28I8hVmvH9swDHDlBrHusN3xrRe17nlk0nWc34ANYLt6kHp0XnhUbVanzsZqbV0IiAZtBK5//UuzaR8yhKgSHtspH31XIQOZyYJ8X7t5eb1XJK9uVLapxrPiQEIFI8PnqPwvhKGz+hteN5tVx1TRUNHulfaIkOYWXyEpMv8UYVN9/VFQ27qmcAdiKiP1fedgxcPVdor6CydrEWFlYn7NEFEaNVGO1pqoV0jzBAczW0usVxvZ4abx66r5qjjTDPjsQfUA82Iz0PmojqTiBlKBpeCEI61Hduhv4NMUCyaRWDWxxWXntmdvPm0+iqo9TPMaM8zZBjiOhD71p5podDlPkvLKTD3FAzBHsxjRxKI9gP5c3/ZjOuUD9HK8HLSgkOfXUVr0BlJrJO5KEhahyjFDnMjrUbIptmblX355UqotweL/8vTYDagmAsH6obxWKhBfUh1Vi5GlaYLHoQf1zluykUWLdhdRlFyINY5hO566Ir9wFu83CfdetCgVUz7snoyHYFkyvJyECoi0PY1mJkglyAh7fgpi01WZhW/AV/SfzGdINUuqcukY47gL40DHaF8CM4bBpCgWX4AkTWWh1zNd9WyZ3VWQsdOGb4mTdVM7mFCYSHbmGHNC8PmbnlZn3sVNqLaNcvB8XVbBpgkIqDNUfKPkijEwCk4M0oWwmeT/fj/qSCO/WbylYnkZpT/1WNz2utRtcLdx0fBettc66xdl6tRU/fdLRJfX/mauVEM1xp0jYbNZ5GB3v00A3xLpaMT0ybfPNrMveXgTvRuqN6aNbe7iTxgDqbLLe0usNHavCY8BCM7RxePTLA8hKnHeQJZ8H1bNxVNKcuQpJM3mo2TceU4dxHCm7w6Va2Agt6wAV42apvtgU2gqMftgoUSxAOyukUPvpNdedgpWaMQ5yFkfuJgync8BRHE4nnN9SFmAAHcQURSCn6koS1+D4khRX5T8mjkgdkyncK7eYzgntgSSkRw3iFEkme6zrZXTNjYXFSmOEy3rZ+22TFDpboZHNFP7KUdY0OFrAmZdyo3twXytpc3WfBgUm+XTmb0KahCFfRvymT3b+7t8XPr+x4WMWntlOfII38Dt6Ei1JmouNCQ/nlsaub9s9oKo2WzLZjZACQ2DTGOajmWtRzIgFyr/2PjwuG6NE/aQbxu5wBoBEcucq33xbVNEYWtsIIe3M01eg3R9PXaVaKotR/UunoDpQsC7ZiWINuY+a8B0aGurYfPzenUUOr7vELyjmvzMuLTTBcoTnHUSZKL8L7u/J+lPbP4Y1+Y9cCANI/tjc6RdRowgbfPZQx/OSEpT90ahlR/anP9Ta3NPYWjlE8PGjtp1L1GUAmpLIeAqzlH6zlf/51SyPkbflrFkib8SSD9Wh7Q+ACurnVfX1V0z7MVFtJvMmB+sq9D3fEn/wNjQfn5+0P2B5NPEG7uaKCHPVaHkHXA1yDfdUWGW1wR9zxgHphrn7BLcvc1WJgqvwp8RvUvbvvV3PaoOxFlJYoXvIJ1iRRYZ99Rzzz8HZOmsx3PolAHMQ1bK3fGfI8mIui/qRcLLlLaWDS9gp7laIE1AGzt98MjO6NHLsvPswy2SNlQx6Klj7owDxtILwNB4xB81QQD09hqDe4u6jlY0j05lyjRpUvA/OkTqTRAX9ZfVvqxq4AO9Q628p2jJZpUj5GUfvc4BTWahVIuDQy4VQ9btz0S3UwwRAMWY6RqlnnAUlV7tSATDPMmAwvj/u4YiJ0qYGIqntTCKAcZAoyuR0fYj3o3kLD2Dngjtpkfm6egrEJRr/JRH0W+uGv8lB/hqi31rHQgr/xQy0EGNitLejQPFQ/hbj12tR76gbuu5jSwZM2bu1U8YYdn6o924ib9mAlLPGc3ELVXdCk/FKmjzZySVQPZuVqbo7a5BDhdim9a3pqad8r17HRhakXQRdujCVZ64E/e72uPxh4zmtVTAQiRFfYI+FV5Cih3m8gxetdwBrsvPCgIXIlJ+3yZwh53lSTckXjSuNWhKnuAX69J8uGWQn/lXJeFo5MT4+HoQh5IMbWHfDKbt2Bucjn0LYQn/2q7IqfFEqKN9xmLtZPwmbF1W+ch81ebBNKW+3FtmBpQ75tWD8gX5AWeDzqYkZ7Vu6jc+HlaUNvAAHc2D+vXry4evG5wQ5N+/vbssf2PM9DhOtdwWMVxu7x2LE0mup/fLCZh1uxMKovfv2R71rAFSFr09CauxpPjZYf7Wi/xap5Z7djyw83PPTC/NFt7ZN+ubl9os02x929hKLvpX7me453sCypoj86pG1n0ieadybWoqnXCyQ02z1fkkcMArERbDQ1ARdODWenVCNbahnTzA69HGAyJ28/yuppIX1lUVXMGo6pVqIZAP1RD+wipDg9DXA3sr+pFpeb/zBOXxp39HPjK5XszIQbff7i+ur6jy/+5eW0Kl+++oPQhX8u//DHaVX94Q/TP76c/Ou/Tqvrfy7/+Koa2WlqhQAHBUlBrjdyspSGmaJgiqrHlmMmojkr5TF5uOa44ttFd3BzQBQ3Pci7Gtzlb7T3IqCSH+Xt1AoyDXbfjfBBkzVBvbdTU0DYbQ6t/xBZOrnvh87gk0HeyOMzkuTSOjZt3AM0eu6wdsLz6ccZZaVPomhja/NqaFxrGBQaP+kdfDhpy+xiJI12RH7bzJrNMH6jgpnIb1aw0MbHMtvPq0m9oJW7nZiFzaupDNXkbCovB/4wffVDpm0MbYNNp6kGZsxVdwwb7YERs/qHQGriarJCTUWi3szaIHqFV6ZQPWDzBUQ+iDSXwbIUsk3MmpAAR4fz4dOGL3NRxXAPg0+43sntZqbDKvCp+lrC6tV10WYoNbYMmeBrWupQJz1ChuJmOwwJxX3Wdf2rP6p/2vn5xas/uqNhtVyb91572LmgWi8Yo9gwADzxp2q2AMekQDg8qIRS0QQSVCw3QOMnT2ywg7HvkycUm/njiTHkwwcgNQ/ggTaFGK4NUugB3OZCK6rNpkLuVI8ZJG9XupFTZ39NjI61cR3ZNOeA/j1N66bgAcUDGvDUyNpQx07juJGaFcEcguZRah4RrCP6fC1/c8iD2507+oW6YdSxzrR72tGHxlhoGDT3OmUYm/QieAViAM7K5a28AwQgYc7ENCAA2+XfM350/7tNG+R2PoKqVXuEkJPaITmxC+PPxDe4tOQZQ4lpuoYVs4xoyRcR0DWoCufh2oLvdyyP7cv++1oJI0LHt9rBG9UHS0+pdugESBOYjK1PC3ITh/pZNUOr5gQaY79fCFmWcR42AT+UpbqXqo5jmTpQm5sEvFADXgIOmINKg+hGAU8cYu/QUICMwHGNAdBoq2/Mnn/rpDwNenGl2BX2KgsD1mxY3bWWyVwmcBNAmiRZrQm9Xq/IQ0F9C/HeXZlEFUO0OgpyaMTph5NYU78Kn4mHz7icMPaJvjcKNgKKEBt4yqDApIXKzz/jsLtWEIPYD0cxHRBQjTW0juF4ZkI+oncOzO5wlOf3DLM1OvTksNThQV6/cbm1Zpih39GCQREetLPEH3KCOzMIuEEs5bFCPfbFEW9zvx9CeR8Ny67heWO8rbohR8Yg1oOa5N6GD7Lg1avlbdvVv0hrY/Lfl60WA+6Hh7GOZfAYQnG03hrQQPBIHgCHfL5Vq6ZbWh5y+6Hk7vbBxMymci5/sNkDFCJ0VGgztPCngBHJFHWR6CJWCcfjvbpy2eBZGyGaiY7HjZYJI5+WihHXwydgx5Lxx/2ug+DgTP/oGTM96P84RB7X5oZzYB1z3FoaTiAupTDo6ffc1uTF0IxWDbcearACn4zTinxJP65U+0jEgsLhTJ1TUr1jhrhss7FmS+l5Ujrzz1c4Ck2mp9lL4cwuwrn2O8b7Nw336xgGZV4NzA0OqDN9UylK+jTBeELBIcDT0RKSWzuXqbH8NMcZapSpvc1lK6TvpLqLG5LaDfkuMdxVHDC4bIQuLxZVEwWcdPJJ9hN0yLz+cSKu4p7ids1YGnAPB4MEMU6JYCY41SebkrncaLB3eDkDg9cQ30jo66nFaL0hVCJqPYsomuS90AaGHbCn+pDRro81nHoPfq61KXgDLMYh+XIIXp+ZPxpZ/hQ0SJs6RG1VJph1RY7KckK0DgXH0ItKp8uTJ1oKfHx5pbyJ9ccdRgNsMUUKBC2JR117B5fRR0xRN6MiaIeU1II7u0u6oJmBstEtWelB7TkxnFVa3VHkwbjHhyWjdDnwPoxmFQbzCYlA7fpA36YBXWFAWbZhLSn4V+ZUVYV2Hlu6GVPMU2Okfgs+0Q50neyqKpcDAHN0WuWXwcxpoEzqE2WcQzNSSRFaKt7IVc5LylihQuZJkFryXo3aXDdTznoHnUzgGh283EclnleipE7jiLR3ZiimcttgNbamMQ8GXKsmipKHKvQ9O3Bh6TjFqUY3I+evTDdgPaK0vVY0tG0CqvBA5PbpM8OpbklxkjKKVxhok1xhGrPsYYCoO1MW30VjMSP3nGi3EMoGTUcsFLQa8pUTowbpTeYvFKq/t4RYu6vIEZ/AmLYQ2mtxvDU1JzQk5PNlTyzZd4hyDccjOUEIf2tBPw2cliGwe497PAmlZvf0dFWvEoWVUw7BknJL2yzVbyvWZ9NK9hzAcKSlqZFgBmeYV3KeWY/P6xXUB2HwAJRVQfOb+3S/NFHz1f0g/km3vq8apIlZzKSGtgZvMogpw4AIKk2MAuJ8kKFqY0IFAijJBsHxUFTWZXkm7PKskhYPwnYI515NE8wrsEw+AgeOuAj2gwUHSGPknXxY1CndRITqxm5iwfwDVeTArlABHxEscrsGeUrhnzDDEFCkp+T9PwC7oEJ3YyQ1BZ9eiTGGUtNsWJGcSuXXZfHMp2mV2msWZ3gPEFO34FyPD1hPaYQHNMjNOIGyr0fw62CbwRB5JpFtBhAviJgX5LLNQCdCwwSaKzjiwPAcqIc/P+ep+WQDFZiHBFPjPnkgl+Jli2cRUPDO7XcDW6P2feyBRqenl+viPjVtWLYORXHe3h2peFwbtc8cjvQGItURaSfSur0k6stG8yMTAR9NXe57dGhJtH+1RJrAzsHDCQuoUQp5gxYHeTHdWsE9uRBrye+zcnnc0sJZATFvVUGNDeC4lCVxKuxiMV5qKDMwZn7ChlO3tgF5mIZEpb/mvOQSAfBJ3oLZfMpL2Qeq5bMh6GpztKzm8NpdSI/XYD2avEbsc2jwESEIYPPa8/BK9ipqUcDAM2pOQBB0+tCEVykOcKvdsRdIykK0K/k2s4gUytl1GeQqKvBAG702Et9XyaWMXBg2YVg/1BFltLgMEgobt3SwwN3O6oA2Wsu2gMBfxgqEYE1u2ecJGeUjAZeE6s0AxqBdUpJNJmEM9pnQF6YQVqbdQmmr35hMS8q/MWcHhtMgrgV/E/YyZSqT5KBAayhh2iqwm3Zlb0wHotq7ndAgYg0WdtNfp0zt4aaKJJjzb1OV9A/UC9ZDg06yd2YXN/7wwefbUF/lBk+depAEtRPP+rTJUeGAGuVo8llXIwbCvWct7N4INvdi13eQaseUXZvgcU28O4pN4eudeiLYLBtEduyFEr/49RlxCLRqqjPu0qZHubVq5nw/rgMl05laV8kmFA8zFUk3W9612LwGNV7tw2x83wpquQiakO4NEV5hEMA1dvtMvmLKDODeYeSi34aT5WSEnI6nkR1dxu7TRv2KbH7xBtYzik1kvvCmBybc9Uk7nBFBSzyAhCD8dbzf3lz64jvaNLZLbSOGsNya5rr911kqCnr7bVIteFhzuxdyuUUqXMqfViwlA0KKeR3nEXnkZxG0cNO7JsIXbvhN9WlPNOX0Opjf0Dpjs04+ToJAaBjhcjM++90wNPtGUPYt8WjfwTd0R1BadRwdaRg9hM/jgxWr5qg5LO8ZOi/EOIN1833/QOn/JTPu/ynkqNXKsfruoYKNlVRsJkJtQQAWAwVADi9fFnIuL3B5B4vCblgG2npN92LvZKSu2vbLRjnPyH6v3gQqeL/QWrJXdDTweppmntBoxFIkYRXvptSD4fLZn7KtLRWGEg4TcHn83179uvXJCCj99z04JK262VonvNHi6MmTaU5dA8OxYig2ujXKDeggB6b+5wbg+d5TnSg7uqqZg75qV7bW2tYXm4fUAlsnVIq+9fkbHyl2YP2hg6+QIs+Om3J2L5tyPwCfDamK6EiElyVW6sCeY3HbLltibOOc3CaQsErvWLdgROlMyxZn/JNp+YLxqkF3YUp2hF+97vXGymkx4mIw+eP5B3WVZVk6XT7Vyw4+rp1ZFr/8H99evlp8e6ZNSilrFRWsZSaydU3sF4CX6Y5ChQtNyJOKpjGIfmJg8jzSb7Chke2WUlyWBX7qV5BvCKSFzx/rXY5bcPtDMqXyAvPc2CBUmmtqc3i9gKVkWAeytQzroByixoiYfaqu5DjHQfOk3NIYBJuFYXGNEqRM4OqRoCN7u1wuXj9/DsEvIVtGfbkwpL6RzKNnts4kRSYO0MiSB1pqjuTNhzrTGh4cMcVCmQ/tTRs+Om7ipyB/e0ZK2X0JhxwyuX5HBhdXlR+mPTKsLBFTORgw+8WsBERLsDvhNhL0DhMtlPdaio8ehIkmiz1dD4htcp6h/k7jJHVVOZ9VW0PyqpG+l0hi8wZHBc/DeM0c6m9YradMcWZYf4Na1EJivc8IgR0qQBSt+Hke4kkj29G+VJEwZWYPntmH5Pi4kKSRjIN8VfF45guhR70Q1s8NDRvq3hQpN7kHvXfDbZNZvz+72MsjRqjXsMN5fU3O945aPiDFYMPoDF1Ig0+6pFZaiYCipGHaRu+NTKuJ0AL1QgMWrhxGVl2TOAEs08Bn5tSDCLsEjN7LX+4DLtWDvsVOhgegf/3uDlIMQa0HHt+rNkRaVAxem2Ln6cRKMkJEorUpuOYScVtqHCD54vDh6PKbVriFxkhLZbY+G+FEQqhsn/WnC3Oi68+qTrHy5ABk7r5R5N+GYoxVpmBwKh6Xk6LGFKk0RI4F0+G8WsU8Cx9kwMmpVcW5uR2vmWQEd+SthVMjAoOvMtugfr3oxnEqCffhmi4SeXmzHnw7jCfY5lpoYujkVDjmmhsZZR/3IBY3Vh8fyKTihumgoWf4lS0KC0+y0P3Rr1g/3CRkqcnBtjpwQyG/vbXaRHMpb6PuBTFFKGsze5MnT2T+PnmSrfoqjKuQdkQfm1Q0nU31iZ5hVpoRWN1Cm+BAx6OgC/d4PCFuFJDnYfml4j47RSamHbFBCu4i5kofHHz/DIxBm5f9BV46LgyFZLS5iBmAEysj0tS/eEAaeo96fHstyVyf4nQ0TqY0Fs3V/bKy2Daby6RYD+wUl4YbEZ127oY/DJxgAfyC7MKZjY24CR7TzzxtQVQxwwnDYWbKf4o++dvDLlilQCO+s3MMp/HUHMxLwng9c8hN3W38Ulkv7ARC38ChA60C51hl8yKtUl39RmiE3HT4mmG6/QGodzRAP1XBjNbIbtrL9u1Aeva+pXkUmY+A7ItiXmIMz7GBTYBWcaUduRVMQoBdQEyn5NnwaFItSNNerCa3et6F080KYjcebBMyG/mRSgZ2/ZhNVjNFm+DRpU85FDVq20SkgI/lxjl8+DTt2vojrPqOB5nnBBp3XENEE790JD4aJ/s+j5zsirE5Ngu9IQptq4WwGaoDOVXXvPSTiJ4ZDkol4TKSdohgNjYP3ns+dxOdWMMCYTEp8GWrsH+cmspssTj8bAbt0fEmaS8U2GiPUOBfkydzFxk0hlEd9D4W2eyengCSBo/LhrRJLr1BTcr1xLVeKLqFOohnuZrWLWcvm80ns3oBR5D7ZnLbtQ0onBJVSpJnM5Mgz2b82D8Hl1WLQRATMiqGiPgbVEZUI4VoghYJcDOOmB+VwilpmtHd9LQp3O00cy8txkdy/y6NkWSKCTs7F3YQ8LP0UCPy5+5AZl4KBWlWl+DeotdjQCYZLxaKoEz9/XSaqibsuarWv3IX9tpCfPsLPlc+0Ww91KqSmKiNBjvFYO+5dYGcNoC2EITUfz4/YIiJ/2K3C721kQ4+DyR3NtTR6YGnGRwWk9KbJQeFwqFLi4Sjdijwsx2grcBXP0WHAhfDw7SVsyP2lgZBJpJOUT3nXeoTVKKhq1zElZBjG2zD7PxCMmXSXRPVu2ErFRTqF9tUy7tWWJIEEpWjD3uFG6Fyo0zlsNFJoTSoB1hyBxSyA0V9wFMIU0rhMrm5Tm/1BAj2Sw4fE4JLYPJqITv/TdJci62hyEwwSNKFTO4N1oJ5vPcz7QVjwkl3zArHT7Ih3cHLVYRcTd/cF34JAAjomQ2QnYpmvR4KJ4Jw3WH+1+QTqTLCurWm99sK/W8biYvw0+12XQCSKqhgxgLQsTXzc0tdMztXRFLLc1xSuw0tRSh/byQC+aPGm04OcFX3bjWbyTECYDba0JWmY0u8Dnn0Lsh6IlrplocpPgS0ULwrjZL21XTSQ4ALEAXVKJ6HCGlksE1vGB2VaW/XPxtafb6vluZIuW7reSOcvdpaR+nCX/46sCr6tn+/72Euvt17FlLd3ghmSWQIFTCDlwn0T4L1Y/GMDtV9wgcaxnLAJ7YQBxbiyH0sglGcW/E7kj1oQtOaalTF6QmKiFtTKXfixzcSmnRo9GEn1Z3OyfXx0f7y8BYcRFUYOxlWtE7LvWkqmpaGBxYkgV0yux+1DpETXWpFa1EDYpyH1IJ2YiEFQrSHNZteVRiR60RMSjdZ2TTsNcBzFQqA87h2gAQpYiAc1IpyJj6HTVMFRLsj8APL8psN3mE0TyT8jil+uO3bU1MLxjLJxqFHgQie5z+fnXkE3ogarKNbRXwOkCqZ8i2OHVBzwW6HN+phY8b7ssZUKgqQ7Xn1U31zS1nCWw2TIDNh4DkwUQg6jyQMRXajJ7KSrjeuHH/5wors5a8aoDH+a7iXqTTKx8297Ngh8LVPurfflrJnSE8tmokhkskGLkTiS8V41dflV+w+G9GcPQxXpUYX8naQC/V0B6E0YdpWyoVfybT4YiYFsC+5Da5s1h0Cs2kD0imPwz0yckIDx0BPBqY5TDlqLAqg0bdpBSr5G+sOJH+pUeXAJEJJnhlUmhHxgzHXAmTDSJac4noZIt3qRo7zsspODy5G2DTpCtuUs/HsBlr32zllFLWlDoQRQl2sDPdBCIstsJzthkjJPSmWMVOpQSFPMyU/VMjT0Jjp+a8ZyCjtAcQuadEoeSn7jYIXqwXdlpPSljJ8q2Cfps7JepK3fm22YX3rQ8bwueauK2UgrEm76r66mrXl5XSHYQNG+bfUd7b44erWOdCfYe2YMRQzJZW989LI8M3XXmDHCKRNOQU+vcJpOJkvG6S3ZYnvbMjMLJP2Eg3BRpvBMn/w0aPCgF4SxVs6Uwys+Zq3zBma8TW5loTn6Nd6OQA3OGLKIB6bFvJ9d0vhbXgHGQJiz2ZJabOy1Q4RTHUNej+4+Xn/ZAEwWAOuHTX1QpPyY4WiZ+KgXNxUh/srHR203d74T27ispnyNdyJmeynaqmwZcW8oF6M2sVsNUAi0+VmCj1bY0H4p0BW2Pe0UtJPrZ7g0nM71FRrjXuiVgwNjT43R42cUdWGQ49Ki/Tk4w4WXZ5uqTxs1BOH85H+zSILjZ1DX0MfX8GGt/KXWS0cLL820/dkSwBq59QkBMTuPJquFQE3jYOfFUokfcjJkeUxDQOUjMJBhhCHET/GQZdU2qngKoa5kvPO5u2bVXt/qepin69Iyi0ta7vjFXavmc7MvgB4raX4fJEhW5QKknR1z/ObB7GP4tHLbiU8742cB+J+iEirduZek95OteRDrRQHp++Dj8ORQx6/dzfko+aYEI7R7+Hp3fM8+iY/i/4Rhhe02UbqEhHVXQ4vFDw4ISk2gb8KRGXoPjcxpOokCR+urNMeFGFe1ZQnjsGIaZtkslPVMLLB3lABF11Ja7XtdJg93/QCFC38rbRB6SDtSr8MXTsm1EvScgG8vkrCTf2CU+20vqY2Q1+mH1lExH/QQCZHuN88kp0KV4dDmb9jjNL/f46cgco6fCwFzJT7KBQllztX8bifKAEvuNrzpyHhmRYAWz8sEVOeZX0r53U5YcOM7+o+m5b9LcUGhkh46Pcx54T4Rm9kh3I7FitLKbSkuww8DX28u7JrRS/bEFWKh/w1pyremsob8px81dQ4ZAhBW3VV1CKy3JV2QoUKCsKn1vOUX1XhS16Mz8IJJBjzJL21voY3izkgNQENsbj8dLGZFUOBXn463FHzo7xE8QWhbnfWZhGheLEIZCS0McY4xWRTPDHHtFdbM48VnL6AwWuIYTt8Z6oSGE35slxg9Ag1y+O+RiYKANWh2oVFoQzYR8YMJOhHsaweiWS8+6q3yaMnKE9MJow5cWpOncbZDj6cpeXFGZdOuMHT1ufsSZsPn7xj1m5vJMxd2nvRWTVtDQpCE0xwDtOIPJKxCAG/xOwEznytIKOYj0HDHfTb690h4pjjg/Vv7gk7tuP9GH0jFn7oLR9s1t8YpNPdxVxI34cHBdQypHfVGoizberwwzVsfXMyAShU9R09el/BzKq7/76X/S3vutHy/9n33Tn+6SJZ/5TSJr0MHmglvtjuhtCOl4ptIejzeElzYJy2Ctxjw9LgMThQJaSrKucFfmLS4cDLVLiugaMpO4BDX9J3UMWj5t+hKqfmHcr6lD6G/gYBSl4kL7HWmpYYXwFFQ62mirzf1r3zA0pmizztXzdRh9Jho2d1g/jJRS4X+dt04EMj5wc5rjKe0dNT71OmyK4bjs6D3Jj8jNrdjwtuPfsfF/nTPlivKV/SLnBwmZeLZ8HJMHoWujmCJiRo/cYiWSS3YIiJA+dBucCMP72O0N5jKM9wxptKpfq6BkTxkydz1XBrcXQiwoJztk8dpgVsUajp6inAQZjaB4fADo4cFd2xsfWdCB9yW5xromJjK0Nvb41DQYMyo2wCpe9lq/jAn3S0ZLt6PnFl8JI5QaaGsdsX1gm0lk3gBr5TFktms8FgC9gPG+angJUY8SUDxHEorVoQzPjLNiydy66m47TtdNJMXEN0Ppk/SyAxg+FH/5Ps5W+k/xrgTr2lIO3YN6TySSiZ+AorZs10a4MA31fYv8O6nLU3TuJUiW6R2igM1yuTM9ozmvbOzLfUWUlD0g747xibR8OUNsTpzMugsKD7spxk9InqegZkgdYD1eMJw7e8U4wvU0PSGAs+2SuZXLP1LqYu03rkHhnKqUzlYL/RhQMBImwFKXvAylTjbMIOQDStkPmJV0PIWSuj7gwbBe/VCnGjGXXRiHkb1QlMu4w2dZtNWKY1tVF0o8W0vNoPb7apyWnuRjOqjExOOVuGKHVLGijfD6La/XW+Zmy/axgDI+m2Vtc0FvtQ3fSMfxILP//bS7+Eo2ND/0ZgAhq2iGGMZIyJI0TtWP9mMhOKcXOfrbqZu7X3hVCpfTWqMN3BwrOGSlspF7zj1/WxO9ug2h5hX8wSHFcRCqcvFxdQRvenTcGzCm9g3KHAEReeX2gc9DwWynA4gGniB4bLaO8y5ZKpHy3In/5SGepx9W0ZNBU1wtoIb/1tOUAhr001rNkEkwgZatN0NisbhlvVv5Z6gL10Noi2asW3xGeNT/AzykUIXJbMhPmgM1bUnIP8HfjGQC/oAQMj84OX0D72fra2iKF6wvaYoXGWfWopZua7CvXRoRqK5KCyOSXK1bsSRnsmmqMmBy5G+Ks5Wys6q0H8TVys1Q+sSCggY9dAEXkMa54JmTGoHOTNFefyfJB92lT7mp613eSs6ogvhuesOmjZB2WFZUlK5CxCVZa+4LgJzNKwIjL322Yff5/7jRfd0bNU0Rg7+TrnXpmXk67tzd4dDCJ0e3/6LLvAPickhqCP4PrYehECPQhj+vypQns/d4zxZzn14m1zs2+seBDcPHUU8WePDtGg09tG63V+0S5uCalB5kVozFQu1eKpp9JVxRTAi5uaS3jpnzZ5pRJ63+eqA2Z4AMqaumrf9OIQ/fVPnigOS4gGgzeVYUqjDvRp+7CYyn9XI8KUBZj4HS1YY4AA9b03xwFgIXq0Wo4CJI9JZZp3AV0n1i91KzW75qHaUlvt1Bhj2H76Ybn3f8e0G9inJzMwf56vz0FMK+gxrXnKoGOf8SgZNcd2SnKknHpl0xEbET7ulcG95or2YZeblWPLPzUGx9RPL0cvngHtG8qJK2y6yiE38aNgmCzOC62km3JFgxYhcbNqT+oudMBdwGlBJIgmTgXG1iVRfVtYuJGuq4FijPMaAn8jdr0cS570gVXzhSCP8onmWTLJnvTBDPrn4/fPfz4+GCXfRilbIQyzE7nldrIWTmqyZE7sDY+hGLlsDxPatt5yqhgP31cH/0+DYYcrgeocao+0x7OHfai6Wf/gmHZwv/mtHV7vUSDQ3/dBZZ4F2XKvcGS7uh4aDHaOxjiQltgD6AppMysVlKdjo8/53DxN5vJwkoeZ7ZYFeLNlHOtnvpZ3DWJMpz+Eye3TyCOXhADdWmxLnBKli6mXVdyU4XTndDWldXUItResJgLpeepbxLNN7YKGHRn0bLy0mCrVdKzrZ5yINd+ViFLaL8e3VTmN9h9oYsQJ+n/LYuBS+wc1vXOAlnnljaULfc0sxKHmbFXL17+2x+QlnpMSapmfVQgnk2xHkQRwLUX6oIiiCEWYP42f9xlmftgacc5NaA9aYGCw1VWPCJnaUM+whdAlX7fmDklvyCQ5+AMH90xTjezlFr+1F4J50i6hnH0Dacxebi3dVSX2ntd6mvnzSg6dBjesmuokxa1E00JuITosxmcPiylE86AYDmGDQrQrS4vIQQD64LTQmSYNigX8rj4CdxGKgcYcBvXh1zQfcAnmaXPMKD1RVk2/FToqb2hq8L01qI9sL9HqUk24+y8QOn2FG1fb/JjdtMv2UBPN3WOtiJSAvwIy4c/g9vF/CQbydvCbzcpFX/0Frpa8YnJwUXp/dqFYEwibSWy8zCaUft7C15tWILYfyyueHysoFQQJ7zm9YLGCm0x+Z64nj4fNvd+/GFE3MsuuHiogmTLUHv9x4PTtgN1rvt5Ny9PIoGhDqLQoo1bzuW1PlEdmQNdJLX+BP7TmQXMHDKfMNDvjm7YwRU9e3rTZLXgIT7xl0h1N+wq18Mvcv1TOcXVTHLphsGtNFVzCwwQaJEi/rvwZnn9h55wc34lEz+CudGVUj8bwvdVRGO5Oxe+teeV7XDjtsoMorHbDAaq+5L00nIr75zKUwYcqDpF53BLy/BauptTxqqsFjwnRwLBZcxNdDEKErAkiiu0CiKZ9Nxi7wcf3YbX2ZZIo0Qi+V0oxgtcVACDfESZagRIRbTlX3OhwdkUYx6TIQUz2kkSHLQgiSyzEYACSl2b+oUfnc7eZL6ktDsfoaDRvGdkCs4VDynmT4zJT2DB1UdKzrTkpTQgif6YAqmo7ZLjyaRpw5zw4OqR3MsxA9DpQ5FeTMgY8UgY2cgvt5rCayEY2U0dZOUrbLZdPtEv/GSPMFZTYo3OciWW1VlAFleslFw5BFaCnFLZhQxqmyWnuhoxL/ZYUBGKjvianuRv1mWdCO8iNL8svFRayiTE0w/DOkZUvZlEGOKygbecIU67iUOgj00qYpoq3XyTY+ypl+iVImBIJdPAaSONsemJGNthIqU0CCOaQ6jt9HtJ1um2U1qm3WbpLwnCGfVpn4rK8uqqmGy1dMnnbg3Eq33wwz+qbpdMQo/S/EiLBtw+3NNFum08QQBb8tZTx+jgSkNJjV24iVoJiCt9PktYtJ6ulbshEsQyhK4Md+SzFs3Sr923gUgNoKcILK7CwWuOPzU/hfCN4tKMMO7ywuQlEHYCTkKTOjwkOoiIfWqQYTV5DRUw71s/lW8rkb6qIxxmSEjDOWX1zu0XYbemD/I21pZkZ1vyfh/CrBahDvo69ug7SikLbIFo1XQ18zEojmvSosY97U6emPWn5xMJnrUJq6cMa9HFs1h+gqZvta/pG8148bd3W2DvY4b1zr+QiFds6S3RNMz7MxCdP/vby1ydPttc1ArTRwLb6q0bWnEnH4l4W02xTU3ZkvagZqmyUXgzLWfSp9WIeiGoqVHIGe9BTDaEB8EVNyC2F01hWzqxe6BLhNAagqadkE41SNK1gl09Q5PcWyBIm+UwY3WjK02eqrsKupzGJ1qqEiJt0f2qvCBMOb73eQlOoA7aeF6carnQvv1otY1Lf1AtZYxT1ObIrY/BYvV7eiIEjHcdDgZfJ2yQMLYEQiOlUL+H90RsIAsFCZpa25W2GlVIrwY3eeceAyIfu6IvU5tehbiD19fBlfRTMZceMZEGe4XR42d2PMVpmVD5zE1rJHuVqja7DyRNtfi0UYN7CMK0HjtH0vdBcmR0EciIU240m2BYtJS5oxEBMJ+T3ar5AdCfJvQT/3MXsJe9j/luH/WGu7tBC1FvhNhUUyryqDHtP8aLcsYpsJpMA1hCDUxKtwRxO6MtOU+3gTXNdL1Uxe1dP4XbJgPVpNHqAg0EkgDCGi29BcnWLmOvLWOoHK/XPKDUK8SncRfnIO4a+x8ehirVkXdTuTULkiqsqRKY0KEHVzwG7WA2yDZ9LdjEwO7KZfsSR+JxUPwHs5VxXc+1wUg6BYrCZrohl0bEeJu5ItrN5xaOCIqFaJYN6nXQtwGZH23baU9UybdtvcRgna/WUQONYID3gsfcVg1ftxJ6lu/L5ZvtqRzi7P21kKPmotZ05+LxtgrjLKBiaJyr+mD5J2HIs7uRBA/jNnU+bar2d4JrDB95piG59hzTuYaxRWBjvf8odp8Y8eSw851B+2EfLFMoHr6qaMGEBUJLql4U7VlNJMRp8EzZss23ggpq2MnjInlr7eraJWucxMrScIeHvPbWugC0a+asbm/Rd786uQaEV4q6x0q4h9kdBBL/7e0Tza2PY+JThmwfq2+9qZzgio12orboYbG5NdwKZc4OxmbQ22KP8rUZxgponotcOIzqp+fz1kpSatjmte2qDmtI/TYpZ2hZ/a8UZudjiba1IINDqp7YBQ3mIkIH/WsmU7okW7k/mJ1woPp9mB8hwG/q9HWDcBGFDyHq1tUpMDM1WKdLY6D6VRPwxN6lS60R4UJBzDK4+hdHjaTAfZ0IoSa/UH37d5jn8Vsgi0JSPy8Uu52Ha3FgxWGRZZIt2cVJctgu9Ad7xooS05c0KtvKwrjptfoJgBEj2nin7PnKpOeZMv6XviOwYt9VswdTsKjQgHEb7pfrEXaV4E2uCOZGM/I45LqN1wayGBpY9IiXj17IZW3Dghi5BkWQkhEGGWcqp63c3/0BM7dgKvCN7xLajCRp4n/aGUd4pfkjXOGxJ6ZtkEihYQvUl9j1n7YLKMPRj9LnZHvqF8RWaldBbOi+Vs9NrLAFfhoQ5F45tetSoAOtcSwk3UX41Zfcezdh6wwTRF40+1EOn9o119IkzkcHQDOZz47S4XoczkQNA1schmO1UGvAXDMLkzb0vQG84RWBwUBKhGGqRl6KS8JDsFJM47bdU6KqrnSOQJBVozjfEa3F6S94lVHfjI0Op5zUZYM3AthfiHxjkoaKoMMSs5pFcGcq7j/FmoFTzvN8aL1XG8RPU/pp5QZZuUGIM9SBscSegLBh2C7djYPMG3DYMJ2isIVWL1jHrRUYrgKN+rEGUxoNnwTVfJrm9WzSqt4BL24IWkvBrXwwg5dDiBLjdaQKWAsz8kG4A5FNIh8OGOh7cDu27NubtA6Abug0gTvaXpNplu97G6bVBO0vBASY0MJ7W4Z5BxRQ6IWHEPvymR6zDYjE84iaQFTwiHbMqRNR69ElJjK3ZjodthdwakgffD9dALhwn5TEZ1PcKnn7MLOFDK0wMg5DgzlMTpFa8N/5Suk0fNWuJLynTjwRv1czgVy6jKfR3ZchxGiczhPLMq28ytxSooGlDO5q6Z74DDn7Y2ChilnubveMbcN+uvsmGNqnBpvNkAmLW49jzX93FfTMp/ny+j7++5E7auCguqmgDiycly6I3s9eEX/B4gV8qLNG1eIHOPXiAMEiIB5HrsA8oDo+tTa5Io0b0YzPD8PMPFvNxe+CUxGg8VNA4eDHH4t5xMyoUy1aI5Ul1967+RmIJWrWOeX6KAQqxLDZQdzTIytLzeQSGgMOoEr1+pElXvoeCaTSLfkZjT9/4j2VKKOhLN8/hHOwZ1lPP8t4aBypZDpvw5j6yn3h4sGiTXWzalTch8Kjsbuxxk9sjuDnRKjOqua5WyyX46qtqBm5xQPbo9rFO6rjLRRfXmltpwlcjX7WwZKZVCwt1DQFTDsr5oqxvmmK1nP9HL7u4UPuIl/zfkApYttW86IXXJcvPRDtWF69evPzj6MUrTfO2YtGFp8lMYtEEizmUir05anrszLLRFUBx7l8/f4680U3b3swqoDcrzMtz2c7651PFSPtR2pYcND3ytmVn79p6OnLB+kgqxMeAd1KXn2VV/e8/rEubC0+ClzqdtoH4XHX/uHe6kjZHPsk23u1NOb2pdj5J1sLsedU8v0Kp/rnKop7TaaSeSMY+Kuwzd7RobjL0Ca3Cuhl+8fp9CoPY9lx9Cf+yLBJrLqEXoeKFcrWr1eR2e/3lzXK9YGiFb3UhpwJZkf9RNcElHL4qJmEPYaGCKZgi1Zn8PcSIEmI4vmylcciC54jB+vGIUlDhMJFMU0Om5x+PGNPHY2di+U8rYIyCMBzyiomSyTuATV+DbUK+bk+aqvQHdnBCHwYmQCDb0rW+pnjWRJvHYck6XMA8LF2cZ+UihYRgyJxCKuT9ICKtBqK8jpQqraTxw1grEKxBdY0btvEwRVDY8jiLnDrKQPOEI+DhJ34USUycVqOxIyV++8GfBxhf86pZqcoMI5wZJE1xbDA0QtGwg73ChFR+6jgmBEArxRD7a7UWAcD0rhRJWmgVqjIUaW6n04BDFWmMldRj4GpVz6Y/q5WNnFvlJtjc9BYsJcSS9t0xSbJCw1OCFTtYh4NrprCJqAyE7yIkOOwe4EMILEKhh0L3K4K/8XXTsYN/wUQ4s5imcb/9kAQ51Xg3iIRd0P7rbps1z/Ku/Qt3pVffKKvJIDVhVLuKBmSJ0cze73//+1/3gzGGJWBl/O3VMG2tkf91Xc76VAH4UFsUMWw0CAWfvIVMOWFfEAMaAxQhFIUFowxJ5ZXCCcespNTbHrHR6v7WoYGtHY//dKHOwXImj/qJkHng6MRUOu9fWnLu6Xt52j0DPswDGLNF+jlafw9HSLSwVqVk46e2cOLKL9Esw6ZuAm++dJMXq70ZIycEXN08LPRpJC1ssmlpGqVz60WwGThzqI5k7QHg5vuCvh+oxTL7G+IFcN5w4wNsyc29wfrDb2NJBz5NzkO6Y3QHEwcH4w64iHd06afFik5ldzpEhk4FJve4zHoPfMQpYgAFmqWmM2MUPgOWZxdMZ0odgoWmZm0/kZOEoWqfJjdpDjRd71dy+khLKF/I5OyGmXrtAQeKY7sg5uybiqFTCsbCsBu1faXy/rC+vlYDETPbQgIrGiAiqikgolC4K8fIO4vX7ANRxdENKqkcclybcG23tkLA7p9LeFsKW6lOxH7r9SI0g9cNKVr/g3CxF0JtrT5uc9xr7nE9nc48T280g/tKUo/3WtF2X+2xu+EaEKTe+UB6po+lLJ6J3BMH4v/C3U8YyAJKittuyKtToJxOjfUtRU9S6TxB0Gh1k4EfnRz5AB3GoMNyktYMWuhyLzs5vSTqlwYlxn6WX7QdYGAtQoOcgV4/49fXJaVfXq+zNsaVwIAWaZwJJKQFOHKDEkyBQ5FGj2ALHkrCqnueVg6ZWtNG2Yd3IwJHgL/DzjQ9XTEOUF7k8mL77fX+FawO+o1ax/DnlksrXM6vNFKtWh42rZIpWjZAD6v0SU0YYDoKEWmCaNGa0DTiWBhz5qiX48aMCJ1H8wyNtZsYY4JJ5T2WuEYjoZgzhny08+MAXweY+PTGjREYNWLJwsIFES7bpKIaAS0G7bytLKO/LVWGATIqE/w6hCkww1HhAyKaapR/awRolaIn8lOCj4QALWrFFWO5aC6kDTD+viYyMFVJs/ujawBQjTXg/VEvDBNEHDKxV+z2AkbzEzCRZS819hg3DMxxbMV1MQENzGQSFD2zeKmt+/GXUg/TF6g2h8DhePK9cuNpLYgsVdWlWqtp5lqtwqXvGVAwITzCtx+8YfHOc54P0kON1GTKyw58cr1gCMFdJQXTUNpZOihjrPWT6s7tnsH7rY2akgNIL8y0Z7OBjwjzhpltQQZ3tLGyYubcbIv4XCjqT9TNBCAvJOWatrvUwIbEyOy7VrfXDg3cDhoIwRweft5mQIdHq68HqdjSCaJOsPB3xalIa26NUDF6WEfyrk2sBv7PqUseV5MoyyeLuFYHJpkqfdsR79EY1jLkAacQsOnkgu+gNoH3s9pVElWKW5OD8+jm5OBBBn3teRcDZCHayEMhVzZ6FqHx6gx3cjL8JpvC3GOZHCoiAiRfTE9syA0sYbgagoY/OXcZ1sPHnsoryjENxDcoX4eqkLuSpg97CSD/797cazSv37nf4JRuthBDmnEBtgXMm21dMO7Nqly239UNl4m6RBtGWEHIeNe1hKsY9MU55NHnZlMN2Fr/dlVCmfiaP8KxgOTEITM0iPsUzga2u0VoCDWNnW61iB1lGXeVgJtCKCz8vM7/6pENEMJg1Vc20+NJ5anN4w9vx4dvz9+cjs8PEd/6WRKeYk0xmwBmuEHeLeGh8J8z/B9MBRC5fVcKZEGmWVwE6eaVvE/xRn6yFnbZpQotLLhc9KFSLc+dJmdzSkPlBH2s4M9yANfoLrYmftYwLgZt5TGYB94oBu+c4s8r2Qn2dEZaYvCAEeyiwOec4fUMfwRbp1oTmN9SYp63FtsghDZwGz16K0U8DzOrGLlvl0e9cAtkk37aQJO9UD8DHWiDPoNiFoHje9n5ik9yAVfEBrGkVUpJm+MIJ2cBdzymDjFAwGhHjAUGSsVPzNySpLz+T12S5NgI8jdp14Goq8mgPTQ3bK3Az3pr2xpjWyCaB+WiJs4GDgyFhp4BRQW6hJJWgC1oIE3Fl/LNvfALdTHYNBP/4OG3DIyBIbcUe1xTBhUZ+6JdWoAxwuDadXbdymru/q296gv82D0sbLmfFHAJGv9r/urFy5f70Alsh/6zamGtpYXqxnOlM7OCv4BogKeITELLPFOesrC/lvpOjnlwgSv8IrvlGNCAc7MXmqlTh84Yt+2MqF0a0kl2nFojRFykEWdA5VQAGQuowMK8diz0cWD4/cGf2m42ZR0adl+srpas9r6CTWmfgKWzGezMBF6/quDdfL1iUHD3PdTmyR87e5mbOEOpzSg+SXtHG9mbrlzcgteZQeDqiyiU1Pg/oWdH83mFDeGe+8Ls2nt4hzdhTGZ7IlEfCecLZhKdspcwkSwoBKieOeeM1p+oPUSoOyGTGgL1raH+6AJXJlhn/Rtq0XzJb+arO9Zf0YudZdLPDSqEN+NgatEv1f2gEmA7hSDJG1kn42ZwcXSBJmHOxHksDQXaFMqMzwZlNqdiKIq1t7UsmSjT78biR80F1t1GjdwyYsmordraPOGGNT/WAWRMKI2bffZiS7ddDRRKe4Is3RIuAWEoXJYXe7Ep5hNaL/1PqH0yqKacvEiKvAxr24T35mpYdddgA2TPX0Imz1mI1sxcj6DUoWNm+DxbqMk9OV7AaZFJahAl02KcjNCGnERevPxXWPZ/bWdfFSnVrfVZlW5cFATLkz1ggK/Pb/9va1fT47YNRO/5FTq2gGJ0N902LeCDtymSomi7aBbIWbW1XiG2ZIhWUv/7znszQ1ESvafe9kOiSM5wOJ9vThDiCGOJdq9zVjWrO4RSzfyfcwu9XX/ABIM1srUasEkdOFbhQa7CHau5sd6s75kj+4TmkCzDS7E2zDs+f+n7tUVRNOZNJwUVz2aMeigOiUYKg4V6mi9MMNjTzuntacVix9aBQzJfuyPtsZOihXUMHWr2brrr2pookUN4vnZ3PmIhBQjy1B0aIfvJelg5+E1dHZXy3tGkNIRheShLgh9Gpe6x3j63neh+cnBE27C2HURcOOIefNqipFzEvkjG3FA/rjkCgzLJANjZXwdgnleR6+Ha2w91yA3zdk3pGXtZ2RDYunn3D4JGZob4abao7JSynUSyx/E7VO8cG7HJkjHe1+DQix8c7XEGU9LGAynKYiM7P5muv5f90E3uQ/GC8k8dqh6dOMb03t8bsQ+MMMU3+K34VNefv81+4/b69t79daeXOoocjydIkefmFBJVNUpKi2hkZf/41flbN2uxuuz4aNa6441U/khRKVx7Cu2DrnnweNPV1tYDYpYl1AgMIofjvF2VXICo7JB4ZuIFghY9XXgedvXxEmKWs3o3/jXZNl78qxcmf5tfbuygEEWE9jjz1OLtJSItzbUMEZYiqy049suhG7RH8W/t6z9q0S4uyYks8ZmtNeAAogEeXGBba/Csnewr2g+GwUNwtjyWcH2R/YPLWTQv/HEXLBkL4X3vnKdlUascCyB0CIOPMcQCPyVP/T0mb12/9Rd7nb71OMPZTt90HgpRAtc879xtQ+zWprbqGS+6fl+h42JP2FuvQjAB63xiNmADD21LJJwqfA42XuweJxfCTvtVmy8tkjO2z2Kxk8WuLNMG7Q3Jm2FkS/BEDHESK8AGpKaMlboD09VONL7EhZngAJ+BcaqjyJlG8SohU3NbGgkmwrdvJxQz7Wqpbk1J5I99ct/M/HkDAUEGr2J0PaCSVu6gh0p5e6N5QQUrbHGu5WV6jLEkAN5XrS69NlK4w+gE+3fbnMYreaolKKPyH/ILeN/gRjEVi4vH7Pb8QXbVSeFp6FgPPi+Kkz2L9pD72i5W/to88qNU9mAHVnHojHXEYqkZ5+Y1ny6hIToR/TpU0ayBcF/MsJ9KW6OqSjp8Ms5qRtIXiA4nYVSiryrPi0OavLPgg9nLc3Z4kfpGd2OCySlJEsgiRJMVDiwO59jkC2lIcI9Rs/y/+YNIWyGyZ5z7uRsJX+xrNVCpf8TMJb1xmz5ZR6n85l6oIdTpvXzthKETqqnOyfGgPjmp1MoSPMcYMkUiesY1Z40k44iH+cM3640n8+pNBIgeQ5Q7T415Edwiv0OcvopCC9qeeWMygBRGZg8ZZh8lopVRu4WAnnAU7di5f+iAWl2dt17s93CB44tLgo93vM23lKVVomzJDzQ3KLBH44F2D2Hc2bhysgYAPXY9GUJRjlVxh0oYLxBV4OF4pm1WfNj8uXGGYwmgZsQL1TTYlYoRC88jLRy9dtptuhVdjDEGLT/mKatLQm2p2LN7lH3g2Gi736khFY0wpQLQUeZ2WiRCTLVL6cGSsIGtUuNN+aq5edu+qz9eNbsj+9+TiAV14DfFx8f3xcwivzJSzL5fvuIpCcE8v81BlNNuOxwdSCYhnAgKa2F4fkZYzHXx07P8D8SE57OJL3lyKPazMyRaWqKIGWOkr9Ra/LFyHGf8EwUjgKvLgjM6MNMfaqEM8bVGNWWwpCmWbsrXa7s76t1g0lC7UApZVsuspGsJSZD2i2fp1Xb5pLE2H5Dy2k8IFbIYpUDIZ2xyYHpTZRWXpMpiCi75G9adj70umW8Os8cFSfw8GMt1WQ3tOy2U83WvLbiKI0XAPz7J68NiqQ5MqhjP0fsREzds1ZUcDGsJSXAEygzwxnQ/ZCQhNVgKcC0DsxjZwoc1DjKBnuUPhjGXTDlDqJyoNtfpcCSAG7If0ZMSqaf0hSP1VMH636VNuYND/U8ba4dX/wFOxwsXQWQBAA== - +
@@ -165,8 +165,7 @@ {0}/{1} competitors selected. - - {0}/{1} の競技者が選択されました。 + {0}/{1} の競技者が選択されました。 No such leaderboard @@ -938,8 +937,7 @@ Settings for {0} - - {0} の設定 + {0} の設定 No events were found @@ -1003,13 +1001,11 @@ {0} passed {1} at {2} - - {0} が {2} に {1} を通過 + {0} が {2} に {1} を通過 {0} at {1}: {2} - - {1} での {0}: {2} + {1} での {0}: {2} Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! @@ -1105,8 +1101,7 @@ No leaderboard group with the name {0} found - - {0} という名称のリーダーボードグループは見つかりませんでした + {0} という名称のリーダーボードグループは見つかりませんでした Overview @@ -1988,6 +1983,30 @@ Title 表題 + + Subtitle + サブタイトル + + + Copyright + 著作権 + + + Width (pixel) + 幅 (ピクセル) + + + Height (pixel) + 高さ (ピクセル) + + + Tags + タグ + + + Size + サイズ + Duration (h:mm:ss.ms) 時間 (h:mm:ss.ms) @@ -2190,8 +2209,7 @@ passed to {0} - - {0} に受け渡し済 + {0} に受け渡し済 Gap Change @@ -3511,8 +3529,7 @@ Worked through {0} data entries in {1} seconds - - {0} データエントリを {1} 秒で処理済 + {0} データエントリを {1} 秒で処理済 No query selected @@ -3544,8 +3561,7 @@ Imported wind from: {0} to: {1}. {2} races affected. - - {0} から {1} に風をインポートしました。{2} レースが影響を受けます。 + {0} から {1} に風をインポートしました。{2} レースが影響を受けます。 Race: {0} ({1}) - {2} fixes from: {3} to: {4} @@ -3829,8 +3845,7 @@ Sets the class flag used for {0}. Choose ''Don''t Overwrite'' to activate the procedure''s default flag. - - {0} に使用するクラス旗を選定します。手順にある初期値の旗を有効化するには、''上書きしない'' を選択してください。 + {0} に使用するクラス旗を選定します。手順にある初期値の旗を有効化するには、''上書きしない'' を選択してください。 When activated the Race Officer is able to call for individual recall. @@ -4118,23 +4133,19 @@ Edit {0} - - {0} を編集 + {0} を編集 Add {0} - - {0} を追加 + {0} を追加 Remove {0} - - {0} を削除 + {0} を削除 Please enter a {0} - - {0} を入力してください + {0} を入力してください Ping {0} position @@ -4142,8 +4153,7 @@ Please enter a valid value for {0} ({1}) - - {0} の有効な値を入力してください ({1}) + {0} の有効な値を入力してください ({1}) Copy course and competitors to other races @@ -4351,14 +4361,12 @@ {0} in {1} on {2} - - {1} の {0} を {2} で + {1} の {0} を {2} で String eventSharingShortText(String eventName, String venue, String dateString); I''d like to share {0} in {1} on {2}. Details on: \n{3} - - {1} の {0} を {2} でシェアします。詳細: \n{3} + {1} の {0} を {2} でシェアします。詳細: \n{3} String eventSharingLongText(String eventName, String venue, String dateString, String url); @@ -4368,9 +4376,7 @@ {0} - - {0} - + {0} String seriesSharingShortText(String seriesName); @@ -4529,6 +4535,10 @@ Use start time inference from start mark passings スタートマーク通過からの推定スタート時刻を使用 + + Control tracking from start and finish times + スタート時刻およびフィニッシュ時刻からの追跡の制御 + Number of queue messages sent 送信済キューメッセージ数 @@ -4623,8 +4633,7 @@ {0} Videos - - {0} 動画 + {0} 動画 Click to select video @@ -5296,8 +5305,7 @@ {0} starts in - - {0} がスタート: + {0} がスタート: Planned @@ -5329,8 +5337,7 @@ {0} won race - - {0} がレースに勝利 + {0} がレースに勝利 Time on Time Factor @@ -5454,8 +5461,7 @@ Collapse {0} - - {0} を圧縮 + {0} を圧縮 GPS fixes @@ -5503,13 +5509,11 @@ {0} min ago - - {0} 分前 + {0} 分前 {0} h ago - - {0} 時間前 + {0} 時間前 Winner @@ -5597,8 +5601,7 @@ Can''t display data of type {0} - - {0} タイプのデータは表示できません。 + {0} タイプのデータは表示できません。 Shown Decimals @@ -5634,8 +5637,7 @@ {0} events have taken place - - {0} イベントが行われました + {0} イベントが行われました One event has taken place @@ -5815,8 +5817,7 @@ The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. - - {0} 画像のサイズが適合しません。幅は {1} と {2} px の間、高さは {3} と {4} px の間である必要があります。 + {0} 画像のサイズが適合しません。幅は {1} と {2} px の間、高さは {3} と {4} px の間である必要があります。 The width and height of the image could not be retrieved yet. @@ -6038,25 +6039,25 @@ utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app https://play.google.com/intl/en/badges/images/generic/en-play-badge.png https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - + http://appstore.com/sapsailinsight - http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight http://appstore.com/stgtrainingstagebuch @@ -6454,6 +6455,390 @@ Maximum number of discards カットレースの最大数 + + Active regatta configuration was set, using the "By Marks" course designer. + "マーク別" コースデザイナーを使用して、有効なレガッタ設定が行われました。 + + + Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"? + 有効なレガッタ設定がすでに登録されていますが、コースデザイナーの設定が適切でありません。\n"マーク別" へのコースデザイナー設定を上書きしますか。 + + + All races have been denoted for racelog tracking. + すべてのレースがレースログ追跡に表示されています。 + + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。 + + + Choose a language + 言語を選択してください + + + Solutions + ソリューション + + + Blog + ブログ + + + Official event website + 公式イベント Web サイト + + + More info + 追加情報 + + + View analysis + 分析の表示 + + + Overall leaderboard + 全体リーダーボード + + + Please try again... + 再試行してください... + + + Reload page + ページのリロード + + + An error occured while loading the data for this page. + このページのデータのロードでエラーが発生しました。 + + + Regatta details + レガッタ詳細 + + + Choose chart type + チャートタイプ選択 + + + What''s new + 最新情報 + + + SAP Sailing + SAP Sailing + + + Search + 検索 + + + Days + 日 + + + Days + 日 + + + Hrs + 時間 + + + Min + 分 + + + Sec + 秒 + + + Day + 曜日 + + + Hour + 時 + + + Min + 分 + + + Sec + 秒 + + + Live + ライブ + + + Watch now + 現在視聴可能 + + + Upcoming + 予定 + + + Last Score Update + 前回スコア更新 + + + Not Tracked + 未追跡 + + + Jobs + 採用 + + + © 2011-2016 SAP Sailing Analytics + © 2011-2016 SAP Sailing Analytics + + + SAP Sailing in + SAP Sailing - + + + Legal Disclosure + 利用規約 + + + Privacy + 個人情報保護 + + + Feedback + フィードバック + + + + Search + 検索 + + + Show All Events + 全イベント表示 + + + Latest Events from the Sailing World + Sailing World からの最新イベント + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + お気に入りのセーリングイベントのすてきな最新画像を楽しんでください。 + + + Photographers love Sailing + 最新のセーリング画像 + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + 最新イベントの動画にアクセスしてセーリングの世界に浸ってください。 + + + Recent Video Entries + 最新のセーリング動画 + + + Search + 検索 + + + Your Search + 検索対象 + + + Type in your searchkey + 検索キーを入力 + + + Recent + 最新 + + + SAP in Sailing + SAP in Sailing + + + SAP Sailing Analytics + SAP Sailing Analytics + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + SAP Sail InSight + SAP Sail InSight + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + Post-Race Analytics + レース後分析 + + + Training Diary + トレーニング日記 + + + Strategy Simulator + 戦略シミュレータ + + + SAP in Sailing + SAP in Sailing + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + セーリングは、SAP にとってソリューションを紹介するためのプラットフォームとしてうってつけのものであり、これまでになかったやり方でスポーツの運営を支援しています。SAP によるスポーツへの関与は、以下のことを行うツールを提供することによってセーリングから得られる体験を別次元のものに変えました。 + + + Help sailors analyze performance and optimize strategy + パフォーマンスの分析と戦略の最適化でセーラーを支援します + + + Bring fans closer to the action + アクションをファンにとって身近なものにします + + + Provide the media with information and insights to deliver a greater informed commentary + 情報豊富なすばらしい解説を行うための情報とインサイトを報道関係者に提供します + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + SAP は、長年にわたりセーリングに関与しており、以下のようなチームおよびレガッタと関係を構築してきました。 + + + Official Technology Partner of Travemünder Woche + Travemünder Woche の公式テクノロジーパートナー + + + Technical Partner of the European Sailing Leagues + 欧州セーリング連盟 (European Sailing Leagues) のテクノロジーパートナー + + + Title sponsor of the SAP Extreme Sailing Team + SAP Extreme Sailing Team のタイトルスポンサー + + + Official Technical Partner of the Extreme Sailing Series + Extreme Sailing Series の公式テクニカルパートナー + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + ドイツ代表セーリングチームである Audi Sailing Team Germany のプレミアムパートナー + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + 世界最大のレガッタである Kieler Woche (Kiel Week) のプレミアムパートナー + + + Title sponsor of the SAP 5O5 World Championships + SAP 5O5 World Championships のタイトルスポンサー + + + SAP Sailing Analytics + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + レースランキング、速力、操縦、ベアリングなどに関係するリアルタイム分析を提供することにより、SAP はセーリングという複雑なスポーツを簡略に分かりやすく説明することをお手伝いしています。 + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできるさまざまなフロントエンドでコンテンツを視覚化することによってセーリングの世界にインサイトと透明性を提供します。 + + + Read More + 続きを読む + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + SAP Sailing Race Manager は、セーリングレガッタ運営中にレース組織者が手動で行う作業や連絡業務を自動化/簡略化することによって効率と統制を向上させます。Race Committee アプリは、レースイベントの運営/管理業務を簡略化するのに役立ち、レース委員会がより円滑に運営されるよう支援します。 + + + Learn More + 詳細情報 + + + SAP Sail InSight + SAP Sail InSight + + + With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. + iPhone、iPad、および Android フォン向け SAP Sail InSight モバイルアプリにより、ヨット競技者はいつでもどこでもレガッタ参加やパフォーマンスを管理することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、競技者が SAP Sail InSight 対応のレガッタへの受付を行い、自分がどこにいるかを艇速や帆走距離などのパフォーマンス指標とともに追跡し、自らのパフォーマンスを分析することを可能にします。 + + + Learn More + 詳細情報 + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. + Android フォン向け SAP Sailing Buoy Pinger モバイルアプリにより、ヨットレース運営者はいつでもどこでもレース用のマークの位置決めや、マーク設置担当者とのやり取りを簡略化することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、レガッタ運営者がレース用のマークの地理的位置を追跡することを可能にし、レガッタに参加しているセーラーが SAP Sail InSight モバイルアプリを使用できるようにします。 + + + Learn More + 詳細情報 + + + Post-Race Analytics + レース後分析 + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + セーリングイベントで収集されたデータへのアクセスにより、戦略の策定や帆走の向上に役立つ、セーラーがそのパフォーマンスを評価および分析する機会が提供されます。 + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + SAP Business Analytics ソリューションは、多くのレガッタおよびレースにわたって履歴データを照会および分析するツールをセーラー、コーチ、ファン、そして報道関係者に提供します。SAP HANA は、こうした人たちが自身のパフォーマンスを最適化し、予定されているレガッタで成功を収める戦略を策定するために簡単、迅速、かつ効率的な方法でパフォーマンスのパターン、傾向、およびセーラーのプロファイルを知ることを可能にします。 + + + SAP Sail Better – STG Training Diary + SAP Sail Better – STG Training Diary + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + STG Training Diary は、選手の体調、ならびに水上トレーニング、身体的トレーニング、操艇、メンタル、理論、さらに教育や移動などのその他の活動の領域におけるトレーニングへの取り組みの日々の記録および分析をサポートします。 + + + Strategy Simulator + 戦略シミュレータ + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + 適切な戦略を選択すれば、レース中に大きな競争上の優位性を得ることが可能です。Strategy Simulator により、さまざまな風況および水流に対して最良のセーリング戦略を決定することが容易になります。風と水流をシミュレーションで直ちに変更することができるため、不確かな気象条件に対しても戦略の確かさを簡単に評価することができます。 + + + Learn More + 詳細情報 + + + Imprint + 刻印 + + + Last fix + 最終フィックス + + + Filter device mappings + デバイスマッピングのフィルタリング +
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf index 2b439ca3d7a..960f9055778 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf @@ -1,12 +1,12 @@ - +
- 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 - +
@@ -65,7 +65,7 @@ This is the Wind Panel which so far is completely empty. - Это панель ветров, которая пока что совсем пуста. + Это панель ветров, которая пока что совсем пуста. Refresh @@ -929,7 +929,7 @@ Race starts with upwind leg - Гонка начинается против ветра + Гонка начинается против ветра Events @@ -937,8 +937,7 @@ Settings for {0} - - {0} — параметры + {0} — параметры No events were found @@ -1002,13 +1001,11 @@ {0} passed {1} at {2} - - {0} пройдено {1} в {2} + {0} пройдено {1} в {2} {0} at {1}: {2} - - {0} в {1}: {2} + {0} в {1}: {2} Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! @@ -1776,7 +1773,7 @@ Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. - Вместо обычной системы обратного отсчета, используемой для разрешения равенства в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту. + Вместо обычной системы обратного отсчета, используемой для разрешения равенства в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту. Low Point, ties broken based on last series only @@ -1986,6 +1983,30 @@ Title Название + + Subtitle + Подзаголовок + + + Copyright + Copyright + + + Width (pixel) + Ширина (в пикселях) + + + Height (pixel) + Высота (в пикселях) + + + Tags + Теги + + + Size + Размер + Duration (h:mm:ss.ms) Длительность (ч:мм:сс.мс) @@ -2140,8 +2161,7 @@ {0} after race {1} - - {0} после гонки {1} + {0} после гонки {1} Ranking @@ -3729,7 +3749,7 @@ Rerun query after refresh - Повторить запрос после обновления + Повторить запрос после обновления Refresh interval mustn''t be empty @@ -3997,7 +4017,7 @@ Error importing wind data from Igtimi: {0} - Ошибка при импорте данных о ветре из Igtimi: {0} + Ошибка при импорте данных о ветре из Igtimi: {0} The following number of fixes were imported for the listed races: {0} @@ -4005,13 +4025,11 @@ {0} to start - - {0} до старта + {0} до старта {0} since start - - {0} от старта + {0} от старта Distance to start line @@ -4343,8 +4361,7 @@ {0} in {1} on {2} - - {0} в {1} на {2} + {0} в {1} на {2} String eventSharingShortText(String eventName, String venue, String dateString); @@ -4359,9 +4376,7 @@ {0} - - {0} - + {0} String seriesSharingShortText(String seriesName); @@ -4520,6 +4535,10 @@ Use start time inference from start mark passings Использовать вывод о времени старта из прохождений стартовой отметки + + Control tracking from start and finish times + Контролировать отслеживание от времени старта и финиша + Number of queue messages sent Число отправленных сообщений очереди @@ -4614,8 +4633,7 @@ {0} Videos - - {0} видео + {0} видео Click to select video @@ -5287,8 +5305,7 @@ {0} starts in - - {0} начинается через + {0} начинается через Planned @@ -5352,7 +5369,7 @@ ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. - Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке. + Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке. Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. @@ -5492,13 +5509,11 @@ {0} min ago - - {0} мин. назад + {0} мин. назад {0} h ago - - {0} ч. назад + {0} ч. назад Winner @@ -5534,8 +5549,7 @@ {0}° to wind - - {0}° к ветру + {0}° к ветру Shows the points along with the number of races per competitor @@ -5647,7 +5661,7 @@ Plain Results Presenter - Презентатор простых результатов + Презентатор простых результатов Results Chart @@ -6025,25 +6039,25 @@ utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app https://play.google.com/intl/en/badges/images/generic/en-play-badge.png https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - + http://appstore.com/sapsailinsight - http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight http://appstore.com/stgtrainingstagebuch @@ -6441,6 +6455,390 @@ Maximum number of discards Максимальное число исключений + + Active regatta configuration was set, using the "By Marks" course designer. + Активная конфигурация регаты была настроена с использованием дизайнера курса "По отметкам". + + + Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"? + Активная конфигурация регаты уже существует, но с неверно выбранным дизайнером курса.\nПереопределить выбор дизайнера курса на "По отметкам"? + + + All races have been denoted for racelog tracking. + Отслеживание журнала всех гонок отменено. + + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. + + + Choose a language + Выбор языка + + + Solutions + Решения + + + Blog + Блог + + + Official event website + Официальный веб-сайт события + + + More info + Больше сведений + + + View analysis + Просмотреть анализ + + + Overall leaderboard + Общая таблица лидеров + + + Please try again... + Повторите попытку... + + + Reload page + Перезагрузить страницу + + + An error occured while loading the data for this page. + При загрузке данных для этой страницы возникла ошибка. + + + Regatta details + Подробности регаты + + + Choose chart type + Выберите тип диаграммы + + + What''s new + Новые возможности + + + SAP Sailing + SAP Sailing + + + Search + Поиск + + + Days + дн. + + + Days + дн. + + + Hrs + ч. + + + Min + мин. + + + Sec + сек. + + + Day + дн. + + + Hour + ч. + + + Min + мин. + + + Sec + сек. + + + Live + Активно + + + Watch now + Смотреть сейчас + + + Upcoming + Скоро + + + Last Score Update + Последнее обновление оценок + + + Not Tracked + Не отслеживается + + + Jobs + Работа + + + © 2011-2016 SAP Sailing Analytics + © SAP Sailing Analytics, 2011–2016. + + + SAP Sailing in + Язык SAP Sailing + + + Legal Disclosure + Раскрытие юридической информации + + + Privacy + Конфиденциальность + + + Feedback + Обратная связь + + + + Search + Поиск + + + Show All Events + Показать все события + + + Latest Events from the Sailing World + Последние события в мире парусного спорта + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + Погрузитесь в новейшие и прекраснейшие впечатления от избранного события в мире парусного спорта. + + + Photographers love Sailing + Фотографы любят паруса + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + Погрузитесь в мир парусного спорта и просмотрите другие видео наших последних событий. + + + Recent Video Entries + Последние видеозаписи + + + Search + Поиск + + + Your Search + Ваш поиск + + + Type in your searchkey + Введите ключ поиска + + + Recent + Недавние + + + SAP in Sailing + SAP в парусном спорте + + + SAP Sailing Analytics + SAP Sailing Analytics + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + SAP Sail InSight + SAP Sail InSight + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + Post-Race Analytics + Аналитика после гонки + + + Training Diary + Дневник тренировок + + + Strategy Simulator + Симулятор стратегии + + + SAP in Sailing + SAP в парусном спорте + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + Парусный спорт предоставляет отличную платформу для демонстрации решений SAP и беспрецедентной помощи развитию спорта. Вовлеченность SAP преобразила парусный спорт, предоставив инструменты, которые: + + + Help sailors analyze performance and optimize strategy + Помогают мореходам анализировать эффективность и оптимизировать стратегию. + + + Bring fans closer to the action + Делают болельщиков ближе к действию. + + + Provide the media with information and insights to deliver a greater informed commentary + Предоставляют информацию и аналитику для более информированного комментирования. + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + За немалое время причастности к парусному спорту компанией SAP накоплено солидное портфолио сотрудничества с разными командами регатами, включая: + + + Official Technology Partner of Travemünder Woche + Официальный технологический партнер Travemünder Woche + + + Technical Partner of the European Sailing Leagues + Технический партнер Европейской лиги парусного спорта + + + Title sponsor of the SAP Extreme Sailing Team + Титульный спонсор команды SAP Extreme Sailing Team + + + Official Technical Partner of the Extreme Sailing Series + Официальный технический партнер серии Extreme Sailing Series + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + Премиальный партнер национальной команды Германии по парусному спорту, Audi Sailing Team Germany + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + Премиальный партнер крупнейшей в мире регаты Kieler Woche (Кильская неделя) + + + Title sponsor of the SAP 5O5 World Championships + Титульный спонсор чемпионатов мира SAP 5O5 + + + SAP Sailing Analytics + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно. + + + Read More + См. также + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. + + + Learn More + Узнать больше + + + SAP Sail InSight + SAP Sail InSight + + + With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. + С помощью мобильного приложения SAP Sail InSight для смартфонов iPhone, iPad и Android яхтсмены гонок могут управлять своим участием и эффективностью в регате откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет яхтсменам выполнять вход в регаты, использующие SAP Sail InSight, отслеживать свое местоположение вместе с индикаторами эффективности, такими как скорость или пройденное расстояние, а также анализировать эффективность. + + + Learn More + Узнать больше + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. + Мобильное приложение SAP Sailing Buoy Pinger для смартфонов Android позволяет руководителям парусных гонок упростить позиционирование отметок и общение с установщиками отметок откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет руководителям гонок отслеживать географическое местоположение гоночных отметок, обеспечивая использование мобильного приложения SAP Sail InSight для яхтсменов, участвующих в регате. + + + Learn More + Узнать больше + + + Post-Race Analytics + Аналитика после гонки + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство. + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. + + + SAP Sail Better – STG Training Diary + SAP Sail Better – Дневник тренировок STG + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия. + + + Strategy Simulator + Симулятор стратегии + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. + + + Learn More + Узнать больше + + + Imprint + Печать + + + Last fix + Последний замер + + + Filter device mappings + Фильтровать сопоставления устройств +
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf index 3229e8895ed..057ae9bc7a0 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf @@ -1,12 +1,12 @@ - +
- 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 - +
@@ -937,8 +937,7 @@ Settings for {0} - - {0}设置 + {0}设置 No events were found @@ -1002,13 +1001,11 @@ {0} passed {1} at {2} - - {0}于{2}越过{1} + {0}于{2}越过{1} {0} at {1}: {2} - - {0}(于{1}): {2} + {0}(于{1}): {2} Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! @@ -1124,7 +1121,7 @@ Click and drag in the plot area to zoom in - 单击并拖动绘图区以放大 + 单击并拖动绘图区以放大 Wind speed (kts) @@ -1986,6 +1983,30 @@ Title 标题 + + Subtitle + 副标题 + + + Copyright + 版权 + + + Width (pixel) + 宽度(像素) + + + Height (pixel) + 高度(像素) + + + Tags + 标记 + + + Size + 大小 + Duration (h:mm:ss.ms) 持续时间 (h:mm:ss.ms) @@ -2140,8 +2161,7 @@ {0} after race {1} - - {0} 比赛轮次后 {1} + {0} 比赛轮次后 {1} Ranking @@ -3501,7 +3521,7 @@ Group by - 分组方式 + 分组方式 Calculate statistic @@ -3509,8 +3529,7 @@ Worked through {0} data entries in {1} seconds - - {1}秒内处理{0}个数据条目 + {1}秒内处理{0}个数据条目 No query selected @@ -3778,7 +3797,7 @@ Course designer - 场地设计师 + 场地设计器 Racing procedure @@ -4006,13 +4025,11 @@ {0} to start - - {0} - 开始 + {0} - 开始 {0} since start - - {0} - 开始后 + {0} - 开始后 Distance to start line @@ -4344,9 +4361,7 @@ {0} in {1} on {2} - - {2} - {1}中的{0} + {2}{1}中的{0} String eventSharingShortText(String eventName, String venue, String dateString); @@ -4361,9 +4376,7 @@ {0} - - {0} - + {0} String seriesSharingShortText(String seriesName); @@ -4522,6 +4535,10 @@ Use start time inference from start mark passings 使用从开始绕标推断的开始时间 + + Control tracking from start and finish times + 从开始和结束时间控制跟踪 + Number of queue messages sent 发送的队列消息的数量 @@ -4616,8 +4633,7 @@ {0} Videos - - {0}个视频 + {0}个视频 Click to select video @@ -4785,7 +4801,7 @@ No overall event selected... - 未选择整个活动... + 未选择整个活动... Error trying to create new event {0}: {1} @@ -5289,8 +5305,7 @@ {0} starts in - - {0}开始于 + {0}开始于 Planned @@ -5322,8 +5337,7 @@ {0} won race - - {0}赢得比赛轮次 + {0}赢得比赛轮次 Time on Time Factor @@ -5467,7 +5481,7 @@ {0,number,#0.0} mil - {0,number,#0.0} 百万 + {0,number,#0.0} 百万 {0,number,#0.0} bil @@ -5495,13 +5509,11 @@ {0} min ago - - {0}分钟前 + {0}分钟前 {0} h ago - - {0}小时前 + {0}小时前 Winner @@ -5537,8 +5549,7 @@ {0}° to wind - - {0}°(相对于风) + {0}°(相对于风) Shows the points along with the number of races per competitor @@ -5626,8 +5637,7 @@ {0} events have taken place - - {0}个活动已举行 + {0}个活动已举行 One event has taken place @@ -5807,8 +5817,7 @@ The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. - - {0}的图像大小不合适。 宽度应在{1}和{2} px 之间,高度在{3}和{4} px 之间。 + {0}的图像大小不合适。 宽度应在{1}和{2} px 之间,高度在{3}和{4} px 之间。 The width and height of the image could not be retrieved yet. @@ -6030,25 +6039,25 @@ utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app - https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app https://play.google.com/intl/en/badges/images/generic/en-play-badge.png https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - + http://appstore.com/sapsailinsight - http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight http://appstore.com/stgtrainingstagebuch @@ -6446,6 +6455,390 @@ Maximum number of discards 最大放弃次数 + + Active regatta configuration was set, using the "By Marks" course designer. + 已使用“按标志”场地设计器设置有效的比赛配置。 + + + Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"? + 有效的比赛配置已存在,但是场地设计器设置错误。\n是否将场地设计器设置覆盖为“按标志”? + + + All races have been denoted for racelog tracking. + 已为比赛轮次日志跟踪描述所有比赛轮次。 + + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + 提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 + + + Choose a language + 选择一种语言 + + + Solutions + 解决方案 + + + Blog + 博客 + + + Official event website + 官方活动网站 + + + More info + 更多信息 + + + View analysis + 查看分析 + + + Overall leaderboard + 总积分榜 + + + Please try again... + 请重试... + + + Reload page + 重新加载页面 + + + An error occured while loading the data for this page. + 加载此页面数据时出错。 + + + Regatta details + 比赛详情 + + + Choose chart type + 选择记录类型 + + + What''s new + 最新消息 + + + SAP Sailing + SAP Sailing + + + Search + 搜索 + + + Days + 天 + + + Days + 天 + + + Hrs + 小时 + + + Min + 分钟 + + + Sec + 秒 + + + Day + 天 + + + Hour + 小时 + + + Min + 分钟 + + + Sec + 秒 + + + Live + 实时 + + + Watch now + 现在观看 + + + Upcoming + 即将到来 + + + Last Score Update + 上次得分更新 + + + Not Tracked + 未跟踪 + + + Jobs + 招贤纳士 + + + © 2011-2016 SAP Sailing Analytics + 版权所有 © 2011-2016 SAP Sailing Analytics + + + SAP Sailing in + SAP Sailing 语言 + + + Legal Disclosure + 法律声明 + + + Privacy + 隐私 + + + Feedback + 反馈 + + + + Search + 搜索 + + + Show All Events + 显示所有活动 + + + Latest Events from the Sailing World + 来自风帆世界的最新活动 + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + 徜徉在让人着迷、震撼人心的最新航行活动中。 + + + Photographers love Sailing + 摄影师酷爱航行 + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + 沉浸在风帆世界中,并通过更多视频了解最新活动。 + + + Recent Video Entries + 最近视频条目 + + + Search + 搜索 + + + Your Search + 您的搜索 + + + Type in your searchkey + 输入搜索关键字 + + + Recent + 最近 + + + SAP in Sailing + SAP in Sailing + + + SAP Sailing Analytics + SAP Sailing Analytics + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + SAP Sail InSight + SAP Sail InSight + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + Post-Race Analytics + 赛后分析 + + + Training Diary + 训练日记 + + + Strategy Simulator + 策略模拟器 + + + SAP in Sailing + SAP in Sailing + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + SAP 凭借此航行应用提供完美的平台,向用户展示解决方案,并以前所未有的顺畅速度呈现体育赛事。 SAP 通过提供各种工具转换其在参与此项运动中获得的航行经验,这些工具: + + + Help sailors analyze performance and optimize strategy + 帮助水手分析表现并优化策略 + + + Bring fans closer to the action + 让粉丝近距离直击运动 + + + Provide the media with information and insights to deliver a greater informed commentary + 为媒体提供信息和见解,从而提供深度评论 + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + SAP 长期参与航行运动,并成立了跨越团队和比赛的组合,包括: + + + Official Technology Partner of Travemünder Woche + 特拉沃明德周的官方技术合作伙伴 + + + Technical Partner of the European Sailing Leagues + 欧洲帆船联盟的技术合作伙伴 + + + Title sponsor of the SAP Extreme Sailing Team + SAP 极限帆船队的冠名赞助商 + + + Official Technical Partner of the Extreme Sailing Series + 极限帆船系列赛的官方技术合作伙伴 + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + 德国国家帆船队 - 德国奥迪帆船队的优选合作伙伴 + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + 世界上最大的帆船盛事“基尔周”的优选合作伙伴 + + + Title sponsor of the SAP 5O5 World Championships + SAP 5O5 世界锦标赛的冠名赞助商 + + + SAP Sailing Analytics + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + 通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。 + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 + + + Read More + 更多信息 + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 + + + Learn More + 了解更多 + + + SAP Sail InSight + SAP Sail InSight + + + With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. + 使用适用于 iPhone、iPad 和 Android 手机的 SAP Sail InSight 移动应用,帆船选手可以随时随地管理其参赛情况和表现。此应用与 SAP Sailing Analytics 解决方案相连,选手可以登录启用 SAP Sail InSight 的比赛,跟踪其所处地点和速度或航行距离等表现指标,并分析其表现。 + + + Learn More + 了解更多 + + + SAP Sailing Buoy Pinger + SAP Sailing Buoy Pinger + + + With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. + 使用适用于 Android 手机的 SAP Sailing Buoy Pinger 移动应用,帆船赛赛事经理可以随时随地简化比赛航标的定位和与布标裁判的沟通。此应用与 SAP Sailing Analytics 解决方案相连,比赛经理可以跟踪其比赛航标的地理位置,并允许参赛水手使用 SAP Sail InSight 移动应用。 + + + Learn More + 了解更多 + + + Post-Race Analytics + 赛后分析 + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + 水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。 + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 + + + SAP Sail Better – STG Training Diary + SAP Sail Better – STG Training Diary + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 + + + Strategy Simulator + 策略模拟器 + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + 选择正确的策略可在比赛期间极大地提高竞争优势。策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 + + + Learn More + 了解更多 + + + Imprint + 版本说明 + + + Last fix + 上次修复 + + + Filter device mappings + 筛选设备映射 +
\ No newline at end of file diff --git a/home.md b/home.md index 58e73df956b..2ff9a805a82 100644 --- a/home.md +++ b/home.md @@ -54,7 +54,8 @@ SAP is at the center of today’s technology revolution, developing innovations * [[Administrator|wiki/info/mobile/racecommittee-app-administrator]] * [[User|wiki/info/mobile/racecommittee-app-user]] * [[Android and Release Build|wiki/info/mobile/android-and-release-build]] -* [[Data consumption of mobile apps|wiki/info/mobile/data-consumption-of-mobile-apps]] +* [[Energy consumption of mobile apps|wiki/info/mobile/energy-consumption]] +* [[Data consumption of mobile apps|wiki/info/mobile/data-consumption]] * [[Mobile Sailing Analytics|wiki/info/mobile/mobilesailinganalytics]] * [[Push Notifications|wiki/info/mobile/push-notifications]] diff --git a/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Localizable.strings b/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Localizable.strings index 14e49d15af8..6e3a025ff81 100644 Binary files a/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Localizable.strings and b/ios/SAPTracker/src/xcode/SAPTracker/Base.lproj/Localizable.strings differ diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages.properties.xlf b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages.properties.xlf index 050adba55e8..20b04e032b6 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages.properties.xlf +++ b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages.properties.xlf @@ -1,12 +1,12 @@ - +
H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA== - +
diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ja.properties.xlf b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ja.properties.xlf index 8fb290f78e0..f6bd58a3702 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ja.properties.xlf +++ b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA== diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ru.properties.xlf b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ru.properties.xlf index ab986074752..c0f1ee8dbdc 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ru.properties.xlf +++ b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA== diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_zh_CN.properties.xlf b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_zh_CN.properties.xlf index dd4afdfc587..1d2d562e52f 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sailing.datamining/resources/stringmessages/XLF/Sailing_StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA== diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ja.properties.xlf b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ja.properties.xlf index fef565d3928..67214a26d0c 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ja.properties.xlf +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA== diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ru.properties.xlf b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ru.properties.xlf index 511b6494eac..5e605f5a607 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ru.properties.xlf +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA== diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_zh_CN.properties.xlf b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_zh_CN.properties.xlf index c71dd189168..5c7ca915c2b 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/XLF/TrackingStringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA== diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/EndOfTrackingController.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/EndOfTrackingController.java index 5edb31040b6..530b53980fe 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/EndOfTrackingController.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/EndOfTrackingController.java @@ -48,7 +48,6 @@ public class EndOfTrackingController extends AbstractRaceChangeListener { if (!Util.equalsWithNull(trackedRace.getEndOfTracking(), newEndOfTracking)) { raceLog.add(new RaceLogEndOfTrackingEventImpl(newEndOfTracking, raceLogEventAuthor, raceLog.getCurrentPassId())); - trackedRace.updateStartAndEndOfTracking(/* waitForGPSFixesToLoad */ false); } } } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/StartOfTrackingController.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/StartOfTrackingController.java index 40b81ffa3c0..be6c68f41ce 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/StartOfTrackingController.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/StartOfTrackingController.java @@ -46,7 +46,6 @@ public class StartOfTrackingController implements StartTimeChangedListener { if (!Util.equalsWithNull(trackedRace.getStartOfTracking(), newStartOfTracking)) { raceLog.add(new RaceLogStartOfTrackingEventImpl(newStartOfTracking, raceLogEventAuthor, raceLog.getCurrentPassId())); - trackedRace.updateStartAndEndOfTracking(/* waitForGPSFixesToLoad */ false); } } } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java index 0eb35f57306..107eb1aeae4 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java @@ -197,8 +197,8 @@ public class FixLoaderAndTracker implements TrackingDataLoader { try { @SuppressWarnings({ "unchecked" }) DeviceMapping competitorMapping = (DeviceMapping) mapping; - gpsFixStore.loadCompetitorTrack(track, competitorMapping, getStartOfTracking(), - getEndOfTracking()); + gpsFixStore.loadCompetitorTrack(track, competitorMapping, timeRangeToLoad.from(), + timeRangeToLoad.to()); } catch (TransformationException | NoCorrespondingServiceRegisteredException e) { logger.log(Level.WARNING, "Could not load competitor track " + mapping.getMappedTo()); } @@ -211,12 +211,10 @@ public class FixLoaderAndTracker implements TrackingDataLoader { try { @SuppressWarnings("unchecked") DeviceMapping markMapping = (DeviceMapping) mapping; - TimePoint from = getStartOfTracking(); - TimePoint to = getEndOfTracking(); - gpsFixStore.loadMarkTrack(track, markMapping, from, to); + gpsFixStore.loadMarkTrack(track, markMapping, timeRangeToLoad.from(), timeRangeToLoad.to()); if (track.getFirstRawFix() == null) { - logger.fine("Loading mark positions from outside of start/end of tracking interval (" + from - + ".." + to + ") because no fixes were found in that interval"); + logger.fine("Loading mark positions from outside of start/end of tracking interval (" + timeRangeToLoad.from() + + ".." + timeRangeToLoad.to() + ") because no fixes were found in that interval"); // got an empty track for the mark; try again without constraining the mapping interval // by start/end of tracking to at least attempt to get fixes at all in case there were any // within the device mapping interval specified @@ -298,8 +296,8 @@ public class FixLoaderAndTracker implements TrackingDataLoader { ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor().execute(new Runnable() { @Override public void run() { + trackedRace.lockForSerializationRead(); try { - trackedRace.lockForSerializationRead(); if (!preemptiveStopRequested.get()) { setStatusAndProgress(TrackedRaceStatusEnum.LOADING, 0.5); synchronized (FixLoaderAndTracker.this) { @@ -308,15 +306,18 @@ public class FixLoaderAndTracker implements TrackingDataLoader { updateCallback.run(); } } finally { - synchronized (FixLoaderAndTracker.this) { - int currentActiveLoaders = activeLoaders.decrementAndGet(); - FixLoaderAndTracker.this.notifyAll(); - if (currentActiveLoaders == 0) { - setStatusAndProgress(stopRequested.get() ? TrackedRaceStatusEnum.FINISHED - : TrackedRaceStatusEnum.TRACKING, 1.0); + try { + synchronized (FixLoaderAndTracker.this) { + int currentActiveLoaders = activeLoaders.decrementAndGet(); + FixLoaderAndTracker.this.notifyAll(); + if (currentActiveLoaders == 0) { + setStatusAndProgress(stopRequested.get() ? TrackedRaceStatusEnum.FINISHED + : TrackedRaceStatusEnum.TRACKING, 1.0); + } } + } finally { + trackedRace.unlockAfterSerializationRead(); } - trackedRace.unlockAfterSerializationRead(); } } }); @@ -347,7 +348,7 @@ public class FixLoaderAndTracker implements TrackingDataLoader { @Override protected void mappingRemoved(DeviceMappingWithRegattaLogEvent mapping) { final DeviceIdentifier device = mapping.getDevice(); - if(!hasMappingForDevice(device)) { + if (!hasMappingForDevice(device)) { sensorFixStore.removeListener(listener, device); } // TODO if tracks are always associated to only one device mapping, we could remove tracks here diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java index f1419b3c878..e61d9abd4a9 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java @@ -262,6 +262,10 @@ public abstract class RegattaLogDeviceMappings { calculateDiff(oldMappings, newMappings); } + /** + * Calculates and applies the mapping changes by removing listeners no longer needed for the mappings removed, + * and by loading and adding the fixes for extended or added mappings. + */ private void calculateDiff(Map>> previousMappings, Map>> newMappings) { Set itemsToProcess = new HashSet(previousMappings.keySet()); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java index 0399e83c387..76774039688 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java @@ -65,7 +65,7 @@ public abstract class BaseRegattaLogDeviceMappingFinder if (!endOfFirstHalf.before(from)) { log.add(createDeviceMappingEvent(item, event.getAuthor(), from, endOfFirstHalf, event.getDevice())); } - if (!to.before(startOfSecondHalf)) { + if (to == null || !to.before(startOfSecondHalf)) { log.add(createDeviceMappingEvent(item, event.getAuthor(), startOfSecondHalf, to, event.getDevice())); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/WaypointImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/WaypointImpl.java index 7c262b59976..bb16d391cba 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/WaypointImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/WaypointImpl.java @@ -46,7 +46,7 @@ public class WaypointImpl implements Waypoint { @Override public String toString() { - return getName(); + return (getName()==null?"":getName()) + " ("+getPassingInstructions()+")"; } @Override diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrencyTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrencyTest.java index 0204088e717..e7d08ff101a 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrencyTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/ConcurrencyTest.java @@ -10,7 +10,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.text.ParseException; import java.util.List; -import java.util.concurrent.Executors; import java.util.logging.Logger; import org.junit.Before; @@ -30,6 +29,7 @@ import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tractracadapter.ReceiverType; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.util.ThreadPoolUtil; import com.tractrac.model.lib.api.event.CreateModelException; import com.tractrac.subscription.lib.api.SubscriberInitializationException; @@ -77,7 +77,7 @@ public class ConcurrencyTest extends OnlineTracTracBasedTest { logger.info("1 thread: "+duration+"ns"); logger.info("number of approximation points: "+approximation1.size()); - dp = new DouglasPeucker(teamAquaTrack, Executors.newFixedThreadPool(numberOfCPUs)); + dp = new DouglasPeucker(teamAquaTrack, ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor()); start = System.nanoTime(); List approximation2 = dp.approximate(new MeterDistance(3), firstMarkPassing.getTimePoint(), lastMarkPassing.getTimePoint()); duration = System.nanoTime()-start; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java index 2434b9ce7af..c8a621c5707 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java @@ -11,6 +11,7 @@ import java.util.Collections; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.base.Competitor; @@ -27,6 +28,7 @@ import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.TrackedLegImpl; @@ -137,7 +139,6 @@ public class StarbordSideOfStartLineRecognitionTest { Position startStarboardPosition = new DegreePosition(0, 1); Position windwardPosition = new DegreePosition(10, 0.5); MockedTrackedRaceImpl trackedRace = createTrackedRaceWithMarkPositions(startPortPosition, startStarboardPosition, windwardPosition); - Position p = trackedRace.getOrCreateTrack(trackedRace.getStartLine(now).getStarboardMarkWhileApproachingLine()). getEstimatedPosition(now, /* extrapolate */ false); assertEquals(startStarboardPosition, p); @@ -184,6 +185,8 @@ public class StarbordSideOfStartLineRecognitionTest { when(trackedRace.getTrackedLeg(course.getFirstLeg())).thenReturn(trackedLeg); when(trackedRace.getApproximatePosition(startWaypoint, now)).thenCallRealMethod(); when(trackedRace.getApproximatePosition(windwardWaypoint, now)).thenCallRealMethod(); + when(trackedRace.getApproximatePosition(Matchers.eq(startWaypoint), Matchers.eq(now), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod(); + when(trackedRace.getApproximatePosition(Matchers.eq(windwardWaypoint), Matchers.eq(now), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod(); return trackedRace; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TargetTimeEstimationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TargetTimeEstimationTest.java index b4a8a8bf09a..d1b4b9ca77f 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TargetTimeEstimationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TargetTimeEstimationTest.java @@ -37,8 +37,10 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; +import com.sap.sailing.domain.tracking.impl.MarkPositionAtTimePointCacheImpl; import com.sap.sailing.domain.tracking.impl.TrackedLegImpl; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -87,9 +89,8 @@ public class TargetTimeEstimationTest { TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors); //Actual test of functionality - Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint); + Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint)); assertEquals(75494, duration.asMillis(), 100); - } @Test @@ -123,9 +124,10 @@ public class TargetTimeEstimationTest { when(leg.getFrom()).thenReturn(from); when(leg.getTo()).thenReturn(to); - when(trackedRace.getApproximatePosition(from, timepoint)).thenReturn(startOfLeg); - when(trackedRace.getApproximatePosition(to, timepoint)).thenReturn(endOfLeg); - + when(trackedRace.getApproximatePosition(eq(from), eq(timepoint))).thenReturn(startOfLeg); + when(trackedRace.getApproximatePosition(eq(to), eq(timepoint))).thenReturn(endOfLeg); + when(trackedRace.getApproximatePosition(eq(from), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(startOfLeg); + when(trackedRace.getApproximatePosition(eq(to), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(endOfLeg); SpeedWithBearing speedWithBearingPort = new KnotSpeedWithBearingImpl(6, new DegreeBearingImpl(-45)); SpeedWithBearingWithConfidence boatSpeedWithBearingWithConfidencePort = new SpeedWithBearingWithConfidenceImpl(speedWithBearingPort, 1, null); @@ -139,9 +141,8 @@ public class TargetTimeEstimationTest { TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors); //Actual test of functionality - Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint); + Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint)); assertEquals(213513, duration.asMillis(), 100); - } @Test @@ -175,9 +176,10 @@ public class TargetTimeEstimationTest { when(leg.getFrom()).thenReturn(from); when(leg.getTo()).thenReturn(to); - when(trackedRace.getApproximatePosition(from, timepoint)).thenReturn(startOfLeg); - when(trackedRace.getApproximatePosition(to, timepoint)).thenReturn(endOfLeg); - + when(trackedRace.getApproximatePosition(eq(from), eq(timepoint))).thenReturn(startOfLeg); + when(trackedRace.getApproximatePosition(eq(to), eq(timepoint))).thenReturn(endOfLeg); + when(trackedRace.getApproximatePosition(eq(from), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(startOfLeg); + when(trackedRace.getApproximatePosition(eq(to), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(endOfLeg); SpeedWithBearing speedWithBearingPort = new KnotSpeedWithBearingImpl(11, new DegreeBearingImpl(150)); SpeedWithBearingWithConfidence boatSpeedWithBearingWithConfidencePort = new SpeedWithBearingWithConfidenceImpl(speedWithBearingPort, 1, null); @@ -191,7 +193,7 @@ public class TargetTimeEstimationTest { TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors); //Actual test of functionality - Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint); + Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint)); assertEquals(95090, duration.asMillis(), 100); } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackedRaceCenterTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackedRaceCenterTest.java index 50b4e9d54f0..f393b19359c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackedRaceCenterTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackedRaceCenterTest.java @@ -22,6 +22,7 @@ import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; @@ -50,6 +51,7 @@ public class TrackedRaceCenterTest { trackedRace = mock(DynamicTrackedRaceImpl.class); when(trackedRace.getCenterOfCourse(Matchers.any(TimePoint.class))).thenCallRealMethod(); when(trackedRace.getApproximatePosition(Matchers.any(Waypoint.class), Matchers.any(TimePoint.class))).thenCallRealMethod(); + when(trackedRace.getApproximatePosition(Matchers.any(Waypoint.class), Matchers.any(TimePoint.class), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod(); RaceDefinition race = mock(RaceDefinition.class); when(trackedRace.getRace()).thenReturn(race); course = mock(Course.class); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index f1de4300373..be7078afd44 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -63,6 +63,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; @@ -612,7 +613,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { return null; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 25e7cbdc60d..fefad810f2b 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -42,6 +42,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; @@ -218,7 +219,7 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { } @Override - public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { return null; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java index 07da1de7bed..34caffcaf8d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -43,6 +43,10 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio protected abstract Map> getRaceColumnsOfSeries(); + /** + * For all tracked races found on any of the {@link #getRaceColumnsOfSeries() race columns} produces a valid and + * potentially empty set. + */ private Map> reloadAndGetPreviousRacesByRace() { final Map> previousRacesByRace = new HashMap<>(); for (Entry> raceColumnsInSeries : getRaceColumnsOfSeries().entrySet()) { @@ -96,11 +100,13 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio @Override public Set getPreviousRacesInExecutionOrder(TrackedRace race) { - Set result = Collections.emptySet(); + final Set result; final Map> previousRacesByRace = getPreviousRacesByRace(); if (previousRacesByRace != null) { result = previousRacesByRace.get(race); - } + } else { + result = Collections.emptySet(); + } return result; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DouglasPeucker.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DouglasPeucker.java index 9971762470e..efd8c9a53a8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DouglasPeucker.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DouglasPeucker.java @@ -6,12 +6,9 @@ import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; -import java.util.concurrent.RunnableFuture; +import java.util.concurrent.ScheduledExecutorService; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Distance; @@ -31,7 +28,7 @@ import com.sap.sse.common.Util; public class DouglasPeucker { private final GPSFixTrack track; - private final Executor executor; + private final ScheduledExecutorService executor; public DouglasPeucker(GPSFixTrack track) { this.track = track; @@ -42,7 +39,7 @@ public class DouglasPeucker { * Allows clients to specify a non-default, optionally multi-threaded executor that will be used to perform the * high-effort computations. */ - public DouglasPeucker(GPSFixTrack track, Executor executor) { + public DouglasPeucker(GPSFixTrack track, ScheduledExecutorService executor) { this.track = track; this.executor = executor; } @@ -96,15 +93,8 @@ public class DouglasPeucker { if (fix.getTimePoint().compareTo(to) > 0) { break; } - RunnableFuture> crossTrackErrorFuture = new FutureTask>( - new Callable>() { - @Override - public Util.Pair call() throws Exception { - return new Util.Pair(fix, fix.getPosition().absoluteCrossTrackError( - fromPosition, bearing)); - } - }); - executor.execute(crossTrackErrorFuture); + Future> crossTrackErrorFuture = executor.submit( + ()->new Util.Pair(fix, fix.getPosition().absoluteCrossTrackError(fromPosition, bearing))); crossTrackErrorFutures.add(crossTrackErrorFuture); } for (Future> crossTrackErrorFuture : crossTrackErrorFutures) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java index a4c9e684d01..eb6d8f44056 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java @@ -23,6 +23,7 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.impl.FutureTaskWithTracingGet; /** * Caches the expensive to compute {@link LeaderboardDTO} results of a @@ -140,15 +141,16 @@ public class LeaderboardDTOCache implements LeaderboardCache { LockUtil.unlockAfterRead(leaderboardCacheLock); } if (future == null) { - future = new FutureTask(new Callable() { - @Override - public LeaderboardDTO call() throws Exception { - LeaderboardDTO result = leaderboard.computeDTO(adjustedTimePoint, - namesOfRaceColumnsForWhichToLoadLegDetails, addOverallDetails, - waitForLatestAnalyses, trackedRegattaRegistry, baseDomainFactory, /* fillTotalPointsUncorrected */ false); - return result; - } - }); + future = new FutureTaskWithTracingGet(LeaderboardDTOCache.class.getName()+" for leaderboard "+leaderboard.getName(), + new Callable() { + @Override + public LeaderboardDTO call() throws Exception { + LeaderboardDTO result = leaderboard.computeDTO(adjustedTimePoint, + namesOfRaceColumnsForWhichToLoadLegDetails, addOverallDetails, + waitForLatestAnalyses, trackedRegattaRegistry, baseDomainFactory, /* fillTotalPointsUncorrected */ false); + return result; + } + }); // The add(Leaderboard) method that the cache manager calls back on this class does nothing, so no synchronization required this.leaderboardCacheManager.add(leaderboard); // ensure the leaderboard is tracked for changes to invalidate LockUtil.lockForWrite(leaderboardCacheLock); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index a60ec26b586..083e5915d18 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -21,7 +21,6 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; import java.util.logging.Level; import java.util.logging.Logger; @@ -97,6 +96,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.util.ThreadPoolUtil; +import com.sap.sse.util.impl.FutureTaskWithTracingGet; /** * Base implementation for various types of leaderboards. The {@link RaceColumnListener} implementation forwards events @@ -311,7 +311,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race this.suppressedCompetitors = new HashSet(); this.suppressedCompetitorsLock = new NamedReentrantReadWriteLock("suppressedCompetitorsLock", /* fair */ false); this.raceColumnListeners = new RaceColumnListeners(); - this.raceDetailsAtEndOfTrackingCache = new HashMap, RunnableFuture>(); + this.raceDetailsAtEndOfTrackingCache = new HashMap<>(); initTransientFields(); } @@ -330,7 +330,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race } private void initTransientFields() { - this.raceDetailsAtEndOfTrackingCache = new HashMap, RunnableFuture>(); + this.raceDetailsAtEndOfTrackingCache = new HashMap<>(); this.cacheInvalidationListeners = new HashSet(); // When many updates are triggered in a short period of time by a single thread, ensure that the single thread // providing the updates is not outperformed by all the re-calculations happening here. Leave at least one @@ -1225,7 +1225,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race } // Now create the race columns and, as a future task, set their competitorsFromBestToWorst, then wait for all these // futures to finish: - Map>> competitorsFromBestToWorstTasks = new HashMap<>(); + Map>> competitorsFromBestToWorstTasks = new HashMap<>(); for (final RaceColumn raceColumn : this.getRaceColumns()) { boolean isMetaLeaderboardColumn = raceColumn instanceof MetaLeaderboardColumn; RaceColumnDTO raceColumnDTO = result.createEmptyRaceColumn(raceColumn.getName(), raceColumn.isMedalRace(), @@ -1253,13 +1253,12 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null, fleetDTO, raceColumn.isMedalRace(), raceIdentifier, race, isMetaLeaderboardColumn); } - FutureTask> task = new FutureTask>( + Future> task = executor.submit( () -> baseDomainFactory.getCompetitorDTOList(AbstractSimpleLeaderboardImpl.this.getCompetitorsFromBestToWorst(raceColumn, timePoint))); - executor.execute(task); competitorsFromBestToWorstTasks.put(raceColumn, task); } // wait for the competitor orderings to have been computed for all race columns before continuing; subsequent tasks may depend on these data - for (Map.Entry>> raceColumnAndTaskToJoin : competitorsFromBestToWorstTasks.entrySet()) { + for (Map.Entry>> raceColumnAndTaskToJoin : competitorsFromBestToWorstTasks.entrySet()) { try { result.setCompetitorsFromBestToWorst(raceColumnAndTaskToJoin.getKey().getName(), raceColumnAndTaskToJoin.getValue().get()); } catch (InterruptedException e) { @@ -1323,7 +1322,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race Map> futuresForColumnName = new HashMap>(); final Set discardedRaceColumns = getResultDiscardingRule().getDiscardedRaceColumns(competitor, this, getRaceColumns(), timePoint); for (final RaceColumn raceColumn : this.getRaceColumns()) { - RunnableFuture future = new FutureTask(() -> { + Future future = executor.submit(() -> { Entry entry = AbstractSimpleLeaderboardImpl.this.getEntry(competitor, raceColumn, timePoint, discardedRaceColumns); return getLeaderboardEntryDTO(entry, raceColumn, competitor, timePoint, namesOfRaceColumnsForWhichToLoadLegDetails != null @@ -1331,7 +1330,6 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race .getName()), waitForLatestAnalyses, legRanksCache, baseDomainFactory, fillTotalPointsUncorrected, cache); }); - executor.execute(future); futuresForColumnName.put(raceColumn.getName(), future); } for (Map.Entry> raceColumnNameAndFuture : futuresForColumnName.entrySet()) { @@ -1611,7 +1609,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race raceDetails = raceDetailsAtEndOfTrackingCache.get(key); if (raceDetails == null) { needToRunRaceDetails = true; - raceDetails = new FutureTask(new Callable() { + raceDetails = new FutureTaskWithTracingGet("RaceDetails for "+trackedRace, new Callable() { @Override public RaceDetails call() throws Exception { TimePoint end = trackedRace.getEndOfRace(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java index 9814c6cb300..32f29af56d5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java @@ -9,7 +9,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; @@ -173,7 +172,7 @@ public class MarkPassingCalculator { + " while waiting for new GPSFixes"); } listener.getQueue().drainTo(allNewFixInsertions); - logger.finer("MPC for "+raceName+" recieved "+ allNewFixInsertions.size()+" new updates."); + logger.fine("MPC for "+raceName+" received "+ allNewFixInsertions.size()+" new updates."); for (StorePositionUpdateStrategy fixInsertion : allNewFixInsertions) { if (listener.isEndMarker(fixInsertion)) { logger.info("Stopping "+MarkPassingCalculator.this+"'s listener for race "+raceName); @@ -212,8 +211,7 @@ public class MarkPassingCalculator { } executor.invokeAll(tasks); } - updateManuallySetMarkPassings(fixedMarkPassings, removedFixedMarkPassings, suppressedMarkPassings, - unsuppressedMarkPassings); + updateManuallySetMarkPassings(fixedMarkPassings, removedFixedMarkPassings, suppressedMarkPassings, unsuppressedMarkPassings); computeMarkPasses(competitorFixes, markFixes); competitorFixes.clear(); markFixes.clear(); @@ -284,9 +282,24 @@ public class MarkPassingCalculator { fixes.addAll(fixesAffectedByNewMarkFixes.getValue()); } } - List> tasks = new ArrayList<>(); - for (Entry> c : combinedCompetitorFixes.entrySet()) { - tasks.add(Executors.callable(new ComputeMarkPassings(c.getKey(), c.getValue()))); + List> tasks = new ArrayList<>(); + for (final Entry> c : combinedCompetitorFixes.entrySet()) { + final Runnable runnable = new ComputeMarkPassings(c.getKey(), c.getValue()); + tasks.add(new Callable() { + @Override + public Void call() throws Exception { + runnable.run(); + return null; + } + + /** + * A reasonable toString implementation helps identifying these tasks in log messages for long-running tasks + */ + @Override + public String toString() { + return "Mark passing calculation for competitor "+c.getKey()+" with "+c.getValue().size()+" fixes"; + } + }); } try { executor.invokeAll(tasks); @@ -296,8 +309,8 @@ public class MarkPassingCalculator { } private class ComputeMarkPassings implements Runnable { - Competitor c; - Iterable fixes; + final Competitor c; + final Iterable fixes; public ComputeMarkPassings(Competitor c, Iterable fixes) { this.c = c; @@ -306,12 +319,22 @@ public class MarkPassingCalculator { @Override public void run() { - logger.finer("Calculating MarkPassings for race "+raceName+", competitor " + c + " (" + Util.size(fixes) + " new fixes)"); - Util.Pair, Iterable> candidateDeltas = finder.getCandidateDeltas(c, fixes); - logger.finer("Received " + Util.size(candidateDeltas.getA()) + " new Candidates for race "+raceName+ - " and competitor "+c+" and will remove " - + Util.size(candidateDeltas.getB()) + " old Candidates for " + c); - chooser.calculateMarkPassDeltas(c, candidateDeltas.getA(), candidateDeltas.getB()); + try { + if (logger.isLoggable(Level.FINER)) { + logger.finer("Calculating MarkPassings for race "+raceName+", competitor " + c + " (" + Util.size(fixes) + " new fixes)"); + } + Util.Pair, Iterable> candidateDeltas = finder.getCandidateDeltas(c, fixes); + if (logger.isLoggable(Level.FINER)) { + logger.finer("Received " + Util.size(candidateDeltas.getA()) + " new Candidates for race "+raceName+ + " and competitor "+c+" and will remove " + + Util.size(candidateDeltas.getB()) + " old Candidates for " + c); + } + chooser.calculateMarkPassDeltas(c, candidateDeltas.getA(), candidateDeltas.getB()); + } catch (Exception e) { + // make sure the exception is logged and not only "swallowed" and suppressed by an invokeAll(...) statement + logger.log(Level.SEVERE, "Exception trying to compute mark passings for competitor "+c, e); + throw e; + } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateFinderImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateFinderImpl.java index c15b26cfaa9..78ed4a0c4f7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateFinderImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateFinderImpl.java @@ -39,6 +39,8 @@ import com.sap.sailing.domain.markpassingcalculation.CandidateFinder; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; +import com.sap.sailing.domain.tracking.impl.MarkPositionAtTimePointCacheImpl; import com.sap.sailing.domain.tracking.impl.TimedComparator; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -47,6 +49,7 @@ import com.sap.sse.common.Timed; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.TimeRangeImpl; +import com.sap.sse.concurrent.LockUtil; import com.sap.sse.util.ThreadPoolUtil; /** @@ -383,24 +386,30 @@ public class CandidateFinderImpl implements CandidateFinder { changedWaypoints.add(w); } } - final Set> tasks = new HashSet<>();; + final Set> tasks = new HashSet<>(); + final Thread executingThread = Thread.currentThread(); // most likely the MarkPassingCalculator.Listen thread for (Competitor c : race.getRace().getCompetitors()) { tasks.add(()->{ - List badCans = new ArrayList<>(); - List newCans = new ArrayList<>(); - for (Waypoint w : changedWaypoints) { - Map, Candidate> xteCans = getXteCandidates(c, w); - badCans.addAll(xteCans.values()); - xteCans.clear(); - Map distanceCans = getDistanceCandidates(c, w); - badCans.addAll(distanceCans.values()); - distanceCans.clear(); + LockUtil.propagateLockSetFrom(executingThread); // "inherit" the course read lock from the "calling" thread into the thread pool executor thread + try { + List badCans = new ArrayList<>(); + List newCans = new ArrayList<>(); + for (Waypoint w : changedWaypoints) { + Map, Candidate> xteCans = getXteCandidates(c, w); + badCans.addAll(xteCans.values()); + xteCans.clear(); + Map distanceCans = getDistanceCandidates(c, w); + badCans.addAll(distanceCans.values()); + distanceCans.clear(); + } + Set allFixes = getAllFixes(c); + newCans.addAll(checkForDistanceCandidateChanges(c, allFixes, changedWaypoints).getA()); + newCans.addAll(checkForXTECandidatesChanges(c, allFixes, changedWaypoints).getA()); + result.put(c, new Util.Pair, List>(newCans, badCans)); + return null; + } finally { + LockUtil.unpropagateLockSetFrom(executingThread); // "return" the course read lock from the thread pool executor thread to the "calling" thread } - Set allFixes = getAllFixes(c); - newCans.addAll(checkForDistanceCandidateChanges(c, allFixes, changedWaypoints).getA()); - newCans.addAll(checkForXTECandidatesChanges(c, allFixes, changedWaypoints).getA()); - result.put(c, new Util.Pair, List>(newCans, badCans)); - return null; }); } executor.invokeAll(tasks); @@ -513,8 +522,8 @@ public class CandidateFinderImpl implements CandidateFinder { private Set getAllFixes(Competitor c) { Set fixes = new TreeSet(comp); DynamicGPSFixTrack track = race.getTrack(c); + track.lockForRead(); try { - track.lockForRead(); for (GPSFix fix : track.getFixes( timeRangeForValidCandidates.from(), /* fromInclusive */ true, timeRangeForValidCandidates.to(), /* toInclusive */ true)) { @@ -542,8 +551,8 @@ public class CandidateFinderImpl implements CandidateFinder { affectedFixes.add(fix); GPSFix fixBefore; GPSFix fixAfter; + track.lockForRead(); try { - track.lockForRead(); TimePoint timePoint = fix.getTimePoint(); fixBefore = track.getLastFixBefore(timePoint); fixAfter = track.getFirstFixAfter(timePoint); @@ -604,15 +613,16 @@ public class CandidateFinderImpl implements CandidateFinder { if (Math.abs(dis.getMeters()) < Math.abs(disBefore.getMeters()) && Math.abs(dis.getMeters()) < Math.abs(disAfter.getMeters())) { t = fix.getTimePoint(); + final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t); p = fix.getPosition(); - Double newProbability = getDistanceBasedProbability(w, t, dis); + Double newProbability = getDistanceBasedProbability(w, t, dis, markPositionCache); if (newProbability != null) { // FIXME why not generate the candidate here where we have all information at hand? - final double newOnCorrectSideOfWaypointPenalty = getSidePenalty(w, p, t, portMark); + final double newOnCorrectSideOfWaypointPenalty = getSidePenalty(w, p, t, portMark, markPositionCache); newProbability *= newOnCorrectSideOfWaypointPenalty * PENALTY_FOR_DISTANCE_CANDIDATES; final Double newStartProbabilityBasedOnOtherCompetitors; if (isStartWaypoint(w)) { - newStartProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t); + newStartProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t, markPositionCache); if (newStartProbabilityBasedOnOtherCompetitors != null) { newProbability *= newStartProbabilityBasedOnOtherCompetitors; } @@ -663,6 +673,7 @@ public class CandidateFinderImpl implements CandidateFinder { private Map> getDistances(Competitor c, GPSFix fix) { // TODO Possibly for specific waypoints Map> result = distanceCache.get(c).get(fix); + final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, fix.getTimePoint()); if (result == null) { // Else calculate distances and put them into the cache result = new LinkedHashMap<>(); @@ -670,7 +681,7 @@ public class CandidateFinderImpl implements CandidateFinder { course.lockForRead(); try { for (Waypoint w : course.getWaypoints()) { - List distances = calculateDistance(fix.getPosition(), w, fix.getTimePoint()); + List distances = calculateDistance(fix.getPosition(), w, fix.getTimePoint(), markPositionCache); result.put(w, distances); } } finally { @@ -811,13 +822,14 @@ public class CandidateFinderImpl implements CandidateFinder { result = new HashMap<>(); Position p = fix.getPosition(); TimePoint t = fix.getTimePoint(); + final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t); Course course = race.getRace().getCourse(); course.lockForRead(); try { for (Waypoint w : course.getWaypoints()) { List distances = new ArrayList<>(); result.put(w, distances); - for (Util.Pair crossingInfo : getCrossingInformation(w, t)) { + for (Util.Pair crossingInfo : getCrossingInformation(w, t, markPositionCache)) { if (crossingInfo.getA() != null && crossingInfo.getB() != null) { distances.add(p.crossTrackError(crossingInfo.getA(), crossingInfo.getB())); } @@ -831,20 +843,6 @@ public class CandidateFinderImpl implements CandidateFinder { return result; } - /** - * Calculates the cross-track error of each fix to the position and crossing bearing of each waypoint. Gates have - * two of these and lines always go from the port mark to the starboard mark. - * - * - * /* private void calculateCrossTrackErrors(Competitor c, Iterable fixes, Iterable - * waypointsToCalculate) { for (GPSFix fix : fixes) { Position fixPos = fix.getPosition(); TimePoint t = - * fix.getTimePoint(); Map> waypointXTE = new HashMap>(); - * crossTrackErrors.get(c).put(fix, waypointXTE); for (Waypoint w : race.getRace().getCourse().getWaypoints()) { - * List xte = new ArrayList<>(); waypointXTE.put(w, xte); for (Util.Pair crossingInfo : - * getCrossingInformation(w, t)) { xte.add(fixPos.crossTrackError(crossingInfo.getA(), - * crossingInfo.getB()).getMeters()); } } } } - */ - /** * {@code xte1} and {@code xte2} are expected to have different signums or both be 0. The method * interpolates between the time points {@code t1} and {@code t2} according to where the XTE is @@ -856,10 +854,11 @@ public class CandidateFinderImpl implements CandidateFinder { final double ratio = (Math.abs(xte1) / (Math.abs(xte1) + Math.abs(xte2))); final TimePoint t = t1.plus((long) (differenceInMillis * ratio)); final Position p = race.getTrack(c).getEstimatedPosition(t, false); - final List distances = calculateDistance(p, w, t); + final List distances = calculateDistance(p, w, t, new MarkPositionAtTimePointCacheImpl(race, t)); final Distance d = portMark ? distances.get(0) : distances.get(1); - final double sidePenalty = getSidePenalty(w, p, t, portMark); - double probability = getDistanceBasedProbability(w, t, d) * sidePenalty; + final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t); + final double sidePenalty = getSidePenalty(w, p, t, portMark, markPositionCache); + double probability = getDistanceBasedProbability(w, t, d, markPositionCache) * sidePenalty; final Double passesInTheRightDirectionProbability = passesInTheRightDirection(w, xte1, xte2, portMark); // null would mean "unknown"; no penalty for those cases probability = passesInTheRightDirectionProbability == null ? probability : probability * passesInTheRightDirectionProbability; @@ -869,7 +868,7 @@ public class CandidateFinderImpl implements CandidateFinder { // at time point t the other competitors are largely not even close to the start waypoint; // this will make start candidates much more likely if many other competitors are also very close to the // start, and it will help ruling out those candidates where someone is practicing a start just for themselves - startProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t); + startProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t, markPositionCache); if (startProbabilityBasedOnOtherCompetitors != null) { probability *= startProbabilityBasedOnOtherCompetitors; } @@ -932,9 +931,9 @@ public class CandidateFinderImpl implements CandidateFinder { * A low variance with a positive average (meaning on course side) indicates that everyone else may have started around the * same time, making this a probable late starter's candidate. Therefore, low variance with positive average shall increase * a probability that was low because of a large weighted average distance. - * * @param t * the time point at which to consider the other competitors behavior relative to the start waypoint + * * @return {@code null} if the {@link #race} has a gate start or the start time is known; a probability between 0..1 * (inclusive) where 0 means that based on all but {@code c}'s relation to the start line it seems * completely unlikely that a candidate for {@code c} at time {@code t} could have been a start candidate; 1 @@ -942,11 +941,13 @@ public class CandidateFinderImpl implements CandidateFinder { * a fact that this must have been the start. * */ - private Double getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(Competitor c, TimePoint t) { + private Double getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(Competitor c, TimePoint t, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); final Double result; if (race.getStartOfRace(/* inferred */ false) == null && race.isGateStart() != Boolean.TRUE) { final Waypoint start = race.getRace().getCourse().getFirstWaypoint(); - final Iterable> crossingInformationForStart = getCrossingInformation(start, t); + final Iterable> crossingInformationForStart = getCrossingInformation(start, t, markPositionCache); if (start == null) { result = 1.0; } else { @@ -960,7 +961,7 @@ public class CandidateFinderImpl implements CandidateFinder { final Position estimatedPositionAtT = track.getEstimatedPosition(t, /* extrapolate */ true); // consider that a position may not be available for that other competitor, although a track exists if (estimatedPositionAtT != null) { - final Distance otherCompetitorsDistanceToStartAtT = getMinDistanceOrNull(calculateDistance(estimatedPositionAtT, start, t)); + final Distance otherCompetitorsDistanceToStartAtT = getMinDistanceOrNull(calculateDistance(estimatedPositionAtT, start, t, markPositionCache)); if (otherCompetitorsDistanceToStartAtT != null) { final Distance crossTrackError; if (startIsLine) { @@ -1095,14 +1096,16 @@ public class CandidateFinderImpl implements CandidateFinder { * to be negative. If the passing instructions are {@link PassingInstruction#Line}, it checks whether the boat * passed between the two marks. */ - private double getSidePenalty(Waypoint w, Position p, TimePoint t, boolean portMark) { + private double getSidePenalty(Waypoint w, Position p, TimePoint t, boolean portMark, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); boolean isOnRightSide = true; Distance onWrongSide = new MeterDistance(0); PassingInstruction instruction = getPassingInstructions(w); if (instruction == PassingInstruction.Line) { List pos = new ArrayList<>(); for (Mark m : w.getMarks()) { - Position po = race.getOrCreateTrack(m).getEstimatedPosition(t, false); + Position po = markPositionCache.getEstimatedPosition(m); if (po == null) { isOnRightSide = true; break; @@ -1130,11 +1133,11 @@ public class CandidateFinderImpl implements CandidateFinder { || instruction == PassingInstruction.FixedBearing || instruction == PassingInstruction.Offset) { m = w.getMarks().iterator().next(); } else if (instruction == PassingInstruction.Gate) { - Util.Pair pair = getPortAndStarboardMarks(t, w); + Util.Pair pair = getPortAndStarboardMarks(t, w, markPositionCache); m = portMark ? pair.getA() : pair.getB(); } if (m != null) { - Util.Pair crossingInfo = Util.get(getCrossingInformation(w, t), portMark ? 0 : 1); + Util.Pair crossingInfo = Util.get(getCrossingInformation(w, t, markPositionCache), portMark ? 0 : 1); isOnRightSide = p.crossTrackError(crossingInfo.getA(), crossingInfo.getB().add(new DegreeBearingImpl(90))).getMeters() < 0; if (isOnRightSide == false) { onWrongSide = p.getDistance(crossingInfo.getA()); @@ -1188,9 +1191,11 @@ public class CandidateFinderImpl implements CandidateFinder { /** * @return a probability based on the distance to w and the average leg lengths before and after. */ - private Double getDistanceBasedProbability(Waypoint w, TimePoint t, Distance distance) { + private Double getDistanceBasedProbability(Waypoint w, TimePoint t, Distance distance, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); final Double result; - Distance legLength = getAverageLengthOfAdjacentLegs(t, w); + Distance legLength = getAverageLengthOfAdjacentLegs(t, w, markPositionCache); if (legLength != null) { result = 1 / (STRICTNESS_OF_DISTANCE_BASED_PROBABILITY/* Raising this will make it stricter */ // reduce distance by 2x the typical HDOP, accounting for the possibility that some distance from the mark @@ -1205,26 +1210,38 @@ public class CandidateFinderImpl implements CandidateFinder { /** * @return an average of the estimated legs before and after w. */ - private Distance getAverageLengthOfAdjacentLegs(TimePoint t, Waypoint w) { - Course course = race.getRace().getCourse(); - if (w == course.getFirstWaypoint()) { - return race.getTrackedLegStartingAt(w).getGreatCircleDistance(t); + private Distance getAverageLengthOfAdjacentLegs(TimePoint t, Waypoint w, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); + final Distance result; + final Course course = race.getRace().getCourse(); + if (course.getNumberOfWaypoints() < 2) { + result = null; + } else if (w == course.getFirstWaypoint()) { + result = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t, markPositionCache); } else if (w == course.getLastWaypoint()) { - return race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t); + result = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t, markPositionCache); } else { - Distance before = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t); - Distance after = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t); + Distance before = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t, markPositionCache); + Distance after = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t, markPositionCache); if (after != null && before != null) { - return new MeterDistance(before.add(after).getMeters() / 2); + result = new MeterDistance(before.add(after).getMeters() / 2); + } else { + result = null; } - return null; } + return result; } /** * Calculates the distance from p to each mark of w at the timepoint t. + * + * @param markPositionCache + * a mark position cache for time point {@code t} for this finder's {@link #race} */ - private List calculateDistance(Position p, Waypoint w, TimePoint t) { + private List calculateDistance(Position p, Waypoint w, TimePoint t, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); final List distances = new ArrayList<>(); PassingInstruction instruction = getPassingInstructions(w); boolean singleMark = false; @@ -1236,25 +1253,25 @@ public class CandidateFinderImpl implements CandidateFinder { singleMark = true; break; case Gate: - Util.Pair posGate = getPortAndStarboardMarks(t, w); + Util.Pair posGate = getPortAndStarboardMarks(t, w, markPositionCache); if (posGate.getA() != null) { - Position portGatePosition = race.getOrCreateTrack(posGate.getA()).getEstimatedPosition(t, false); + Position portGatePosition = markPositionCache.getEstimatedPosition(posGate.getA()); distances.add(portGatePosition != null ? p.getDistance(portGatePosition) : null); } else { distances.add(null); } if (posGate.getB() != null) { - Position starboardGatePosition = race.getOrCreateTrack(posGate.getB()).getEstimatedPosition(t, false); + Position starboardGatePosition = markPositionCache.getEstimatedPosition(posGate.getB()); distances.add(starboardGatePosition != null ? p.getDistance(starboardGatePosition) : null); } else { distances.add(null); } break; case Line: - Util.Pair posLine = getPortAndStarboardMarks(t, w); + Util.Pair posLine = getPortAndStarboardMarks(t, w, markPositionCache); if (posLine.getA() != null && posLine.getB() != null) { - Position portLinePosition = race.getOrCreateTrack(posLine.getA()).getEstimatedPosition(t, false); - Position starboardLinePosition = race.getOrCreateTrack(posLine.getB()).getEstimatedPosition(t, false); + Position portLinePosition = markPositionCache.getEstimatedPosition(posLine.getA()); + Position starboardLinePosition = markPositionCache.getEstimatedPosition(posLine.getB()); distances.add((portLinePosition != null && starboardLinePosition != null) ? p.getDistanceToLine( portLinePosition, starboardLinePosition).abs() : null); } @@ -1270,8 +1287,7 @@ public class CandidateFinderImpl implements CandidateFinder { break; } if (singleMark) { - Position markPosition = race.getOrCreateTrack(w.getMarks().iterator().next()) - .getEstimatedPosition(t, false); + Position markPosition = markPositionCache.getEstimatedPosition(w.getMarks().iterator().next()); distances.add(markPosition != null ? p.getDistance(markPosition) : null); } return distances; @@ -1292,44 +1308,46 @@ public class CandidateFinderImpl implements CandidateFinder { * @return all possible ways to pass a waypoint, described as a position and a bearing. The line out of those two * must be crossed. */ - private Iterable> getCrossingInformation(Waypoint w, TimePoint t) { + private Iterable> getCrossingInformation(Waypoint w, TimePoint t, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); List> result = new ArrayList<>(); PassingInstruction instruction = getPassingInstructions(w); if (instruction == PassingInstruction.Line) { - Util.Pair marks = getPortAndStarboardMarks(t, w); + Util.Pair marks = getPortAndStarboardMarks(t, w, markPositionCache); Position portPosition = null; Bearing b = null; Mark portMark = marks.getA(); Mark starBoardMark = marks.getB(); if (portMark != null && starBoardMark != null) { - portPosition = race.getOrCreateTrack(portMark).getEstimatedPosition(t, false); - Position starboardPosition = race.getOrCreateTrack(starBoardMark).getEstimatedPosition(t, false); + portPosition = markPositionCache.getEstimatedPosition(portMark); + Position starboardPosition = markPositionCache.getEstimatedPosition(starBoardMark); if (portPosition != null && starboardPosition != null) { b = portPosition.getBearingGreatCircle(starboardPosition); result.add(new Util.Pair(portPosition, b)); } } } else if (instruction == PassingInstruction.Gate) { - Position before = race.getApproximatePosition(race.getTrackedLegFinishingAt(w).getLeg().getFrom(), t); - Position after = race.getApproximatePosition(race.getTrackedLegStartingAt(w).getLeg().getTo(), t); - Util.Pair pos = getPortAndStarboardMarks(t, w); + Position before = markPositionCache.getApproximatePosition(race.getTrackedLegFinishingAt(w).getLeg().getFrom()); + Position after = markPositionCache.getApproximatePosition(race.getTrackedLegStartingAt(w).getLeg().getTo()); + Util.Pair pos = getPortAndStarboardMarks(t, w, markPositionCache); Mark portMark = pos.getA(); if (portMark != null) { - Position portPosition = race.getOrCreateTrack(portMark).getEstimatedPosition(t, false); + Position portPosition = markPositionCache.getEstimatedPosition(portMark); Bearing crossingPort = before.getBearingGreatCircle(portPosition).middle( after.getBearingGreatCircle(portPosition)); result.add(new Util.Pair(portPosition, crossingPort)); } Mark starboardMark = pos.getB(); if (starboardMark != null) { - Position starboardPosition = race.getOrCreateTrack(starboardMark).getEstimatedPosition(t, false); + Position starboardPosition = markPositionCache.getEstimatedPosition(starboardMark); Bearing crossingStarboard = before.getBearingGreatCircle(starboardPosition).middle( after.getBearingGreatCircle(starboardPosition)); result.add(new Util.Pair(starboardPosition, crossingStarboard)); } } else { // single mark Bearing b = null; - Position p = race.getOrCreateTrack(w.getMarks().iterator().next()).getEstimatedPosition(t, false); + Position p = markPositionCache.getEstimatedPosition(w.getMarks().iterator().next()); if (instruction == PassingInstruction.FixedBearing) { b = w.getFixedBearing(); } else { @@ -1339,23 +1357,23 @@ public class CandidateFinderImpl implements CandidateFinder { // orthogonally to the adjacent leg: if (w == race.getRace().getCourse().getFirstWaypoint()) { if (instruction == PassingInstruction.None || instruction == PassingInstruction.Single_Unknown) { - b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(90)); + b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(90)); result.add(new Pair<>(p, b)); - b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(270)); + b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(270)); } else { - b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270)); + b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270)); } } else if (w == race.getRace().getCourse().getLastWaypoint()) { if (instruction == PassingInstruction.None || instruction == PassingInstruction.Single_Unknown) { - b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(90)); + b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(90)); result.add(new Pair<>(p, b)); - b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(270)); + b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(270)); } else { - b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270)); + b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270)); } } else { - Bearing before = race.getTrackedLegFinishingAt(w).getLegBearing(t); - Bearing after = race.getTrackedLegStartingAt(w).getLegBearing(t); + Bearing before = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)); + Bearing after = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)); if (before != null && after != null) { b = before.middle(after.reverse()); } @@ -1367,14 +1385,17 @@ public class CandidateFinderImpl implements CandidateFinder { } /** + * @param markPositionCache + * a mark position cache for this finder's {@link #race} for time point {@code t} * @return the marks of a waypoint with two marks in the order port, starboard (when approaching the waypoint from * the direction of the waypoint beforehand. */ - private Util.Pair getPortAndStarboardMarks(TimePoint t, Waypoint w) { + private Util.Pair getPortAndStarboardMarks(TimePoint t, Waypoint w, MarkPositionAtTimePointCache markPositionCache) { + assert t.equals(markPositionCache.getTimePoint()); + assert race == markPositionCache.getTrackedRace(); List markPositions = new ArrayList(); for (Mark mark : w.getMarks()) { - final Position estimatedMarkPosition = race.getOrCreateTrack(mark).getEstimatedPosition(t, /* extrapolate */ - false); + final Position estimatedMarkPosition = markPositionCache.getEstimatedPosition(mark); if (estimatedMarkPosition == null) { return new Util.Pair(null, null); } @@ -1389,8 +1410,8 @@ public class CandidateFinderImpl implements CandidateFinder { return new Util.Pair(null, null); } final boolean isStartLine = indexOfWaypoint == 0; - final Bearing legDeterminingDirectionBearing = race.getTrackedLeg( - legs.get(isStartLine ? 0 : indexOfWaypoint - 1)).getLegBearing(t); + final Bearing legDeterminingDirectionBearing = markPositionCache.getLegBearing(race.getTrackedLeg( + legs.get(isStartLine ? 0 : indexOfWaypoint - 1))); if (legDeterminingDirectionBearing == null) { return new Util.Pair(null, null); } @@ -1414,8 +1435,9 @@ public class CandidateFinderImpl implements CandidateFinder { final TimePoint newNonInferredStartTime = race.getStartOfRace(/* inferred */ false); final TimePoint newTimePointWhenToStartConsideringCandidates = getTimePointWhenToStartConsideringCandidates(newNonInferredStartTime); if (!Util.equalsWithNull(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.from())) { + final TimePoint oldTimePointWhenToStartConsideringCandidates = timeRangeForValidCandidates.from(); timeRangeForValidCandidates = new TimeRangeImpl(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.to()); - result = updateCandiatesAfterRaceTimeRangeChanged(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.from()); + result = updateCandiatesAfterRaceTimeRangeChanged(newTimePointWhenToStartConsideringCandidates, oldTimePointWhenToStartConsideringCandidates); } else { result = Collections.emptyMap(); } @@ -1427,12 +1449,10 @@ public class CandidateFinderImpl implements CandidateFinder { TimePoint oldFinishedTime, TimePoint newFinishedTime) { final Map, Iterable>> result; final TimePoint newTimePointWhenToFinishConsideringCandidates = getTimePointWhenToFinishConsideringCandidates(newFinishedTime); - final TimePoint oldTimePointWhenToFinishConsideringCandidates = timeRangeForValidCandidates.to(); if (!Util.equalsWithNull(timeRangeForValidCandidates.to(), newTimePointWhenToFinishConsideringCandidates)) { + final TimePoint oldTimePointWhenToFinishConsideringCandidates = timeRangeForValidCandidates.to(); timeRangeForValidCandidates = new TimeRangeImpl(timeRangeForValidCandidates.from(), newTimePointWhenToFinishConsideringCandidates); - result = updateCandiatesAfterRaceTimeRangeChanged( - oldTimePointWhenToFinishConsideringCandidates, - newTimePointWhenToFinishConsideringCandidates); + result = updateCandiatesAfterRaceTimeRangeChanged(oldTimePointWhenToFinishConsideringCandidates, newTimePointWhenToFinishConsideringCandidates); } else { result = Collections.emptyMap(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPositionAtTimePointCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPositionAtTimePointCache.java new file mode 100644 index 00000000000..cd00e07b30c --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/MarkPositionAtTimePointCache.java @@ -0,0 +1,58 @@ +package com.sap.sailing.domain.tracking; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.Position; +import com.sap.sse.common.TimePoint; + +/** + * Some calculations that span several method calls require access to the same {@link Mark} positions for the same + * {@link TimePoint} within the scope of the same {@link TrackedRace} repeatedly. Usually, for such a compound + * calculation it doesn't matter whether a new fix has arrived in between, making it valid to cache the mark + * positions---once calculated---for the remainder of the compound operation. Based on these positions, approximate + * waypoint positions and leg bearings can also be calculated and cached. + *

+ * + * Implementations of this interface may cache the results of computing a mark's position for the duration of this + * object. + * + * @author Axel Uhl (D043530) + * + */ +public interface MarkPositionAtTimePointCache { + /** + * Gets the non-extrapolated mark position in this cache's tracked race at the time point + * specified. + * + * @see TrackedRace#getOrCreateTrack(Mark) + * @see GPSFixTrack#getEstimatedPosition(TimePoint, boolean) + */ + Position getEstimatedPosition(Mark mark); + + /** + * Gets the approximate position of a waypoint in the scope of this cache's tracked race at + * the time point specified. + * + * @see TrackedRace#getApproximatePosition(Waypoint, TimePoint) + */ + Position getApproximatePosition(Waypoint waypoint); + + /** + * Gets the bearing of the tracked leg at the time point specified, optionally based on mark position + * information already stored in this cache. + * + * @see TrackedLeg#getLegBearing(TimePoint) + */ + Bearing getLegBearing(TrackedLeg trackedLeg); + + /** + * @return the time point for which this cache holds values + */ + TimePoint getTimePoint(); + + /** + * @return the tracked race for which this cache holds values + */ + TrackedRace getTrackedRace(); +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java index a5ece6b1bfa..da4592948ff 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLeg.java @@ -56,6 +56,16 @@ public interface TrackedLeg extends Serializable { Bearing getLegBearing(TimePoint at); + /** + * Same as {@link #getLegBearing(TimePoint)}, but giving the caller the possibility to provide a cache for + * mark positions and related position and bearing data + * + * @param markPositionCache + * a cache for this tracked leg's {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the + * {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed + */ + Bearing getLegBearing(TimePoint at, MarkPositionAtTimePointCache markPositionCache); + /** * Returns the positive (absolute) distance of p to this leg's course middle line at timePoint, * based on the position of the waypoints delimiting this leg at that time. @@ -80,6 +90,16 @@ public interface TrackedLeg extends Serializable { */ Distance getGreatCircleDistance(TimePoint timePoint); + /** + * Same as {@link #getGreatCircleDistance(TimePoint)}, but giving the caller the possibility to provide a cache for + * mark positions and related position and bearing data + * + * @param markPositionCache + * a cache for this tracked leg's {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the + * {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed + */ + Distance getGreatCircleDistance(TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache); + /** * If the current {@link #getLeg() leg} is +/- {@link TrackedLegImpl#UPWIND_DOWNWIND_TOLERANCE_IN_DEG} degrees * collinear with the wind's bearing, pos1 is projected onto the line crossing pos2 in the @@ -144,7 +164,8 @@ public interface TrackedLeg extends Serializable { * is not available * @throws NoWindException no wind available. unable to determine legtypes for given timepoint */ - Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint) throws NotEnoughDataHasBeenAddedException, NoWindException; + Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint, MarkPositionAtTimePointCache markPositionCache) + throws NotEnoughDataHasBeenAddedException, NoWindException; /** * Computes the windward distance (for upwind/downwind legs) or the along-course distance (for reaching legs) at a reference time point diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 94544b60334..b9f36f9e1aa 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -49,6 +49,7 @@ import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; import com.sap.sailing.domain.ranking.RankingMetric; import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; +import com.sap.sailing.domain.tracking.impl.NonCachingMarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; import com.sap.sse.common.Duration; import com.sap.sse.common.IsManagedByCache; @@ -316,8 +317,22 @@ public interface TrackedRace extends Serializable, IsManagedByCachewaypoint only has one {@link #getMarks() mark}, its position at time timePoint * is returned. Otherwise, the center of gravity between the mark positions is computed and returned. */ - Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint); + default Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + return getApproximatePosition(waypoint, timePoint, new NonCachingMarkPositionAtTimePointCache(this, timePoint)); + } + /** + * Same as {@link #getApproximatePosition(Waypoint, TimePoint)}, but giving the caller the possibility to pass a + * cache of mark positions and related information that can help speed up compound operations requiring frequent + * access to the same marks in the same race for the same time point. + * + * @param markPositionCache + * a cache for this {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the + * {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed + */ + Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, + MarkPositionAtTimePointCache markPositionCache); + /** * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time * for wind recording. If, based on a {@link RaceExecutionOrderProvider}, there is no previous race that takes the @@ -946,4 +961,5 @@ public interface TrackedRace extends Serializable, IsManagedByCache getAttachedRaceLogs(); + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java index b89c60c9421..2600557528a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java @@ -1075,8 +1075,10 @@ public class GPSFixTrackImpl extends MappedTra unlockAfterRead(); } } - for (GPSTrackListener listener : getListeners()) { - listener.gpsFixReceived(fix, getTrackedItem(), firstFixInTrack); + if (result) { + for (GPSTrackListener listener : getListeners()) { + listener.gpsFixReceived(fix, getTrackedItem(), firstFixInTrack); + } } return result; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPositionAtTimePointCacheImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPositionAtTimePointCacheImpl.java new file mode 100644 index 00000000000..a3187c5d202 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPositionAtTimePointCacheImpl.java @@ -0,0 +1,62 @@ +package com.sap.sailing.domain.tracking.impl; + +import java.util.HashMap; +import java.util.Map; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.TimePoint; + +public class MarkPositionAtTimePointCacheImpl extends NonCachingMarkPositionAtTimePointCache { + private final Map estimatedMarkPositions; + private final Map approximateWaypointPositions; + private final Map legBearings; + + public MarkPositionAtTimePointCacheImpl(TrackedRace trackedRace, TimePoint timePoint) { + super(trackedRace, timePoint); + estimatedMarkPositions = new HashMap<>(); + approximateWaypointPositions = new HashMap<>(); + legBearings = new HashMap<>(); + } + + @Override + public Position getEstimatedPosition(Mark mark) { + final Position result; + if (estimatedMarkPositions.containsKey(mark)) { + result = estimatedMarkPositions.get(mark); + } else { + result = super.getEstimatedPosition(mark); + estimatedMarkPositions.put(mark, result); + } + return result; + } + + @Override + public Position getApproximatePosition(Waypoint waypoint) { + final Position result; + if (approximateWaypointPositions.containsKey(waypoint)) { + result = approximateWaypointPositions.get(waypoint); + } else { + result = super.getApproximatePosition(waypoint); + approximateWaypointPositions.put(waypoint, result); + } + return result; + } + + @Override + public Bearing getLegBearing(TrackedLeg trackedLeg) { + final Bearing result; + if (legBearings.containsKey(trackedLeg)) { + result = legBearings.get(trackedLeg); + } else { + result = super.getLegBearing(trackedLeg); + legBearings.put(trackedLeg, result); + } + return result; + } + +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/NonCachingMarkPositionAtTimePointCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/NonCachingMarkPositionAtTimePointCache.java new file mode 100644 index 00000000000..600a2beb411 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/NonCachingMarkPositionAtTimePointCache.java @@ -0,0 +1,46 @@ +package com.sap.sailing.domain.tracking.impl; + +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.common.TimePoint; + +public class NonCachingMarkPositionAtTimePointCache implements MarkPositionAtTimePointCache { + private final TrackedRace trackedRace; + private final TimePoint timePoint; + + public NonCachingMarkPositionAtTimePointCache(TrackedRace trackedRace, TimePoint timePoint) { + super(); + this.trackedRace = trackedRace; + this.timePoint = timePoint; + } + + @Override + public Position getEstimatedPosition(Mark mark) { + return trackedRace.getOrCreateTrack(mark).getEstimatedPosition(timePoint, /* extrapolate */ false); + } + + @Override + public Position getApproximatePosition(Waypoint waypoint) { + return trackedRace.getApproximatePosition(waypoint, timePoint, this); + } + + @Override + public Bearing getLegBearing(TrackedLeg trackedLeg) { + return trackedLeg.getLegBearing(timePoint, this); + } + + @Override + public TrackedRace getTrackedRace() { + return trackedRace; + } + + @Override + public TimePoint getTimePoint() { + return timePoint; + } +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java index d5902aeaac8..85ee7d7ca06 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java @@ -39,6 +39,7 @@ import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuse import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; @@ -204,8 +205,15 @@ public class TrackedLegImpl implements TrackedLeg { @Override public Bearing getLegBearing(TimePoint at) { - Position startMarkPos = getTrackedRace().getApproximatePosition(getLeg().getFrom(), at); - Position endMarkPos = getTrackedRace().getApproximatePosition(getLeg().getTo(), at); + return getLegBearing(at, new MarkPositionAtTimePointCacheImpl(getTrackedRace(), at)); + } + + @Override + public Bearing getLegBearing(TimePoint at, MarkPositionAtTimePointCache markPositionCache) { + assert markPositionCache.getTimePoint().equals(at); + assert markPositionCache.getTrackedRace() == getTrackedRace(); + Position startMarkPos = markPositionCache.getApproximatePosition(getLeg().getFrom()); + Position endMarkPos = markPositionCache.getApproximatePosition(getLeg().getTo()); Bearing legBearing = (startMarkPos != null && endMarkPos != null) ? startMarkPos.getBearingGreatCircle(endMarkPos) : null; return legBearing; } @@ -337,10 +345,12 @@ public class TrackedLegImpl implements TrackedLeg { } @Override - public Distance getGreatCircleDistance(TimePoint timePoint) { + public Distance getGreatCircleDistance(TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { + assert markPositionCache.getTimePoint().equals(timePoint); + assert markPositionCache.getTrackedRace() == getTrackedRace(); final Distance result; - final Position approximatePositionOfFrom = getTrackedRace().getApproximatePosition(getLeg().getFrom(), timePoint); - final Position approximatePositionOfTo = getTrackedRace().getApproximatePosition(getLeg().getTo(), timePoint); + final Position approximatePositionOfFrom = markPositionCache.getApproximatePosition(getLeg().getFrom()); + final Position approximatePositionOfTo = markPositionCache.getApproximatePosition(getLeg().getTo()); if (approximatePositionOfFrom != null && approximatePositionOfTo != null) { result = approximatePositionOfFrom.getDistance(approximatePositionOfTo); } else { @@ -349,6 +359,11 @@ public class TrackedLegImpl implements TrackedLeg { return result; } + @Override + public Distance getGreatCircleDistance(TimePoint timePoint) { + return getGreatCircleDistance(timePoint, new NonCachingMarkPositionAtTimePointCache(getTrackedRace(), timePoint)); + } + @Override public Distance getAbsoluteWindwardDistance(Position pos1, Position pos2, TimePoint at, WindPositionMode windPositionMode) { return getAbsoluteWindwardDistance(pos1, pos2, at, windPositionMode, new LeaderboardDTOCalculationReuseCache(at)); @@ -498,8 +513,10 @@ public class TrackedLegImpl implements TrackedLeg { } @Override - public Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint) + public Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint, MarkPositionAtTimePointCache markPositionCache) throws NotEnoughDataHasBeenAddedException, NoWindException { + assert timepoint.equals(markPositionCache.getTimePoint()); + assert getTrackedRace() == markPositionCache.getTrackedRace(); Position centralPosition = trackedRace.getCenterOfCourse(timepoint); Wind wind = trackedRace.getWind(centralPosition, timepoint, getTrackedRace().getWindSources(WindSourceType.TRACK_BASED_ESTIMATION)); Position from = trackedRace.getApproximatePosition(leg.getFrom(), timepoint); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index cad88ade91b..da48741957d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -127,6 +127,7 @@ import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.RaceListener; @@ -158,6 +159,7 @@ import com.sap.sse.util.SmartFutureCache; import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; import com.sap.sse.util.impl.ArrayListNavigableSet; +import com.sap.sse.util.impl.FutureTaskWithTracingGet; import difflib.DiffUtils; import difflib.Patch; @@ -750,7 +752,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl /** * Monitor object to synchronize access to the {@link #updateStartAndEndOfTracking(boolean)} method. See bug 3922. */ - private final Serializable updateStartAndEndOfTrackingMonitor = ""; + private final Serializable updateStartAndEndOfTrackingMonitor = "updateStartAndEndOfTrackingMonitor"; /** * Updates the start and end of tracking in the following precedence order: @@ -1670,10 +1672,12 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } @Override - public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { + assert timePoint.equals(markPositionCache.getTimePoint()); + assert this == markPositionCache.getTrackedRace(); Position result = null; for (Mark mark : waypoint.getMarks()) { - Position nextPos = getOrCreateTrack(mark).getEstimatedPosition(timePoint, /* extrapolate */false); + Position nextPos = markPositionCache.getEstimatedPosition(mark); if (result == null) { result = nextPos; } else if (nextPos != null) { @@ -1875,7 +1879,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl synchronized (directionFromStartToNextMarkCache) { future = directionFromStartToNextMarkCache.get(at); if (future == null) { - newFuture = new FutureTask(new Callable() { + newFuture = new FutureTaskWithTracingGet("getDirectionFromStartToNextMark for "+this, new Callable() { @Override public Wind call() { Wind result; @@ -3892,8 +3896,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl throw new NotEnoughDataHasBeenAddedException("Target time estimation failed. No polar service available."); } Duration durationOfAllLegs = Duration.NULL; + final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(this, timepoint); for (TrackedLeg leg : trackedLegs.values()) { - Duration durationOfLeg = leg.getEstimatedTimeToComplete(polarDataService, timepoint); + Duration durationOfLeg = leg.getEstimatedTimeToComplete(polarDataService, timepoint, markPositionCache); durationOfAllLegs = durationOfAllLegs.plus(durationOfLeg); } return durationOfAllLegs; diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index f3eb526e5f2..b58478a3a82 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -50,6 +50,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; @@ -352,7 +353,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { return null; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SimulationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SimulationPanel.java new file mode 100644 index 00000000000..ff4a621350f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SimulationPanel.java @@ -0,0 +1,60 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.sap.sailing.gwt.ui.client.StringMessages; + +/** + * Can be used in {@link AbstractEventManagementPanel}s to enable some sort of time-delayed race simulation. + * Provides a checkbox (see {@link #isSimulate()}) that enables simulation and an offset in minutes (see + * {@link #getOffsetToStartTimeInMinutes()}). + * + * @author Axel Uhl (d043530) + * + */ +public class SimulationPanel extends VerticalPanel { + private static final String ZERO_AS_STRING = "0"; + final CheckBox simulateWithStartTimeNowCheckBox; + final TextBox offsetToStartTimeOfSimulatedRaceTextBox; + + public SimulationPanel(StringMessages stringMessages) { + offsetToStartTimeOfSimulatedRaceTextBox = new TextBox(); + offsetToStartTimeOfSimulatedRaceTextBox.setWidth("40px"); + offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(false); + offsetToStartTimeOfSimulatedRaceTextBox.setValue(ZERO_AS_STRING); + simulateWithStartTimeNowCheckBox = new CheckBox(stringMessages.simulateAsLiveRace()); + simulateWithStartTimeNowCheckBox.ensureDebugId("SimulateWithStartTimeNowCheckBox"); + simulateWithStartTimeNowCheckBox.setWordWrap(false); + simulateWithStartTimeNowCheckBox.setValue(Boolean.FALSE); + simulateWithStartTimeNowCheckBox.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(simulateWithStartTimeNowCheckBox.getValue()); + offsetToStartTimeOfSimulatedRaceTextBox.setFocus(simulateWithStartTimeNowCheckBox.getValue()); + } + }); + + final FlowPanel simulateAsLiveRacePanel = new FlowPanel(); + simulateAsLiveRacePanel.add(simulateWithStartTimeNowCheckBox); + final Label offsetToStartLabel = new Label(stringMessages.simulateWithOffset()); + final HorizontalPanel simulateWithOffsetPanel = new HorizontalPanel(); + simulateWithOffsetPanel.add(offsetToStartLabel); + simulateWithOffsetPanel.add(offsetToStartTimeOfSimulatedRaceTextBox); + add(simulateAsLiveRacePanel); + add(simulateWithOffsetPanel); + } + + public boolean isSimulate() { + return simulateWithStartTimeNowCheckBox.getValue(); + } + + public String getOffsetToStartTimeInMinutes() { + return offsetToStartTimeOfSimulatedRaceTextBox.getValue(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java index 416a780ba56..5e4e5272b6d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TracTracEventManagementPanel.java @@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; -import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HTMLTable.ColumnFormatter; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -85,7 +84,6 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { private LabeledAbstractFilterablePanel racesFilterablePanel; private FlushableCellTable racesTable; - private static final String ZERO_AS_STRING = "0"; public TracTracEventManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, RegattaRefresher regattaRefresher, StringMessages stringMessages) { @@ -275,32 +273,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { correctWindCheckBox.setWordWrap(false); correctWindCheckBox.setValue(Boolean.TRUE); - final TextBox offsetToStartTimeOfSimulatedRaceTextBox = new TextBox(); - offsetToStartTimeOfSimulatedRaceTextBox.setWidth("40px"); - offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(false); - offsetToStartTimeOfSimulatedRaceTextBox.setValue(ZERO_AS_STRING); - - final CheckBox simulateWithStartTimeNowCheckBox = new CheckBox(stringMessages.simulateAsLiveRace()); - simulateWithStartTimeNowCheckBox.ensureDebugId("SimulateWithStartTimeNowCheckBox"); - simulateWithStartTimeNowCheckBox.setWordWrap(false); - simulateWithStartTimeNowCheckBox.setValue(Boolean.FALSE); - simulateWithStartTimeNowCheckBox.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(simulateWithStartTimeNowCheckBox.getValue()); - offsetToStartTimeOfSimulatedRaceTextBox.setFocus(simulateWithStartTimeNowCheckBox.getValue()); - } - }); - - final FlowPanel simulateAsLiveRacePanel = new FlowPanel(); - simulateAsLiveRacePanel.add(simulateWithStartTimeNowCheckBox); - - final Label offsetToStartLabel = new Label(stringMessages.simulateWithOffset()); - - final HorizontalPanel simulateWithOffsetPanel = new HorizontalPanel(); - simulateWithOffsetPanel.add(offsetToStartLabel); - simulateWithOffsetPanel.add(offsetToStartTimeOfSimulatedRaceTextBox); - + final SimulationPanel simulationPanel = new SimulationPanel(stringMessages); final CheckBox ignoreTracTracMarkPassingsCheckbox = new CheckBox(stringMessages.useInternalAlgorithm()); ignoreTracTracMarkPassingsCheckbox.setWordWrap(false); ignoreTracTracMarkPassingsCheckbox.setValue(Boolean.FALSE); @@ -308,8 +281,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { layoutTable.setWidget(++row, 0, trackSettingsLabel); layoutTable.setWidget(row, 1, trackWindCheckBox); layoutTable.setWidget(++row, 1, correctWindCheckBox); - layoutTable.setWidget(++row, 1, simulateAsLiveRacePanel); - layoutTable.setWidget(++row, 1, simulateWithOffsetPanel); + layoutTable.setWidget(++row, 1, simulationPanel); layoutTable.setWidget(++row, 1, ignoreTracTracMarkPassingsCheckbox); // Filter @@ -413,8 +385,8 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel { @Override public void onClick(ClickEvent event) { Duration offsetToStartTimeOfSimulatedRace = null; - if(simulateWithStartTimeNowCheckBox.getValue().booleanValue()) { - offsetToStartTimeOfSimulatedRace = getMillisecondsDurationFromMinutesAsString(offsetToStartTimeOfSimulatedRaceTextBox.getValue()); + if (simulationPanel.isSimulate()) { + offsetToStartTimeOfSimulatedRace = getMillisecondsDurationFromMinutesAsString(simulationPanel.getOffsetToStartTimeInMinutes()); } trackSelectedRaces(trackWindCheckBox.getValue(), correctWindCheckBox.getValue(), offsetToStartTimeOfSimulatedRace, ignoreTracTracMarkPassingsCheckbox.getValue()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties index 0d6cadbd7d3..afebcf5d100 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ja.properties @@ -491,12 +491,12 @@ mediaPanel=音声と動画 url=URL mimeType=MIME タイプ title=表題 -subtitle=Subtitle -copyright=Copyright -widthInPx=Width (pixel) -heightInPx=Height (pixel) -tags=Tags -size=Size +subtitle=サブタイトル +copyright=著作権 +widthInPx=幅 (ピクセル) +heightInPx=高さ (ピクセル) +tags=タグ +size=サイズ duration=時間 (h:mm:ss.ms) addMediaTrack=音声/動画追加 addYoutubeTrack=YouTube 追加 @@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=最終得点修正時刻 lastScoreCorrectionsComment=最終得点修正コメント setTimeToNow=時刻を ''現在'' に設定 useStartTimeInference=スタートマーク通過からの推定スタート時刻を使用 +controlTrackingFromStartAndFinishTimes=スタート時刻およびフィニッシュ時刻からの追跡の制御 numberOfQueueMessagesSent=送信済キューメッセージ数 totalSize=合計サイズ averageMessageSize=メッセージごとの平均サイズ (バイト) @@ -1363,6 +1364,7 @@ gotoDesktop=デスクトップバージョンにジャンプ goBack=戻る showAllX=全 {0} を表示 collapseX={0} を圧縮 + numberOfGPSFixes=GPS フィックス fastestSailor=最速 numberWindFixes=風フィックス @@ -1611,8 +1613,11 @@ raceAnalysis=レース分析 startAnalysis=スタート分析 winningLanes=勝利レーン maximumNumberOfDiscards=カットレースの最大数 +notificationRegattaConfigurationUpdatedUsingByMarks="マーク別" コースデザイナーを使用して、有効なレガッタ設定が行われました。 +warningOverrideRegattaConfigurationCourseDesignerToByMarks=有効なレガッタ設定がすでに登録されていますが、コースデザイナーの設定が適切でありません。\n"マーク別" へのコースデザイナー設定を上書きしますか。 +allRacesHaveBeenDenoted=すべてのレースがレースログ追跡に表示されています。 -chartSelectionHint=ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。 +chartSelectionHint=ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。 chooseALanguage=言語を選択してください solutions=ソリューション blog=ブログ @@ -1644,7 +1649,7 @@ eventRegattaLeaderboardLastScoreUpdate=前回スコア更新 eventRegattaRaceNotTracked=未追跡 footerJobs=採用 footerCopyright=© 2011-2016 SAP Sailing Analytics -footerLanguage=SAP Sailing - +footerLanguage=SAP Sailing - footerLegal=利用規約 footerPrivacy=個人情報保護 footerFeedback=フィードバック @@ -1683,17 +1688,17 @@ contentSapInSailing11=世界最大のレガッタである Kieler Woche (Kiel We contentSapInSailing12=SAP 5O5 World Championships のタイトルスポンサー sapSailingAnalyticsTitle=SAP Sailing Analytics contentSapSailingAnalytics1=レースランキング、速力、操縦、ベアリングなどに関係するリアルタイム分析を提供することにより、SAP はセーリングという複雑なスポーツを簡略に分かりやすく説明することをお手伝いしています。 -contentSapSailingAnalytics2=SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできる多様なフロントエンドでコンテンツを視覚化して、セーリングの世界に洞察力と透明性を提供します。 +contentSapSailingAnalytics2=SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできるさまざまなフロントエンドでコンテンツを視覚化することによってセーリングの世界にインサイトと透明性を提供します。 sapSailingAnalyticsReadMore=続きを読む sapSailingRaceManager=SAP Sailing Race Manager contentSapSailingRaceManager=SAP Sailing Race Manager は、セーリングレガッタ運営中にレース組織者が手動で行う作業や連絡業務を自動化/簡略化することによって効率と統制を向上させます。Race Committee アプリは、レースイベントの運営/管理業務を簡略化するのに役立ち、レース委員会がより円滑に運営されるよう支援します。 sapSailingRaceManagerReadMore=詳細情報 sapSailInSight=SAP Sail InSight -contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. -sapSailInSightReadMore=Learn More +contentSapSailInSight=iPhone、iPad、および Android フォン向け SAP Sail InSight モバイルアプリにより、ヨット競技者はいつでもどこでもレガッタ参加やパフォーマンスを管理することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、競技者が SAP Sail InSight 対応のレガッタへの受付を行い、自分がどこにいるかを艇速や帆走距離などのパフォーマンス指標とともに追跡し、自らのパフォーマンスを分析することを可能にします。 +sapSailInSightReadMore=詳細情報 sapSailingBuoyPinger=SAP Sailing Buoy Pinger -contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. -sapSailingBuoyPingerReadMore=Learn More +contentSapSailingBuoyPinger=Android フォン向け SAP Sailing Buoy Pinger モバイルアプリにより、ヨットレース運営者はいつでもどこでもレース用のマークの位置決めや、マーク設置担当者とのやり取りを簡略化することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、レガッタ運営者がレース用のマークの地理的位置を追跡することを可能にし、レガッタに参加しているセーラーが SAP Sail InSight モバイルアプリを使用できるようにします。 +sapSailingBuoyPingerReadMore=詳細情報 postRaceAnalytics=レース後分析 contentPostRaceAnalytics1=セーリングイベントで収集されたデータへのアクセスにより、戦略の策定や帆走の向上に役立つ、セーラーがそのパフォーマンスを評価および分析する機会が提供されます。 contentPostRaceAnalytics2=SAP Business Analytics ソリューションは、多くのレガッタおよびレースにわたって履歴データを照会および分析するツールをセーラー、コーチ、ファン、そして報道関係者に提供します。SAP HANA は、こうした人たちが自身のパフォーマンスを最適化し、予定されているレガッタで成功を収める戦略を策定するために簡単、迅速、かつ効率的な方法でパフォーマンスのパターン、傾向、およびセーラーのプロファイルを知ることを可能にします。 @@ -1702,4 +1707,6 @@ i18nDeSolutionsTrainingText=STG Training Diary は、選手の体調、ならび strategySimulator=戦略シミュレータ contentStrategySimulator=適切な戦略を選択すれば、レース中に大きな競争上の優位性を得ることが可能です。Strategy Simulator により、さまざまな風況および水流に対して最良のセーリング戦略を決定することが容易になります。風と水流をシミュレーションで直ちに変更することができるため、不確かな気象条件に対しても戦略の確かさを簡単に評価することができます。 strategySimulatorReadMore=詳細情報 -impressum=刻印 \ No newline at end of file +impressum=刻印 +lastFix=最終フィックス +filterDeviceMappings=デバイスマッピングのフィルタリング diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index c8bcc492f9f..593bac04de3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -491,12 +491,12 @@ mediaPanel=Аудио и видео url=URL-адрес mimeType=Тип MIME title=Название -subtitle=Subtitle +subtitle=Подзаголовок copyright=Copyright -widthInPx=Width (pixel) -heightInPx=Height (pixel) -tags=Tags -size=Size +widthInPx=Ширина (в пикселях) +heightInPx=Высота (в пикселях) +tags=Теги +size=Размер duration=Длительность (ч:мм:сс.мс) addMediaTrack=Добавить аудио/видео addYoutubeTrack=Добавить Youtube @@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=Время последнего исправления lastScoreCorrectionsComment=Комментарий последнего исправления оценки setTimeToNow=Установить время "сейчас" useStartTimeInference=Использовать вывод о времени старта из прохождений стартовой отметки +controlTrackingFromStartAndFinishTimes=Контролировать отслеживание от времени старта и финиша numberOfQueueMessagesSent=Число отправленных сообщений очереди totalSize=Общий размер averageMessageSize=Средний размер сообщения в байтах @@ -1612,8 +1613,11 @@ raceAnalysis=Анализ гонки startAnalysis=Начать анализ winningLanes=Выигрышные маршруты maximumNumberOfDiscards=Максимальное число исключений +notificationRegattaConfigurationUpdatedUsingByMarks=Активная конфигурация регаты была настроена с использованием дизайнера курса "По отметкам". +warningOverrideRegattaConfigurationCourseDesignerToByMarks=Активная конфигурация регаты уже существует, но с неверно выбранным дизайнером курса.\nПереопределить выбор дизайнера курса на "По отметкам"? +allRacesHaveBeenDenoted=Отслеживание журнала всех гонок отменено. -chartSelectionHint=Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. +chartSelectionHint=Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. chooseALanguage=Выбор языка solutions=Решения blog=Блог @@ -1640,7 +1644,7 @@ countdownMinute=мин. countdownSecond=сек. liveCapitalLetter=Активно watchNow=Смотреть сейчас -seriesHeaderUpcoming=Предстоит +seriesHeaderUpcoming=Скоро eventRegattaLeaderboardLastScoreUpdate=Последнее обновление оценок eventRegattaRaceNotTracked=Не отслеживается footerJobs=Работа @@ -1690,11 +1694,11 @@ sapSailingRaceManager=SAP Sailing Race Manager contentSapSailingRaceManager=Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. sapSailingRaceManagerReadMore=Узнать больше sapSailInSight=SAP Sail InSight -contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. -sapSailInSightReadMore=Learn More +contentSapSailInSight=С помощью мобильного приложения SAP Sail InSight для смартфонов iPhone, iPad и Android яхтсмены гонок могут управлять своим участием и эффективностью в регате откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет яхтсменам выполнять вход в регаты, использующие SAP Sail InSight, отслеживать свое местоположение вместе с индикаторами эффективности, такими как скорость или пройденное расстояние, а также анализировать эффективность. +sapSailInSightReadMore=Узнать больше sapSailingBuoyPinger=SAP Sailing Buoy Pinger -contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. -sapSailingBuoyPingerReadMore=Learn More +contentSapSailingBuoyPinger=Мобильное приложение SAP Sailing Buoy Pinger для смартфонов Android позволяет руководителям парусных гонок упростить позиционирование отметок и общение с установщиками отметок откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет руководителям гонок отслеживать географическое местоположение гоночных отметок, обеспечивая использование мобильного приложения SAP Sail InSight для яхтсменов, участвующих в регате. +sapSailingBuoyPingerReadMore=Узнать больше postRaceAnalytics=Аналитика после гонки contentPostRaceAnalytics1=Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство. contentPostRaceAnalytics2=Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. @@ -1704,4 +1708,5 @@ strategySimulator=Симулятор стратегии contentStrategySimulator=Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. strategySimulatorReadMore=Узнать больше impressum=Печать - +lastFix=Последний замер +filterDeviceMappings=Фильтровать сопоставления устройств diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties index dc0cca22d58..f7e35229132 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties @@ -491,12 +491,12 @@ mediaPanel=音频和视频 url=URL mimeType=MIME 类型 title=标题 -subtitle=Subtitle -copyright=Copyright -widthInPx=Width (pixel) -heightInPx=Height (pixel) -tags=Tags -size=Size +subtitle=副标题 +copyright=版权 +widthInPx=宽度(像素) +heightInPx=高度(像素) +tags=标记 +size=大小 duration=持续时间 (h:mm:ss.ms) addMediaTrack=添加音频/视频 addYoutubeTrack=添加 Youtube @@ -944,7 +944,7 @@ maximumRoundsForCourse=场地的最大轮次 resultsMailRecipient=结果邮件收件人 deviceConfiguration=设备配置 none=无 -courseDesignerMode=场地设计师 +courseDesignerMode=场地设计器 racingProcedure=比赛程序 courseNames=场地名称 generate=生成 @@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=上次得分更正时间 lastScoreCorrectionsComment=上次得分更正评论 setTimeToNow=将时间设为“现在” useStartTimeInference=使用从开始绕标推断的开始时间 +controlTrackingFromStartAndFinishTimes=从开始和结束时间控制跟踪 numberOfQueueMessagesSent=发送的队列消息的数量 totalSize=总大小 averageMessageSize=各消息的平均大小(字节) @@ -1363,6 +1364,7 @@ gotoDesktop=进入桌面版 goBack=返回 showAllX=显示所有{0} collapseX=折叠{0} + numberOfGPSFixes=GPS 修复 fastestSailor=最快 numberWindFixes=风力修复 @@ -1511,7 +1513,7 @@ playstoreInsightApp=https://play.google.com/store/apps/details?id=com.sap.sailin playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app playStoreBuoyPingerApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app playstoreBadge=https://play.google.com/intl/en/badges/images/generic/en-play-badge.png -appstoreSapSailnsight=http://appstore.com/sapsailinsight +appstoreSapSailInsight=http://appstore.com/sapsailinsight appstoreStgTrainingstagebuch=http://appstore.com/stgtrainingstagebuch appstoreBadgeSuffix=_en distanceFromAveragePosition=与平均位置的距离 @@ -1611,14 +1613,17 @@ raceAnalysis=比赛轮次分析 startAnalysis=起航分析 winningLanes=获胜的船道 maximumNumberOfDiscards=最大放弃次数 +notificationRegattaConfigurationUpdatedUsingByMarks=已使用“按标志”场地设计器设置有效的比赛配置。 +warningOverrideRegattaConfigurationCourseDesignerToByMarks=有效的比赛配置已存在,但是场地设计器设置错误。\n是否将场地设计器设置覆盖为“按标志”? +allRacesHaveBeenDenoted=已为比赛轮次日志跟踪描述所有比赛轮次。 -chartSelectionHint=提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 +chartSelectionHint=提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 chooseALanguage=选择一种语言 solutions=解决方案 blog=博客 officalEventWebsite=官方活动网站 moreInfo=更多信息 -viewAnalysis=查看分析 +viewAnalysis=查看分析 overallLeaderboard=总积分榜 pleaseTryAgain=请重试... reloadPage=重新加载页面 @@ -1649,7 +1654,7 @@ footerLegal=法律声明 footerPrivacy=隐私 footerFeedback=反馈 headerLogo=Sailing Analytics -headerSearchPlaceholder=搜索 +headerSearchPlaceholder=搜索 mainEventShowAll=显示所有活动 mainEventTitle=来自风帆世界的最新活动 mainMediaSubtitle=徜徉在让人着迷、震撼人心的最新航行活动中。 @@ -1686,20 +1691,22 @@ contentSapSailingAnalytics1=通过实时分析比赛轮次排名、速度、操 contentSapSailingAnalytics2=SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 sapSailingAnalyticsReadMore=更多信息 sapSailingRaceManager=SAP Sailing Race Manager -contentSapSailingRaceManager=SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 +contentSapSailingRaceManager=SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 sapSailingRaceManagerReadMore=了解更多 sapSailInSight=SAP Sail InSight -contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance. -sapSailInSightReadMore=Learn More +contentSapSailInSight=使用适用于 iPhone、iPad 和 Android 手机的 SAP Sail InSight 移动应用,帆船选手可以随时随地管理其参赛情况和表现。此应用与 SAP Sailing Analytics 解决方案相连,选手可以登录启用 SAP Sail InSight 的比赛,跟踪其所处地点和速度或航行距离等表现指标,并分析其表现。 +sapSailInSightReadMore=了解更多 sapSailingBuoyPinger=SAP Sailing Buoy Pinger -contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta. -sapSailingBuoyPingerReadMore=Learn More +contentSapSailingBuoyPinger=使用适用于 Android 手机的 SAP Sailing Buoy Pinger 移动应用,帆船赛赛事经理可以随时随地简化比赛航标的定位和与布标裁判的沟通。此应用与 SAP Sailing Analytics 解决方案相连,比赛经理可以跟踪其比赛航标的地理位置,并允许参赛水手使用 SAP Sail InSight 移动应用。 +sapSailingBuoyPingerReadMore=了解更多 postRaceAnalytics=赛后分析 contentPostRaceAnalytics1=水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。 -contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 +contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 i18nDeSolutionsTrainingHeadline=SAP Sail Better – STG Training Diary i18nDeSolutionsTrainingText=STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 strategySimulator=策略模拟器 -contentStrategySimulator=选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 +contentStrategySimulator=选择正确的策略可在比赛期间极大地提高竞争优势。策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 strategySimulatorReadMore=了解更多 -impressum=版本说明 \ No newline at end of file +impressum=版本说明 +lastFix=上次修复 +filterDeviceMappings=筛选设备映射 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractRaceChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractRaceChart.java index 9fbb374c863..0f72b6ae08e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractRaceChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractRaceChart.java @@ -27,6 +27,8 @@ import com.sap.sse.common.settings.Settings; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator; +import com.sap.sse.gwt.client.controls.slider.TimeTicksCalculator; +import com.sap.sse.gwt.client.controls.slider.TimeTicksCalculator.NormalizedInterval; import com.sap.sse.gwt.client.player.TimeListener; import com.sap.sse.gwt.client.player.TimeRangeChangeListener; import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider; @@ -66,6 +68,8 @@ public abstract class AbstractRaceChart extends A /** the tick count must be the same as TimeSlider.TICKCOUNT, otherwise the time ticks will be not synchronized */ private final int TICKCOUNT = 10; + + public static final long MINUTE_IN_MILLIS = 60 * 1000; private boolean ignoreNextClickEvent; @@ -158,7 +162,12 @@ public abstract class AbstractRaceChart extends A if (!isZoomed) { isZoomed = true; } - timeRangeWithZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this); + //Set a minute as max time zoom just as for chart + if (xAxisMax - xAxisMin > MINUTE_IN_MILLIS) { + timeRangeWithZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this); + } else { + return false; + } } catch (Exception e) { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override @@ -193,7 +202,9 @@ public abstract class AbstractRaceChart extends A if (minTimepoint != null && maxTimepoint != null) { xAxis.setExtremes(minTimepoint.getTime(), maxTimepoint.getTime(), /* redraw */ false, false); long tickInterval = (maxTimepoint.getTime() - minTimepoint.getTime()) / TICKCOUNT; - xAxis.setTickInterval(tickInterval); + TimeTicksCalculator calculator = new TimeTicksCalculator(); + NormalizedInterval normalizedInterval = calculator.normalizeTimeTickInterval(tickInterval); + xAxis.setTickInterval(normalizedInterval.count * normalizedInterval.unitRange); } if (minTimepoint != null) { xAxis.setMin(minTimepoint.getTime()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 84defeaeb0b..420a98df543 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -2173,7 +2173,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } else { actualTimePoint = timePoint; } - RaceDefinition race = trackedRace.getRace(); + final RaceDefinition race = trackedRace.getRace(); int rank = 1; final List competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(actualTimePoint); for (Competitor competitor : competitorsFromBestToWorst) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java index 2a2a72e011f..6f6fba2e3e7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java @@ -10,10 +10,7 @@ import java.util.Map.Entry; import java.util.NavigableMap; import java.util.Set; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ScheduledExecutorService; import java.util.logging.Logger; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @@ -86,7 +83,7 @@ import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; -import com.sap.sse.util.impl.ThreadFactoryWithPriority; +import com.sap.sse.util.ThreadPoolUtil; public class SimulatorServiceImpl extends RemoteServiceServlet implements SimulatorService { @@ -107,12 +104,7 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula private SpeedWithBearing averageWind = null; public SimulatorServiceImpl() { - final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()/2, 3); - Executor simulatorExecutor = new ThreadPoolExecutor(/* corePoolSize */THREAD_POOL_SIZE, - /* maximumPoolSize */THREAD_POOL_SIZE, - /* keepAliveTime */60, TimeUnit.SECONDS, - /* workQueue */new LinkedBlockingQueue(), - new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true)); + final ScheduledExecutorService simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor(); // TODO: initialize smart-future-cache for simulation-results and add to simulation-service simulationService = SimulationServiceFactory.INSTANCE.getService(simulatorExecutor, null); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/BuoyPingerAppNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/BuoyPingerAppNotes.html index 5b611d43983..313d1dc8d3d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/BuoyPingerAppNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/BuoyPingerAppNotes.html @@ -4,7 +4,16 @@

What's New - SAP Sailing Buoy Pinger

+
October 2016
+
    +
  • Improved pinging accuracy by using a more controllable API: + The app will now only use true GPS signals instead of accepting + positions acquired through network triangulation.
  • +
  • In some rare situations the app crashed, if you want to scan a QR-Code.
  • +
+
June 2016
+
  • First PlayStore release
diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/InSightAppNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/InSightAppNotes.html index fac557514d7..be7104dde4e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/InSightAppNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/InSightAppNotes.html @@ -4,7 +4,19 @@

What's New - SAP Sail InSight

+
October 2016
+
    +
  • Improved tracking reliability and accuracy, + especially when the app is in background by using a more reliable and controllable API: + The app will now only use true GPS signals instead of accepting + positions acquired through network triangulation.
  • +
  • There now is a more detailed energy saving option, + and the automatic setting overriding user preferences has been removed.
  • +
  • In some rare situations the app crashed, if you want to scan a QR-Code.
  • +
+
August 2016
+
  • The GPS fix sending was optimize to send all data in a bulk. Instead of sending every fix separately. This will reduce the battery consumption and minimize the @@ -15,6 +27,7 @@
July 2016
+
  • It is possible to track buoys for multiple regattas. Scan all buoy QR-codes and start tracking for one buoy. It will track all buoys.
  • diff --git a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ja.properties.xlf b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ja.properties.xlf index 3fe54ecb024..30c293b19a1 100644 --- a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ja.properties.xlf +++ b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA diff --git a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ru.properties.xlf b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ru.properties.xlf index f2c2a2cb6fd..8be27d5f037 100644 --- a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ru.properties.xlf +++ b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA diff --git a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_zh_CN.properties.xlf b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_zh_CN.properties.xlf index e6ea6a59147..96364c558e9 100644 --- a/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sailing.polars.datamining/resources/stringmessages/XLF/Polars_StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java index 86059c4429f..689a03fe977 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/FlatGPSFixJsonSerializer.java @@ -17,8 +17,12 @@ public class FlatGPSFixJsonSerializer implements JsonSerializer { result.put(FIELD_LON_DEG, object.getPosition().getLngDeg()); result.put(FIELD_LAT_DEG, object.getPosition().getLatDeg()); result.put(FIELD_TIME_MILLIS, object.getTimePoint().asMillis()); - // TODO the default accuracy is 1.0; when fixes ever have an accuracy, report it here - result.put(FIELD_ACCURACY, 1.0); + // TODO Insert Accuracy if someday available from the server + // Buoy Pinger app will interpret no accuracy in JSON message as MarkPingInfo.NOT_SET_BY_USER (-1) and store that in DB + // For the user these values are displayed as R.string.unknown ("n/a"); + // (CheckinManager in Buoy Pinger can accept messages with and without accuracy) + + // result.put(FIELD_ACCURACY, XXXXXXXXX); return result; } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/SensorDataImportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/SensorDataImportServlet.java index c6004de2610..cf1a661dccd 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/SensorDataImportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/SensorDataImportServlet.java @@ -31,13 +31,12 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; /** - * Import servlet for sensor data files. Importers are located through the OSGi service registry and mathed against the - * name provided by the upload formular. + * Import servlet for sensor data files. Importers are located through the OSGi service registry and matched against the + * name provided by the upload form. */ public class SensorDataImportServlet extends AbstractFileUploadServlet { private static final long serialVersionUID = 1120226743039934620L; private static final Logger logger = Logger.getLogger(SensorDataImportServlet.class.getName()); - private static final int READ_BUFFER_SIZE = 1024 * 1024 * 1024; public void storeFixes(Iterable fixes, DeviceIdentifier deviceIdentifier) { try { diff --git a/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/TrackFileExporterImpl.java b/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/TrackFileExporterImpl.java index fe52330b27b..0c11fe98d55 100644 --- a/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/TrackFileExporterImpl.java +++ b/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/TrackFileExporterImpl.java @@ -6,7 +6,6 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; @@ -18,7 +17,7 @@ import com.sap.sailing.domain.common.trackfiles.TrackFilesFormat; import com.sap.sailing.domain.trackimport.FormatNotSupportedException; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.trackfiles.TrackFileExporter; -import com.sap.sse.util.impl.ThreadFactoryWithPriority; +import com.sap.sse.util.ThreadPoolUtil; /** * Export data to well-known formats such as GPX, KML etc. Internally, the RouteConverter Library is used. @@ -56,7 +55,7 @@ public class TrackFileExporterImpl implements TrackFileExporter { }; List callables = new ArrayList<>(); - ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true)); + ExecutorService executor = ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor(); List errors = new ArrayList<>(); for (TrackedRace race : races) { for (TrackFilesDataSource d : data) { diff --git a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ja.properties.xlf b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ja.properties.xlf index 8ffe9ccf561..7bd020e1654 100644 --- a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ja.properties.xlf +++ b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA= diff --git a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ru.properties.xlf index ebf8101b04d..305b144b8b5 100644 --- a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ru.properties.xlf +++ b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA= diff --git a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf index fd40346044b..b3ad43de1bb 100644 --- a/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sailing.server/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA= @@ -45,7 +45,7 @@ New results for boat class {0} in {1} are available. - {1}中船只级别{0}的新结果可用。 + {1}中船只级别{0}的新结果可用。 0: boatClassName, 1: raceDescription @@ -54,7 +54,7 @@ New results for boat class {0} in {1} are available. - {1}中船只级别{0}的新结果可用。 + {1}中船只级别{0}的新结果可用。 0: boatClassName, 1: leaderboardDescription @@ -72,7 +72,7 @@ New results for competitor {0} in {1} are available. - {1}中参赛队{0}的新结果可用。 + {1}中参赛队{0}的新结果可用。 0: competitorName, 1: leaderboardDescription @@ -102,7 +102,7 @@ Hallo {0}, - {0}您好! + {0}您好! diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index e3ed723b961..2605ac6ddb2 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -28,7 +28,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -605,7 +604,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes operationExecutionListeners = new ConcurrentHashMap<>(); courseListeners = new ConcurrentHashMap<>(); persistentRegattasForRaceIDs = new ConcurrentHashMap<>(); - Executor simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor(); + final ScheduledExecutorService simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor(); // TODO: initialize smart-future-cache for simulation-results and add to simulation-service simulationService = SimulationServiceFactory.INSTANCE.getService(simulatorExecutor, this); this.raceLogReplicator = new RaceLogReplicatorAndNotifier(this); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 72616d0e514..c5be8205189 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -41,6 +41,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; @@ -213,7 +214,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { } @Override - public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) { + public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) { return null; } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactory.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactory.java index 5cf6daff5c6..e214bfbf9ab 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactory.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactory.java @@ -1,6 +1,6 @@ package com.sap.sailing.server.simulation; -import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import com.sap.sailing.server.RacingEventService; @@ -8,6 +8,6 @@ public interface SimulationServiceFactory { static SimulationServiceFactory INSTANCE = new SimulationServiceFactoryImpl(); - SimulationService getService(Executor executor, RacingEventService racingEventService); + SimulationService getService(ScheduledExecutorService executor, RacingEventService racingEventService); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactoryImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactoryImpl.java index cd73c3228b9..c7a6ce0bfbc 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactoryImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceFactoryImpl.java @@ -1,12 +1,12 @@ package com.sap.sailing.server.simulation; -import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import com.sap.sailing.server.RacingEventService; public class SimulationServiceFactoryImpl implements SimulationServiceFactory { - public SimulationService getService(Executor executor, RacingEventService racingEventService) { + public SimulationService getService(ScheduledExecutorService executor, RacingEventService racingEventService) { return new SimulationServiceImpl(executor, racingEventService); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceImpl.java index 74d01a04541..515f7cac9ec 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/simulation/SimulationServiceImpl.java @@ -8,9 +8,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.FutureTask; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -59,13 +57,12 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.util.SmartFutureCache; -import com.sap.sse.util.impl.ThreadFactoryWithPriority; public class SimulationServiceImpl implements SimulationService { private static final Logger logger = Logger.getLogger(SimulationService.class.getName()); - final private Executor executor; + final private ScheduledExecutorService executor; final private SmartFutureCache cache; final private RacingEventService racingEventService; final private ScheduledExecutorService scheduler; @@ -73,9 +70,9 @@ public class SimulationServiceImpl implements SimulationService { final private HashMap legListeners; final private long WAIT_MILLIS = 20000; // milliseconds to wait until earliest cache-update for simulation - public SimulationServiceImpl(Executor executor, RacingEventService racingEventService) { + public SimulationServiceImpl(ScheduledExecutorService executor, RacingEventService racingEventService) { this.executor = executor; - this.scheduler = Executors.newScheduledThreadPool(1, new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true)); + this.scheduler = executor; this.racingEventService = racingEventService; if (racingEventService != null) { this.raceListeners = new HashMap(); @@ -437,31 +434,26 @@ public class SimulationServiceImpl implements SimulationService { Simulator simulator = new SimulatorImpl(simulationParameters); Map result = new HashMap(); - FutureTask taskOmniscient = null; + Future taskOmniscient = null; if (simulationParameters.showOmniscient()) { // schedule omniscient task - taskOmniscient = new FutureTask(() -> simulator.getPath(PathType.OMNISCIENT)); - executor.execute(taskOmniscient); + taskOmniscient = executor.submit(() -> simulator.getPath(PathType.OMNISCIENT)); } - FutureTask task1TurnerLeft = null; - FutureTask task1TurnerRight = null; + Future task1TurnerLeft = null; + Future task1TurnerRight = null; if (simulationParameters.getLegType() != LegType.REACHING) { // schedule 1-turner tasks - task1TurnerLeft = new FutureTask(() -> simulator.getPath(PathType.ONE_TURNER_LEFT)); - task1TurnerRight = new FutureTask(() -> simulator.getPath(PathType.ONE_TURNER_RIGHT)); - executor.execute(task1TurnerLeft); - executor.execute(task1TurnerRight); + task1TurnerLeft = executor.submit(() -> simulator.getPath(PathType.ONE_TURNER_LEFT)); + task1TurnerRight = executor.submit(() -> simulator.getPath(PathType.ONE_TURNER_RIGHT)); } - FutureTask taskOpportunistLeft = null; - FutureTask taskOpportunistRight = null; + Future taskOpportunistLeft = null; + Future taskOpportunistRight = null; if (simulationParameters.showOpportunist()) { // schedule opportunist tasks (which depend on 1-turner results) - taskOpportunistLeft = new FutureTask(() -> simulator.getPath(PathType.OPPORTUNIST_LEFT)); - taskOpportunistRight = new FutureTask(() -> simulator.getPath(PathType.OPPORTUNIST_RIGHT)); - executor.execute(taskOpportunistLeft); - executor.execute(taskOpportunistRight); + taskOpportunistLeft = executor.submit(() -> simulator.getPath(PathType.OPPORTUNIST_LEFT)); + taskOpportunistRight = executor.submit(() -> simulator.getPath(PathType.OPPORTUNIST_RIGHT)); } Path path1TurnerLeft = null; diff --git a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ja.properties.xlf b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ja.properties.xlf index d49b4e8c297..6edd48daec2 100644 --- a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ja.properties.xlf +++ b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA diff --git a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ru.properties.xlf index 075cc1476fb..6b2548b8a6a 100644 --- a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ru.properties.xlf +++ b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA diff --git a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf index 60e6ef4f786..4c9de70e956 100644 --- a/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.datamining/resources/stringmessages/XLF/StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA diff --git a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ja.properties.xlf b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ja.properties.xlf index 8736aa95911..a4a5a308b53 100644 --- a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ja.properties.xlf +++ b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA== diff --git a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ru.properties.xlf b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ru.properties.xlf index 92b49c6a325..81303b072fd 100644 --- a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ru.properties.xlf +++ b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA== diff --git a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_zh_CN.properties.xlf b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_zh_CN.properties.xlf index 129d6a56ea8..b5e2a841af5 100644 --- a/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.filestorage/resources/stringmessages/XLF/FileStorageStringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA== diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ja.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ja.properties.xlf index 3d690268704..a25a20dc3dd 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ja.properties.xlf +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf index 98a30827145..d14f359f97d 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf index 40a196b3379..1d8ca95902e 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/slider/TimeTicksCalculator.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/slider/TimeTicksCalculator.java index 735989a2776..4b4a557ba08 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/slider/TimeTicksCalculator.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/slider/TimeTicksCalculator.java @@ -158,10 +158,24 @@ public class TimeTicksCalculator { // get tick positions i = 1; + /* + * There are the Competitor and the Wind highcharts which + * set time ticks depending on a locale. So we have to + * move the ticks in this time slider on the time zone offset + * to match the time ticks in time slider with ticks in highcharts + */ + minDate = new Date(minDate.getTime() - minDate.getTimezoneOffset() * TimeUnits.MINUTE.unitInMs); minYear = minDate.getYear() + 1900; int minMonth = minDate.getMonth() + 1; int minDateDate = minDate.getDate(); long time = minDate.getTime(); + /* + * After the moving time on time zone offset, + * we should make some steps back to find the race start time + */ + while (time > min) { + time -= interval * count; + } // iterate and add tick positions at appropriate values while (time < max) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ja.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ja.properties.xlf index 8796b6af0e7..7573e06886c 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ja.properties.xlf +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ja.properties.xlf @@ -1,6 +1,6 @@ - +
    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 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf index 7c856eff12c..29028cf06ae 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf @@ -1,6 +1,6 @@ - +
    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 diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf index 86fc8856f0a..3a139709076 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf @@ -1,6 +1,6 @@ - +
    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 @@ -65,7 +65,7 @@ Welcome, {0}! - {0}欢迎使用! + {0}欢迎使用! Trying to verify user... @@ -161,7 +161,7 @@ {0}-Account - {0} 账户 + {0} 账户 Save @@ -349,7 +349,7 @@ Settings for {0} - {0}设置 + {0}设置 Please select diff --git a/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java b/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java index bf489da87e7..7988f3f3fbb 100755 --- a/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java +++ b/java/com.sap.sse/src/com/sap/sse/util/SmartFutureCache.java @@ -13,6 +13,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -23,6 +24,11 @@ import com.sap.sse.common.Util.Pair; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.util.SmartFutureCache.UpdateInterval; +import com.sap.sse.util.impl.HasTracingGet; +import com.sap.sse.util.impl.HasTracingGetImpl; +import com.sap.sse.util.impl.KnowsExecutor; +import com.sap.sse.util.impl.KnowsExecutorAndTracingGet; +import com.sap.sse.util.impl.KnowsExecutorAndTracingGetImpl; /** * A cache for which a background update can be triggered. Readers can decide whether they want to wait for any ongoing @@ -188,6 +194,10 @@ public class SmartFutureCache> { return callable.call(); } + @Override + public String toString() { + return callable==null?"null":callable.toString(); + } } /** @@ -201,7 +211,9 @@ public class SmartFutureCache> { * @author Axel Uhl (D043530) * */ - private class FutureTaskWithCancelBlocking extends FutureTask implements Callable { + private class FutureTaskWithCancelBlocking extends FutureTask implements KnowsExecutor, Callable { + private final KnowsExecutorAndTracingGet tracingGetHelper; + private boolean runningAndReadUpdateInterval; private final K key; @@ -228,6 +240,7 @@ public class SmartFutureCache> { public FutureTaskWithCancelBlocking(SettableCallable callable, final K key, final U updateInterval, final boolean callerWaitsSynchronouslyForResult, final Thread callerThread) { super(callable); + tracingGetHelper = new KnowsExecutorAndTracingGetImpl<>(); callable.setCallable(this); this.gettingThreads = new HashSet<>(); this.key = key; @@ -274,7 +287,7 @@ public class SmartFutureCache> { } } } - return super.get(); + return tracingGetHelper.callGetAndTraceAfterEachTimeout(this); } @Override @@ -363,6 +376,16 @@ public class SmartFutureCache> { public U getUpdateInterval() { return updateInterval; } + + @Override + public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) { + tracingGetHelper.setExecutorThisTaskIsScheduledFor(executorThisTaskIsScheduledFor); + } + + @Override + public String toString() { + return getClass().getName()+" [key="+key+", updateInterval="+updateInterval+", cacheUpdateComputer="+cacheUpdateComputer+"]"; + } } public SmartFutureCache(CacheUpdater cacheUpdateComputer, String nameForLocks) { @@ -507,14 +530,33 @@ public class SmartFutureCache> { notifyAll(); } } + + public String toString() { + final String result; + synchronized (this) { + if (isSet) { + result = value==null?"null":value.toString(); + } else { + result = "unset"; + } + } + return result; + } } private static class TransitiveFuture implements Future { private final SettableFuture> future; + private final HasTracingGet tracingGetHelper; protected TransitiveFuture(SettableFuture> future) { super(); this.future = future; + this.tracingGetHelper = new HasTracingGetImpl() { + @Override + protected String getAdditionalTraceInfo() { + return "transitive future "+TransitiveFuture.this.future.toString(); + } + }; } @Override @@ -546,7 +588,7 @@ public class SmartFutureCache> { @Override public T get() throws InterruptedException, ExecutionException { - return future.get().get(); + return tracingGetHelper.callGetAndTraceAfterEachTimeout(this); } @Override diff --git a/java/com.sap.sse/src/com/sap/sse/util/ThreadPoolUtil.java b/java/com.sap.sse/src/com/sap/sse/util/ThreadPoolUtil.java index 26ae00ad34a..71a942b31d3 100644 --- a/java/com.sap.sse/src/com/sap/sse/util/ThreadPoolUtil.java +++ b/java/com.sap.sse/src/com/sap/sse/util/ThreadPoolUtil.java @@ -52,7 +52,7 @@ public interface ThreadPoolUtil { * * The same configuration as for {@link #getDefaultBackgroundTaskThreadPoolExecutor()} is used. */ - ScheduledExecutorService createBackgroundTaskThreadPoolExecutor(); + ScheduledExecutorService createBackgroundTaskThreadPoolExecutor(String name); /** * In case an application module really requires its own thread pool instead of @@ -74,5 +74,7 @@ public interface ThreadPoolUtil { * * The same configuration as for {@link #getDefaultForegroundTaskThreadPoolExecutor()} is used. */ - ScheduledExecutorService createForegroundTaskThreadPoolExecutor(); + ScheduledExecutorService createForegroundTaskThreadPoolExecutor(String name); + + ScheduledExecutorService createForegroundTaskThreadPoolExecutor(int size, String name); } diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/FutureTaskWithTracingGet.java b/java/com.sap.sse/src/com/sap/sse/util/impl/FutureTaskWithTracingGet.java new file mode 100644 index 00000000000..95a807e7068 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/FutureTaskWithTracingGet.java @@ -0,0 +1,37 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +public class FutureTaskWithTracingGet extends FutureTask { + private final HasTracingGet hasTracingGet; + private final String traceInfo; + + public FutureTaskWithTracingGet(String traceInfo, Callable callable) { + super(callable); + this.traceInfo = traceInfo; + hasTracingGet = createHasTracingGet(); + } + + public FutureTaskWithTracingGet(String traceInfo, Runnable runnable, V result) { + super(runnable, result); + this.traceInfo = traceInfo; + hasTracingGet = createHasTracingGet(); + } + + @Override + public V get() throws InterruptedException, ExecutionException { + return hasTracingGet.callGetAndTraceAfterEachTimeout(this); + } + + private HasTracingGet createHasTracingGet() { + return new HasTracingGetImpl() { + @Override + protected String getAdditionalTraceInfo() { + return traceInfo; + } + }; + } + +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGet.java b/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGet.java new file mode 100644 index 00000000000..91228d39732 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGet.java @@ -0,0 +1,16 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeoutException; + +public interface HasTracingGet { + /** + * Keeps calling {@link Future#get(long, java.util.concurrent.TimeUnit)} with a timeout until a result is available + * or an exception other than a {@link TimeoutException} is thrown. When a timeout occurs, some trace output is + * written to the log. The method is guaranteed not to call {@link Future#get()} and therefore can be used in an + * implementation of a {@link Future#get()} method without causing an endless recursion as long as + * {@link Future#get(long, java.util.concurrent.TimeUnit)} is not calling this method. + */ + V callGetAndTraceAfterEachTimeout(Future future) throws InterruptedException, ExecutionException; +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGetImpl.java b/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGetImpl.java new file mode 100644 index 00000000000..f87ba32bce9 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/HasTracingGetImpl.java @@ -0,0 +1,37 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sap.sse.common.Duration; + +/** + * Can be used with a {@link Future} task and outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds + * of a {@link #get()} call not returning. The {@link #getAdditionalTraceInfo()} method must be implemented by subclasses to provide some meaningful + * hint as to which object is currently timing out. + * + * @author Axel Uhl (d043530) + * + * @param + */ +public abstract class HasTracingGetImpl implements HasTracingGet { + private static final Logger logger = Logger.getLogger(HasTracingGetImpl.class.getName()); + private final long MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET = Duration.ONE_SECOND.times(5).asMillis(); + + public V callGetAndTraceAfterEachTimeout(Future future) throws InterruptedException, ExecutionException { + while (true) { + try { + return future.get(MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + logger.log(Level.INFO, ""+Thread.currentThread()+": Timeout waiting for future task "+future+ + " (retrying); "+ getAdditionalTraceInfo(), e); + } + } + } + + protected abstract String getAdditionalTraceInfo(); +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutor.java b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutor.java new file mode 100644 index 00000000000..ab7d0241a85 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutor.java @@ -0,0 +1,14 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * A {@link ThreadPoolExecutor} can be set on this object. This is used, in particular, by the + * {@link NamedTracingScheduledThreadPoolExecutor} whenever a task of this type is enqueued. + * + * @author Axel Uhl (d043530) + * + */ +public interface KnowsExecutor { + void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor); +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGet.java b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGet.java new file mode 100644 index 00000000000..300a6ecc1b0 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGet.java @@ -0,0 +1,17 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Future; + +import com.sap.sse.util.ThreadPoolUtil; + +/** + * Can be used with a {@link Future} task and outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds + * of a {@link #get()} call not returning. When used in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as + * the ones returned by {@link ThreadPoolUtil}, the task will be + * + * @author Axel Uhl (d043530) + * + * @param + */ +public interface KnowsExecutorAndTracingGet extends KnowsExecutor, HasTracingGet { +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGetImpl.java b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGetImpl.java new file mode 100644 index 00000000000..288ebe998db --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/KnowsExecutorAndTracingGetImpl.java @@ -0,0 +1,31 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; + +import com.sap.sse.util.ThreadPoolUtil; + +/** + * Can be used with a {@link Future} task and outputs trace messages to the log after + * {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds of a {@link #get()} call not returning. When used + * in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as the ones returned by + * {@link ThreadPoolUtil}, the task will be + * + * @author Axel Uhl (d043530) + * + * @param + */ +public class KnowsExecutorAndTracingGetImpl extends HasTracingGetImpl implements KnowsExecutorAndTracingGet { + private ThreadPoolExecutor executorThisTaskIsScheduledFor; + + @Override + public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) { + this.executorThisTaskIsScheduledFor = executorThisTaskIsScheduledFor; + } + + @Override + protected String getAdditionalTraceInfo() { + return executorThisTaskIsScheduledFor == null ? "not scheduled" + : ("scheduled with executor " + executorThisTaskIsScheduledFor); + } +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/NamedTracingScheduledThreadPoolExecutor.java b/java/com.sap.sse/src/com/sap/sse/util/impl/NamedTracingScheduledThreadPoolExecutor.java new file mode 100644 index 00000000000..0704932e53a --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/NamedTracingScheduledThreadPoolExecutor.java @@ -0,0 +1,164 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.RunnableFuture; +import java.util.concurrent.RunnableScheduledFuture; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sap.sse.common.Duration; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.concurrent.ConcurrentWeakHashMap; + +/** + * A scheduled thread pool executor with a name that produces {@link Future} tasks that write a trace message + * to the log after their {@link Future#get()} method hasn't produced a result for some time, then keep trying. + * The tasks are linked to this executor, also when a {@link KnowsExecutor} task is submitted to the {@link #execute(Runnable)} + * method, so that when they need to trace they + * + * @author Axel Uhl (d043530) + * + */ +public class NamedTracingScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor { + private static final Logger logger = Logger.getLogger(NamedTracingScheduledThreadPoolExecutor.class.getName()); + private final String name; + + /** + * If logging level is at least {@link Level#FINE}, each runnable's start time point is recorded in the + * {@link #beforeExecute(Thread, Runnable)} method. If at this logging level, the + * {@link #afterExecute(Runnable, Throwable)} method calculates the runnable's duration, and if above the + * {@link #DURATION_LOGGING_THRESHOLD}, writes a log entry. + */ + private final ConcurrentHashMap startTimePoints = new ConcurrentHashMap<>(); + + /** + * When logging {@link Level#FINE}, the {@link #schedule(Runnable, long, TimeUnit)} variants produce wrappers + * around the runnables whose content is nulled when {@link #afterExecute(Runnable, Throwable)} is called. In order + * to be able to log long-running runnables correctly, this map stores the connection between the wrapping + * future and the runnable wrapped by it. + */ + private final ConcurrentWeakHashMap, Runnable> wrappedRunnables = new ConcurrentWeakHashMap<>(); + + private final Duration DURATION_LOGGING_THRESHOLD = Duration.ONE_SECOND.times(5); + + public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, RejectedExecutionHandler handler) { + super(corePoolSize, handler); + this.name = name; + } + + public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, ThreadFactory threadFactory, + RejectedExecutionHandler handler) { + super(corePoolSize, threadFactory, handler); + this.name = name; + } + + public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, ThreadFactory threadFactory) { + super(corePoolSize, threadFactory); + this.name = name; + } + + public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize) { + super(corePoolSize); + this.name = name; + } + + @Override + protected RunnableScheduledFuture decorateTask(Runnable runnable, RunnableScheduledFuture task) { + return new ThreadPoolAwareRunnableScheduledFutureDelegate<>(this, task); + } + + @Override + protected RunnableScheduledFuture decorateTask(Callable callable, RunnableScheduledFuture task) { + return new ThreadPoolAwareRunnableScheduledFutureDelegate<>(this, task); + } + + @Override + protected RunnableFuture newTaskFor(Runnable runnable, T value) { + return new ThreadPoolAwareFutureTask(this, runnable, value); + } + + @Override + protected RunnableFuture newTaskFor(Callable callable) { + return new ThreadPoolAwareFutureTask(this, callable); + } + + @Override + public void execute(Runnable command) { + if (command instanceof KnowsExecutor) { + ((KnowsExecutor) command).setExecutorThisTaskIsScheduledFor(this); + } + super.execute(command); + } + + @Override + protected void beforeExecute(Thread t, Runnable r) { + super.beforeExecute(t, r); + if (logger.isLoggable(Level.FINE)) { + startTimePoints.put(r, MillisecondsTimePoint.now()); + } + } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + if (logger.isLoggable(Level.FINE)) { + final TimePoint end = MillisecondsTimePoint.now(); + final TimePoint startTime = startTimePoints.remove(r); + Runnable theRunnableToLog = wrappedRunnables.get(r); + if (theRunnableToLog == null) { + theRunnableToLog = r; + } + if (startTime != null) { + final Duration duration = startTime.until(end); + if (duration.compareTo(DURATION_LOGGING_THRESHOLD) > 0) { + logger.fine("Runnable "+theRunnableToLog+" took "+duration+" to complete in executor "+this+(t==null?"":("It failed with exception "+t))); + } + } else { + logger.fine("Strange internal problem: had expected to find start time for "+r); + } + } + super.afterExecute(r, t); + } + + @Override + public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + final ScheduledFuture result = super.schedule(command, delay, unit); + if (logger.isLoggable(Level.FINE)) { + // remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called + wrappedRunnables.put(result, command); + } + return result; + } + + @Override + public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + final ScheduledFuture result = super.scheduleAtFixedRate(command, initialDelay, period, unit); + if (logger.isLoggable(Level.FINE)) { + // remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called + wrappedRunnables.put(result, command); + } + return result; + } + + @Override + public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + final ScheduledFuture result = super.scheduleWithFixedDelay(command, initialDelay, delay, unit); + if (logger.isLoggable(Level.FINE)) { + // remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called + wrappedRunnables.put(result, command); + } + return result; + } + + @Override + public String toString() { + return super.toString() + "[name=" + name + "]"; + } +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareFutureTask.java b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareFutureTask.java new file mode 100644 index 00000000000..03664e8a4cd --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareFutureTask.java @@ -0,0 +1,62 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sap.sse.util.ThreadPoolUtil; + +/** + * A future task that outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds + * of a {@link #get()} call not returning. When used in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as + * the ones returned by {@link ThreadPoolUtil}, the task will be updated by the executor when added to the queue. When the {@link #get()} + * method doesn't respond after the timeout period, the executor that scheduled this tasks, its name as well as its queue size + * are traced into the log. + * + * @author Axel Uhl (d043530) + * + * @param + */ +public class ThreadPoolAwareFutureTask extends FutureTask implements KnowsExecutor { + private static final Logger logger = Logger.getLogger(ThreadPoolAwareFutureTask.class.getName()); + private final KnowsExecutorAndTracingGet getHelper = new KnowsExecutorAndTracingGetImpl(); + private final Object callableOrRunnableIfLoggingFine; + + public ThreadPoolAwareFutureTask(ThreadPoolExecutor executor, Callable callable) { + super(callable); + if (logger.isLoggable(Level.FINE)) { + callableOrRunnableIfLoggingFine = callable; + } else { + callableOrRunnableIfLoggingFine = null; + } + getHelper.setExecutorThisTaskIsScheduledFor(executor); + } + + public ThreadPoolAwareFutureTask(ThreadPoolExecutor executor, Runnable runnable, V result) { + super(runnable, result); + if (logger.isLoggable(Level.FINE)) { + callableOrRunnableIfLoggingFine = runnable; + } else { + callableOrRunnableIfLoggingFine = null; + } + getHelper.setExecutorThisTaskIsScheduledFor(executor); + } + + @Override + public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) { + this.getHelper.setExecutorThisTaskIsScheduledFor(executorThisTaskIsScheduledFor); + } + + @Override + public V get() throws InterruptedException, ExecutionException { + return getHelper.callGetAndTraceAfterEachTimeout(this); + } + + @Override + public String toString() { + return super.toString()+(callableOrRunnableIfLoggingFine==null?"":(" "+callableOrRunnableIfLoggingFine.toString())); + } +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareRunnableScheduledFutureDelegate.java b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareRunnableScheduledFutureDelegate.java new file mode 100644 index 00000000000..64b5bfeaba4 --- /dev/null +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolAwareRunnableScheduledFutureDelegate.java @@ -0,0 +1,53 @@ +package com.sap.sse.util.impl; + +import java.util.concurrent.Delayed; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.RunnableScheduledFuture; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class ThreadPoolAwareRunnableScheduledFutureDelegate extends KnowsExecutorAndTracingGetImpl implements KnowsExecutorAndTracingGet, RunnableScheduledFuture { + private final RunnableScheduledFuture future; + + public ThreadPoolAwareRunnableScheduledFutureDelegate(ThreadPoolExecutor executor, RunnableScheduledFuture future) { + this.future = future; + setExecutorThisTaskIsScheduledFor(executor); + } + + public long getDelay(TimeUnit unit) { + return future.getDelay(unit); + } + + public void run() { + future.run(); + } + + public boolean isPeriodic() { + return future.isPeriodic(); + } + + public boolean cancel(boolean mayInterruptIfRunning) { + return future.cancel(mayInterruptIfRunning); + } + + public int compareTo(Delayed o) { + return future.compareTo(o); + } + + public boolean isCancelled() { + return future.isCancelled(); + } + + public boolean isDone() { + return future.isDone(); + } + + public V get() throws InterruptedException, ExecutionException { + return callGetAndTraceAfterEachTimeout(future); + } + + public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return future.get(timeout, unit); + } +} diff --git a/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolUtilImpl.java b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolUtilImpl.java index 33e030e489e..61576bd0520 100644 --- a/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolUtilImpl.java +++ b/java/com.sap.sse/src/com/sap/sse/util/impl/ThreadPoolUtilImpl.java @@ -1,21 +1,18 @@ package com.sap.sse.util.impl; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import com.sap.sse.util.ThreadPoolUtil; public class ThreadPoolUtilImpl implements ThreadPoolUtil { - private static final int REASONABLE_THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()/2, 3); + private static final int REASONABLE_THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()-1, 3); private final ScheduledExecutorService defaultBackgroundTaskThreadPoolExecutor; private final ScheduledExecutorService defaultForegroundTaskThreadPoolExecutor; public ThreadPoolUtilImpl() { - defaultBackgroundTaskThreadPoolExecutor = Executors.newScheduledThreadPool(/* corePoolSize */ REASONABLE_THREAD_POOL_SIZE, - new ThreadFactoryWithPriority(Thread.NORM_PRIORITY-1, /* daemon */ true)); - defaultForegroundTaskThreadPoolExecutor = Executors.newScheduledThreadPool(/* corePoolSize */ Math.max(Runtime.getRuntime().availableProcessors()-1, 6), - new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true)); + defaultBackgroundTaskThreadPoolExecutor = createBackgroundTaskThreadPoolExecutor("Default background executor"); + defaultForegroundTaskThreadPoolExecutor = createForegroundTaskThreadPoolExecutor(2*REASONABLE_THREAD_POOL_SIZE, "Default foreground executor"); } @Override @@ -29,18 +26,26 @@ public class ThreadPoolUtilImpl implements ThreadPoolUtil { } @Override - public ScheduledExecutorService createBackgroundTaskThreadPoolExecutor() { - return createThreadPoolExecutor(Thread.NORM_PRIORITY-1); + public ScheduledExecutorService createBackgroundTaskThreadPoolExecutor(String name) { + return createThreadPoolExecutor(name, Thread.NORM_PRIORITY-1); } @Override - public ScheduledExecutorService createForegroundTaskThreadPoolExecutor() { - return createThreadPoolExecutor(Thread.NORM_PRIORITY); + public ScheduledExecutorService createForegroundTaskThreadPoolExecutor(String name) { + return createThreadPoolExecutor(name, Thread.NORM_PRIORITY); } - private ScheduledExecutorService createThreadPoolExecutor(final int priority) { - return Executors.newScheduledThreadPool(/* corePoolSize */ REASONABLE_THREAD_POOL_SIZE, - new ThreadFactoryWithPriority(priority, /* daemon */ true)); + @Override + public ScheduledExecutorService createForegroundTaskThreadPoolExecutor(int size, String name) { + return createThreadPoolExecutor(name, Thread.NORM_PRIORITY, size); + } + + private ScheduledExecutorService createThreadPoolExecutor(String name, final int priority) { + return createThreadPoolExecutor(name, priority, /* corePoolSize */ REASONABLE_THREAD_POOL_SIZE); + } + + private ScheduledExecutorService createThreadPoolExecutor(String name, final int priority, final int size) { + return new NamedTracingScheduledThreadPoolExecutor(name, /* corePoolSize */ size, new ThreadFactoryWithPriority(priority, /* daemon */ true)); } @Override diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java index 99b4d32c22b..f250089e8dd 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/ui/fragments/AbstractHomeFragment.java @@ -2,6 +2,13 @@ package com.sap.sailing.android.ui.fragments; import java.util.List; +import com.sap.sailing.android.shared.R; +import com.sap.sailing.android.shared.data.BaseCheckinData; +import com.sap.sailing.android.shared.logging.ExLog; +import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity; +import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter; +import com.sap.sailing.android.shared.util.BaseAppPreferences; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.DialogInterface; @@ -18,13 +25,6 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; -import com.sap.sailing.android.shared.R; -import com.sap.sailing.android.shared.data.BaseCheckinData; -import com.sap.sailing.android.shared.logging.ExLog; -import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity; -import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter; -import com.sap.sailing.android.shared.util.BaseAppPreferences; - public abstract class AbstractHomeFragment extends BaseFragment { private final static String TAG = AbstractHomeFragment.class.getName(); protected AbstractRegattaAdapter adapter; @@ -58,26 +58,30 @@ public abstract class AbstractHomeFragment extends BaseFragment { } private boolean requestQRCodeScan() { + boolean result; + PackageManager manager = getActivity().getPackageManager(); Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); - - PackageManager manager = getActivity().getPackageManager(); List infos = manager.queryIntentActivities(intent, 0); if (infos.size() != 0) { - startActivityForResult(intent, requestCodeQRCode); - return true; - } else { - Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android"); - Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); - infos = manager.queryIntentActivities(marketIntent, 0); - if (infos.size() != 0) { - startActivity(marketIntent); - } else { - Toast.makeText(getActivity(), getString(R.string.error_play_store_and_scanning_not_available), - Toast.LENGTH_LONG).show(); + try { + startActivityForResult(intent, requestCodeQRCode); + result = true; + } catch (Exception ex) { + requestQRCodeScannerInstallation(); + result = false; } - return false; + } else { + requestQRCodeScannerInstallation(); + result = false; } + return result; + } + + private void requestQRCodeScannerInstallation() { + Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android"); + Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); + startActivity(marketIntent); } @Override diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-de/preferences.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-de/preferences.xml index 9cdceb8cd52..55c9fbd8018 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values-de/preferences.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values-de/preferences.xml @@ -1,11 +1,20 @@ Batterie Sparen - Batteriesparmodus - Ein - Aus - GPS Updates werden alle 30 Sekunden verschickt. - GPS Updates werden jede Sekunde verschickt. + + Sendeintervall für GPS-Updates auswählen + Wählen Sie den größtmöglichen Wert, der dennoch eine dem Anwendungsfall entsprechend hohe Aktualisierungsrate ermöglicht. + + GPS Updates werden%1$s %2$s an den Server gesendet. + alle + + sofort + 5 Sekunden + 10 Sekunden + 20 Sekunden + 60 Sekunden + + Ein Aus Anzeige: Missweisend diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml index f803398580d..314a1aa3a66 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values-de/strings.xml @@ -78,5 +78,6 @@ Wird hochgeladen… Fehler beim Hochladen: Fehler beim Hochladen.\nZum Wiederholen hier tippen. + GPS Signal gefunden! \ No newline at end of file diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml index 403f5b8e5d1..5ef2e862a8f 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/preferences.xml @@ -6,15 +6,32 @@ tracking - preferenceEnergySavingEnabled preferenceHeadingWithDeclinationSubtracted Battery Saving - Save Energy - On - Off - GPS updates are being sent to server every 30 seconds. - GPS updates are being sent to server every second. + + msgSndInt + 0 + choose GPS update sending interval + Choose a value as high as possible to preserve battery life while still maintaining a reasonable live experience, depending on your use case. + + GPS updates will be sent to the server%1$s %2$s. + msgSndIntMessage + every + + immediately + 5 seconds + 10 seconds + 20 seconds + 60 seconds + + + 0 + 5 + 10 + 20 + 60 + gpsFixInterval 500 diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml index 75dae9ad3f1..cf66464434a 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml @@ -19,4 +19,5 @@ No GPS Signal! Regatta User Image Add Photo Button + GPS signal found! \ No newline at end of file diff --git a/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml b/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml index 37cec25d928..6f1087bd9d1 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/xml/preference_general.xml @@ -3,14 +3,17 @@ - + + + diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java index e976e6fdc7d..83c73833660 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java @@ -37,11 +37,9 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; -import android.content.IntentFilter; import android.graphics.BitmapFactory; import android.hardware.GeomagneticField; import android.location.Location; -import android.os.BatteryManager; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -68,8 +66,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti private int NOTIFICATION_ID = R.string.tracker_started; public final static int UPDATE_INTERVAL_IN_MILLIS_DEFAULT = 1000; - private final static int UPDATE_INTERVAL_IN_MILLIS_POWERSAVE_MODE = 30000; - private final static float BATTERY_POWER_SAVE_THRESHOLD = 0.2f; private boolean initialLocation; private String checkinDigest; @@ -235,7 +231,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti if (initialLocation) { storeInitialTrackingTimestamp(); } - updateResendIntervalSetting(); reportGPSQualityBearingAndSpeed(location.getAccuracy(), location.getBearing(), location.getSpeed(), location.getLatitude(), location.getLongitude(), location.getAltitude()); final String postUrlStr = event.server + prefs.getServerGpsFixesPostPath(); @@ -347,47 +342,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti initialLocation = false; } - /** - * Update whether message sending service should retry every 3 seconds or every 30. - */ - private void updateResendIntervalSetting() { - float batteryPct = getBatteryPercentage(); - boolean batteryIsCharging = prefs.getBatteryIsCharging(); - int updateInterval = UPDATE_INTERVAL_IN_MILLIS_DEFAULT; - if (prefs.getEnergySavingEnabledByUser() || (batteryPct < BATTERY_POWER_SAVE_THRESHOLD && !batteryIsCharging)) { - if (BuildConfig.DEBUG) { - ExLog.i(this, "POWER-LEVELS", "in power saving mode"); - } - updateInterval = UPDATE_INTERVAL_IN_MILLIS_POWERSAVE_MODE; - } else { - if (BuildConfig.DEBUG) { - ExLog.i(this, "POWER-LEVELS", "in default power mode"); - } - } - prefs.setMessageResendIntervalInMillis(updateInterval); - } - - /** - * Get battery charging level - * - * @return battery charging level in interval [0,1] - */ - private float getBatteryPercentage() { - IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - Intent batteryStatus = this.registerReceiver(null, ifilter); - - int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); - int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); - - float batteryPct = level / (float) scale; - - if (BuildConfig.DEBUG) { - ExLog.i(this, TAG, "Battery: " + (batteryPct * 100) + "%"); - } - - return batteryPct; - } - @Override public IBinder onBind(Intent intent) { return trackingBinder; diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java index 84e5b1057b1..7605f797ab9 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/TrackingFragment.java @@ -7,11 +7,11 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import com.sap.sailing.android.shared.logging.ExLog; import com.sap.sailing.android.shared.services.sending.MessageSendingService.APIConnectivity; @@ -30,8 +30,9 @@ public class TrackingFragment extends BaseFragment { static final String SIS_GPS_ACCURACY = "instanceStateGpsAccuracy"; static final String SIS_GPS_UNSENT_FIXES = "instanceStateGpsUnsentFixes"; - private AppPreferences prefs; private long lastGPSQualityUpdate; + private Toast gpsToast; + private boolean gpsFound = true; private String TAG = TrackingFragment.class.getName(); @@ -69,6 +70,9 @@ public class TrackingFragment extends BaseFragment { qualityIndicator.setSignalQuality(savedInstanceState.getInt(SIS_GPS_QUALITY)); accuracyText.setText(savedInstanceState.getString(SIS_GPS_ACCURACY)); unsentFixesText.setText(savedInstanceState.getString(SIS_GPS_UNSENT_FIXES)); + } else { + //initially set quality to "No GPS" on start tracking + updateTrackingStatus(GPSQuality.noSignal); } } @@ -111,13 +115,27 @@ public class TrackingFragment extends BaseFragment { public void updateTrackingStatus(GPSQuality quality) { if (isAdded()) { TextView textView = (TextView) getActivity().findViewById(R.id.tracking_status); - if (quality == GPSQuality.noSignal) { textView.setText(getString(R.string.tracking_status_no_gps_signal)); textView.setTextColor(getResources().getColor(R.color.sap_red)); + //either GPS has been found before or tracking just started (but is not available now) --> show noGPS Toast + if (gpsFound || gpsToast == null) { + gpsToast = Toast.makeText(getActivity(),getString(R.string.tracking_status_no_gps_signal), Toast.LENGTH_LONG); + gpsToast.show(); + gpsFound = false; + } } else { textView.setText(getString(R.string.tracking_status_tracking)); textView.setTextColor(getResources().getColor(R.color.fiori_text_color)); + if (gpsToast == null) { + gpsToast.cancel(); + } + //GPS was lost before but is available again now --> show gpsFound toast + if (!gpsFound) { + gpsToast = Toast.makeText(getActivity(),getString(R.string.tracking_status_gps_found), Toast.LENGTH_SHORT); + gpsToast.show(); + gpsFound = true; + } } } } @@ -134,14 +152,8 @@ public class TrackingFragment extends BaseFragment { public void run() { TextView textView = (TextView) getActivity().findViewById(R.id.mode); if (apiConnectivity == APIConnectivity.transmissionSuccess) { - if (prefs.getEnergySavingEnabledByUser()) { - textView.setText(getString(R.string.tracking_mode_battery_saving)); - textView.setTextColor(getResources().getColor(R.color.fiori_text_color)); - } else { - textView.setText(getString(R.string.tracking_mode_live)); - textView.setTextColor(getResources().getColor(R.color.fiori_text_color)); - } - + textView.setText(getString(R.string.tracking_mode_live)); + textView.setTextColor(getResources().getColor(R.color.fiori_text_color)); } else if (apiConnectivity == APIConnectivity.noAttempt) { textView.setText(getString(R.string.tracking_mode_offline)); textView.setTextColor(getResources().getColor(R.color.fiori_text_color)); @@ -183,7 +195,7 @@ public class TrackingFragment extends BaseFragment { } else { locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); - return !TextUtils.isEmpty(locationProviders); + return locationProviders.contains("gps"); } } else { return false; diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java index 9131438e7ae..6a0143a4bbd 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/preference/GeneralPreferenceFragment.java @@ -1,7 +1,9 @@ package com.sap.sailing.android.tracking.app.ui.fragments.preference; import android.os.Bundle; +import android.preference.ListPreference; import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; import android.preference.SwitchPreference; import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment; @@ -9,8 +11,7 @@ import com.sap.sailing.android.shared.util.UniqueDeviceUuid; import com.sap.sailing.android.tracking.app.R; import com.sap.sailing.android.tracking.app.utils.AppPreferences; -public class GeneralPreferenceFragment extends BasePreferenceFragment { - +public class GeneralPreferenceFragment extends BasePreferenceFragment implements OnPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -24,23 +25,76 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment { if (currentDeviceId != null && currentDeviceId.length() > 0) { deviceIdPreference.setSummary(currentDeviceId); } else { - // this would, in most caes, be set elsewhere, but since we don't want to show an empty summary, + // this would, in most cases, be set elsewhere, but since we don't want to show an empty summary, // we can just set it here. (UniqueDeviceUuid.getUniqueId sets it in prefs.) String newDeviceId = UniqueDeviceUuid.getUniqueId(getActivity()); deviceIdPreference.setSummary(newDeviceId); } + + ListPreference prefSendingInterval = findPreference(R.string.preference_energy_saving_sending_interval_key); + prefSendingInterval.setDefaultValue(R.string.preference_energy_saving_sending_interval_default); + prefSendingInterval.setOnPreferenceChangeListener(this); + + updateEnergySavingMessage(null); } @Override public void onPause() { super.onPause(); - SwitchPreference prefEnergy = findPreference(R.string.preference_energy_saving_enabled_key); + //SwitchPreference prefEnergy = findPreference(R.string.preference_energy_saving_enabled_key); SwitchPreference prefDeclination = findPreference(R.string.preference_heading_with_declination_subtracted_key); AppPreferences prefs = new AppPreferences(getActivity()); - prefs.setEnergySavingEnabledByUser(prefEnergy.isChecked()); + //prefs.setEnergySavingEnabledByUser(prefEnergy.isChecked()); prefs.setDisplayHeadingWithSubtractedDeclination(prefDeclination.isChecked()); } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + AppPreferences prefs = new AppPreferences(getActivity()); + + //GPS message sending interval settings + if(preference.getKey().equals(getString(R.string.preference_energy_saving_sending_interval_key))) { + int msgSndInt = Integer.parseInt((String)newValue); + switch (msgSndInt){ + case 0: + + //send every second + prefs.setMessageResendIntervalInMillis(1000); + break; + default: + prefs.setMessageResendIntervalInMillis(msgSndInt * 1000); + break; + } + updateEnergySavingMessage(newValue.toString()); + } + return true; + } + + private void updateEnergySavingMessage(String value){ + Preference msgSndIntMessage = findPreference(getString(R.string.preference_energy_saving_sending_interval_message_key)); + ListPreference msgSndIntPreference = (ListPreference) findPreference(getString(R.string.preference_energy_saving_sending_interval_key)); + + //when value == null, (meaning the settings screen just launched) - current entry will be selected + //otherwise, we need to get the index of the newly selected entry as the one resulting from getEntry() will be the previous one + String entry; + if (value == null){ + entry = msgSndIntPreference.getEntry().toString(); + } else { + int indexOfEntry = msgSndIntPreference.findIndexOfValue(value); + entry = msgSndIntPreference.getEntries()[indexOfEntry].toString(); + } + + //possibly fill in the word "every" + String fillEvery = (entry.equals(msgSndIntPreference.getEntries()[0])) ? "" : " " + getString(R.string.preference_energy_saving_sending_interval_message_every); + + //set Text + msgSndIntMessage.setSummary(String.format( + getString(R.string.preference_energy_saving_sending_interval_message), + fillEvery, + entry) + ); + } } diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java index 8cf6ab2b105..d0a1eb74996 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/utils/AppPreferences.java @@ -112,15 +112,6 @@ public class AppPreferences extends BaseAppPreferences { preferences.edit().putString(context.getString(R.string.preference_competitor_key), id).commit(); } - public void setEnergySavingEnabledByUser(boolean newValue) { - preferences.edit().putBoolean(context.getString(R.string.preference_energy_saving_enabled_key), newValue) - .commit(); - } - - public boolean getEnergySavingEnabledByUser() { - return preferences.getBoolean(context.getString(R.string.preference_energy_saving_enabled_key), false); - } - public void setDisplayHeadingWithSubtractedDeclination(boolean newValue) { preferences.edit() .putBoolean(context.getString(R.string.preference_heading_with_declination_subtracted_key), newValue) @@ -186,4 +177,5 @@ public class AppPreferences extends BaseAppPreferences { public void removeFailedUpload(String key) { pref.edit().remove(key).commit(); } + } \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml index f77bf6fd3be..f466ee3f429 100755 --- a/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values-de/strings.xml @@ -9,6 +9,7 @@ Position zurücksetzen Empfangen der Markierungen… Gesetzt + Unbekannt Nicht gesetzt (Genauigkeit ca. %1$sm) GPS Genauigkeit diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml index 85ce4539351..d6adace3426 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml @@ -12,6 +12,7 @@ Reset Position Getting race marks… set + n/a not set (Accurary ca. %1$sm) ca. %1$.02fm diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java index 721c2a3753c..5729fa1fadf 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/adapter/MarkAdapter.java @@ -33,8 +33,16 @@ public class MarkAdapter extends ResourceCursorAdapter { } else { final DecimalFormat df = new DecimalFormat("#.##"); final double accuracy = markPings.get(0).getAccuracy(); - final String accuracyString = String.format(context.getString(R.string.mark_list_accuracy), df.format(accuracy)); - setText = context.getString(R.string.set) + " " + accuracyString; + String accuracyString= ""; + //accuracy-values that are stored as -1 will be displayed as "n/a" + if(accuracy == MarkPingInfo.NOT_SET_BY_USER){ + accuracyString = context.getString(R.string.unknown); + } + else { + accuracyString = context.getString(R.string.set) + " " + + String.format(context.getString(R.string.mark_list_accuracy), df.format(accuracy)); + } + setText = accuracyString; } markName.setText(name); markSet.setText(setText); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java index c52c3aee9f1..766a4a3423e 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/fragments/BuoyFragment.java @@ -55,7 +55,6 @@ public class BuoyFragment extends BaseFragment private static final String TAG = BuoyFragment.class.getName(); private static final int GPS_MIN_TIME = 1000; - private static final String N_A = "n/a"; private static final int REQUEST_CHECK_SETTINGS = 1 << 16; private TextView accuracyTextView; @@ -230,8 +229,8 @@ public class BuoyFragment extends BaseFragment } private void setUpTextUI(Location location) { - String accuracyText = N_A; - String distanceText = N_A; + String accuracyText = this.getString(R.string.unknown); + String distanceText = this.getString(R.string.unknown); if (location != null) { accuracyText = getString(R.string.buoy_detail_accuracy_ca, location.getAccuracy()); MarkPingInfo markPing = positioningActivity.getMarkPing(); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java index 72cc7bf1814..6e41b915e4b 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java @@ -189,8 +189,17 @@ public class CheckinManager { org.json.simple.JSONObject simplePosition; simplePosition = JsonHelper.convertToSimple(positionJson); GPSFix gpsFix = deserializer.deserialize(simplePosition); - MarkPingInfo ping = new MarkPingInfo(mark.getId(), gpsFix, positionJson.getDouble(FlatGPSFixJsonSerializer.FIELD_ACCURACY)); + //accepts JSON messages without accuracy and with, without will be displayed as "n/a" + MarkPingInfo ping; + if (positionJson.has(FlatGPSFixJsonSerializer.FIELD_ACCURACY)){ + ping = new MarkPingInfo(mark.getId(), gpsFix, positionJson.getDouble(FlatGPSFixJsonSerializer.FIELD_ACCURACY)); + } + else { + ping = new MarkPingInfo(mark.getId(), gpsFix, MarkPingInfo.NOT_SET_BY_USER); + } + if (ping != null){ pings.add(ping); + } } } marks.add(mark); diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java index dcdc8286672..1ace4490e7d 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/valueobjects/MarkPingInfo.java @@ -8,6 +8,8 @@ public class MarkPingInfo { private final Serializable markId; private final GPSFix gpsFix; private final double accuracy; + + public static final int NOT_SET_BY_USER = -1; // this is used for accuracies that are displayed as "n/a" public MarkPingInfo(Serializable markId, GPSFix gpsFix, double accuracy) { super(); diff --git a/wiki/howto/onboarding.md b/wiki/howto/onboarding.md index bbfb3762a81..972b940d5b0 100644 --- a/wiki/howto/onboarding.md +++ b/wiki/howto/onboarding.md @@ -66,11 +66,14 @@ Beside the installation script for Eclipse Mars, there is also one for the new E * Clone the repository to your local file system from `ssh://[SAP-User]@git.wdf.sap.corp:29418/SAPSail/sapsailingcapture.git` or `ssh://[user]@sapsailing.com/home/trac/git` User "trac" has all public ssh keys. 2. Check out the 'master' branch from the git repository. The 'master' branch is the main development branch. Please check that you start your work on this branch. 3. Setup and configure Eclipse - * Make absolutely sure to import CodeFormatter.xml (from $GIT_HOME/java) into your Eclipse preferences (Preferences->Java->Code Style->Fortmatter) + * Make absolutely sure to import CodeFormatter.xml (from $GIT_HOME/java) into your Eclipse preferences (Preferences->Java->Code Style->Formatter) * Install the Eclipse GWT-Plugin (now called Google Plugin for Eclipse) * Install the Google Android SDK from the same Google Plugin for Eclipse update site * In Eclipse go to "Window->Preferences->Java->Build Path->Classpath Variables" and create a new classpath variable called ``ANDROID_HOME``. Set its value to the install location of your Android SDK, e.g., ``c:\apps\android-sdk-windows`` or ``/usr/local/android-sdk-linux``. * Install GWT SDK and add the SDK in Eclipse (Preferences -> Google -> Web Toolkit -> Add...) + * In "Window->Preferences->General->Editors->TextEditors" check Insert Spaces for Tabs + * In "Window->Preferences->Web->HTML Files->Editor" indent using Spaces + * In "Window->Preferences->General->Content Types" select on the right side CSS, now add in the lower file association list *.gss to get limited syntax highlighting and content assist in GSS files * Install Eclipse debugger for GWT SuperDevMode * Install Eclipse eGit (optional) * Check that JDK 1.8 is available and has been set for compilation in Eclipse @@ -78,7 +81,7 @@ Beside the installation script for Eclipse Mars, there is also one for the new E * Check that JDK 1.7 has been matched to JavaSE-1.7 and that JDK 1.8 has been matched to JavaSE-1.8 (...>Installed JREs>Execution Environments) * It is also possible to match the SAPJVM 7 or 8 to JavaSE-1.7 / JavaSE-1.8 (for profiling purposes) * Go to Windows->Preferences->Google->Errors/Warnings and set "Missing SDK" to "Ignore" - * Import all Race Analysis projects from the `java/` subdirectory of the git main folder (make sure to import as a git project in eclipse) + * Import all Race Analysis projects from the `java/` subdirectory of the git main folder (make sure to import as a git project in eclipse) (make sure to scan for nested projects) * Import all projects from the `mobile/` subdirectory of the git main folder; this in particular contains the race committee app projects * Set the Eclipse target platform to race-analysis-p2-remote.target (located in com.sap.sailing.targetplatform/definitions) * Wait until the target platform has been resolved completely diff --git a/wiki/info/mobile/Data-consumption-of-mobile-apps.md b/wiki/info/mobile/data-consumption.md similarity index 62% rename from wiki/info/mobile/Data-consumption-of-mobile-apps.md rename to wiki/info/mobile/data-consumption.md index 3144457d049..21ec4b562b3 100644 --- a/wiki/info/mobile/Data-consumption-of-mobile-apps.md +++ b/wiki/info/mobile/data-consumption.md @@ -6,9 +6,13 @@ This article can be used to store information on the data consumption that can b Energy consumption of the tracking itself is - without any optimization and compression of the messages at the time of writing this - quite low already. Ten hours of tracking mean less than five MB of data volume for the messages themselve, if you choose to send them immediately. If sent in intervalls you can minimize the size of the messages further, since you do not have to sent the devices UUID with every fix. Sending every second message together with the previous one will theoretically equal to around three to four MB of data volume needed for ten hours of tracking. -It is technically possible to compress the sent JSON messages with GZIP. Even if every message is sent individually you can achieve a compression ratio of ~103% which on it's own is not a lot, but at least it does not make it worse. Where it would really come in handy is when several messages are sent together. At a 5 second sending intervall, you can already achieve compression ratios of 300% and more. The challenge with sending GZIP-compressed JSON messages to the server is that this has to be supported by the webserver. Normally only messages sent from the server to the client can contain compressed content. There are ways to enable Apaches to receive compressed content, this definitely could use some testing. +It is technically possible to compress the sent JSON messages with GZIP. Even if every message is sent individually you can achieve a compression ratio of ~103% which on it's own is not a lot, but at least it does not make it worse. Where it would really come in handy is when several messages are sent together. At a 5 second sending intervall, you can already achieve compression ratios of 300% and more. The challenge with sending GZIP-compressed JSON messages to the server is that this has to be supported by the webserver. Normally only messages sent from the server to the client can contain compressed content. There are ways to enable Apaches to receive compressed content but that probably is a lot of work. -Since the app not only produces traffic when tracking, but also when checking in to a event or reopening that, when loading and sending team photos etc. energy consumption is significantly higher than the previously mentioned values. Since we cannot determine how often users will open and close the app, open the regattas, refresh photos etc. we cannot give good estimations on that even if we knew how much data volume every single one of these actions costs. +A better idea to cut down on data consumption of the fixes messages in the InSight app is to assemble byte messages directly instead of taking JSON messages and encoding them with UTF-8. You can simply assemble a DataOutputStream / ByteArrayOutputStream with the UUID as 2 64-bit longs at the beginning and then append the values of all the parameters in a certain order with certain data types of certain lengths. On the server-side you can then read that stream of data, extract the first 16 bytes as UUID and then split the rest of the data into the fixes again. +On [Bug 3933](https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=3933) you can already find an implementation for assembling such a byte message. We already evaluated that you can save more than two thirds of the message length by doing this. +This only has to be implemented further down to the point where the data is sent and on the server side, possibly with a parameter in the URL to enable the servers to accept both JSON and direct byte messages, an implementation to split them apart again. + +Since the app not only produces traffic when tracking, but also when checking in to a event or reopening that, when loading and sending team photos etc. energy consumption is significantly higher than the previously mentioned values. Since we cannot determine how often users will open and close the app, open the regattas, refresh photos etc. we cannot give good estimations for real world use cases even if we knew how much data volume every single one of these actions costs. What we can say is, that testing the app extensively over a time of four weeks with booking into events probably more than 100 times and tracking way more than 30 hours caused around 50 to 100 MB of traffic on the testing phones. Under normal conditions the traffic for one event should stay well below the former of these numbers. diff --git a/wiki/info/mobile/energy-consumption.md b/wiki/info/mobile/energy-consumption.md new file mode 100644 index 00000000000..cb6b4d532a9 --- /dev/null +++ b/wiki/info/mobile/energy-consumption.md @@ -0,0 +1,107 @@ +# Power Consumption Of Android Apps + +[[_TOC_]] + +## Introduction +This page documents energy consumption tests of the SailInsight app in various scenarios. It is a crucial topic to consider as tracking often goes on for several hours and it would be desirable that the phone lasts throughout the whole session. + +Though there are many opinions which can be found on the internet as to how big of an impact GPS or cellular network has on battery drain, most of them are very vague or do not comply with our specific usecase, so more abstract observations had to be done, see our findings below. + +For further discussion on the topic there is bug [#3883]( https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=3883); you can also find detailed measurements of the initial tests on this topic [here](http://media.sapsailing.com/SmartphoneLogs/energyTracking.zip). + +## Testing Methodology + +Monitoring energy consumption in Android is not easy. Detailed statistics can only be obtained from the system if you have root access from Android 4.4 onwards. Information like what app is responsible for what portion of the energy consumption is either not available in APIs before 4.4 or would require rooting all the testing devices. Since that was not an option we decided to monitor the general battery level over a time of 2 hours to get somewhat representative results. We made sure that the phone was only running the regular set of background activities and no unnecessary applications. + +Having decided that, we wrote an EnergyLog class that you can find in com.sap.sailing.android.shared.util on the “bug3883”-branch ready for future testing. It is able to monitor the following data by itself whenever `addEntryToLog` is called: a timestamp, the battery-percentage, battery temperature, CPU usage and GSM signal strength. Instantiate the class once for every log you want to write and when you are done logging/adding entries call `writeLog`. You can also monitor GPS accuracy and the amount of satellites used for finding the fix. This is useful if you want to measure energy consumption in the InSight app whenever `onLocationChanged` is called. + +### Location APIs + +Differences and considerations +There basically are two APIs for gathering location information: The "older" LocationManager API which is available in every API level, and the FusedLocationProvider API which works through the GooglePlayServices. The latter was used for all the Sailing Analytics Android apps and is also available on every phone in theory. Sometimes the app requires updates of the GooglePlayServices though, making it an additional hassle that could be avoided by not using it. Also we experienced issues on an Huawei Honor 6 device with Android 6 while using the InSight App when the phone was locked. The phone did not provide location updates anymore, which was the reason we looked into switching the APIs in the first place, since everything worked fine with the LocationManager. + +Furthermore, you can specify the LocationManager API to only use GPS to determine exact locations, while the FusedLocationProvider API only takes criterias (such as the need for high-precision location), but it will fall back to unreasonably unprecise location fixes aggregated through WiFi and cellular network if there is no GPS connection yet. + +The only advantage over the LocationManager here is that getting a coarse location as the initial fix can be much faster. + +Unprecise locations are insufficient for Sail InSight and Buoy Pinger though, so waiting for a fine location instead of accepting an unprecise one should be the way to go. Thus the API used in these two apps will be switched to LocationManager. +As for the Race Committee app, unprecise locations will do here, since those are only used for setting wind information. Therefore, FusedLocationProviderApi grants better useability in terms of the speed of finding the location. + +Battery drain aspects +We tested both APIs on three devices over a period of two hours. See the results below. + + +As you can see above, the difference between the two APIs is relatively small. Moreover it seems that on some phones, one API has less impact on battery drain than the other, while on other phones it is the other way around, though this delta is probably within margin of error. So switching APIs really has no impact on battery consumption. + +### 2G vs 3G connection in good network coverage + +There is the common opinion that a 2G network connection drains less battery than 3G. This is only partially true though as in certain situations it is the other way around, especially in situations without good coverage (which is the case while sailing on the water most of the time). + +See our tests in a good connection state below - again tested on three devices over two hours, the devices set to only use the respective network. + + +The results show that for the Sail InSight app, 2G does not consume less battery in any case. The difference again is very small and probably within margin of error on two of our testing phones. Interestingly though, on the third phone, 2G actually drains the phone's battery noticeably stronger than 3G. + +A possible reason for this might be that sending fixes takes longer on a 2G connection due to the lower bandwidth - leading the chip having to stay active longer each time a message is sent. Again, under hard conditions with problematic connectivity this would probably be the other way around. + +### Comparing different message sending intervals and also good and bad connectivity +In order to simulate a weak cellular connection often found on the water - constantly changing 2G/3G/4G networks and signal strengths; even signal loss from time to time, we put the phones in an elevator. On the top floor, there is a good connection with 3G, the further down, the worse it gets up to no connection in the basement. Here the phones are sometimes able to catch a 2G signal, which is also not that strong. +For comparison, we also put the phones in a well-covered area. + +As message sending intervals shown on the X-axis we chose the following: +immediately, 5 seconds, 10 seconds, 20 seconds, 30 seconds and 5 minutes. +On the Y-axis you can see the consumed energy over 2 hours. + +See the results below. + + + +What you can see in this diagram is that battery consumption will drop with increasing sending intervals, no matter how good or bad cellular connection is. The most significant differences are observable on intervals ranging from 5 to 25 seconds. The difference between 30 seconds and 5 minutes is negligible, so is the difference between immediate sending and a 5 second interval. + +When comparing good and bad connectivity, the graphs mostly confirm our concerns: The battery drains faster on most phones when exposed to changing cellular network or frequently lost connection. The phones consume more energy when they have to compensate for that with booking into other networks, reconnecting and so on. This means that tracking will use more energy under real conditions than in synthetic benchmarks on land, where you usually have a better connection. + +Some phones though behave unexpectedly on a bad connection. The S2 shows the exact opposite of the expected results with the battery consumption being lower under bad connectivity. From this we can conclude that there are phones which are able to handle these bad conditions better than others or even get an advantage from it. When a phone is booked into a cellular network for overall less time it also consumes less power. But seemingly the expected increased consumption for booking in and out of networks is not present on some phones. + +## Conclusion + +Generally we have to say that energy consumption heavily depends on the phone itself. On some phones the app would still be able to run 10 hours without optimization, on others only 4. It also depends on the specific device how effective energy conserving measures are. + +GPS fix interval + +* different GPS fix acquiring intervals do not make a difference in battery drain +* they would if the interval was much lower - say 5-10 minutes upwards +* this is not an option for a precise tracking app though so there is nothing which can be done at this point + +Connectivity state + +* better signal strength leads to a lower required transmission power by the phone's antenna + --> a solid 2G connection is better than a bad 3G connection +* the longer the chip needs to be active, the higher the drain + --> the faster data is sent, the better + --> 3G is more economical, if stable, especially with bigger data batches +* frequent signal loss forces the phone to constanly try to reconnect to the cellular network + +Message sending interval + +* the main thing where power saving measures can be applied on all phones + +Heat + +* heat will have no short term influence on battery life on the current cycle +* only long term influence on battery degredation + + +Resulting actions going forth + +* send messages _only_ as fast as necessary to still provide a reasonable experience +* intervals between 5 and 60 seconds are imaginable as a choice for the user +* provide a setting in the app for that - possibly displaying an educated guess on remaining battery life with each setting; taking into account the following: +* the user's device (battery level, capacity, average idle power drain) +* statistics provided by the backend (how power-intense are the different intervals on the average of devices) +* possibly taking android-provided expected time into account - see Intent.ACTION_POWER_USAGE_SUMMARY + +--- + +Authors: +Adrian Riedel (D064867) +Daniel Wagner (D065058) \ No newline at end of file diff --git a/wiki/info/mobile/energy-consumption/Comparison3G2G.png b/wiki/info/mobile/energy-consumption/Comparison3G2G.png new file mode 100644 index 00000000000..865d117e766 Binary files /dev/null and b/wiki/info/mobile/energy-consumption/Comparison3G2G.png differ diff --git a/wiki/info/mobile/energy-consumption/ComparisonAPIs.png b/wiki/info/mobile/energy-consumption/ComparisonAPIs.png new file mode 100644 index 00000000000..a150b00e266 Binary files /dev/null and b/wiki/info/mobile/energy-consumption/ComparisonAPIs.png differ diff --git a/wiki/info/mobile/energy-consumption/ComparisonConnectivity.png b/wiki/info/mobile/energy-consumption/ComparisonConnectivity.png new file mode 100644 index 00000000000..16dc6f49a55 Binary files /dev/null and b/wiki/info/mobile/energy-consumption/ComparisonConnectivity.png differ