DELETED .gitignore Index: .gitignore ================================================================== --- .gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# -.* -*-1.css -*-1.js -*edit-1.xhtml -*~ -abc2svg.woff -abc2svg.ttf -# important! -!.gitignore Index: README.md ================================================================== --- README.md +++ README.md @@ -18,69 +18,79 @@ [http://moinejf.free.fr/js/](http://moinejf.free.fr/js). They are updated on release change. These files are: -- `abc2svg-1.js` +- `abc2svg-1.js` This script is the **abc2svg** core. It contains the ABC parser and the SVG generation engine. It must be included in the (X)HTML header of the pages where ABC rendering is needed (in ` Index: font.js ================================================================== --- font.js +++ font.js @@ -1,183 +1,377 @@ // abc2svg music font -var musicfont = 'url("data:application/font-ttf;base64,\ -AAEAAAANAIAAAwBQRkZUTX30pOoAACfYAAAAHE9TLzJYnlnxAAABWAAAAFZjbWFwN+qJgQAAAsAA\ -AAIqY3Z0IAAiAogAAATsAAAABGdhc3D//wADAAAn0AAAAAhnbHlmirg/swAABXwAAB4caGVhZAsO\ -geEAAADcAAAANmhoZWEIoQEcAAABFAAAACRobXR4cVoAlAAAAbAAAAEObG9jYQpbAnAAAATwAAAA\ -im1heHAAiwDcAAABOAAAACBuYW1lNpjajAAAI5gAAAGDcG9zdA9CdgsAACUcAAACsQABAAAAAQAA\ -tjNVVF8PPPUACwQAAAAAANGXIhcAAAAA1qodLf+6/QwD9ASUAAAACAACAAAAAAAAAAEAAASU/QwA\ -XAQN/7r/vwP0AAEAAAAAAAAAAAAAAAAAAABDAAEAAABEAKsABQAAAAAAAgAAAAEAAQAAAEAALgAA\ -AAAAAQG7AZAABQAIApkCzAAAAI8CmQLMAAAB6wAzAQkAAAIABQMAAAAAAAAAAAAAEAAAAAAAAAAA\ -AAAAUGZFZABAAADpXAMz/zMAXASUAvQAAAABAAAAAAAAAXYAIgAAAAABVQAAAZAAAABXAAAB4P/c\ -A14AegMLAAAC0gAAAr//ugHWAAADCwAAAw4AAAMn/8gBrgAAASIAAAGQAAABfAAAAZAAAAGQAAAB\ -gQAAAZAAAAGQAAABgQAAAZkACQGYAAkB9AAAAQQAFAEEAAoCEQAAAhwAAAHAAAABSQAAAUoAAAFK\ -//4BLAAAAjAAAAHgAAABDQAyAMgAAAENAAABCwAUAW4AAAENADIBQP/9ARgAAAJYAAAAtgAAAIIA\ -AACCAAABLAAAASwAAADuAAAA/wAAAUkAAAGPAAAB2AAAAdgAAANTAAACM//wAyD/4QG1AAABtQAA\ -AkQADQJEAA0EDQAAAhwADAAAAAAAAAADAAAAAwAAABwAAQAAAAABJAADAAEAAAAcAAQBCAAAAD4A\ -IAAEAB4AAOAA4EjgUOBc4GLgaeB84IzgleCk4Kngs+EB4efiZOKA5KDkrOTA5M7k6uTu5QHlZ+Vp\ -5W3mUOZV6Vz//wAAAADgAOBH4FDgXOBi4GngeuCA4JTgoOCp4LPhAeHn4mDigOSg5KzkwOTO5OHk\ -7uUA5WflaeVs5lDmVelc//8AAyAEH74ftx+sH6cfoR+RH44fhx99H3kfcB8jHj4dxh2rG4wbgRtu\ -G2EbTxtMGzsa1hrVGtMZ8RntFucAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAwAAAAAAAAABAgAAAAIAAAAAAAAAAAAA\ -AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +var musicfont = 'url("data:application/x-font-ttf;base64,\ +AAEAAAAOAIAAAwBgRkZUTYGiLYcAAFMIAAAAHEdERUYAFQAUAABS7AAAABxPUy8yWLxbCQAAAWgA\ +AABWY21hcM7xzSEAAAPMAAADKmN2dCAAIgKIAAAG+AAAAARnYXNw//8AAwAAUuQAAAAIZ2x5ZvUw\ +oLYAAAgEAABCqGhlYWQNXJHdAAAA7AAAADZoaGVhCWn/CwAAASQAAAAkaG10eM2n+wQAAAHAAAAC\ +CmxvY2HVL+UYAAAG/AAAAQhtYXhwAMoBPQAAAUgAAAAgbmFtZcjHNnAAAEqsAAADGHBvc3TQFqwa\ +AABNxAAABR8AAQAAAAEAAGk1jGtfDzz1AAsEAAAAAADRlyIXAAAAANgjLVL/OPzvBUsEiAAAAAgA\ +AgAAAAAAAAABAAAEiPzvAFwEJf84/XQFSwABAAAAAAAAAAAAAAAAAAAAggABAAAAgwEMAAUAAAAA\ +AAIAAAABAAEAAABAAC4AAAAAAAEBlwGQAAUACAKZAswAAACPApkCzAAAAesAMwEJAAACAAUDAAAA\ +AAAAAAAAARAAAAAAAAAAAAAAAFBmRWQAQAAA6qQDM/8zAFwEiAMRAAAAAQAAAAAAAAF2ACIAAAAA\ +AVUAAAGQAAACWAAAAFcAAAFK/7ACE/+wANL/sAAjAAAAIwAAACMAAABkAAAEIwAABCUAAAHg/9wD\ +XgB6AwsAAALSAAACv/+6AdYAAAMLAAADDgAAAyf/yADIAAABrgAAASIAAAGQAAABfAAAAZAAAAGQ\ +AAABgQAAAZAAAAGQAAABgQAAAZkACQGYAAkB9AAAAQQAFAEEAAoCawAkAhIAAAHCAAABSQAAAUAA\ +AAFK//4BLAAAAjAAAAFKAAABSgAAAGQAAAE7AAABOwAAATsAAAE7AAABOwAAATsAAAE7AAABOwAA\ +ATsAAAE7AAABDQAAAMgAAAD/AAABCwAUAW4AAAENADIBbv/1AKkAAAE6AAABQP/9AFAAAAFAAAAB\ +QAAAARgAAAJYAAAAtgAAAIIAAACCAAABLAAAASwAAADuAAAA/wAAAUkAAAGPAAAB2AAAAdgAAANT\ +AAACM//wAyD/4QIz/7QBuP/bAV//fgIzAAACM//kAr//tAIz/7QCv/+0Ayv/2wFf/9sCaf9+AV//\ +fgJp/34BXwAAAf0ABQG1AAABtQAAAkQADQJEAA0BGAAAATYAAAEs//8BLAAAAPoAAADIAAABGP84\ +APoAAADIAAAEDQAAAhwADAH0AAAB9AAAAfQAAAH0AAAB9AAAAfQAAAB4AAAALQAAAhwAAAD6AAD/\ +6gAAAAAAAwAAAAMAAAAcAAEAAAAAAiQAAwABAAAAHAAEAggAAAB+AEAABQA+AAAAIOAA4CTgMOA5\ +4EPgSOBQ4FzgYuBp4H3gjOCV4KTgqeCz4QHhueG74efiSeJk4oPkoOSi5KTkqOSs5MDkzuTq5O7l\ +AeUi5SXlLeUx5TnlZ+Vp5W3lguXQ5eLmEOYS5hTmGOYk5jDmUOZV6RLpFekY6SDpJeld6gLqpP//\ +AAAAAAAg4ADgIuAw4DjgQ+BF4FDgXOBi4GngeuCA4JTgoOCp4LPhAeG54bvh5+JA4mDigOSg5KLk\ +pOSo5KzkwOTO5OHk7uUA5SDlJOUp5S/lOeVm5WnlbOWC5dDl4uYQ5hLmFOYY5iTmMOZQ5lXpEOkU\ +6RjpIOkl6V3qAuqk//8AA//kIAUf5B/ZH9IfyR/IH8Efth+xH6sfmx+ZH5IfiB+EH3sfLh53HnYe\ +Sx3zHd0dwhumG6UbpBuhG54bixt+G2wbaRtYGzobORs2GzUbLhsCGwEa/xrrGp4ajRpgGl8aXhpb\ +GlAaRRomGiIXaBdnF2UXXhdaFyMWfxXeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGAAADAAAAAAAAAAECAAAA\ +AgAAAAAAAAAAAAAAAAAAAAEAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAACICiAAAACoAKgAqADYAZgDOARABpgI4ApICpgNCA9QELAROBGIEtAUEBSQFagWqBeQG\ -MAZwBrYHEAckB0oHcAesB8gH9ggiCDwIVgiMCJoIrAjSCOwJHAlGCaIJyAnwCgAKKApOCloKZgpy\ -Cn4KoArGCvwLSguqDB4MNAxaDIgMzA0WDTANVA40DvAPDgAAAAIAIgAAATICqgADAAcALrEBAC88\ -sgcEAO0ysQYF3DyyAwIA7TIAsQMALzyyBQQA7TKyBwYB/DyyAQIA7TIzESERJzMRIyIBEO7MzAKq\ -/VYiAmYAAAEAAAAAAZEBkAADAAAxESERAZEBkP5wAAEAAAAAAFcEAwAgAAARNTY1NCcmNTQ3BhUU\ -FxYVFAcWFRQHBhUUFyY1NDc2NTQ1IxJXPxUlTU0lFT9XEiMCAwIYQzZgOTRmOjJLIjlhTWEYGGZM\ -YDklSjI6ZjQ5YDZIAAP/3AACAd4CswAHAA8ARwAAACImNDYyFhQEIiY0NjIWFBc0NjMyFhUUBxYz\ -MjY1NCcmJwMnEyY1NDc2MhYVFAYjIiY1NDcmIyIGFRQXFhcTFwMWFRQHBiImAZ4gGBggGP5+IBgY\ -IBhbGxQTHiwYKCdBMDxBzyvTmDgoYDgbFBMeLBgoJ0EwQTvUK9eYOChgOAFSGCAYGCBUGCAYGCDY\ -EhwaER0OGC8lKDAtOP7eIAEmj2A1LxQzIRIcGhEdDhgvJSgwMTQBJh/+1pBgNS8UMwAFAHr/NANe\ -AlQAFwAbAB8AIwAnAAABMxUeARczFSMOAQcVIzUuAScjNTM+ATcRIxYXNxU2NyczJicHNQYHAdgo\ -VXgHiooHeFUoVXgHiooHeFVwBWsoawVwcAVrKGsFAlSJCItgKGCLCImJCItgKGKJCP7lug7IyA66\ -KLoOyMkOuwAAAAAEAAD9gQKnBJQAPwBGAFoAZwAAATYzMhYXFhUUBwYHFxYVFAYjIiY1NDYzMhYV\ -FAYHFjMyNTQvAQYjIiY1NDc+ATc+AjcuAjU0NjceARUUBgcbATY1NCYjCwEOARUUFy4BNTQ2NycO\ -AQcSITIDBhUUFz4BNTQmJw4BAY8SCzVnID98QisQAkVPUWBAMi5CPjAbKmUBEQscr8E5El4mBi0w\ -FwMKBW9ROx5beR8fq25OFSA3Ry8yM2BJEY9sAQUBLwQpBAdJcBgaO0UBCgIqJkR7lDwiBLsgDlBN\ -WEEsQEQtKzIBD4ASCr4Bt6yEZiNkHgUoKBEhdUgdip4YQHlyiahf/rX+nieRQGr+ngFeCkAwLToM\ -WjpGYhS9cpdn/tYEDiEuUiMxj0gpTw8HdwACAAD9/ALSAgAAZABoAAABMjY1NCcmIyIHDgIHJicm\ -JxEjETMRNjc2Nx4DFxYzMjY1NCcmIyIHFhcUFhUUBisBJjU0NzY3NjMyFxYXFRQGBwYjIicHFzYz\ -MhYXFh0BBgcGIyImNTQ3MzIWFRQGFQYHFgEzESMB3j5KDRpJRjwCBgoEIhoeLhwcLh4aIgYUDBkP\ -JyUxPRIkUi8xMg0CMyEFRAUaVScjXlU3CFpIHy00PyIiPzRCZh4oCDdWXUxyRAUhMwIPMDX+TXt7\ -/iB4Si0tbEkFDhsKYicrH/4EBAD+ER8rJ2ILKhcdCRt7QjE2YhoQKAMNBB4rGTIUC0QZDU80UxJO\ -bxwNF0tKFz4sOUMSUzRQTjwyGSseBA4EJhAcA978AAAAA/+6/aUCwwD/ACYAMQA9AAA3NDYzMhcW\ -FRQHDgEHNjc2NzY1NCcuASMiBgc+ATMyFhUUBwYjIiYFIiY1NDYyFhUUBiciJjU0NjMyFhUUBhOM\ -ZqNLLJdU9oTwdVskCzgeOSg8Zg0XGxwuRychLThGAoIWHRkqHhoaFxsaFxQcGylgdm1Bb/aISm4H\ -QH1erj0xfkEhGFJEHRBLLzIgHmeSHBcWHB0VFh3yHhkWGRsUGR4AAAAAAgAA/wYBcgD6AAMABwAA\ -NzMTIwMzEyPclAKW3JQClvr+DAH0/gwAAAQAAP4KAh8DqgAJACAAYgBtAAAlFhc+ATU0JiMiAwIn\ -DgEVFBcuATU0NjcmJw4BBx4BMzIXHgEfAR0BFCMiJjU0NjMyFhUUBgcWMzI2NTQvAQYjIiY1NDc+\ -ATc+AjcmNTQ2Nx4BFRQGBx4BFzYzMhcWFRQHBgMGFRQXPgE1NCcGAUkTBk1HVkIODRgBLDkfICpM\ -OwUJcVUBBW2CAyIDBgICejZTMyglNTEnFSIjLAENCRWNmS4OTB4FIycSDllALxlJYQIIBBIIXDky\ -YzZkAwY3XilfdcRbEk8zNlb+4AELEAk0JykmEkEpOE4QPlpaeVNxfhogQBcXGwd/SDEkMzckIigB\ -DDM1DwmNAZKKalEcUBgEICENwgdufxMzYltth0wRbiQCQzZidzAbA1YeIjkkJXszRiYmAAIAAP5j\ -AkIBmgBjAGcAAAEyNjU0JyYjIgcOAQcmJyYnESMRMxE2NzY3HgMXFjMyNjU0JyYjIgcWFxQWFRQG\ -KwEmNTQ3Njc2MzIXFhcVFAYHBiMiJwcXNjMyFhcWHQEGBwYjIiY1NDczMhYVFAYVBgcWATMRIwF+\ -MjsKFTo4MAIMBB0TGCUWFiUYEx0EEQoTDCAdJzEOHEMlJygKAioaBDYEFUQjGElGLQZIOhglKzEb\ -GzQoNVIYIAYtRkk9WzYEGioCDCYr/qNiYv6AYDskJFc7BR0LUhwiGf5qAzP+dBkiHFIIIhIXCBZi\ -NSsoThUNIAILAxgiFCgQCTUVC0ArQQ4+WhYKEjw7EzIjLjUPQStAPzAoFCMYAwsDHw0WAxj8zQAA\ -AAAD/8j+HgI2AMwAJgAvADsAADc0NjMyFxYVFAcOAQc2NzY3NjU0Jy4BIyIGBz4BMzIWFRQHBiMi\ -JgUiJjQ2MhYUBiciJjU0NjMyFhUUBg9wUoI8I3hDxmnAXkceCS0YLSAwUgoSFhYlOSAZJSw5AgIS\ -FxQiGBUVEhYVEhEWFSFNXlczWsZsO1cGM2RKjC8pZjMaFEI2Fw08JigaGFN1FyQWFyIYwhgUERQV\ -EBMZAAAAAAIAAP8GAa4A+gALABQAADMUFjMyNjU0JiMiBgc0NjIWFAYiJooqIyIrJyYlKIp9tH19\ -tH1ieHlhZXV2YWeQkdKRkgAAAQAA/wYBIgD6AAkAADE3MxEXFSM1NxFkfUHwQfr+Ph4UFB4BLAAA\ -AAEAAP8GAY8A+gA8AAA3MhUUBw4DBzYzMhYzMjc+AjMOAgcGBwYjIiYjIgYjIjU0Jz4FNTQnIgcy\ -FhUUBiMiNTQ+AcfIBQ02QG82EyAbZBwYHgUQDAEBBQUBBxAaKRp0FR9WAgcBAiw+RzwoU04aHCk3\ -Hkw8WPp+Gg4hLh1ELQwjDgMNCwUWFgMpDhgnJhABAiFFODwyOBhiATUlHh8pZyg5GQAAAQAA/wYB\ -dQD6ADkAADcyFhUUBiMiJjU0NzYzMhcWFRQGBx4BFRQHBiMiJicmNDYzMhYVFAYjFjMyNjU0Jicm\ -NDc+ATQmIyJmGyInIRsyHzNZRiZERj0+UUskTSdXGCMyICIqJRsMPyQrSC4WFi9LKSQ8qhwXGyMr\ -Iy8aKhMiSC5ECwtFLUMnExYUHUwuIRsZHikxJyY6CAQiBAk3UDAAAAEAAP8GAZAA+gARAAAFFyM3\ -NSM1NjUzATM/AREzFSMBRTLIMuGTo/77sAFjS0vRKSkxKPKA/o6Wkf7ZKAAAAAABAAD/BwF+APoA\ -LwAAFzYzMhYVFAYjFjMyNz4BNTQnJiMiBxMhDgErAQc2MzIXHgEVFAcOAiMiJy4BNTQSHCEbKiAc\ -GiQxHBMJHhwoTkgKAWILNSXVBjlCUzEhK0MWQCslPCsQHl8gIBccICEeFB8gORwaNQEiJDp5Hh8V\ -QSVPLxAQAhQJMhIjAAAAAAIAAP8GAYEA+gAJACwAABcyNjU0JiMiBxYTFhUUBiMiJjU0NjMmIyIG\ -FT4CMzIWFRQGIyImJz4BMzIWyCktKigsMAfdGyMYHiIbEBY3NS8VGC0eTE9xSGFmAQFsWzA/0kUs\ -IjAlngGfGiYZKB4bDB4jeF8LCglANkRZgnhpkRIAAQAA/wYBkAD7ACgAADciDgMHNz4IMzIWMzI2\ -Nw4EFSM2NzY3NjcGIyImYRQaFAkRBQoBDAILBQsJDRAJL3UjGjsRG0UaHgiCAQgRaB4tER4lYKEF\ -DgkbBnQBCwIJAQYBAwEmFw5Dp0FcQitFGzaHJzkKKAADAAD/BgGEAPoADgAcADQAABcOARUUFjMy\ -NjU0LgM3PgE1NCYiBhUUHgMHLgE1NDY3MhYVFAYHHgEVFAYjIiY1NDaaNixYLCo/DyAdMT4zI0RS\ -MwocEjFwMSlmSktlKjA6MnVNTHY5KhkkGx0wKR8OFxINE1oaIhwdMCggDxcTChU/GDw1M00BRjIn\ -NBcaOjU3SkgwJDUAAAIAAP8GAYEA+gAJACwAADciBhUUFjMyNyYDJjU0NjMyFhUUBiMWMzI2NQ4C\ -IyImNTQ2MzIWFw4BIyImuSktKigsMAfdGyMYHiIbEBY3NS8VGC0eTE9xSGFmAQFsWzA/0kUsIjAl\ -nv5hGiYZKB4bDB4jeF8LCglANkRZgnhpkRIAAQAJ/woBmQD5ADAAACUwFzY1NCYjDgEVFBcWMzI3\ -NjcUHgEVDgEHIicmJzQmNTQ3MhYXFhUUBiMiJjU+ATMBLxIEPB8yQSchMCsoHCoJCBtVVk87OwQB\ -2yRAESIkHCApAiAapAMFCBQiAmVrjjMqIhhYAQQDAVVQATk5ZgIrAuYCHhQnJCU5LhwWJgACAAn+\ -ogGZAV4AOAA/AAAlMBc2NTQmIyIHERYzMjc2NxQeARUOAQcjFSM1JicmJzQmNTQ3NTMVMjYzMhYX\ -FhUUBiMiJjU+ATMDEQYVFBcWAS8SBDwfAxAMDCsoHCoJCBtRVQEjPS47BAGrIwMHAyRAESIkHCAp\ -AiAaej0nCqQDBQgUIgT+SwQiGFgBBAMBVFEBaGsJLTlmAisCyxlpZgEeFCckJTkuHBYm/pcBli6R\ -jjMNAAABAAD/BgH0APoACwAANTM1MxUzFSMVIzUj10bX10bXI9fXRtfXAAAAAQAU/gYA4wIAABMA\ -ABMWBwYnJgI1NBI3NhcWBwYCFRQS3AcNCQVJa2tJCQsGBjxGR/4WCAUDBlcBIH18ASJWCwcGCEn+\ -54iG/uUAAAEACv4CANwB/QATAAATNhI1NAInJjc2FxYSFRQCBwYnJhQ7R0Y8CQwKB0lra0kICwb+\ -FkkBG4aIARlJCwQECVb+3nx9/uBXCQkEAAAEAAD/TAIRAKoAAwAHABsAJQAAJTMRIwEzESM3BhUU\ -Fx4BFzMyNzY0Jy4BJzAjIgQUBiMiJjU0NjIB6Sgo/hcnJ5cFAwpVLg0zEwUDCVYuDTYBQXlnZnp5\ -zqr+ogFe/qLzDA4LCyJHBCMJHAsiRwQmeEVEOD9HAAACAAD/JAIcANwAAwAPAAA3FSE1JTMVITUz\ -ESM1IRUjGQHq/f0ZAeoZGf4WGUaMjJYyMv5IMjIAAAIAAP9/AcAAgQATAB0AADcGFRQXHgEXMzI3\ -NjQnLgEnMCMiBBQGIyImNTQ2Mm8FAwpVLg0zEwUDCVYuDTYBQXlnZnp5zj8MDgsLIkcEIwkcCyJH\ -BCZ4RUQ4P0cAAgAA/2wBSACUAA0AGwAAJSYjIgYVFBcWMzI2NTQ3FhUUBiMiJyY1NDYzMgEkDSU8\ -lwYLJjyXEA9+SE8kD35IT0QXYSsKCRdhKwkXHh1DZ0MeHUNnAAAAAAEAAP90AUoAiwAOAAAVNDY3\ -NjMyFhUUBwYjIiZdSB4RM0OlGBsxQSE+VBMHODJ1MAg5AAAB//7/bwFMAJEACwAAJzcXNxcHFwcn\ -Byc3AhuMjBuGhhyLixyGcSB2dSBwcCF1dSFwAAAABQAA/2oBLACWAAUACwARABcAHwAAFwcWMzI3\ -LwEGFRQXPwEmIyIHHwE2NTQnBjQ2MhYUBiKWRx0qKR9dRx0dXEgfKSodXEcdHfJYfFhYfBJIHR1a\ -SR8pKh1YSB0dWkgfKSodhXxYWHxYAAAAAQAA/wYCMAD6AAMAABUBMwEBuHj+R/oB9P4MAAEAAP/O\ -AGQAMgAHAAAWIiY0NjIWFEcqHR0qHTIdKh0dKgAAAAIAMv9kAQ0BsAAKABYAADciBh0BNjc2NTQm\ -NzIWFRQHBiMRMxE2lBUqHCwuIAciOU9SOiMjeh4SywNCPzYbJiYyI0VQUgJM/rw0AAACAAD+hgDF\ -AXoAAwAMAAAXNzUHERU3ESM1BxE3HJCQqRmsAWUtli0BSeg0/cDiMwJDAQAAAgAA/o8BDAF1AAMA\ -HwAANxU3NQMjNQc1NzUHNTc1MxU3NTMVNxUHFTcVBxUjNQdSZmYZOTk5ORlmGDw8PDwYZk20HLX+\ -Ja8RVQ63EFcOsqoat68PUxK0D1MPsaodAAAAAQAU/4QBCwB6AB4AABc1JicHMBUjNTM3JzAjNTMV\ -Fhc3MDUzFSMGBxcwMxXDKAwzSDkzMzlIIRI0SDkhEzQ5fDsmDTM7SjIySDkiETM5RyIRNEgABAAA\ -/2oBbAGwABAAHgAtADwAADcOAR0BMjc2NzY3NjU0JyYjNzIWFRQHBgcGIxEzETYXDgEdATI3Njc2\ -NTQnJiM3MhYVFAcGBw4BIxEzETZOER4LGwQCHwwEChARGR0rCRgrNS8fGdERHQ0hHQsGCxAPFh8q\ -CxkoFjcWHht9AR4QyyYFAys0DRkeFBUmOSESIDk0QAJG/sEyJgEdEcsuLzATExwWFSY2JBYcPi8b\ -JQJG/sEyAAAAAAIAMv9kAQ0BsAAKABYAADciBhUUFxYXNTQmJzIXETMRIicmNTQ2qxcgLi4aKjM6\ -IyM6Uk85eiYbMEVCA8sSHiY0AUT9tFJQRSMyAAAB//0AAAE/APQAGAAANwYjIiY1ND8BNi8BJjU0\ -NjMyMRcFFhUUBxICAwcJBs8ODs0ICwcBAgEfDg4BARAICgNJBwZPAwsKEgFrBg4NBQAAAAEAAAAA\ -ARgBNQAFAAAxGwEjJweMjEFYWgE1/svGxgAAAgAAAAACWAFKAA4AGQAAMTQ2MzIeAhUjLgEiBgch\ -IiY0NjMyFhUUBrN5OWtVMwoLpuKmCwEhFyUlFxkjI5iyLFGATW6Ghm4kMCQkGBkjAAABAAAAAAC2\ -AS0AFwAAEzIWFxYVFAcOASMnJjU0NjU0Iy4BNTQ2VhsbEBoyGUQQBgFHFBsoLQEtDBEdMD08HS0D\ -AQIIaxMPASYcHjEAAQAA/wYAggD6AAMAADUzEyOAAoL6/gwAAQAAAAAAggD6AAMAADUzFSOCgvr6\ -AAAAAQAA/4MBLAAAAAMAADEhFSEBLP7UfQAAAQAAAAABLAB9AAMAADUhFSEBLP7UfX0AAQAA/n4A\ -6wGHABMAABMXBxcmIyIGFRQXJjU0NjMyFyc3Kb1nbDI0HyY4eDQlIiKHZAGH5dnPLiQdNTRLTSMt\ -Fby0AAABAAD/DQEAAMAAFgAANw4CIyImNTQ2MhYVFAcyNjc2MhcDJ6sDGRoTKzcmOCkXIjMhAhUD\ -ljA8AQcEKSgfIB4ZHRshLAIC/m8QAAAAAQAA/gwBSADAACQAABcGIyImNTQ2MzIWFRQHMj8BBiMi\ -JjU0NjMyFhUUBzI3NjIXAyerKCErNycbHCkXQQs8NhgrNycbHCkXSC4CFQPFLcQMKCggIB8ZHRsi\ -ygwpKB8gHhkdG00CAv1uDAAAAQAA/gwBjwHAADYAADcGIyImNTQ2MzIWFRQHMj8BIg4BIyImNTQ2\ -MzIWFRQHMjc2MhcBJxMGIyImNTQ2MzIWFRQHMjf2KB8rNycbHCkXPws6ASAcEys3JxscKRdILgEW\ -A/70LVUoISs3JxscKRdBCzwMKCggIB8ZHRsiywkEKSgfIB4ZHRtNAgL8bgwBJAwoKCAgHxkdGyIA\ -AAAAAQAA/QwB2gHAAEUAABMGIyImNTQ2MzIWFRQHMj8BBiMiJjU0NjMyFhUUBzI/AQYjIiY1NDYz\ -MhYVFAcyPwEiDgEjIiY1NDYyFhUUBzI3NjIXASerKCErNycbHCkXQQs6KCErNycbHCkXQQs6KB8r\ -NycbHCkXPws6ASAcEys3JjgpF0guAhUD/qkt/jwMKCggIB8ZHRsiygwoKCAgHxkdGyLKDCgoICAf\ -GR0bIssJBCkoHyAeGR0bTQIC+24MAAAAAQAA/QwCGQKuAFYAACUGIyImNTQ2MzIWFRQHMj8BBiMi\ -JjU0NjMyFhUUBzI/ASIOASMiJjU0NjMyFhUUBzI3NjIXAScTBiMiJjU0NjMyFhUUBzI/AQYjIiY1\ -NDYzMhYVFAcyNwE/KCErNycbHCkXQQs2KB8rNycbHCkXPws0ASAcEys3JxscKRdILgEWA/5qLVUo\ -ISs3JxscKRdBCzooISs3JxscKRdBCzQMKCggIB8ZHRsixAwoKCAgHxkdGyLHCQQpKB8gHhkdG00C\ -AvqADAEkDCgoICAfGR0bIsgMKCggIB8ZHRsiAAEAAP8aA1IA5gALAAA1MxUhNTMRIzUhFSMZAyAZ\ -GfzgGeZ9ff40fX0AAAAAA//w/wYCJgD6AAcADwATAAA2IiY0NjIWFAAiJjQ2MhYUBQEzAVAyIyMy\ -IwGIMiMjMiP90gG4fv5HSyMyIyMy/s8jMiMjMloB9P4MAAT/4f8GAwcA+gAHAA8AEwAXAAA2IiY0\ -NjIWFAAiJjQ2MhYUBQEzATMBMwFBMiMjMiMCdzIjIzIj/OMBuHv+R3kBuHv+R0sjMiMjMv7PIzIj\ -IzJaAfT+DAH0/gwAAQAA//0BtQDUAC8AACUyNjU0JwYjIjU+ATMyFhUUBwYjIi8BJiMiBhUUFzYz\ -MhUUByInJjU0NzYzFh8BFgF2FRwWFBIcAQ8JIC0pFxwkHqggDxYcFRQTHBkZGBwoFiAoF6giJSkc\ -JxAMGw8VQiYzJBUVghYoHicPDB0gAxoiLTMkEwIQghcAAAEAAP/NAbUBAwA2AAAXIiY1NDc2MxYf\ -ATUzFRcWMzI2NTQnBiMiNT4BMzIWFRQHBiMiLwEVIzUnJiMiBhUUFzYzMhUUTSAtKBYgKBcuHlwi\ -DxUcFhQSHAEPCSAtKRccJB4uHlwgDxYcFRQTHANDJjMkEwIQJGmARxcpHCcQDBsPFUImMyQVFSRs\ -g0cWKB4nDwwdIAABAA0AAAJFAOAACwAANyc3FzcXNxcHJwcnIhWOZXhqTRaSaXRpLhmZfHx8VBeh\ -fHx8AAAAAQAN/8sCRQERABMAACUHJwcnNxc3NTMXNxc3FwcnBxUjARZAaUsVjmUWGwFGak8UkmkZ\ -G0ZGfE4ZmXwXlntKfFUYoXwblgAABAAA//wD9AJ/AAkAlACgAKoAAAUiJjQ2MzIWFAYlJjU0NzYz\ -MhYVFAcOBwcWMzI2NTQ2Ny4CPQEeARUUBiMiJwYjIiYnDgEiJicmIyIGBwYjIjU0Njc+CTc2NTQm\ -NTQ/AQ4BFDMyNxcOASMiJjU0PgIzMhYVFAYjIiYnNxYzMjY1NCYnBwYVFBYVFA8BHgEzMj4GNz4B\ -NTQnJiMiBhUUBTY1NCYnDgEVFAPWCxMTCwwSEf3pIxwgThsjCgQMCxAKEgcSASosFTJDXSCBXrq0\ -UUJBIyQ8IkETMCYgGxwaEg0tA1csCjohDhsPEQYKAwcDCQMCQgI0WnIgNRwQKTYwFBcfPXFIfntC\ -JR05EQ0aNCEsXF8mAkYBJhE7DwQHBwkHDAgSLDUiBAQWHC8BPFoXEj8zAhIYEhIYEl84JTUlKykf\ -IRMJEQ4QCg8GDgEzMBpSXxksWTQGATyxa0ZfOTooGCkbFiAtIwE6BwszFAgRBgwCEAMZDCkOCAIW\ -QR4HDNcHWFAwCEUsIRofSEcvXDwlPispDC0dGyNJBaAIBhlEGggEowxYAgIHBAsHDyAwLyAHDhI5\ -KyJwBYEiSRUdWUM+AAIADAAKAdMBzwAKAI8AACU0JiMiBhQWMzI2Jw4BIyImNDYzMhYXNjU0JyYj\ -IiY0NjMyFx4BFxYzMjU0Jy4BNTQ2MzIWFRQGBxQzMjc+ATc2MzIWFRQGIyIGBwYVFDMyNjMyFhQG\ -IyImIyIGFRQXHgEXFhUUBiMiJy4BJyYjIhUUFhUUBiMiJjQ2NTQjIgcOAQcGIyImNTQ3NjMyNzY1\ -NAEWGA8QFRYPEBeJGSYOGRsaGQ0qGCUMFBgdHBkXEhALAxQLEhQBAiceFBIbIwEWEA0RAQ0MGhMe\ -GxIbFQ0QIRsrDhwbHRkPJxQXEgsUOA0OGRcTFAwBExEKEiogExIdJhcNDhIDERIMFBoNDBYjEg3u\ -EBQTIhYVCgElGSobJQIDFg4KExwoHQwLPhYNGA0IFycPFxobFhEjGSoQEzgPDhsUESMGCw4PFicd\ -KBomCAoWChIDCw0ZExsOCzkVDx8eMBMUGBokMRckDhI9DAcWFBgODRINDBoAAAACAAD95AIdANwA\ -AwAPAAA3FSE1JTMVITUzEyMDIRUjGQHq/f0ZAeoZARkB/hYZRoyMljIy/QgBcjIAAAAAAAwAlgAB\ -AAAAAAABAAcAEAABAAAAAAACAAcAKAABAAAAAAADACIAdgABAAAAAAAEAAcAqQABAAAAAAAFAAsA\ -yQABAAAAAAAGAAcA5QADAAEECQABAA4AAAADAAEECQACAA4AGAADAAEECQADAEQAMAADAAEECQAE\ -AA4AmQADAAEECQAFABYAsQADAAEECQAGAA4A1QBhAGIAYwAyAHMAdgBnAABhYmMyc3ZnAABSAGUA\ -ZwB1AGwAYQByAABSZWd1bGFyAABGAG8AbgB0AEYAbwByAGcAZQAgADIALgAwACAAOgAgAGEAYgBj\ -ADIAcwB2AGcAIAA6ACAAOQAtADMALQAyADAAMQA4AABGb250Rm9yZ2UgMi4wIDogYWJjMnN2ZyA6\ -IDktMy0yMDE4AABhAGIAYwAyAHMAdgBnAABhYmMyc3ZnAABWAGUAcgBzAGkAbwBuACAAMQAuADAA\ -AFZlcnNpb24gMS4wAABhAGIAYwAyAHMAdgBnAABhYmMyc3ZnAAAAAgAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAABEAAAAAQACAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgET\ -ARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8B\ -MAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgYubm9kZWYHdW5pRTAwMAd1bmlF\ -MDQ3B3VuaUUwNDgHdW5pRTA1MAd1bmlFMDVDB3VuaUUwNjIHdW5pRTA2OQd1bmlFMDdBB3VuaUUw\ -N0IHdW5pRTA3Qwd1bmlFMDgwB3VuaUUwODEHdW5pRTA4Mgd1bmlFMDgzB3VuaUUwODQHdW5pRTA4\ -NQd1bmlFMDg2B3VuaUUwODcHdW5pRTA4OAd1bmlFMDg5B3VuaUUwOEEHdW5pRTA4Qgd1bmlFMDhD\ -B3VuaUUwOTQHdW5pRTA5NQd1bmlFMEEwB3VuaUUwQTEHdW5pRTBBMgd1bmlFMEEzB3VuaUUwQTQH\ -dW5pRTBBOQd1bmlFMEIzB3VuaUUxMDEHdW5pRTFFNwd1bmlFMjYwB3VuaUUyNjEHdW5pRTI2Mgd1\ -bmlFMjYzB3VuaUUyNjQHdW5pRTI4MAd1bmlFNEEwB3VuaUU0QUMHdW5pRTRDMAd1bmlFNENFB3Vu\ -aUU0RTEHdW5pRTRFMgd1bmlFNEUzB3VuaUU0RTQHdW5pRTRFNQd1bmlFNEU2B3VuaUU0RTcHdW5p\ -RTRFOAd1bmlFNEU5B3VuaUU0RUEHdW5pRTRFRQd1bmlFNTAwB3VuaUU1MDEHdW5pRTU2Nwd1bmlF\ -NTY5B3VuaUU1NkMHdW5pRTU2RAd1bmlFNjUwB3VuaUU2NTUHdW5pRTk1QwAAAAAAAAH//wACAAAA\ -AQAAAADVs2WlAAAAANGXIhcAAAAA1qodLQ==\ +AAAAAAAAAAAAAAAAAAAAAAAAIgKIAAAAKgAqACoANgA+AG4AfACKAJgApACwAL4A3AFQAawCHAJe\ +AvADggPkA/gElAUmBX4FvAXeBfIGRAaUBrQG+gc6B3QHwAgACEYIoAi0CNoJAAkyCU4JcAmcCbIJ\ +zAoCChAKHAooCjoKVApuCqIK1gsqC3QL1AwyDKgNHA1CDVwNjA22Dg4ONA6ODq4O7A8UDygPNA9C\ +D1IPeg+gD6wPuA/ED9AP8hAYEE4QnBD8EXARhhGsEdoSPhK2ExQTXBO4FRIWHhbYF5gYaBkEGeIa\ +/hwAHEIchhzQHOodDh0iHTYdZh12HYgdpB26Hd4eDh7wH6wf1B/yICQgYiCUINYg6CD2IRIhLCFU\ +AAIAIgAAATICqgADAAcALrEBAC88sgcEAO0ysQYF3DyyAwIA7TIAsQMALzyyBQQA7TKyBwYB/Dyy\ +AQIA7TIzESERJzMRIyIBEO7MzAKq/VYiAmYAAAEAAAAAAZEBkAADAAAxESERAZEBkP5wAAEAAAAA\ +AAAAAAAAAAAxAAABAAAAAABXBAMAIAAAETU2NTQnJjU0NwYVFBcWFRQHFhUUBwYVFBcmNTQ3NjU0\ +NSMSVz8VJU1NJRU/VxIjAgMCGEM2YDk0ZjoySyI5YU1hGBhmTGA5JUoyOmY0OWA2SAAB/7D/7AGa\ +ABQAAwAAJyEVIVAB6v4WFCgAAAAAAf+w/+wCYgAUAAMAACchFSFQArL9ThQoAAAAAAH/sP/sASIA\ +FAADAAAnIRUhUAFy/o4UKAAAAAABAAAAAAAjA+gAAwAAETMRIyMjA+j8GAABAAAB9AAjA+gAAwAA\ +ETMRIyMjA+j+DAABAAAC+AAjBFYAAwAAETcRIyMjBEwK/qIAAAAAAgAAAUAAZAKeAAcADwAAEiIm\ +NDYyFhQCIiY0NjIWFEcqHR0qHR0qHR0qHQI6HSodHSr+6R0qHR0qAAAABQAAAAAEJAGuAC8ANwA/\ +AEcAUwAAITUzHgEzMjY1NCcuBDU0NjMyFhc3MxcjLgEjIgYVFB4DFx4BFRQGIyInByAiJjQ2MhYU\ +BCImNDYyFhQBETMyNjQmIwM1MxEjNTMyFhUUIwJOHhVPMik7lBkaKhYRWT0kJxkeHgceD0owHzkQ\ +IhkyCE5NW09FLiMBmyodHSod/eoqHR0qHf6JKDxGRjzcRkbccYn6oDxLICEtKAcIFBQjFUNNCw4Z\ +mzpIKBsPFw8JCwIVNzM6TiAgHSodHSodHSodHSoBaf6YYaZh/noeAWgeZ2vSAAUAAAAABCQBrgAa\ +ACIAKgAyAD4AACEiJjU0NjMyFhc3MxcHJiMiBhQWMzI2NxcOATIiJjQ2MhYUBCImNDYyFhQBETMy\ +NjQmIwM1MxEjNTMyFhUUIwMCZ3WCWiUpGx4eCCEkXjg2Njg2TREjFFmxKh0dKh396iodHSod/oko\ +PEZGPNxGRtxxifprZ2V3DBIepgSMbZhtST4KSlEdKh0dKh0dKh0dKgFp/phhpmH+eh4BaB5na9IA\ +AAAD/9wAAgHeArMABwAPAE0AAAAiJjQ2MhYUBCImNDYyFhQXNDYzMhYVFAcWMzI2NTQvAQMnEy4B\ +NTQ+ATc2MzIWFRQGIyImNTQ3JiMiBhUUHwETFwMeARUUDgEHBiMiJgGeIBgYIBj+fiAYGCAYWxsU\ +Ex4sFykmNiZ7zyvRWkgcExQmMzA4GxQTHiwXKSY2JnrUK9VaSBwTFCYzMDgBUhggGBggVBggGBgg\ +0xIcGhEdDhctJi0mZf7eIAElR3E4Fi0RERM4IRIcGhEdDhctJi0mZQEmH/7XR3I4Fi0RERM4AAUA\ +ev80A14CVAAXABsAHwAjACcAAAEzFR4BFzMVIw4BBxUjNS4BJyM1Mz4BNxEjFhc3FTY3JzMmJwc1\ +BgcB2ChVeAeKigd4VShVeAeKigd4VXAFayhrBXBwBWsoawUCVIkIi2AoYIsIiYkIi2AoYokI/uW6\ +DsjIDrooug7IyQ67AAAAAAQAAP1vAqcEiAALAEgAUgBnAAABBhUUFz4BNTQnDgETFxQVFAYjIiY1\ +NDYzMhYUBgcWMzI2NTQ1JwYjIi4CNTQ3PgY/ASY1NDY3FhUUBgcXNjMyFhUUJzQmIyIGIxM+AScO\ +ARUUFhcuATU0NycOAQceATMyNwFsBwVIdTY5QksXT01SX0AyL0E/Ly0YLkEXFBVJhmc9Og0kIC4d\ +MRIXFg1sSWJceRQQD3GITmJQAgcCIVtB4jZGJx09P6YRj2wBAqB6EBADUzYuF2YxlUhyDQde+2zs\ +AQJMXFNBLUg7WDcBGT1FAgHpAjNbh0+FZhcwJS0aJw4REJZmjKEHOuWIqV/PAp1yzro9ZwH+nRJd\ +8gtGMSBCEg5FR6kuvXKXZ42jAgAAAAACAAD9/ALSAgAAZABoAAABMjY1NCcmIyIHDgIHJicmJxEj\ +ETMRNjc2Nx4DFxYzMjY1NCcmIyIHFhcUFhUUBisBJjU0NzY3NjMyFxYXFRQGBwYjIicHFzYzMhYX\ +Fh0BBgcGIyImNTQ3MzIWFRQGFQYHFgEzESMB3j5KDRpJRjwCBgoEIhoeLhwcLh4aIgYUDBkPJyUx\ +PRIkUi8xMg0CMyEFRAUaVScjXlU3CFpIHy00PyIiPzRCZh4oCDdWXUxyRAUhMwIPMDX+TXt7/iB4\ +Si0tbEkFDhsKYicrH/4EBAD+ER8rJ2ILKhcdCRt7QjE2YhoQKAMNBB4rGTIUC0QZDU80UxJObxwN\ +F0tKFz4sOUMSUzRQTjwyGSseBA4EJhAcA978AAAAA/+6/aUCwwD/ACsANwBDAAA3NDYzMhYXFhUU\ +BgcOAQc+ATc+ATc2NTQmJy4BIyIGBz4BMzIWFRQHBiMiJgUiJjU0NjMyFhUUBiciJjU0NjMyFhUU\ +BhOLZ1VrKy9CVWjVkXevSDEsEw4RHR80MD9iERcjHC49JyExM0UCghYdGhQVHhoaFxscFRQcGx1i\ +gDQ5PnJ/sE9iVQggVUgxVFA7akdQIyQdTE0dFEEvMiAeUYocFxYcHRUWHfIeGRUaGxQZHgAAAAIA\ +AP8GAXIA+gADAAcAADczEyMDMxMj3JQCltyUApb6/gwB9P4MAAAEAAD+CgIfA6oACQAgAGIAbQAA\ +JRYXPgE1NCYjIgMCJw4BFRQXLgE1NDY3JicOAQceATMyFx4BHwEdARQjIiY1NDYzMhYVFAYHFjMy\ +NjU0LwEGIyImNTQ3PgE3PgI3JjU0NjceARUUBgceARc2MzIXFhUUBwYDBhUUFz4BNTQnBgFJEwZN\ +R1ZCDg0YASw5HyAqTDsFCXFVAQVtggMiAwYCAno2UzMoJTUxJxUiIywBDQkVjZkuDkweBSMnEg5Z\ +QC8ZSWECCAQSCFw5MmM2ZAMGN14pX3XEWxJPMzZW/uABCxAJNCcpJhJBKThOED5aWnlTcX4aIEAX\ +FxsHf0gxJDM3JCIoAQwzNQ8JjQGSimpRHFAYBCAhDcIHbn8TM2JbbYdMEW4kAkM2YncwGwNWHiI5\ +JCV7M0YmJgACAAD+YwJCAZoAYwBnAAABMjY1NCcmIyIHDgEHJicmJxEjETMRNjc2Nx4DFxYzMjY1\ +NCcmIyIHFhcUFhUUBisBJjU0NzY3NjMyFxYXFRQGBwYjIicHFzYzMhYXFh0BBgcGIyImNTQ3MzIW\ +FRQGFQYHFgEzESMBfjI7ChU6ODACDAQdExglFhYlGBMdBBEKEwwgHScxDhxDJScoCgIqGgQ2BBVE\ +IxhJRi0GSDoYJSsxGxs0KDVSGCAGLUZJPVs2BBoqAgwmK/6jYmL+gGA7JCRXOwUdC1IcIhn+agMz\ +/nQZIhxSCCISFwgWYjUrKE4VDSACCwMYIhQoEAk1FQtAK0EOPloWChI8OxMyIy41D0ErQD8wKBQj\ +GAMLAx8NFgMY/M0AAAAAA//I/h4CNgDMACYALwA7AAA3NDYzMhcWFRQHDgEHNjc2NzY1NCcuASMi\ +Bgc+ATMyFhUUBwYjIiYFIiY0NjIWFAYnIiY1NDYzMhYVFAYPcFKCPCN4Q8ZpwF5HHgktGC0gMFIK\ +EhYWJTkgGSUsOQICEhcUIhgVFRIWFRIRFhUhTV5XM1rGbDtXBjNkSowvKWYzGhRCNhcNPCYoGhhT\ +dRckFhciGMIYFBEUFRATGQAAAAADAAAAAADIAPAACQATACkAADcGFRQWMzI2NTQnIgYVFBc2NTQm\ +ByImNTQ2Ny4BNTQ2MzIWFRQHFhUUBlAjGxARFAIOEyAjEzAlNSMiEQwoHiQ2PCg0dxQdFB4bERaG\ +EQ4XGQshDxTcKB4XGgsPExAaIiAcIxAgGyAmAAAAAgAA/wYBrgD6AAsAFAAAMxQWMzI2NTQmIyIG\ +BzQ2MhYUBiImiiojIisnJiUoin20fX20fWJ4eWFldXZhZ5CR0pGSAAABAAD/BgEiAPoACQAAMTcz\ +ERcVIzU3EWR9QfBB+v4+HhQUHgEsAAAAAQAA/wYBjwD6ADwAADcyFRQHDgMHNjMyFjMyNz4CMw4C\ +BwYHBiMiJiMiBiMiNTQnPgU1NCciBzIWFRQGIyI1ND4Bx8gFDTZAbzYTIBtkHBgeBRAMAQEFBQEH\ +EBopGnQVH1YCBwECLD5HPChTThocKTceTDxY+n4aDiEuHUQtDCMOAw0LBRYWAykOGCcmEAECIUU4\ +PDI4GGIBNSUeHylnKDkZAAABAAD/BgF1APoAOQAANzIWFRQGIyImNTQ3NjMyFxYVFAYHHgEVFAcG\ +IyImJyY0NjMyFhUUBiMWMzI2NTQmJyY0Nz4BNCYjImYbIichGzIfM1lGJkRGPT5RSyRNJ1cYIzIg\ +IiolGww/JCtILhYWL0spJDyqHBcbIysjLxoqEyJILkQLC0UtQycTFhQdTC4hGxkeKTEnJjoIBCIE\ +CTdQMAAAAQAA/wYBkAD6ABEAAAUXIzc1IzU2NTMBMz8BETMVIwFFMsgy4ZOj/vuwAWNLS9EpKTEo\ +8oD+jpaR/tkoAAAAAAEAAP8HAX4A+gAvAAAXNjMyFhUUBiMWMzI3PgE1NCcmIyIHEyEOASsBBzYz\ +MhceARUUBw4CIyInLgE1NBIcIRsqIBwaJDEcEwkeHChOSAoBYgs1JdUGOUJTMSErQxZAKyU8KxAe\ +XyAgFxwgIR4UHyA5HBo1ASIkOnkeHxVBJU8vEBACFAkyEiMAAAAAAgAA/wYBgQD6AAkALAAAFzI2\ +NTQmIyIHFhMWFRQGIyImNTQ2MyYjIgYVPgIzMhYVFAYjIiYnPgEzMhbIKS0qKCwwB90bIxgeIhsQ\ +Fjc1LxUYLR5MT3FIYWYBAWxbMD/SRSwiMCWeAZ8aJhkoHhsMHiN4XwsKCUA2RFmCeGmREgABAAD/\ +BgGQAPsAKAAANyIOAwc3PggzMhYzMjY3DgQVIzY3Njc2NwYjIiZhFBoUCREFCgEMAgsFCwkNEAkv\ +dSMaOxEbRRoeCIIBCBFoHi0RHiVgoQUOCRsGdAELAgkBBgEDASYXDkOnQVxCK0UbNocnOQooAAMA\ +AP8GAYQA+gAOABwANAAAFw4BFRQWMzI2NTQuAzc+ATU0JiIGFRQeAwcuATU0NjcyFhUUBgceARUU\ +BiMiJjU0Npo2LFgsKj8PIB0xPjMjRFIzChwSMXAxKWZKS2UqMDoydU1MdjkqGSQbHTApHw4XEg0T\ +WhoiHB0wKCAPFxMKFT8YPDUzTQFGMic0Fxo6NTdKSDAkNQAAAgAA/wYBgQD6AAkALAAANyIGFRQW\ +MzI3JgMmNTQ2MzIWFRQGIxYzMjY1DgIjIiY1NDYzMhYXDgEjIia5KS0qKCwwB90bIxgeIhsQFjc1\ +LxUYLR5MT3FIYWYBAWxbMD/SRSwiMCWe/mEaJhkoHhsMHiN4XwsKCUA2RFmCeGmREgABAAn/CgGZ\ +APkAMAAAJTAXNjU0JiMOARUUFxYzMjc2NxQeARUOAQciJyYnNCY1NDcyFhcWFRQGIyImNT4BMwEv\ +EgQ8HzJBJyEwKygcKgkIG1VWTzs7BAHbJEARIiQcICkCIBqkAwUIFCICZWuOMyoiGFgBBAMBVVAB\ +OTlmAisC5gIeFCckJTkuHBYmAAIACf6iAZkBXgA4AD8AACUwFzY1NCYjIgcRFjMyNzY3FB4BFQ4B\ +ByMVIzUmJyYnNCY1NDc1MxUyNjMyFhcWFRQGIyImNT4BMwMRBhUUFxYBLxIEPB8DEAwMKygcKgkI\ +G1FVASM9LjsEAasjAwcDJEARIiQcICkCIBp6PScKpAMFCBQiBP5LBCIYWAEEAwFUUQFoawktOWYC\ +KwLLGWlmAR4UJyQlOS4cFib+lwGWLpGOMw0AAAEAAP8GAfQA+gALAAA1MzUzFTMVIxUjNSPXRtfX\ +Rtcj19dG19cAAAABABT+BgDjAgAAEwAAExYHBicmAjU0Ejc2FxYHBgIVFBLcBw0JBUlra0kJCwYG\ +PEZH/hYIBQMGVwEgfXwBIlYLBwYISf7niIb+5QAAAQAK/gIA3AH9ABMAABM2EjU0AicmNzYXFhIV\ +FAIHBicmFDtHRjwJDAoHSWtrSQgLBv4WSQEbhogBGUkLBAQJVv7efH3+4FcJCQQAAAQAJP9WAkwA\ +qgALAA8AEwAeAAAFNCYjIgYVFBYzMjY3MxEjATMRIyQUBiMiJjU0NjMyAahUPCA0Vz0hL3IyMv4K\ +MjIB9XtmZXx5aGYgNU4nHzVLI+r+rAFU/qzmeEZJOT9DAAACAAD/JAISANwAAwAPAAA3FSE1JTMV\ +ITUzESM1IRUjHgHW/gweAdYeHv4qHkGCgps3N/5INzcAAAIAAP9/AcIAgQALABMAAAU0JiMiBhUU\ +FjMyPgEUBiImNDYyAVFaNiA0XTchL3F9yH19yB40TycfNEwjdGxLS2xLAAAAAgAA/2wBSACUAA0A\ +GwAAJSYjIgYVFBcWMzI2NTQ3FhUUBiMiJyY1NDYzMgEkDSU8lwYLJjyXEA9+SE8kD35IT0QXYSsK\ +CRdhKwkXHh1DZ0MeHUNnAAAAAAEAAP95AUAAhwALAAAlFAYjIiY1NDYzMhYBQHlZMjx6WDI8KEZp\ +OCdFajgAAf/+/28BTACRAAsAACc3FzcXBxcHJwcnNwIbjIwbhoYci4schnEgdnUgcHAhdXUhcAAA\ +AAUAAP9qASwAlgAFAAsAEQAXAB8AABcHFjMyNy8BBhUUFz8BJiMiBx8BNjU0JwY0NjIWFAYilkcd\ +KikfXUcdHVxIHykqHVxHHR3yWHxYWHwSSB0dWkkfKSodWEgdHVpIHykqHYV8WFh8WAAAAAEAAP8G\ +AjAA+gADAAAVATMBAbh4/kf6AfT+DAABAAD/dAFKAIwAAwAAMTcXB6WlpYyMjAABAAD/dAFKAIwA\ +AgAAFRsBpaWMARj+6AABAAD/zgBkADIABwAAFiImNDYyFhRHKh0dKh0yHSodHSoAAAABAAD87wE7\ +AAAADwAAFTUzHgQVFAc2NTQmJx4GP1FQNy4SkXDv7zVwZWyJSWBpQUmP3yoAAQAAAAABOwMRAA8A\ +ADE1Mz4BNTQnFhUUDgMHHnCSEy43UFE/Bu8f4ZNHSGdeSIptZ3E1AAIAAP1EATwAAAAWACMAABkB\ +Mx4EFRQHFhUUBzY1NC4DIzUeAxc2NTQuAx4JQlBONBITHgUoPklAFglETVYVASk+SUD+qQFXJFBK\ +T2IzKi0qKjU6HR03ZEUzGaskVENdKQsJOGRFNBgAAgAA//8BPAK8ABYAIwAAFREzMj4DNTQnFhUU\ +BxYVFA4DBzUyPgM1NCcOAx4WQEk+KAUeExI0TlBCCRZAST4pARVWTUQBAVcZM0VkNx0dOjUqKi0q\ +M2JPSlAkqxg0RWQ4CQopXUNTAAADAAD9KgE8AJEAGwArADsAABkBMx4GFRQHFhUUBxYVFAc2NTQu\ +AiM1HgMXNDY1NCcmJyYjIiceAxc0NjU0JyYnJiMiHgYnMzs4LhwSEhITHgU9V1UcCURNVhUBckZA\ +BwUBAQlETVYVAXJGQAcFAf6QAgEbOTM3Oj1IJSwrJy0sKykrNjkZIUR3SCmpJFRBXSkEDQOIXzsI\ +AaskU0JdKQQNA4hfOwgBAAADAAD/VgE8Ar0AGQAmADMAABEzMj4DNTQnFhUUBxYUBxYVFA4DByM3\ +Mj4DNTQnDgMnMj4DNTQnDgMeFkBJPigFHhMSEhI0TlBCCR4eFkBJPikBFVZNRAkWQEk+KQEVVk1E\ +AVcZM0VkNx0dOjUqKixVKi0qM2JPSlAkqhk0RWQ4CgopXUNUhhk0RWQ4CgopXUNUAAAABAAA/UIB\ +PAFUABwAKQA2AEMAABkBMx4EFRQHFhQHFhQHFhUUBzY1NC4DIzUeAxc2NTQuAyceAxc2NTQuAyce\ +Axc2NTQuAx4JQlBONBISEhISEx4FKD5JQBYJRE1WFQEpPklAFglETVYVASk+SUAWCURNVhUBKT5J\ +QP6oAqwkUEpPYjMqLSpVLCpVLCoqNTodHTdkRTMZqyRUQ10pCwk4ZEU0GKskVENdKQsJOGRFNBir\ +JFRDXSkLCThkRTQYAAAABAAA/o4BPAKgABwAKQA2AEMAABkBMzI+AzU0JxYVFAcWFAcWFAcWFRQO\ +Awc1Mj4DNTQnDgMnMj4DNTQnDgMnMj4DNTQnDgMeFkBJPigFHhMSEhISEjROUEIJFkBJPikBFVZN\ +RAkWQEk+KQEVVk1ECRZAST4pARVWTUT+jgKsGTNFZDcdHTo1KiosVSosVSotKjNiT0pQJKoZNEVk\ +OAoKKV1DVIYZNEVkOAoKKV1DVIYZNEVkOAoKKV1DVAAFAAD9VQE8AhIAIAAtADoARwBUAAAZATMe\ +BRUUBxYUBxYUBxYUBxYVFAc2NTQuAyM1HgMXNjU0LgMnHgMXNjU0LgMnHgMXNjU0LgMnHgMXNjU0\ +LgMeBzI/RjolEhISEhISEhMeBSg+SUAWCURNVhUBKT5JQBYJRE1WFQEpPklAFglETVYVASk+SUAW\ +CURNVhUBKT5JQP67A1cfQzpGQVQrKi0qVSwqVSwqVSwqKjU6HR03ZEUzGaskVENdKQsJOGRFNBir\ +JFRDXSkLCThkRTQYqyRUQ10pCwk4ZEU0GKskVENdKQoKOGRFNBgAAAUAAP28ATwCeQAfACwAOQBG\ +AFMAABkBMzI+AzU0JxYVFAcWFAcWFAcWFAcWFRQOAwc1Mj4DNTQnDgMnMj4DNTQnDgMnMj4DNTQn\ +DgMnMj4DNTQnDgMeFkBJPigFHhMSEhISEhISNE5QQgkWQEk+KQEVVk1ECRZAST4pARVWTUQJFkBJ\ +PikBFVZNRAkWQEk+KQEVVk1E/bwDVxkzRWQ3HR06NSoqLFUqLFUqLFUqLSozYk9KUCSqGTRFZDgK\ +CildQ1SGGTRFZDgKCildQ1SGGTRFZDgKCildQ1SGGTRFZDgKCildQ1QAAAACAAD/ZADhAbAACgAW\ +AAA3IgYdATY3NjU0JjcyFhUUBwYjETMRNmcUKyImKx0HIzlLUkQoI3omE7kPODsvGyYmMiNJTFIC\ +TP68NAAAAgAA/oYAxQF6AAMADAAAFzc1BxEVNxEjNQcRNxyQkKkZrAFlLZYtAUnoNP3A4jMCQwEA\ +AAIAAP6YAP8BaAADAB8AADcVNzUDIzUHNTc1BzU3NTMVNzUzFTcVBxU3FQcVIzUHU1paHjU1NTUe\ +Wh01NTU1HVpGpxun/jejD1wPpw9aD6ifHKujD1wPpw9aD6ifHAAAAAEAFP+EAQsAegAeAAAXNSYn\ +BzAVIzUzNycwIzUzFRYXNzA1MxUjBgcXMDMVwygMM0g5MzM5SCESNEg5IRM0OXw7Jg0zO0oyMkg5\ +IhEzOUciETRIAAQAAP9qAWwBsAAOABwAKwA6AAA3DgEdATI3Njc2NTQnJiM3MhYVFAcGBwYjETMR\ +NhcOAR0BMjc2NzY1NCcmIzcyFhUUBwYHDgEjETMRNk4RHg4eHwwEChARGR0rCRgrNS8fGdERHRAe\ +HQsGCxAPFh8qCxkoFjcWHht9AR4QxikrNA0ZHhQVJjkhEiA5NEACRv7BMiYBHRHGKS8wExMcFhUm\ +NiQWHD4vGyUCRv7BMgAAAgAy/2QBDQGwAAoAFgAANyIGFRQXFhc1NCYnMhcRMxEiJyY1NDarFyAu\ +LhoqMzojIzpSTzl6JhswRUIDyxIeJjQBRP20UlBFIzIAAAT/9f9qAWwBsAAOAB0ALAA7AAA3IyIH\ +BhUUFxYXFjM1NCYnMhcRMxEiJicmJyY1NDYXDgEdATI3Njc2NTQnJiM3MhYVFAcGBw4BIxEzETZX\ +AREQCgQMHx4OHiswGR8WNxcrGAkr6REdEB4dCwYLEA8WHyoLGSgWNxYeG30VFB4ZDTQrKcYQHicy\ +AT/9uiUbNDkgEiE5JgEdEcYpLzATExwWFSY2JBYcPi8bJQJG/sEyAAAAAAEAAP7AAKkBQAATAAAT\ +MxU3FQcVNxUHFSM1BzU3NQc1N0QeR0dHRx5EREREAUCiDlwOfw5aD6iiDlwOfw5aDwADAAD+mAE6\ +AWgAIwAnACsAADc1MxU3FQcVNxUHFSM1BxUjNQ8BIzUHNTc1BzU3NTMVNzUzFQM1BxU3FTc16R4z\ +MzMzHj0ePAEeMzMzMx49Hh49Wz3AqJ4PXA+fD1oPtaoSrKQQqJ4PXA+fD1oPtaoSrKT+/Z4Rn7ie\ +EZ8AAf/9AAABPwD0ABgAADcGIyImNTQ/ATYvASY1NDYzMjEXBRYVFAcSAgMHCQbPDg7NCAsHAQIB\ +Hw4OAQEQCAoDSQcGTwMLChIBawYODQUAAAABAAAAAABQAFAACQAANTQ2MhYUBiMiJhciFxcREBgo\ +ERcXIhcYAAAAAQAAAAABQAAoAAMAADE1IRUBQCgoAAAAAQAAAAAAZAEYAAMAADMDMwMoKGQoARj+\ +6AAAAAEAAAAAARgBNQAFAAAxGwEjJweMjEFYWgE1/svGxgAAAgAAAAACWAFKAA4AGQAAMTQ2MzIe\ +AhUjLgEiBgchIiY0NjMyFhUUBrN5OWtVMw8LouCiCwEcFyUlFxkjI5iyLFGATW6Ghm4kMCQkGBkj\ +AAABAAAAAAC2AS0AFwAAEzIWFxYVFAcOASMnJjU0NjU0Iy4BNTQ2VhsbEBoyGUQQBgFHFBsoLQEt\ +DBEdMD08HS0DAQIIaxMPASYcHjEAAQAA/wYAggD6AAMAADUzESOCgvr+DAAAAQAAAAAAggD6AAMA\ +ADUzFSOCgvr6AAAAAQAA/4MBLAAAAAMAADEhFSEBLP7UfQAAAQAAAAABLAB9AAMAADUhFSEBLP7U\ +fX0AAQAA/n4A6wGHABMAABMXBxcmIyIGFRQXJjU0NjMyFyc3Kb1nbDI0HyY4eDQlIiKHZAGH5dnP\ +LiQdNTRLTSMtFby0AAABAAD/DQEAAMAAFgAANw4CIyImNTQ2MhYVFAcyNjc2MhcDJ6sDGRoTKzcm\ +OCkXIjMhAhUDljA8AQcEKSgfIB4ZHRshLAIC/m8QAAAAAQAA/gwBSADAACQAABcGIyImNTQ2MzIW\ +FRQHMj8BBiMiJjU0NjMyFhUUBzI3NjIXAyerKCErNycbHCkXQQs8NhgrNycbHCkXSC4CFQPFLcQM\ +KCggIB8ZHRsiygwpKB8gHhkdG00CAv1uDAAAAQAA/gwBjwHAADYAADcGIyImNTQ2MzIWFRQHMj8B\ +Ig4BIyImNTQ2MzIWFRQHMjc2MhcBJxMGIyImNTQ2MzIWFRQHMjf2KB8rNycbHCkXPws6ASAcEys3\ +JxscKRdILgEWA/70LVUoISs3JxscKRdBCzwMKCggIB8ZHRsiywkEKSgfIB4ZHRtNAgL8bgwBJAwo\ +KCAgHxkdGyIAAAAAAQAA/QwB2gHAAEUAABMGIyImNTQ2MzIWFRQHMj8BBiMiJjU0NjMyFhUUBzI/\ +AQYjIiY1NDYzMhYVFAcyPwEiDgEjIiY1NDYyFhUUBzI3NjIXASerKCErNycbHCkXQQs6KCErNycb\ +HCkXQQs6KB8rNycbHCkXPws6ASAcEys3JjgpF0guAhUD/qkt/jwMKCggIB8ZHRsiygwoKCAgHxkd\ +GyLKDCgoICAfGR0bIssJBCkoHyAeGR0bTQIC+24MAAAAAQAA/QwCGQKuAFYAACUGIyImNTQ2MzIW\ +FRQHMj8BBiMiJjU0NjMyFhUUBzI/ASIOASMiJjU0NjMyFhUUBzI3NjIXAScTBiMiJjU0NjMyFhUU\ +BzI/AQYjIiY1NDYzMhYVFAcyNwE/KCErNycbHCkXQQs2KB8rNycbHCkXPws0ASAcEys3JxscKRdI\ +LgEWA/5qLVUoISs3JxscKRdBCzooISs3JxscKRdBCzQMKCggIB8ZHRsixAwoKCAgHxkdGyLHCQQp\ +KB8gHhkdG00CAvqADAEkDCgoICAfGR0bIsgMKCggIB8ZHRsiAAEAAP8aA1IA5gALAAA1MxUhNTMR\ +IzUhFSMZAyAZGfzgGeZ9ff40fX0AAAAAA//w/wYCJgD6AAcADwATAAA2IiY0NjIWFAAiJjQ2MhYU\ +BQEzAVAyIyMyIwGIMiMjMiP90gG4fv5HSyMyIyMy/s8jMiMjMloB9P4MAAT/4f8GAwcA+gAHAA8A\ +EwAXAAA2IiY0NjIWFAAiJjQ2MhYUBQEzATMBMwFBMiMjMiMCdzIjIzIj/OMBuHv+R3kBuHv+R0sj\ +MiMjMv7PIzIjIzJaAfT+DAH0/gwAAv+0/4gBfAEYABkASAAANxYzMjY3PgU1NCYnJiMiBgcGFRQe\ +ARciJwczMhQrASI0OwETPgI1NC4CIyIOAwcGJjc2NzYzMhYXPgEzMhYVFAbFAwQSMg4CAwMDAQEH\ +CAMDEzQLDwQHCBYZLTQLC+ELC0toAQMCAQIFAwgMDwsZCgUbBTEPGCQjJAcdJiMeLWsoATUkBQsM\ +DAwMBhAXAwEzHCYlDBQNKiB6Hh4BHQIIDgYDBQUCBxQSLBAIDwlYEBkTGh4PNDBHbQAB/9v/9gG+\ +ARgAVwAANwYHBisBIj8BNiYjIgYHBiY3PgMzMhc2MzIXPgEzMh4DFRQPAQYVFDMyNz4FNzYWBw4C\ +IyImNTQ2PwI0IyIPAQYHJwYmPwE2NTQmIyIHUAcIBAQ1DQ1CBAYIDRYkBRUEFBAiHxI3CyQkLQkL\ +KRMKEg8LBwUvBAgCAwULBwwDDQEGFQYSFy0fFRkCAzQBFRsIQQgPJg0IBEMBDAkbCBURAwEapw0P\ +GjkIDAklGjASKCgoEBgGCw8TCg0NfQsJDgIDCQYPBRIBCQ0LHx8aFRQGDQeIBg4UqxYBAQEPCKsD\ +AwYIFAAB/37/YAFeAbgASAAAByImNTQ2MzIWFRQHBhUUMzI+BzcjIiY1ND4DOwE+ATMyFhUUBiMi\ +JjU0NzY0IyIOBwczMhYUBisBDgEyIDAXExIXEgoZCxAPCw0KDg0UCjUJCgEDBAYDQRRpNCAwFxMS\ +FxIKGQcMCgcIBQYDBgE2CQoKCT8hdqAmIBoiFA8OCwcNDgYREyUkPDdVJwwJAwUFBAJLXyYgGiIU\ +Dw4LBhwFCwoUDRoNHgYMEAzFwQAAAAEAAAAAANoBGAA0AAAzIiY1NDYzMhYVFAcWMzI2NTQuAicm\ +NTQ2MzIWFRQGIyIuATU0NyYjIgYVFB4CFx4BFRRQHjISDA4XDAYYFiEJCxgGPDctIjYWEAgQCwUQ\ +Dg8ZERIeBRsXKxsQFg0LGAwSFhILDwcNBCYqIy0kGBAYCQ8KCAgUEQ0JEwwRAxIfFVoAAAH/5P//\ +AOcBEAA/AAAnBi4BPwEuASMqASMiDgEHBicmNz4BNxYzMj4BMzIXFhQPAQ4BFRQeARcWNicuATU0\ +NjMyFRQHBgciJiMuASMiCgYLAQWwCBcRBQwHBREUBQ8EAwgMCwEwIhkgEQcFCAsHngEBECwXCAwD\ +AyQUDCYkERIDBQIXNAkSAwQIDQbBBAMbIQQNCwkSHjACAwMEAQERB6cDAwIFAQkLBA8JCAgUCxM3\ +KhUJAQEDDQAF/7T/iAVLARgAGwA1ANkA8AELAAAlFjMyPgE3PgY1NCYnJiMiBgcOAhUUBRYzMjY3\ +PgU1NCYnJiMiBgcGFRQeARciJwczMhQrASI0OwETPgI1NC4CIyIOAwcGJjc2NzYzMhYXPgEzMhc+\ +ATMyFhc+ATMyFz4BMzIWFz4BMzIXPgEzMhYXPgEzMhYVFAYjIicHMzIUKwEiNDsBEz4CNTQmIyIG\ +BxUUBiMiJwczMhQrASI0OwETPgI1NCYjIgYHFRQGIyInBzMyFCsBIjQ7ARM0PgM0NTQmIyIGBxUU\ +BiUWMzI2Nz4ENTQmJyYjIgYHBhUUBRYzMjY3PgY1NCYnJiMiDgEHBhUUFgIKAwQMHx4JAgMCAgIB\ +AQcIAwMTNAsFBwP+ywMEEjIOAgMDAwEBBwgDAxM0Cw8EBwgWGS00CwvhCwtLaAEDAgECBQMIDA8L\ +GQoFGwUxDxgkIyQHHSYjLxMSIhsjJAcdJiMvExIiGyMkBx0mIy8TEiIbIyQHHSYjHi1rSRYZLTQL\ +C+ELC0toAQMCBQYOFBRrSRYZLTQLC+ELC0toAQMCBQYOFBRrSRYZLTQLC+ELC0toAQIBAgUGDhQU\ +awODAwQSMg4CBAMDAQcIAwMTNAsP/ssDBBIyDgIDAgICAQEHCAMDDCEeBw8JKAEYKhcECgkLCgoL\ +BRAXAwEzHA0bGAsoBwE1JAULDAwMDAYQFwMBMxwmJQwUDSogeh4eAR0CCA4GAwUFAgcUEiwQCA8J\ +WBAZExoeDzIcFhMaHg8yHBYTGh4PMhwWExoeDzQwR20geh4eAR0CCA4GBwgYIwFHbSB6Hh4BHQII\ +DgYHCBgjAUdtIHoeHgEdAQMFBQYHAwcIGCMBR20oATUkBg0PDg8HEBcDATMcJiUoBwE1JAQKCQsK\ +CgsFEBcDARglEiYlEhoAAAT/tP+IBAYBGAB9AJgAtADOAAAhIicHMzIUKwEiNDsBEz4CNTQmIyIG\ +BxUUBiMiJwczMhQrASI0OwETND4DNDU0JiMiBgcVFAYjIicHMzIUKwEiNDsBEz4CNTQuAiMiDgMH\ +BiY3Njc2MzIWFz4BMzIXPgEzMhYXPgEzMhc+ATMyFhc+ATMyFhUUBicWMzI2Nz4GNTQmJyYjIg4B\ +BwYVFBYFFjMyPgE3PgY1NCYnJiMiBgcOAhUUBRYzMjY3PgU1NCYnJiMiBgcGFRQeAQNSFhktNAsL\ +4QsLS2gBAwIFBg4UFGtJFhktNAsL4QsLS2gBAgECBQYOFBRrSRYZLTQLC+ELC0toAQMCAQIFAwgM\ +DwsZCgUbBTEPGCQjJAcdJiMvExIiGyMkBx0mIy8TEiIbIyQHHSYjHi1rTAMEEjIOAgMCAgIBAQcI\ +AwMMIR4HDwn+wgMEDB8eCQIDAgICAQEHCAMDEzQLBQcD/ssDBBIyDgIDAwMBAQcIAwMTNAsPBAcg\ +eh4eAR0CCA4GBwgYIwFHbSB6Hh4BHQEDBQUGBwMHCBgjAUdtIHoeHgEdAggOBgMFBQIHFBIsEAgP\ +CVgQGRMaHg8yHBYTGh4PMhwWExoeDzQwR20oATUkBAoJCwoKCwUQFwMBGCUSJiUSGgMBGCoXBAoJ\ +CwoKCwUQFwMBMxwNGxgLKAcBNSQFCwwMDAwGEBcDATMcJiUMFA0AA/+0/4gCwQEYAFcAcQCNAAAz\ +IicHMzIUKwEiNDsBEz4CNTQuAiMiDgMHBiY3Njc2MzIWFz4BMzIXPgEzMhYXPgEzMhYVFAYjIicH\ +MzIUKwEiNDsBEzQ+AzQ1NCYjIgYHFRQGJxYzMjY3PgU1NCYnJiMiBgcGFRQeAQUWMzI+ATc+BjU0\ +JicmIyIGBw4CFRTIFhktNAsL4QsLS2gBAwIBAgUDCAwPCxkKBRsFMQ8YJCMkBx0mIy8TEiIbIyQH\ +HSYjHi1rSRYZLTQLC+ELC0toAQIBAgUGDhQUa0wDBBIyDgIDAwMBAQcIAwMTNAsPBAcBSgMEDB8e\ +CQIDAgICAQEHCAMDEzQLBQcDIHoeHgEdAggOBgMFBQIHFBIsEAgPCVgQGRMaHg8yHBYTGh4PNDBH\ +bSB6Hh4BHQEDBQUGBwMHCBgjAUdtKAE1JAULDAwMDAYQFwMBMxwmJQwUDQIBGCoXBAoJCwoKCwUQ\ +FwMBMxwNGxgLKAAAAv/b/4gDKwEYAHoAjwAAJTY3NjMyFhc+ATMyFhUUBiMiJwczMhQrASI0OwET\ +PgM1NCYjIg4DBw4BIyImNTQ2PwI0IyIPAQYHJwYmPwE2NTQmIyIPAQYHBisBIj8BNiYjIgYHBiY3\ +PgMzMhc2MzIXPgEzMh4DFRQPAQYVFDMyNz4BFxYzMjY3PgE1NCYnJiMiBgcGFRQWAa0xFBgiIyQH\ +HSYjHi1rSRYZLTQLC+ELC0toAQEDAQUGBw8SDhgIGjwtFRkCAzQBFRsIQQgPJg0IBEMBDAkbCEQH\ +CAQENQ0NQgQGCA0WJAUVBBQQIh8SNwskJC0JCykTChIPCwcFLwQIAgMPJdEDBBIyDgYHBwgDAxM0\ +Cw8Jd2wYHRMaHg80MEdtIHoeHgEdAgUJCQUHCA0fGzUQNjgVFAYNB4gGDhSrFgEBAQ8IqwMDBggU\ +rBEDARqnDQ8aOQgMCSUaMBIoKCgQGAYLDxMKDQ19CwkOAgg1OQE1JA8mERAXAwEzHCYlEhoAAv/b\ +/2ADGQG4AFcAnwAANwYHBisBIj8BNiYjIgYHBiY3PgMzMhc2MzIXPgEzMh4DFRQPAQYVFDMyNz4F\ +NzYWBw4CIyImNTQ2PwI0IyIPAQYHJwYmPwE2NTQmIyIHEyImNTQ2MzIWFRQHBhUUMzI+BzcjIiY1\ +NDY7AT4BMzIWFRQGIyImNTQ3NjQjIg4HBzMyFhUUDgErAQ4BUAcIBAQ1DQ1CBAYIDRYkBRUEFBAi\ +HxI3CyQkLQkLKRMKEg8LBwUvBAgCAwULBwwDDQEGFQYSFy0fFRkCAzQBFRsIQQgPJg0IBEMBDAkb\ +CPUgMBcTEhcSChkLEA8LDQoODRQKNQkKCQhBFGk0IDAXExIXEgoZBwwKBwgFBgMGATYJCwUJBj8h\ +dhURAwEapw0PGjkIDAklGjASKCgoEBgGCw8TCg0NfQsJDgIDCQYPBRIBCQ0LHx8aFRQGDQeIBg4U\ +qxYBAQEPCKsDAwYIFP6fJiAaIhQPDgsHDQ4GERMlJDw3VScMCQgLS18mIBoiFA8OCwYcBQsKFA0a\ +DR4GDAgFCQbFwQAAAAAB/37/YAJpAbgAewAAJSMOASMiJjU0NjMyFhUUBwYVFDMyPgc3IyImNTQ+\ +AzsBPgEzMhYVFAYjIiY1NDc2NCMiBwYHFz4BMzIWFRQGIyImNTQ3NjQjIg4HBzMyFhQGKwEOASMi\ +JjU0NjMyFhUUBwYVFDMyPgcBX5shdl8gMBcTEhcSChkLEA8LDQoODRQKNQkKAQMEBgNBFGk0IDAX\ +ExIXEgoZJhcDAZsUaTQgMBcTEhcSChkHDAoHCAUGAwYBNgkLCwk/IXZfIDAXExIXEgoZCxAPCw0K\ +Dw0U5sXBJiAaIhQPDgsHDQ4GERMlJDw3VScMCQMFBQQCS18mIBoiFA8OCwYccwwGAUtfJiAaIhQP\ +DgsGHAULChQNGg0eBgwQDMXBJiAaIhQPDgsHDQ4GERMlJDw3VQAAAAAB/37/YAN0AbgAswAAEzM+\ +ATMyFhUUBiMiJjU0NzY0IyIHBgcXPgEzMhYVFAYjIiY1NDc2NCMiDgcHMzIWFRQOASsBDgEjIiY1\ +NDYzMhYVFAcGFRQzMj4HNyMOASMiJjU0NjMyFhUUBwYVFDMyPgc3Iw4BIyImNTQ2MzIWFRQHBhUU\ +MzI+BzcjIiY1ND4DOwE+ATMyFhUUBiMiJjU0NzY0IyIOAgcGzJwUaTQgMBcTEhcSChkmFwMBmxRp\ +NCAwFxMSFxIKGQcMCgcIBQYDBgE2CQoECQY/IXZfIDAXExIXEgoZCxAPCw0KDw0UCpshdl8gMBcT\ +EhcSChkLEA8LDQoODRUKmyF2XyAwFxMSFxIKGQsQDwsNCg4NFAo1CQoBAwQGA0EUaTQgMBcTEhcS\ +ChkOFQ4IBgIBDktfJiAaIhQPDgsGHHMMBgFLXyYgGiIUDw4LBhwFCwoUDRoNHgYMCAUJBsXBJiAa\ +IhQPDgsHDQ4GERMlJDw3VSfFwSYgGiIUDw4LBw0OBhETJSQ7OFUnxcEmIBoiFA8OCwcNDgYREyUk\ +PDdVJwwJAwUFBAJLXyYgGiIUDw4LBhwTJyIbCgAB/37/YASAAbgA5wAAARc+ATMyFhUUBiMiJjU0\ +NzY0IyIHBgcXPgEzMhYVFAYjIiY1NDc2NCMiDgcHMzIWFAYrAQ4BIyImNTQ2MzIWFRQHBhUUMzI+\ +BzcjDgEjIiY1NDYzMhYVFAcGFRQzMj4HNyMOASMiJjU0NjMyFhUUBwYVFDMyPgc3Iw4BIyImNTQ2\ +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\ +BwsBDhgRPRQDCQwWGBE9FAQKDAAAAAAADgCuAAEAAAAAAAAAfgD+AAEAAAAAAAEABwGNAAEAAAAA\ +AAIABwGlAAEAAAAAAAMAJAH3AAEAAAAAAAQABwIsAAEAAAAAAAUACQJIAAEAAAAAAAYABwJiAAMA\ +AQQJAAAA/AAAAAMAAQQJAAEADgF9AAMAAQQJAAIADgGVAAMAAQQJAAMASAGtAAMAAQQJAAQADgIc\ +AAMAAQQJAAUAEgI0AAMAAQQJAAYADgJSAEMAbwBwAHkAcgBpAGcAaAB0ACAAXAAyADUAMQAgADIA\ +MAAxADgAIABKAGUAYQBuAC0ARgByAGEAbgBjAG8AaQBzACAATQBvAGkAbgBlAC4AIABUAGgAaQBz\ +ACAAZgBvAG4AdAAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAA\ +UwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABcACgAaAB0AHQAcAA6\ +AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAFwAKQAuAABDb3B5cmln\ +aHQgXDI1MSAyMDE4IEplYW4tRnJhbmNvaXMgTW9pbmUuIFRoaXMgZm9udCBpcyBsaWNlbnNlZCB1\ +bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlIFwoaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9P\ +RkxcKS4AAGEAYgBjADIAcwB2AGcAAGFiYzJzdmcAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAEYA\ +bwBuAHQARgBvAHIAZwBlACAAMgAuADAAIAA6ACAAYQBiAGMAMgBzAHYAZwAgADoAIAAyADcALQAx\ +ADEALQAyADAAMQA4AABGb250Rm9yZ2UgMi4wIDogYWJjMnN2ZyA6IDI3LTExLTIwMTgAAGEAYgBj\ +ADIAcwB2AGcAAGFiYzJzdmcAAFYAZQByAHMAaQBvAG4AIAAgAABWZXJzaW9uICAAAGEAYgBjADIA\ +cwB2AGcAAGFiYzJzdmcAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAAAAEAAgEC\ +AAMBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0B\ +HgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6\ +ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYB\ +VwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFz\ +AXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYAGLm5vZGVmB3VuaUUwMDAHdW5pRTAyMgd1bmlFMDIz\ +B3VuaUUwMjQHdW5pRTAzMAd1bmlFMDM4B3VuaUUwMzkHdW5pRTA0Mwd1bmlFMDQ1B3VuaUUwNDYH\ +dW5pRTA0Nwd1bmlFMDQ4B3VuaUUwNTAHdW5pRTA1Qwd1bmlFMDYyB3VuaUUwNjkHdW5pRTA3QQd1\ +bmlFMDdCB3VuaUUwN0MHdW5pRTA3RAd1bmlFMDgwB3VuaUUwODEHdW5pRTA4Mgd1bmlFMDgzB3Vu\ +aUUwODQHdW5pRTA4NQd1bmlFMDg2B3VuaUUwODcHdW5pRTA4OAd1bmlFMDg5B3VuaUUwOEEHdW5p\ +RTA4Qgd1bmlFMDhDB3VuaUUwOTQHdW5pRTA5NQd1bmlFMEEwB3VuaUUwQTEHdW5pRTBBMgd1bmlF\ +MEEzB3VuaUUwQTQHdW5pRTBBOQd1bmlFMEIzB3VuaUUxMDEHdW5pRTFCOQd1bmlFMUJCB3VuaUUx\ +RTcHdW5pRTI0MAd1bmlFMjQxB3VuaUUyNDIHdW5pRTI0Mwd1bmlFMjQ0B3VuaUUyNDUHdW5pRTI0\ +Ngd1bmlFMjQ3B3VuaUUyNDgHdW5pRTI0OQd1bmlFMjYwB3VuaUUyNjEHdW5pRTI2Mgd1bmlFMjYz\ +B3VuaUUyNjQHdW5pRTI4MAd1bmlFMjgxB3VuaUUyODIHdW5pRTI4Mwd1bmlFNEEwB3VuaUU0QTIH\ +dW5pRTRBNAd1bmlFNEE4B3VuaUU0QUMHdW5pRTRDMAd1bmlFNENFB3VuaUU0RTEHdW5pRTRFMgd1\ +bmlFNEUzB3VuaUU0RTQHdW5pRTRFNQd1bmlFNEU2B3VuaUU0RTcHdW5pRTRFOAd1bmlFNEU5B3Vu\ +aUU0RUEHdW5pRTRFRQd1bmlFNTAwB3VuaUU1MDEHdW5pRTUyMAd1bmlFNTIxB3VuaUU1MjIHdW5p\ +RTUyNAd1bmlFNTI1B3VuaUU1MjkHdW5pRTUyQQd1bmlFNTJCB3VuaUU1MkMHdW5pRTUyRAd1bmlF\ +NTJGB3VuaUU1MzAHdW5pRTUzMQd1bmlFNTM5B3VuaUU1NjYHdW5pRTU2Nwd1bmlFNTY5B3VuaUU1\ +NkMHdW5pRTU2RAd1bmlFNTgyB3VuaUU1RDAHdW5pRTVFMgd1bmlFNjEwB3VuaUU2MTIHdW5pRTYx\ +NAd1bmlFNjE4B3VuaUU2MjQHdW5pRTYzMAd1bmlFNjUwB3VuaUU2NTUHdW5pRTkxMAd1bmlFOTEx\ +B3VuaUU5MTIHdW5pRTkxNAd1bmlFOTE1B3VuaUU5MTgHdW5pRTkyMAd1bmlFOTI1B3VuaUU5NUQH\ +dW5pRUEwMgd1bmlFQUE0AAAAAAH//wACAAEAAAAAAAAADAAUAAQAAAACAAAAAQAAAAEAAAAAAAEA\ +AAAA1+feHQAAAADRlyIXAAAAANgjLVI=\ ")' Index: font/abc2svg.sfd ================================================================== --- font/abc2svg.sfd +++ font/abc2svg.sfd @@ -1,10 +1,12 @@ SplineFontDB: 3.0 FontName: abc2svg FullName: abc2svg FamilyName: abc2svg Weight: Regular +Copyright: Copyright \\251 2018 Jean-Francois Moine. This font is licensed under the SIL Open Font License \\(http://scripts.sil.org/OFL\\). +Version: ItalicAngle: 0 UnderlinePosition: 0 UnderlineWidth: 0 Ascent: 819 Descent: 205 @@ -15,11 +17,11 @@ XUID: [1021 296 1430826605 13506888] OS2Version: 0 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 0 CreationTime: 1433498007 -ModificationTime: 1518628013 +ModificationTime: 1543339218 PfmFamily: 17 TTFWeight: 400 TTFWidth: 5 LineGap: 92 VLineGap: 92 @@ -36,25 +38,30 @@ HheadAscent: 0 HheadAOffset: 1 HheadDescent: 0 HheadDOffset: 1 OS2Vendor: 'PfEd' +MarkAttachClasses: 1 DEI: 91125 +LangName: 1033 Encoding: Custom +Compacted: 1 UnicodeInterp: none NameList: Adobe Glyph List -DisplaySize: -24 +DisplaySize: -96 AntiAlias: 1 FitToEm: 1 -WinInfo: 0 16 10 -BeginChars: 65 65 +WinInfo: 48 8 2 +BeginPrivate: 0 +EndPrivate +TeXData: 1 0 0 346030 173015 115343 0 1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 +BeginChars: 128 128 StartChar: .nodef Encoding: 0 0 0 Width: 400 -HStem: 0 400<0 401> -VStem: 0 401<0 400> +Flags: M LayerCount: 2 Fore SplineSet 0 0 m 1 0 400 l 1 @@ -62,17 +69,27 @@ 401 0 l 1 0 0 l 1 EndSplineSet Validated: 1 EndChar + +StartChar: space +Encoding: 1 32 1 +Width: 600 +Flags: HM +LayerCount: 2 +Fore +SplineSet +0 0 m 1053 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE000 -Encoding: 1 57344 1 +Encoding: 2 57344 2 Width: 87 -Flags: W -HStem: 0 21G<58 65> -VStem: 0 24<91.7005 190.325 838.222 935.924> 53 29<333.889 460.558 569.339 692.856> +Flags: MW LayerCount: 2 Fore SplineSet 0 515 m 9 0 517 l 1 @@ -93,65 +110,291 @@ 42 335 53 385 53 419 c 0 53 463 35 499 0 515 c 9 EndSplineSet Validated: 1 EndChar + +StartChar: uniE022 +Encoding: 3 57378 3 +Width: 330 +Flags: MW +LayerCount: 2 +Fore +SplineSet +-80 20 m 5 + 410 20 l 5 + 410 -20 l 5 + -80 -20 l 5 + -80 20 l 5 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE023 +Encoding: 4 57379 4 +Width: 531 +Flags: MW +LayerCount: 2 +Fore +SplineSet +-80 20 m 1 + 610 20 l 5 + 610 -20 l 1 + -80 -20 l 1 + -80 20 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE024 +Encoding: 5 57380 5 +Width: 210 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +-80 20 m 1 + 290 20 l 1 + 290 -20 l 1 + -80 -20 l 1 + -80 20 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE030 +Encoding: 6 57392 6 +Width: 35 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 1000 m 5 + 35 1000 l 5 + 35 0 l 5 + 0 0 l 5 + 0 1000 l 5 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE038 +Encoding: 7 57400 7 +Width: 35 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 1000 m 1 + 35 1000 l 1 + 35 500 l 1 + 0 500 l 1 + 0 1000 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE039 +Encoding: 8 57401 8 +Width: 35 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 1100 m 1 + 35 1110 l 5 + 35 760 l 1 + 0 760 l 1 + 0 1100 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE043 +Encoding: 9 57411 9 +Width: 100 +Flags: W +HStem: 320 100<8.4375 91.5625> 570 100<8.4375 91.5625> +VStem: 0 100<328.438 411.562 578.438 661.562> +LayerCount: 2 +Fore +SplineSet +50 570 m 3 + 22 570 0 592 0 620 c 3 + 0 648 22 670 50 670 c 3 + 78 670 100 648 100 620 c 3 + 100 592 78 570 50 570 c 3 +50 320 m 7 + 22 320 0 342 0 370 c 7 + 0 398 22 420 50 420 c 7 + 78 420 100 398 100 370 c 7 + 100 342 78 320 50 320 c 7 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE045 +Encoding: 10 57413 10 +Width: 1059 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +590 0 m 24 + 590 160 l 24 + 620 160 l 0 + 647 83 701 25 770 25 c 0 + 818 25 870 42 870 90 c 0 + 870 135 766 163 722 175 c 0 + 661 192 590 212 590 286 c 0 + 590 380 665 430 740 430 c 0 + 791 430 809 423 840 405 c 0 + 870 430 l 24 + 900 430 l 24 + 907 275 l 24 + 877 275 l 0 + 857 351 806 405 740 405 c 0 + 702 405 652 376 652 338 c 0 + 652 285 733 277 785 263 c 0 + 878 238 940 209 940 136 c 0 + 940 62 879 0 770 0 c 0 + 718 0 688 9 655 32 c 0 + 620 0 l 24 + 590 0 l 24 +1010 0 m 3 + 982 0 960 22 960 50 c 3 + 960 78 982 100 1010 100 c 3 + 1038 100 1060 78 1060 50 c 3 + 1060 22 1038 0 1010 0 c 3 +505 0 m 3 + 477 0 455 22 455 50 c 3 + 455 78 477 100 505 100 c 3 + 533 100 555 78 555 50 c 3 + 555 22 533 0 505 0 c 3 +180 390 m 24 + 180 30 l 24 + 220 30 l 0 + 300 30 350 100 350 210 c 0 + 350 320 300 390 220 390 c 0 + 180 390 l 24 +0 0 m 0 + 0 30 l 24 + 70 30 l 24 + 70 390 l 24 + 0 390 l 24 + 0 420 l 24 + 220 420 l 0 + 360 420 470 361 470 210 c 0 + 470 60 370 0 220 0 c 0 + 147 0 73 0 0 0 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE046 +Encoding: 11 57414 11 +Width: 1061 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +770 0 m 0 + 636 0 550 70 550 210 c 0 + 550 350 656 430 770 430 c 0 + 818 430 838 425 875 400 c 0 + 905 430 l 24 + 935 430 l 24 + 943 264 l 24 + 910 260 l 0 + 886 354 841 400 780 400 c 0 + 700 400 670 305 670 215 c 0 + 670 125 700 30 780 30 c 0 + 855 30 906 86 928 165 c 0 + 963 155 l 0 + 939 65 890 0 770 0 c 0 +1010 0 m 3 + 982 0 960 22 960 50 c 3 + 960 78 982 100 1010 100 c 3 + 1038 100 1060 78 1060 50 c 3 + 1060 22 1038 0 1010 0 c 3 +505 0 m 3 + 477 0 455 22 455 50 c 3 + 455 78 477 100 505 100 c 3 + 533 100 555 78 555 50 c 3 + 555 22 533 0 505 0 c 3 +180 390 m 24 + 180 30 l 24 + 220 30 l 0 + 300 30 350 100 350 210 c 0 + 350 320 300 390 220 390 c 0 + 180 390 l 24 +0 0 m 0 + 0 30 l 24 + 70 30 l 24 + 70 390 l 24 + 0 390 l 24 + 0 420 l 24 + 220 420 l 0 + 360 420 470 361 470 210 c 0 + 470 60 370 0 220 0 c 0 + 147 0 73 0 0 0 c 0 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE047 -Encoding: 2 57415 2 +Encoding: 12 57415 12 Width: 480 -Flags: W -HStem: 2 20<238.886 330.311> 278 80<0.392967 71.607> 338 80<362.393 433.607> 670 20<107.689 199.114> -VStem: -4 80<282.393 353.607> 23 28<542.438 620.954> 167 96<56 124.156> 175 96<567.844 636> 358 80<342.393 413.607> 387 28<71.0456 149.564> +Flags: HMW LayerCount: 2 Fore SplineSet -398 338 m 3xb080 +398 338 m 3 376 338 358 356 358 378 c 3 358 400 376 418 398 418 c 3 420 418 438 400 438 378 c 3 - 438 356 420 338 398 338 c 3xb080 -36 278 m 7xd8 - 14 278 -4 296 -4 318 c 7 - -4 340 14 358 36 358 c 7 - 58 358 76 340 76 318 c 7 - 76 296 58 278 36 278 c 7xd8 -167 86 m 0x92 - 167 109 186 132 214 132 c 0 - 240 132 263 111 263 89 c 0x92 - 263 73 251 56 219 46 c 1 - 235 30 259 22 283 22 c 0 - 331 22 387 54 387 106 c 0 - 387 130 371 162 339 194 c 1 - 291 230 250 264 214 295 c 1 + 438 356 420 338 398 338 c 3 +36 278 m 3 + 14 278 -4 296 -4 318 c 3 + -4 340 14 358 36 358 c 3 + 58 358 76 340 76 318 c 3 + 76 296 58 278 36 278 c 3 +167 91 m 0 + 167 114 186 137 214 137 c 0 + 240 137 263 116 263 94 c 0 + 263 78 251 61 219 51 c 1 + 235 35 259 28 283 28 c 0 + 331 28 375 59 375 111 c 0 + 375 135 369 162 337 194 c 1 + 214 295 l 1 7 5 l 1 -36 37 l 1 - 175 331 l 1x9140 - 59 440 23 515 23 570 c 0 - 23 618 55 650 79 670 c 1 - 111 686 139 690 167 690 c 0x96 - 235 690 271 646 271 606 c 0 - 271 583 252 560 224 560 c 0 - 198 560 175 581 175 603 c 0x91 - 175 619 187 636 219 646 c 1 - 203 662 179 670 155 670 c 0 - 107 670 51 638 51 586 c 0 - 51 562 67 530 99 498 c 1 - 147 462 188 428 223 397 c 1 + 173 330 l 1 + 47 429 11 500 11 570 c 0 + 11 618 54 651 78 671 c 1 + 110 687 139 690 167 690 c 0 + 235 690 271 641 271 601 c 0 + 271 578 252 555 224 555 c 0 + 198 555 175 576 175 598 c 0 + 175 614 187 631 219 641 c 1 + 203 657 179 664 155 664 c 0 + 107 664 63 633 63 581 c 0 + 63 557 69 530 101 498 c 1 + 223 397 l 1 435 691 l 1 478 660 l 1 - 263 362 l 1x96 - 379 252 415 177 415 122 c 0 - 415 74 383 42 359 22 c 1 - 327 6 299 2 271 2 c 0x9140 - 203 2 167 46 167 86 c 0x92 + 265 363 l 1 + 391 263 427 192 427 122 c 0 + 427 74 384 41 360 21 c 1 + 328 5 299 2 271 2 c 0 + 203 2 167 51 167 91 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE048 -Encoding: 3 57416 3 +Encoding: 13 57416 13 Width: 862 Flags: W HStem: -67 43<422.573 472 512 561.427> 176 40<122 261.794 360 472 512 624 722.206 862> 417 42<420.937 472 512 558.146> VStem: 260 100<86.3906 176 216 307.453> 472 40<-204 -64.8472 -24 176 216 416 456.872 596> 624 100<86.3906 176 216 306.031> CounterMasks: 1 1c @@ -194,72 +437,67 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE050 -Encoding: 4 57424 4 +Encoding: 14 57424 14 Width: 779 -Flags: W -HStem: -639 39<257.008 385.474> -255 39<268.842 402.5 446 488.682> 142 126<319.544 361 411 512.424> -VStem: 0 92<-43.3386 199.147> 139 226<-548.75 -424.855> 192 54<-23.0009 79.1161> 311 48<630.535 899.429> 425 39<-557.026 -267.641> 551 41<807.632 989.141> 613 66<-112.05 46.8229> +Flags: HMW LayerCount: 2 Fore SplineSet -399 266 m 1xf3c0 - 408 267 418 268 428 268 c 0 - 497 268 572 240 616 188 c 1 - 667 133 679 68 679 -3 c 0 - 679 -96 642 -169 555 -211 c 1 - 518 -230 488 -245 446 -249 c 1 - 462 -436 l 1 - 463 -452 464 -467 464 -482 c 0 - 464 -585 424 -639 316 -639 c 0 - 204 -639 139 -570 139 -486 c 0 - 139 -429 184 -378 253 -378 c 0 - 315 -378 365 -432 365 -491 c 0xf9c0 - 365 -550 317 -584 255 -585 c 1 - 275 -596 298 -600 324 -600 c 0 - 375 -600 425 -573 425 -472 c 0 - 425 -463 425 -454 424 -444 c 9 - 407 -254 l 1 - 396 -255 379 -255 368 -255 c 0 - 136 -255 0 -131 0 100 c 0 - 0 188 25 277 57 334 c 1 - 83 385 164 465 207 499 c 0 - 231 519 278 563 329 601 c 1 - 321 705 311 787 311 852 c 0 - 311 1052 410 1144 503 1172 c 1 - 588 1080 592 1005 592 873 c 0 - 592 688 539 598 380 473 c 1 - 399 266 l 1xf3c0 -411 142 m 1 - 442 -212 l 1 - 579 -181 613 -104 613 -28 c 0 - 613 54 533 142 425 142 c 0 - 420 142 416 142 411 142 c 1 -404 -212 m 2 - 372 138 l 1 - 303 125 246 83 246 16 c 0 - 246 -16 267 -55 293 -87 c 1 - 223 -70 192 1 192 73 c 0xf5c0 - 192 172 270 236 361 261 c 1 +364 851 m 0 + 358.834831965 811.556898639 356.976973124 782.035724861 356.976973124 751.255004513 c 0 + 356.976973124 716.483564406 359.347803652 680.10480549 362 626 c 1 + 443 681 551 791 551 896 c 4 + 551 942 546 1011 497 1023 c 5 + 417 1013 376 939 364 851 c 0 +449 -250 m 9 + 472 -486 l 0 + 472.010742188 -487.030273438 472.015625 -488.056640625 472.015625 -489.081054688 c 0 + 472.015625 -586.490234375 422.876582453 -657 316 -657 c 0 + 204 -657 139 -593 139 -509 c 0 + 139 -452 184 -392 253 -392 c 0 + 315 -392 365 -436 365 -495 c 0 + 365 -554 317 -594 255 -595 c 1 + 275 -606 298 -620 324 -620 c 0 + 376.540978621 -620 435.012695312 -591.5 435.012695312 -489.685546875 c 0 + 435.012695312 -488.795898438 435.008789062 -487.900390625 435 -487 c 0 + 412 -254 l 17 + 398.364449186 -255.357092735 384.770660292 -256.025113783 371.270180398 -256.025113783 c 0 + 175.860782244 -256.025113783 5.68434188608e-14 -116.071979914 0 100 c 0 + 0 188 25 277 58 335 c 8 + 131 463 275 562 326 600 c 1 + 317 704 313 787 313 852 c 0 + 313 1052 406 1152 494 1160 c 1 + 570 1115 592 1005 592 873 c 0 + 592 688 538 598 379 473 c 1 + 399 266 l 0 + 409.453125 267.208007812 419.672851562 267.79296875 429.6484375 267.79296875 c 0 + 584.774414062 267.79296875 679 144.540865361 679 -3 c 0 + 679 -124 618 -220 449 -250 c 9 +601 -23 m 0 + 601 51.748046875 536.096679688 141.236328125 423.16015625 141.236328125 c 0 + 419.477539062 141.236328125 415.756835938 140.158203125 412 140 c 1 + 445 -215 l 1 + 575 -189 601 -121 601 -23 c 0 +375 138 m 1 + 306 124 251 75 251 8 c 0 + 251 -35 281 -84 319 -108 c 1 + 246 -91 195 -56 195 46 c 0 + 195 176 270 236 361 261 c 1 344 450 l 1 164 306 93 226 92 82 c 1 - 95 -86 166 -216 400 -216 c 0 - 404 -216 404 -214 404 -212 c 2 -363 822 m 0 - 360 797 359 769 359 743 c 0xf3c0 - 359 690 363 641 366 626 c 1 - 447 681 551 785 551 890 c 0 - 551 936 539 1003 501 1025 c 1 - 415 1015 374 910 363 822 c 0 + 94.8109172159 -111.016315493 218.774420218 -221.508405886 375.873991765 -221.508405886 c 0 + 386.441654234 -221.508405886 397.159253713 -221.008441515 408 -220 c 0 + 375 138 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE05C -Encoding: 5 57436 5 +Encoding: 15 57436 15 Width: 722 Flags: W HStem: -516 36<404.33 535.95> -88 35<438.435 550.878> 50 35<444.881 548.647> 475 37<397.951 540.179> VStem: 0 123<-514 510> 186 28<-514 -6 15 510> 290 157<-427.748 -329.281 326.281 424.154> 614 108<-378.538 -189.443 184.402 376.99> LayerCount: 2 @@ -323,51 +561,51 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE062 -Encoding: 6 57442 6 +Encoding: 16 57442 16 Width: 703 Flags: W -HStem: -170 101<618.082 698.676> -127 234<86.7071 208.416> 72 102<613.871 693.281> 212 43<161.915 326.675> -VStem: 19 243<-51.1252 51.2871> 425 118<-191.301 97.8937> 610 97<-162.037 -77.8382 83.7117 162.856> +HStem: -170 101<618.042 698.676> -113 224<91.5691 210.802> 72 102<613.779 693.281> 215 40<163.491 326.905> +VStem: 19 241<-54.3228 59.215> 422 121<-211.326 98.8623> 610 97<-162.037 -77.8382 83.7117 162.856> LayerCount: 2 Fore SplineSet -19 41 m 0x5e - 19 173 130 255 261 255 c 0 - 374 255 448 220 499 146 c 0 - 529 102 543 31 543 -30 c 0 - 543 -193 492 -322 392 -412 c 1 - 291 -501 118 -593 -70 -603 c 1 - 72 -565 199 -508 287 -414 c 1 - 347 -352 392 -252 414 -146 c 0 - 421 -107 425 -69 425 -36 c 0 - 425 48 406 112 369 155 c 1 - 328 200 294 212 242 212 c 0 - 166 212 85 156 67 62 c 1 - 97 100 108 107 145 107 c 0 - 206 107 262 48 262 -15 c 0 - 262 -47 250 -75 223 -97 c 1 - 200 -118 172 -127 145 -127 c 0 - 67 -127 19 -40 19 41 c 0x5e -661 -170 m 4x9e - 632 -170 610 -150 610 -119 c 4 - 610 -90 627 -69 656 -69 c 4 - 683 -69 707 -90 707 -119 c 4 - 707 -148 687 -170 661 -170 c 4x9e -655 72 m 4x3e - 625 72 605 94 605 127 c 4 - 605 156 624 174 654 174 c 4 - 681 174 702 153 702 127 c 4 - 702 94 682 72 655 72 c 4x3e +19 29 m 0x5e + 19 161 125 255 261 255 c 0 + 378 255 440 220 496 146 c 0 + 528.135801023 103.534834363 543 31 543 -30 c 0 + 543 -193 509 -303 392 -412 c 24 + 250 -545 118 -593 -70 -603 c 1 + 72 -565 193 -517 296 -414 c 0 + 362.272166103 -347.727833897 383 -307 408 -201 c 0 + 417.095703125 -162.434570312 422 -69 422 -36 c 0 + 422 48 418 100 376 150 c 0 + 339.06264499 193.973041679 314 215 245 215 c 0 + 168 215 91 170 67 62 c 1 + 97 100 116 111 153 111 c 4 + 214 111 260 62 260 -1 c 0 + 260 -33 248 -61 221 -83 c 1 + 198 -104 166 -113 139 -113 c 0 + 71 -113 19 -52 19 29 c 0x5e +661 -170 m 0x9e + 632 -170 610 -150 610 -119 c 0 + 610 -90 629 -69 656 -69 c 4 + 683 -69 707 -90 707 -119 c 0 + 707 -148 687 -170 661 -170 c 0x9e +655 72 m 0x3e + 625 72 605 94 605 127 c 0 + 605 156 626 174 654 174 c 4 + 681 174 702 153 702 127 c 0 + 702 94 682 72 655 72 c 0x3e EndSplineSet Validated: 1 EndChar StartChar: uniE069 -Encoding: 7 57449 7 +Encoding: 17 57449 17 Width: 470 Flags: W VStem: 0 150<-250 250> 220 150<-250 250> LayerCount: 2 Fore @@ -385,11 +623,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE07A -Encoding: 8 57466 8 +Encoding: 18 57466 18 Width: 779 Flags: W HStem: -502 30<205.501 304.477> -204 31<214.246 323 357 391.941> 113 95<243.207 289> 118 99<329.167 431.634> VStem: 0 76<-48.8921 170.465> 111 181<-436.162 -326.772> 154 43<-16.0423 68.9973> 249 38<502.74 719.447> 338 32<-437.341 -205.711> 442 32<651.371 785.751> 502 41<-92.0505 45.5518> LayerCount: 2 @@ -447,11 +685,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE07B -Encoding: 9 57467 9 +Encoding: 19 57467 19 Width: 782 Flags: W HStem: -413 29<322.95 428.387> -70 28<351.623 440.673> 40 28<355.737 438.873> 380 30<318.164 432.756> VStem: 0 98<-411 408> 149 22<-411 -5 12 408> 232 126<-344.637 -259.418 257.61 342.509> 491 87<-311.532 -144.136 138.096 308.532> LayerCount: 2 @@ -515,11 +753,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE07C -Encoding: 10 57468 10 +Encoding: 20 57468 20 Width: 807 Flags: W HStem: -136 81<491.982 561.648> -102 188<67.2812 172.801> 58 81<488.633 557.386> 170 34<129.66 260.591> VStem: 15 195<-48.9031 47.6335> 340 94<-168.512 89.0947> 488 78<-131.953 -59.6448 63.9747 133.311> LayerCount: 2 @@ -553,13 +791,43 @@ 545 139 562 123 562 102 c 0 562 76 546 58 524 58 c 0x3e EndSplineSet Validated: 1 EndChar + +StartChar: uniE07D +Encoding: 21 57469 21 +Width: 200 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +80 119 m 1 + 55 105 45 90 45 70 c 0 + 45 42 68 20 88 20 c 0 + 113 20 125 44 125 64 c 0 + 125 84 103 102 80 119 c 1 +123 220 m 28 + 105 220 90 209 90 189 c 0 + 90 169 99 159 122 141 c 1 + 145 148 157 161 157 185 c 0 + 157 205 144 220 123 220 c 28 +90 0 m 0 + 41 0 0 30 0 70 c 0 + 0 104 32 118 69 130 c 1 + 49 148 40 157 40 180 c 0 + 40 215 70 240 110 240 c 0 + 154 240 200 220 200 180 c 0 + 200 156 178 139 140 129 c 1 + 164 110 180 90 180 70 c 0 + 180 27 140 0 90 0 c 0 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE080 -Encoding: 11 57472 11 +Encoding: 22 57472 22 Width: 430 Flags: HMW LayerCount: 2 Fore SplineSet @@ -576,11 +844,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE081 -Encoding: 12 57473 12 +Encoding: 23 57473 23 Width: 290 Flags: HMW LayerCount: 2 Fore SplineSet @@ -598,11 +866,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE082 -Encoding: 13 57474 13 +Encoding: 24 57474 24 Width: 400 Flags: HMW HStem: -250 500 VStem: 0 400 LayerCount: 2 @@ -633,11 +901,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE083 -Encoding: 14 57475 14 +Encoding: 25 57475 25 Width: 380 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -670,11 +938,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE084 -Encoding: 15 57476 15 +Encoding: 26 57476 26 Width: 400 Flags: HMW HStem: -250 500 VStem: 0 400 LayerCount: 2 @@ -701,11 +969,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE085 -Encoding: 16 57477 16 +Encoding: 27 57477 27 Width: 400 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -736,11 +1004,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE086 -Encoding: 17 57478 17 +Encoding: 28 57478 28 Width: 385 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -766,11 +1034,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE087 -Encoding: 18 57479 18 +Encoding: 29 57479 29 Width: 400 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -789,11 +1057,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE088 -Encoding: 19 57480 19 +Encoding: 30 57480 30 Width: 400 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -816,14 +1084,15 @@ 351 -16 388 -46 388 -121 c 4 388 -197 293 -250 194 -250 c 1 93 -250 0 -194 0 -130 c 0 0 -77 50 -44 108 -16 c 1 EndSplineSet +Validated: 1 EndChar StartChar: uniE089 -Encoding: 20 57481 20 +Encoding: 31 57481 31 Width: 385 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -849,11 +1118,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE08A -Encoding: 21 57482 21 +Encoding: 32 57482 32 Width: 409 Flags: W HStem: -246 29<187.663 292.861> 30 134<264.058 320.72> 228 21<196.786 281.147> VStem: 9 110<-126.934 138.101> 325 54<100.5 183.933> 392 17<-84.7973 -75.9219> LayerCount: 2 @@ -883,11 +1152,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE08B -Encoding: 22 57483 22 +Encoding: 33 57483 33 Width: 408 Flags: W HStem: -246 29<215.419 292.933> 30 134<264.058 320.72> 228 21<215.371 280.515> VStem: 9 110<-126.934 136.6> 180 35<-350 -246 -197 209 248 350> 325 54<100.5 183.933> 392 17<-84.661 -75.9219> LayerCount: 2 @@ -930,11 +1199,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE08C -Encoding: 23 57484 23 +Encoding: 34 57484 34 Width: 500 Flags: HMW HStem: -250 500 LayerCount: 2 Fore @@ -955,11 +1224,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE094 -Encoding: 24 57492 24 +Encoding: 35 57492 35 Width: 260 Flags: MW HStem: -250 500 LayerCount: 2 Fore @@ -974,11 +1243,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE095 -Encoding: 25 57493 25 +Encoding: 36 57493 36 Width: 260 Flags: HMW LayerCount: 2 Fore SplineSet @@ -992,110 +1261,92 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE0A0 -Encoding: 26 57504 26 -Width: 529 -Flags: W -HStem: -129 35<239.072 356.375> 98 31<166.535 282.804> -VStem: 0 39<-180 170> 40 106<-19.7907 60.9119> 378 110<-62.7554 24.9716> 489 40<-180 170> +Encoding: 37 57504 37 +Width: 619 +Flags: HMW LayerCount: 2 Fore SplineSet -489 170 m 1 - 529 170 l 1 - 529 -180 l 1 - 489 -180 l 1 - 489 170 l 1 -0 170 m 1 - 39 170 l 1 - 39 -180 l 1 - 0 -180 l 1 - 0 170 l 1 -151 63 m 0 - 148 56 146 47 146 37 c 0 - 146 29 147 22 149 15 c 0 - 161 -26 224 -89 290 -94 c 0 - 294 -94 299 -94 303 -94 c 0 - 331 -94 357 -88 373 -59 c 0 - 377 -52 378 -44 378 -36 c 0 - 378 -27 377 -18 375 -11 c 0 - 364 30 300 93 234 98 c 0 - 230 98 225 98 221 98 c 0 - 192 98 164 92 151 63 c 0 -488 0 m 0 - 488 -80 400 -129 264 -129 c 0 - 128 -129 40 -80 40 -5 c 0 - 40 80 128 129 264 129 c 0 - 400 129 488 80 488 0 c 0 +424 -32 m 0 + 424 38 361 99 280 99 c 0 + 241 99 196 73 196 29 c 0 + 196 -42 263 -99 344 -99 c 0 + 385 -99 424 -77 424 -32 c 0 +538 170 m 1 + 588 170 l 1 + 588 -170 l 1 + 538 -170 l 1 + 538 170 l 1 +36 170 m 1 + 86 170 l 1 + 86 -170 l 1 + 36 -170 l 1 + 36 170 l 1 +537 0 m 0 + 537 -80 448 -130 312 -130 c 0 + 176 -130 87 -75 87 0 c 0 + 87 85 176 130 312 130 c 0 + 448 130 537 80 537 0 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE0A1 -Encoding: 27 57505 27 -Width: 540 -Flags: W -HStem: -170 100<25 515> 70 100<25 515> -VStem: 0 25<-220 -170 -70 70 170 220> 515 25<-220 -170 -70 70 170 220> +Encoding: 38 57505 38 +Width: 530 +Flags: HMW LayerCount: 2 Fore SplineSet -25 70 m 29 - 25 -70 l 29 - 515 -70 l 29 - 515 70 l 29 - 25 70 l 29 +30 65 m 25 + 30 -65 l 25 + 500 -65 l 25 + 500 65 l 25 + 30 65 l 25 0 220 m 29 - 25 220 l 29 - 25 170 l 29 - 515 170 l 29 - 515 220 l 29 - 540 220 l 29 - 540 -220 l 29 - 515 -220 l 29 - 515 -170 l 29 - 25 -170 l 29 - 25 -220 l 29 - 0 -220 l 29 + 30 220 l 25 + 30 165 l 25 + 500 165 l 25 + 500 220 l 25 + 530 220 l 25 + 530 -220 l 25 + 500 -220 l 25 + 500 -165 l 25 + 30 -165 l 25 + 30 -220 l 25 + 0 -220 l 25 0 220 l 29 EndSplineSet Validated: 1 EndChar StartChar: uniE0A2 -Encoding: 28 57506 28 -Width: 448 -Flags: W -HStem: -129 35<199.072 316.375> 98 31<126.535 242.804> -VStem: 0 106<-19.7907 60.9119> 338 110<-62.7554 24.9716> +Encoding: 39 57506 39 +Width: 450 +Flags: HMW LayerCount: 2 Fore SplineSet -111 63 m 0 - 108 56 106 47 106 37 c 0 - 106 29 107 22 109 15 c 0 - 121 -26 184 -89 250 -94 c 0 - 254 -94 259 -94 263 -94 c 0 - 291 -94 317 -88 333 -59 c 0 - 337 -52 338 -44 338 -36 c 0 - 338 -27 337 -18 335 -11 c 0 - 324 30 260 93 194 98 c 0 - 190 98 185 98 181 98 c 0 - 152 98 124 92 111 63 c 0 -448 0 m 0 - 448 -80 360 -129 224 -129 c 0 - 88 -129 0 -80 0 -5 c 0 - 0 80 88 129 224 129 c 0 - 360 129 448 80 448 0 c 0 +337 -30 m 4 + 337 40 264 101 193 101 c 4 + 154 101 109 75 109 31 c 4 + 109 -40 186 -97 257 -97 c 4 + 298 -97 337 -75 337 -30 c 4 +450 0 m 0 + 450 -70 361 -129 225 -129 c 0 + 89 -129 0 -70 0 0 c 0 + 0 70 89 129 225 129 c 0 + 361 129 450 70 450 0 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE0A3 -Encoding: 29 57507 29 +Encoding: 40 57507 40 Width: 329 Flags: W HStem: -148 57<54.5533 171.763> 91 57<156.237 273.528> VStem: 0 31<-79.2669 -12.3025> 297 31<12.3025 73.4219> LayerCount: 2 @@ -1118,31 +1369,27 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE0A4 -Encoding: 30 57508 30 -Width: 330 -Flags: W -HStem: -140 279<120.935 205.86> -VStem: 0 330<-42.5424 39.6306> +Encoding: 41 57508 41 +Width: 320 +Flags: HMW LayerCount: 2 Fore SplineSet -0 -33 m 0 - 0 55 77 109 165 132 c 0 - 182 136 197 139 212 139 c 0 - 276 139 330 103 330 33 c 0 - 330 -56 255 -106 165 -132 c 0 - 147 -138 131 -140 114 -140 c 0 - 52 -140 0 -103 0 -33 c 0 +320 40 m 0 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 280 135 320 90 320 40 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE0A9 -Encoding: 31 57513 31 +Encoding: 42 57513 42 Width: 330 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1162,11 +1409,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE0B3 -Encoding: 32 57523 32 +Encoding: 43 57523 43 Width: 300 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1198,11 +1445,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE101 -Encoding: 33 57601 33 +Encoding: 44 57601 44 Width: 560 Flags: W LayerCount: 2 Fore SplineSet @@ -1212,17 +1459,50 @@ 119 -250 l 5 0 -250 l 5 EndSplineSet Validated: 1 EndChar + +StartChar: uniE1B9 +Encoding: 45 57785 45 +Width: 330 +Flags: W +HStem: -140 280 +VStem: 0 330 +LayerCount: 2 +Fore +SplineSet +0 0 m 1 + 165 140 l 1 + 330 0 l 1 + 165 -140 l 1 + 0 0 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1BB +Encoding: 46 57787 46 +Width: 330 +Flags: W +HStem: -140 280 +VStem: 0 330 +LayerCount: 2 +Fore +SplineSet +0 -140 m 29 + 165 140 l 25 + 330 -140 l 29 + 0 -140 l 29 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE1E7 -Encoding: 34 57831 34 -Width: 480 -Flags: W -HStem: -50 100<8.4375 91.5625> -VStem: 0 100<-41.5625 41.5625> +Encoding: 47 57831 47 +Width: 100 +Flags: MW LayerCount: 2 Fore SplineSet 50 -50 m 3 22 -50 0 -28 0 0 c 3 @@ -1230,40 +1510,350 @@ 78 50 100 28 100 0 c 3 100 -28 78 -50 50 -50 c 3 EndSplineSet Validated: 1 EndChar + +StartChar: uniE240 +Encoding: 48 57920 48 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -239 m 9 + 0 0 l 1 + 30 0 l 1 + 51 -195 315 -321 315 -584 c 0 + 315 -643 302 -710 269 -785 c 1 + 282 -738 287 -691 287 -647 c 0 + 287 -452 175 -294 30 -239 c 1 + 0 -239 l 9 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE241 +Encoding: 49 57921 49 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 0 m 1 + 0 239 l 1 + 30 239 l 1 + 178 280 288 445 288 642 c 0 + 288 688 282 736 269 785 c 1 + 302 711 315 647 315 588 c 0 + 315 328 51 195 30 0 c 0 + 0 0 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE242 +Encoding: 50 57922 50 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -343 m 9 + 0 0 l 1 + 30 0 l 1 + 62.1962890625 -133.135742188 315.4921875 -235.983398438 315.4921875 -417.918945312 c 0 + 315.4921875 -445.063476562 309.853515625 -473.969726562 297 -505 c 1 + 308.7109375 -531.232421875 315.594726562 -559.000976562 315.594726562 -588.922851562 c 0 + 315.594726562 -622.875976562 306.73046875 -659.6015625 286 -700 c 1 + 289.740234375 -679.993164062 291.475585938 -660.758789062 291.475585938 -642.3125 c 0 + 291.475585938 -448.700195312 100.301757812 -342 30 -342 c 1 + 0 -343 l 9 +30 -171 m 1 + 56 -278 226 -366 291 -492 c 1 + 291.465820312 -485.108398438 291.692382812 -478.3203125 291.692382812 -471.635742188 c 0 + 291.692382812 -277.536132812 100.569335938 -171 30 -171 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE243 +Encoding: 51 57923 51 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -1 m 9 + 0 342 l 1 + 30 342 l 1 + 100.301757812 342 291.475585938 448.700195312 291.475585938 642.3125 c 0 + 291.475585938 660.758789062 289.740234375 679.993164062 286 700 c 1 + 306.73046875 659.6015625 315.594726562 622.875976562 315.594726562 588.922851562 c 0 + 315.594726562 559.000976562 308.7109375 531.232421875 297 505 c 1 + 309.853515625 473.969726562 315.4921875 445.063476562 315.4921875 417.918945312 c 0 + 315.4921875 235.983398438 62.1962890625 133.135742188 30 0 c 1 + 0 -1 l 9 +30 171 m 1 + 100.569335938 171 291.692382812 277.536132812 291.692382812 471.635742188 c 0 + 291.692382812 478.3203125 291.465820312 484.108398438 291 491 c 1 + 226 365 56 278 30 171 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE244 +Encoding: 52 57924 52 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -368 m 9 + 0 145 l 1 + 30 145 l 1 + 62 12 315 -91 315 -273 c 0 + 315 -300 310 -329 297 -360 c 1 + 309 -386 315 -414 315 -444 c 0 + 315 -471 310 -500 297 -531 c 1 + 309 -557 316 -585 316 -615 c 0 + 316 -649 307 -686 286 -726 c 1 + 290 -706 291 -687 291 -668 c 0 + 291 -475 100 -368 30 -368 c 1 + 0 -368 l 9 +30 -199 m 1 + 56 -307 226 -392 291 -518 c 1 + 291 -511 292 -504 292 -498 c 0 + 292 -305.781467412 104.491731968 -198.972460053 31.9860569235 -198.972460053 c 0 + 31.3140795885 -198.972460053 30.6519803414 -198.981634357 30 -199 c 1 +30 -28 m 1 + 56 -135 226 -221 291 -347 c 1 + 291 -340 292 -333 292 -327 c 0 + 292 -134.781467412 104.491731968 -27.9724600525 31.9860569235 -27.9724600525 c 0 + 31.3140795885 -27.9724600525 30.6519803414 -27.9816343566 30 -28 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE245 +Encoding: 53 57925 53 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 343 m 17 + 30 343 l 1 + 100.301757812 343 291.475585938 449.700195312 291.475585938 643.3125 c 0 + 291.475585938 661.758789062 289.740234375 680.993164062 286 701 c 1 + 306.73046875 660.6015625 315.594726562 623.875976562 315.594726562 589.922851562 c 0 + 315.594726562 560.000976562 308.7109375 532.232421875 297 506 c 1 + 309.81640625 475.145507812 315.422851562 446.318359375 315.422851562 419.19921875 c 0 + 315.422851562 389.1875 308.556640625 361.265625 297 335 c 1 + 309.853515625 303.969726562 315.4921875 275.063476562 315.4921875 247.918945312 c 0 + 315.4921875 65.9833984375 62.1962890625 -36.8642578125 30 -170 c 1 + 0 -170 l 1 + 0 343 l 17 +30 0 m 1 + 100.569335938 0 291.692382812 107.536132812 291.692382812 301.635742188 c 0 + 291.692382812 308.3203125 291.465820312 315.108398438 291 322 c 1 + 226 196 56 109 30 0 c 1 +30 171 m 1 + 100.569335938 171 291.692382812 278.536132812 291.692382812 472.635742188 c 0 + 291.692382812 479.3203125 291.465820312 486.108398438 291 493 c 1 + 226 367 56 280 30 171 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE246 +Encoding: 54 57926 54 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -344 m 9 + 0 340 l 1 + 30 340 l 1 + 62.1962890625 206.864257812 315.4921875 104.016601562 315.4921875 -77.9189453125 c 0 + 315.4921875 -105.063476562 309.853515625 -133.969726562 297 -165 c 1 + 308.556640625 -191.265625 315.422851562 -219.1875 315.422851562 -249.19921875 c 0 + 315.422851562 -276.318359375 309.81640625 -305.145507812 297 -336 c 1 + 308.556640625 -362.265625 315.422851562 -390.1875 315.422851562 -420.19921875 c 0 + 315.422851562 -447.318359375 309.81640625 -476.145507812 297 -507 c 1 + 308.7109375 -533.232421875 315.594726562 -561.000976562 315.594726562 -590.922851562 c 0 + 315.594726562 -624.875976562 306.73046875 -661.6015625 286 -702 c 1 + 289.740234375 -681.993164062 291.475585938 -662.758789062 291.475585938 -644.3125 c 0 + 291.475585938 -450.700195312 100.301757812 -344 30 -344 c 1 + 0 -344 l 9 +30 -173 m 1 + 56 -281 226 -368 291 -494 c 1 + 291.465820312 -487.108398438 291.692382812 -480.3203125 291.692382812 -473.635742188 c 0 + 291.692382812 -279.536132812 100.569335938 -173 30 -173 c 1 +30 -2 m 1 + 56 -110 226 -197 291 -323 c 1 + 291.465820312 -316.108398438 291.692382812 -309.3203125 291.692382812 -302.635742188 c 0 + 291.692382812 -108.536132812 100.569335938 -2 30 -2 c 1 +30 169 m 1 + 56 62 226 -26 291 -152 c 1 + 291.465820312 -145.108398438 291.692382812 -138.3203125 291.692382812 -131.635742188 c 0 + 291.692382812 62.4638671875 100.569335938 169 30 169 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE247 +Encoding: 55 57927 55 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -370 m 9 + 0 314 l 1 + 30 314 l 1 + 100.301757812 314 291.475585938 420.700195312 291.475585938 614.3125 c 0 + 291.475585938 632.758789062 289.740234375 651.993164062 286 672 c 1 + 306.73046875 631.6015625 315.594726562 594.875976562 315.594726562 560.922851562 c 0 + 315.594726562 531.000976562 308.7109375 503.232421875 297 477 c 1 + 309.81640625 446.145507812 315.422851562 417.318359375 315.422851562 390.19921875 c 0 + 315.422851562 360.1875 308.556640625 332.265625 297 306 c 1 + 309.81640625 275.145507812 315.422851562 246.318359375 315.422851562 219.19921875 c 0 + 315.422851562 189.1875 308.556640625 161.265625 297 135 c 1 + 309.853515625 103.969726562 315.4921875 75.0634765625 315.4921875 47.9189453125 c 0 + 315.4921875 -134.016601562 62.1962890625 -236.864257812 30 -370 c 1 + 0 -370 l 9 +30 -200 m 5 + 100.569335938 -200 291.692382812 -92.4638671875 291.692382812 101.635742188 c 0 + 291.692382812 108.3203125 291.465820312 115.108398438 291 122 c 5 + 226 -4 56 -91 30 -200 c 5 +30 -29 m 1 + 100.569335938 -29 291.692382812 78.5361328125 291.692382812 272.635742188 c 0 + 291.692382812 279.3203125 291.465820312 286.108398438 291 293 c 1 + 226 167 56 81 30 -29 c 1 +30 142 m 1 + 100.569335938 142 291.692382812 249.536132812 291.692382812 443.635742188 c 0 + 291.692382812 450.3203125 291.465820312 457.108398438 291 464 c 1 + 226 338 56 251 30 142 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE248 +Encoding: 56 57928 56 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -325 m 9 + 0 530 l 1 + 30 530 l 1 + 62.1962890625 396.864257812 315.4921875 294.016601562 315.4921875 112.081054688 c 0 + 315.4921875 84.9365234375 309.853515625 56.0302734375 297 25 c 1 + 308.556640625 -1.265625 315.422851562 -29.1875 315.422851562 -59.19921875 c 0 + 315.422851562 -86.318359375 309.81640625 -115.145507812 297 -146 c 1 + 308.556640625 -172.265625 315.422851562 -200.1875 315.422851562 -230.19921875 c 0 + 315.422851562 -257.318359375 309.81640625 -286.145507812 297 -317 c 1 + 308.556640625 -343.265625 315.422851562 -371.1875 315.422851562 -401.19921875 c 0 + 315.422851562 -428.318359375 309.81640625 -457.145507812 297 -488 c 1 + 308.7109375 -514.232421875 315.594726562 -542.000976562 315.594726562 -571.922851562 c 0 + 315.594726562 -605.875976562 306.73046875 -642.6015625 286 -683 c 1 + 289.740234375 -662.993164062 291.475585938 -643.758789062 291.475585938 -625.3125 c 0 + 291.475585938 -431.700195312 100.301757812 -325 30 -325 c 1 + 0 -325 l 9 +30 -154 m 1 + 56 -262 226 -349 291 -475 c 1 + 291.465820312 -468.108398438 291.692382812 -461.3203125 291.692382812 -454.635742188 c 0 + 291.692382812 -260.536132812 100.569335938 -154 30 -154 c 1 +30 17 m 1 + 56 -91 226 -178 291 -304 c 1 + 291.465820312 -297.108398438 291.692382812 -290.3203125 291.692382812 -283.635742188 c 0 + 291.692382812 -89.5361328125 100.569335938 17 30 17 c 1 +30 188 m 1 + 56 80 226 -7 291 -133 c 1 + 291.465820312 -126.108398438 291.692382812 -119.3203125 291.692382812 -112.635742188 c 0 + 291.692382812 81.4638671875 100.569335938 188 30 188 c 1 +30 359 m 1 + 56 252 226 164 291 38 c 1 + 291.465820312 44.8916015625 291.692382812 51.6796875 291.692382812 58.3642578125 c 0 + 291.692382812 252.463867188 100.569335938 359 30 359 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE249 +Encoding: 57 57929 57 +Width: 315 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 -580 m 9 + 0 275 l 1 + 30 275 l 1 + 100.301757812 275 291.475585938 381.700195312 291.475585938 575.3125 c 0 + 291.475585938 593.758789062 289.740234375 612.993164062 286 633 c 1 + 306.73046875 592.6015625 315.594726562 555.875976562 315.594726562 521.922851562 c 0 + 315.594726562 492.000976562 308.7109375 464.232421875 297 438 c 1 + 309.81640625 407.145507812 315.422851562 378.318359375 315.422851562 351.19921875 c 0 + 315.422851562 321.1875 308.556640625 293.265625 297 267 c 1 + 309.81640625 236.145507812 315.422851562 207.318359375 315.422851562 180.19921875 c 0 + 315.422851562 150.1875 308.556640625 122.265625 297 96 c 1 + 309.81640625 65.1455078125 315.422851562 36.318359375 315.422851562 9.19921875 c 0 + 315.422851562 -20.8125 308.556640625 -48.734375 297 -75 c 1 + 309.853515625 -106.030273438 315.4921875 -134.936523438 315.4921875 -162.081054688 c 0 + 315.4921875 -344.016601562 62.1962890625 -446.864257812 30 -580 c 1 + 0 -580 l 9 +30 -410 m 5 + 100.569335938 -410 291.692382812 -302.463867188 291.692382812 -108.364257812 c 0 + 291.692382812 -101.6796875 291.465820312 -94.8916015625 291 -88 c 5 + 226 -214 56 -301 30 -410 c 5 +30 -239 m 1 + 100.569335938 -239 291.692382812 -131.463867188 291.692382812 62.6357421875 c 0 + 291.692382812 69.3203125 291.465820312 76.1083984375 291 83 c 1 + 226 -43 56 -129 30 -239 c 1 +30 -68 m 1 + 100.569335938 -68 291.692382812 39.5361328125 291.692382812 233.635742188 c 0 + 291.692382812 240.3203125 291.465820312 247.108398438 291 254 c 1 + 226 128 56 41 30 -68 c 1 +30 103 m 1 + 100.569335938 103 291.692382812 210.536132812 291.692382812 404.635742188 c 0 + 291.692382812 411.3203125 291.465820312 418.108398438 291 425 c 1 + 226 299 56 213 30 103 c 1 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE260 -Encoding: 35 57952 35 +Encoding: 58 57952 58 Width: 269 -Flags: W -HStem: 122 38<116.669 186.23> -VStem: 50 35<-129 103.906 108 432> 203 66<-1.30317 108.888> +Flags: HMW LayerCount: 2 Fore SplineSet -148 122 m 0 - 122 122 85 99 85 74 c 2 - 85 -129 l 1 - 103 -127 128 -103 157 -60 c 1 - 187 -19 203 22 203 57 c 0 - 203 92 179 122 148 122 c 0 -178 160 m 0 - 222 160 269 124 269 75 c 0 - 269 28 243 -20 190 -74 c 0 - 136 -128 84 -156 50 -156 c 1 - 50 40 50 236 50 432 c 1 - 85 432 l 1 - 85 108 l 1 - 108 142 138 160 178 160 c 0 +103 122 m 0 + 77 122 40 90 40 65 c 2 + 40 -120 l 1 + 58 -112 83 -92 112 -49 c 1 + 142 -8 155 22 155 57 c 0 + 155 92 134 122 103 122 c 0 +133 160 m 0 + 177 160 225 124 225 75 c 0 + 225 28 203 -20 150 -74 c 0 + 96 -128 40 -156 0 -156 c 1 + 0 432 l 1 + 40 432 l 1 + 40 108 l 1 + 63 142 93 160 133 160 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE261 -Encoding: 36 57953 36 +Encoding: 59 57953 59 Width: 200 Flags: W VStem: 0 28<-101 49 146 376> 172 25<-378 -152 -56 94> LayerCount: 2 Fore @@ -1286,57 +1876,56 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE262 -Encoding: 37 57954 37 -Width: 269 -Flags: W -VStem: 57 25<-369 -194 -103 71 164 334> 184 24<-328 -158 -68 106 198 373> +Encoding: 60 57954 60 +Width: 255 +Flags: HMW LayerCount: 2 Fore SplineSet -82 77 m 17 - 82 -103 l 1 - 184 -75 l 1 - 184 106 l 1 - 82 77 l 17 -82 -369 m 1 - 57 -369 l 1 - 57 -194 l 1 - 0 -211 l 1 - 0 -126 l 1 - 57 -112 l 1 - 57 71 l 1 - 0 55 l 1 - 0 142 l 1 - 57 156 l 1 - 57 334 l 1 - 82 334 l 1 - 82 164 l 1 - 184 190 l 1 - 184 373 l 1 - 208 373 l 1 - 208 198 l 1 - 268 213 l 1 - 268 130 l 1 - 208 112 l 1 - 208 -68 l 1 - 268 -53 l 1 - 268 -136 l 1 - 208 -151 l 1 - 208 -328 l 1 - 184 -328 l 1 - 184 -158 l 1 - 82 -187 l 1 - 82 -369 l 1 +83 70 m 21 + 83 -97 l 5 + 173 -70 l 5 + 173 97 l 5 + 83 70 l 21 +83 -360 m 5 + 53 -360 l 5 + 53 -197 l 5 + 0 -212 l 5 + 0 -120 l 5 + 53 -105 l 5 + 53 62 l 5 + 0 47 l 5 + 0 137 l 5 + 53 152 l 5 + 53 320 l 5 + 83 320 l 5 + 83 161 l 5 + 173 189 l 5 + 173 360 l 5 + 202 360 l 5 + 202 197 l 5 + 255 212 l 5 + 255 120 l 5 + 202 105 l 5 + 202 -62 l 5 + 255 -47 l 5 + 255 -137 l 5 + 202 -152 l 5 + 202 -320 l 5 + 173 -320 l 5 + 173 -161 l 5 + 83 -189 l 5 + 83 -360 l 5 EndSplineSet Validated: 1 EndChar StartChar: uniE263 -Encoding: 38 57955 38 +Encoding: 61 57955 61 Width: 267 Flags: W HStem: -124 74<20 77 210 267> 50 72<20 77 210 267> VStem: 20 72<-124 -65 65 122> 195 72<-124 -65 65 122> LayerCount: 2 @@ -1370,22 +1959,20 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE264 -Encoding: 39 57956 39 +Encoding: 62 57956 62 Width: 366 -Flags: W -HStem: 125 38<53.6461 109.57 242.595 296.832> -VStem: 0 31<-125 432> 122 54<-4.60115 110.015> 189 30<-125 432> 311 53<-2.92645 109.746> +Flags: HMW LayerCount: 2 Fore SplineSet 78 125 m 1 55 124 31 100 31 78 c 2 - 31 -125 l 1 - 43 -125 54 -108 75 -79 c 0 + 31 -120 l 1 + 43 -120 54 -108 75 -79 c 0 96 -50 110 -19 118 16 c 0 122 29 122 42 122 54 c 0 122 72 119 90 112 104 c 1 102 117 90 125 79 125 c 2 78 125 l 1 @@ -1398,12 +1985,12 @@ 31 432 l 1 31 113 l 1 47 145 68 163 104 163 c 0 265 125 m 1 242 124 219 100 219 78 c 2 - 219 -125 l 1 - 230 -125 244 -108 265 -79 c 0 + 219 -120 l 5 + 230 -120 244 -108 265 -79 c 0 283 -50 297 -19 305 16 c 0 309 29 311 42 311 54 c 0 311 72 307 90 300 104 c 1 290 117 280 125 269 125 c 2 265 125 l 1 @@ -1419,11 +2006,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE280 -Encoding: 40 57984 40 +Encoding: 63 57984 63 Width: 269 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1442,13 +2029,150 @@ 76 -20 50 28 50 75 c 0 50 124 97 160 141 160 c 0 EndSplineSet Validated: 1 EndChar + +StartChar: uniE281 +Encoding: 64 57985 64 +Width: 366 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +87 125 m 1 + 86 125 l 2 + 75 125 63 117 53 104 c 1 + 46 90 43 72 43 54 c 0 + 43 42 43 29 47 16 c 0 + 55 -19 69 -50 90 -79 c 0 + 111 -108 122 -120 134 -120 c 1 + 134 78 l 2 + 134 100 110 124 87 125 c 1 +61 163 m 0 + 97 163 118 145 134 113 c 1 + 134 432 l 1 + 165 432 l 1 + 165 -150 l 1 + 135 -150 94 -121 65 -86 c 0 + 37 -52 15 -17 -2 23 c 1 + -7 41 -11 57 -11 73 c 0 + -11 116 21 163 61 163 c 0 +265 125 m 1 + 242 124 219 100 219 78 c 2 + 219 -120 l 1 + 230 -120 244 -108 265 -79 c 0 + 283 -50 297 -19 305 16 c 0 + 309 29 311 42 311 54 c 0 + 311 72 307 90 300 104 c 1 + 290 117 280 125 269 125 c 2 + 265 125 l 1 +291 163 m 0 + 333 163 364 119 364 73 c 0 + 364 57 360 41 353 23 c 0 + 337 -17 317 -52 288 -86 c 1 + 260 -121 219 -150 189 -150 c 1 + 189 432 l 1 + 219 432 l 1 + 219 113 l 1 + 235 143 256 163 291 163 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE282 +Encoding: 65 57986 65 +Width: 169 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +68 320 m 8 + 98 320 l 1 + 98 158 l 1 + 169 172 l 1 + 169 80 l 1 + 98 66 l 1 + 98 -61 l 1 + 169 -47 l 1 + 169 -137 l 1 + 98 -152 l 1 + 98 -320 l 8 + 68 -320 l 1 + 68 -158 l 1 + 0 -172 l 1 + 0 -80 l 1 + 68 -66 l 1 + 68 61 l 1 + 0 47 l 1 + 0 137 l 1 + 68 152 l 1 + 68 320 l 8 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE283 +Encoding: 66 57987 66 +Width: 314 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +233 192 m 17 + 233 360 l 1 + 263 360 l 1 + 263 202 l 1 + 314 217 l 1 + 314 125 l 1 + 263 110 l 1 + 263 -49 l 1 + 314 -34 l 1 + 314 -124 l 1 + 263 -139 l 1 + 263 -320 l 1 + 233 -320 l 1 + 233 -150 l 1 + 172 -168 l 1 + 172 -340 l 25 + 142 -340 l 25 + 142 -176 l 25 + 82 -192 l 17 + 81 -360 l 1 + 51 -360 l 1 + 51 -202 l 1 + 0 -217 l 1 + 0 -125 l 1 + 51 -110 l 1 + 51 49 l 1 + 0 34 l 1 + 0 124 l 1 + 51 139 l 1 + 51 320 l 1 + 81 320 l 1 + 81 150 l 1 + 142 168 l 1 + 142 340 l 25 + 172 340 l 25 + 172 176 l 25 + 233 192 l 17 +142 -83 m 9 + 142 75 l 1 + 81 58 l 1 + 81 -101 l 1 + 142 -83 l 9 +172 83 m 9 + 172 -75 l 1 + 233 -58 l 1 + 233 101 l 1 + 172 83 l 9 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE4A0 -Encoding: 41 58528 41 +Encoding: 67 58528 67 Width: 320 Flags: W HStem: 0 244<5 15> VStem: -3 322 LayerCount: 2 @@ -1469,13 +2193,61 @@ 319 109 314 101 305 98 c 1 18 1 l 0 EndSplineSet Validated: 1 EndChar + +StartChar: uniE4A2 +Encoding: 68 58530 68 +Width: 80 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 40 m 24 + 0 63 17 80 40 80 c 24 + 62 80 80 63 80 40 c 24 + 80 18 63 0 40 0 c 24 + 18 0 0 18 0 40 c 24 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE4A4 +Encoding: 69 58532 69 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 0 m 25 + 0 40 l 25 + 320 40 l 25 + 320 0 l 25 + 0 0 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE4A8 +Encoding: 70 58536 70 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +40 0 m 29 + 0 280 l 25 + 100 280 l 25 + 60 0 l 25 + 40 0 l 29 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE4AC -Encoding: 42 58540 42 +Encoding: 71 58540 71 Width: 280 Flags: W HStem: 0 309 VStem: 0 280 LayerCount: 2 @@ -1491,36 +2263,34 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4C0 -Encoding: 43 58560 43 +Encoding: 72 58560 72 Width: 600 -Flags: W -HStem: 0 120<253.391 344.66> 244 86<189.458 410.542> -VStem: 0 10<0 27.4595> 239 120<15.0142 104.986> 590 10<0 27.4595> +Flags: HMW LayerCount: 2 Fore SplineSet 0 0 m 1 0 214 150 330 300 330 c 3 450 330 600 213 600 0 c 1 - 590 0 l 1 - 575 150 446 244 300 244 c 3 - 154 244 25 150 10 0 c 1 + 585 0 l 5 + 570 150 446 244 300 244 c 3 + 154 244 30 150 15 0 c 1 0 0 l 1 -299 0 m 7 - 268 0 239 28 239 60 c 7 - 239 92 268 120 299 120 c 7 - 332 120 359 92 359 60 c 7 - 359 27 333 0 299 0 c 7 +299 0 m 3 + 268 0 239 28 239 60 c 3 + 239 92 268 120 299 120 c 3 + 332 120 359 92 359 60 c 3 + 359 27 333 0 299 0 c 3 EndSplineSet Validated: 1 EndChar StartChar: uniE4CE -Encoding: 44 58574 44 +Encoding: 73 58574 73 Width: 182 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1534,35 +2304,33 @@ 16 26 87 105 87 140 c 0 87 149 81 155 67 155 c 0 32 156 -0 184 -0 222 c 0 -0 258 27 301 86 301 c 0 EndSplineSet +Validated: 1 EndChar StartChar: uniE4E1 -Encoding: 45 58593 45 +Encoding: 74 58593 74 Width: 130 -Flags: W -VStem: 0 130<-250 250> +Flags: HMW LayerCount: 2 Fore SplineSet 0 250 m 1 - 128 250 l 1 - 130 -250 l 1 + 130 250 l 1 + 130 -250 l 5 0 -250 l 1 0 250 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE4E2 -Encoding: 46 58594 46 +Encoding: 75 58594 75 Width: 130 -Flags: W -HStem: 0 250<0 130> -VStem: 0 130<0 250> +Flags: MW LayerCount: 2 Fore SplineSet 0 250 m 1 130 250 l 1 @@ -1572,15 +2340,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E3 -Encoding: 47 58595 47 +Encoding: 76 58595 76 Width: 300 -Flags: W -HStem: -125 125<0 300> -VStem: 0 300<-125 0> +Flags: MW LayerCount: 2 Fore SplineSet 0 0 m 1 300 0 l 1 @@ -1590,15 +2356,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E4 -Encoding: 48 58596 48 +Encoding: 77 58596 77 Width: 300 -Flags: W -HStem: 0 125<0 300> -VStem: 0 300<0 125> +Flags: MW LayerCount: 2 Fore SplineSet 0 125 m 1 300 125 l 1 @@ -1608,15 +2372,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E5 -Encoding: 49 58597 49 +Encoding: 78 58597 78 Width: 238 -Flags: W -HStem: -216 62<79.4562 172.905> -VStem: 0 64<-298.233 -231.781> +Flags: MW LayerCount: 2 Fore SplineSet 41 391 m 1 230 162 l 1 @@ -1634,11 +2396,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E6 -Encoding: 50 58598 50 +Encoding: 79 58598 79 Width: 255 Flags: W HStem: 48 33<112 170.038> VStem: 0 135<81.9955 177.625> LayerCount: 2 @@ -1658,11 +2420,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E7 -Encoding: 51 58599 51 +Encoding: 80 58599 80 Width: 329 Flags: W HStem: -208 32<112 170.069> 48 33<184 242.918> VStem: 0 135<-174.731 -78.875> 72 135<81.9955 177.625> LayerCount: 2 @@ -1689,11 +2451,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E8 -Encoding: 52 58600 52 +Encoding: 81 58600 81 Width: 399 Flags: W HStem: -208 32<112 170.069> 48 32<189 245.07> 304 33<255 314.117> VStem: 0 135<-174.731 -78.875> 77 135<81.2688 177.125> 143 135<337.996 433.625> LayerCount: 2 @@ -1727,11 +2489,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E9 -Encoding: 53 58601 53 +Encoding: 82 58601 82 Width: 472 Flags: W HStem: -464 32<112 170.069> -208 32<187 245.069> 48 32<264 320.07> 304 33<330 389.117> VStem: 0 135<-430.731 -334.875> 75 135<-174.731 -78.875> 152 135<81.2688 177.125> 218 135<337.996 433.625> LayerCount: 2 @@ -1772,11 +2534,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4EA -Encoding: 54 58602 54 +Encoding: 83 58602 83 Width: 472 Flags: W HStem: -464 32<112 170.069> -210 32<187 245.069> 40 32<260 318.069> 290 32<333 389.07> 542 33<393 452.117> VStem: 0 135<-430.731 -334.875> 75 135<-176.731 -80.875> 148 135<73.2688 169.125> 221 135<323.269 419.125> 281 135<575.996 671.625> LayerCount: 2 @@ -1824,11 +2586,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4EE -Encoding: 55 58606 55 +Encoding: 84 58606 84 Width: 851 Flags: W HStem: -105 210<25 825> VStem: 0 25<-230 -105 105 230> 825 25<-230 -105 105 230> LayerCount: 2 @@ -1850,11 +2612,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE500 -Encoding: 56 58624 56 +Encoding: 85 58624 85 Width: 563 Flags: W HStem: -195 120<435.745 528.255> 75 120<8.74536 101.255> VStem: -5 120<88.7454 181.255> 422 120<-181.255 -88.7454> LayerCount: 2 @@ -1878,11 +2640,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE501 -Encoding: 57 58625 57 +Encoding: 86 58625 86 Width: 800 Flags: W HStem: -195 120<659.745 752.255> 75 120<-6.25464 86.2546> VStem: -20 120<88.7454 181.255> 646 120<-181.255 -88.7454> LayerCount: 2 @@ -1909,50 +2671,991 @@ 334 -250 l 5 212 -250 l 5 EndSplineSet Validated: 1 EndChar + +StartChar: uniE520 +Encoding: 87 58656 87 +Width: 563 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +197 40 m 0 + 199.179123831 39.0525548563 201.555731167 38.5988184777 204.0907001 38.5988184777 c 0 + 228.311569742 38.5988184777 266.989634802 80.0214592618 286 128 c 0 + 293.801273837 147.763227053 298.897664408 174.829638922 298.897664408 197.52305288 c 0 + 298.897664408 218.46369363 294.558131706 235.680764302 284 240 c 0 + 282.059714009 240.759242344 279.934395026 241.11995209 277.659464452 241.11995209 c 0 + 252.96754404 241.11995209 210.650235832 198.625589581 196 162 c 0 + 185.665333312 135.693575703 181.068143327 108.945807045 181.068143327 87.1471403297 c 0 + 181.068143327 62.5417301443 186.925393958 44.2419393862 197 40 c 0 +200 0 m 0 + 183 0 173 6 153 32 c 1 + 108 -90 l 1 + 160 -90 l 2 + 175 -90 175 -120 160 -120 c 0 + -65 -120 l 0 + -79 -120 -80 -90 -65 -90 c 2 + 10 -90 l 1 + 114 195 l 0 + 115.167116963 197.917792406 120.420719938 212.754502351 120.420719938 224.605732511 c 0 + 120.420719938 233.06305846 117.745271893 240 109 240 c 0 + 83 240 72 207 28 135 c 0 + 21 124 -6 139 1 151 c 0 + 56 249 69 280 125 280 c 0 + 170 280 193 271 203 235 c 1 + 244 278 263 280 305 280 c 0 + 341 280 380 248 380 180 c 0 + 380 87 299 0 200 0 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE521 +Encoding: 88 58657 88 +Width: 440 +Flags: W +HStem: -10 44.404<309.482 391.648> 0 21G<-1 65.5 153 199> 212.877 67.1232<170.507 229.008 295.16 358.649> 221 59<37.7036 99.8884> +VStem: 276.686 77.1955<12.819 101.414> 335.007 74.6509<146.188 236.074> +LayerCount: 2 +Fore +SplineSet +80 21 m 0x64 + 76 11 74 1 57 0 c 0 + 4 0 l 0 + -6 0 0 18 4 26 c 1 + 70 193 l 0 + 77 211 69 221 60 221 c 0 + 42 221 35 210 -11 138 c 0 + -18 127 -39 139 -33 151 c 0 + 3 216 36 280 86 280 c 0x54 + 128 280 145 266 152 240 c 1 + 170 260 194 280 224 280 c 0 + 254 280 273 263 278 240 c 1 + 292 259 322 280 349 280 c 0 + 382.297060451 280 409.658220776 253.618221661 409.658220776 218.530504648 c 0x24 + 409.658220776 210.41331474 408.193901764 201.830198995 405 193 c 0 + 358 68 l 0 + 355.211869734 60.3326417674 353.881302664 53.2726015335 353.881302664 47.6241881024 c 0 + 353.881302664 39.5840041338 356.577277218 34.4040367054 361.602949871 34.4040367054 c 0 + 363.177144158 34.4040367054 364.979913018 34.9122608557 367 36 c 0 + 389 48 404 72 419 93 c 0 + 427 104 449 93 440 78 c 0 + 411 27 388 -10 323 -10 c 0 + 295.96461562 -10 276.685848474 4.31990873934 276.685848474 30.6552962356 c 0xa8 + 276.685848474 38.4136929968 278.359032859 47.2149008096 282 57 c 0 + 334 193 l 0 + 334.687448544 195.062345631 335.007330587 196.961328373 335.007330587 198.698285174 c 0 + 335.007330587 208.224115412 325.386390673 212.876768553 314.009865299 212.876768553 c 0 + 300.302784706 212.876768553 284.047157224 206.122608782 279 193 c 0 + 214 22 l 0 + 211 14 207 0 191 -1 c 1 + 153 0 l 16 + 134 -2 132 12 136 22 c 0 + 203 193 l 0 + 203.698722351 195.018531237 204.023750859 196.886379473 204.023750859 198.6021409 c 0 + 204.023750859 208.040661137 194.187819777 212.876768553 182.617370253 212.876768553 c 0 + 169.199127766 212.876768553 153.448127054 206.372675496 148 193 c 0 + 80 21 l 0x64 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE522 +Encoding: 89 58658 89 +Width: 351 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +-50 -160 m 0 + -90 -160 -130 -135 -130 -90 c 0 + -130 -55 -113 -30 -88 -30 c 0 + -63 -30 -47 -45 -47 -65 c 0 + -47 -75 -54 -83 -65 -90 c 0 + -75 -97 -75 -100 -75 -110 c 0 + -75 -120 -65 -124 -50 -124 c 0 + 13 -124 16 -35 83 230 c 1 + 64 230 65 230 30 230 c 0 + 17.239470207 230 10.992185238 240.421191718 10.992185238 250.625180963 c 0 + 10.992185238 260.412503619 16.7396874095 270 28 270 c 0 + 59 270 61 270 93 270 c 1 + 121 374 204 440 270 440 c 0 + 310 440 350 415 350 370 c 0 + 350 335 333 310 308 310 c 0 + 283 310 267 325 267 345 c 0 + 267 355 274 363 285 370 c 0 + 296 377 295 380 295 390 c 0 + 295 400 285 404 270 404 c 0 + 228 404 218 332 205 270 c 1 + 232 270 229 270 259 270 c 0 + 272 270 278.5 260 278.5 250 c 0 + 278.5 240 272 230 259 230 c 0 + 233 230 229 230 196 230 c 1 + 153 -26 80 -160 -50 -160 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE524 +Encoding: 90 58660 90 +Width: 563 +Flags: W +HStem: 0 30<56.2969 128.192> 250 30<86.1231 145.206> +VStem: 0 67<48.3332 106.102> 30 50<188.851 246.418> 140 60<38.2418 104.228> 145.315 72.6848<183.703 229.735> +LayerCount: 2 +Fore +SplineSet +80 0 m 0xd8 + 41 0 0 33 0 70 c 0xe0 + 0 92 14 108 30 108 c 0xd0 + 47 108 67 100 67 84 c 0 + 67 69 62 55 55 48 c 1 + 60 34 69 30 85 30 c 0 + 113 30 140 45 140 70 c 0xe8 + 140 100 116 103 90 120 c 0 + 57 141 30 167 30 200 c 0 + 30 247 70 280 130 280 c 0 + 175 280 218 253 218 220 c 0 + 218 199 202 180 180 180 c 0 + 163.575188443 180 145.315176651 194.681601887 145.315176651 213.518742217 c 0xd4 + 145.315176651 218.765893239 146.732008255 224.335480975 150 230 c 1 + 142 240 133 250 120 250 c 0 + 101 250 80 239 80 220 c 0 + 80 193 127 175 150 160 c 0 + 184 137 200 120 200 90 c 0 + 200 26 156 0 80 0 c 0xd8 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE525 +Encoding: 91 58661 91 +Width: 563 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +-10 3 m 0 + -22 -6 -34 16 -23 26 c 0 + 153 219 l 0 + 141.918058124 224.910369 126.469558534 226.454180286 105.444752759 226.454180286 c 0 + 98.0113613903 226.454180286 89.8809317488 226.261203875 81 226 c 0 + 70 226 47 173 34 162 c 0 + 20 150 6 154 20 187 c 0 + 41 238 38 251 44 267 c 1 + 79.2709584661 264.544426942 105.57190844 263.63368868 125.594979066 263.63368868 c 0 + 183.112330324 263.63368868 188.827343421 271.148705903 206.551743542 271.148705903 c 0 + 210.297411805 271.148705903 214.579415356 270.813087697 220 270 c 0 + 235 268 233 254 224 245 c 0 + 66 78 l 0 + 64.6486486486 74.6216216216 63.972972973 72.1015339664 63.972972973 70.1929599431 c 0 + 63.972972973 57.9780861943 91.6486486486 70.8108108108 147 44 c 0 + 158 39 168 52 164 64 c 0 + 157 84 125 65 125 100 c 0 + 125 115 141 130 157 130 c 0 + 177 130 195 117 195 75 c 0 + 195 36.9571906054 164.866783384 2.35817739562 123.772791397 2.35817739562 c 0 + 120.578422501 2.35817739562 117.317823606 2.5672403992 114 3 c 0 + 69.8119048549 8.52351189314 48.9765181701 18.5669028431 29.7645164434 18.5669028431 c 0 + 17.6725183082 18.5669028431 6.22361116537 14.5882936895 -10 3 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE529 +Encoding: 92 58665 92 +Width: 703 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +522 40 m 0 + 524.179123831 39.0525548563 526.555731167 38.5988184777 529.0907001 38.5988184777 c 0 + 553.311569742 38.5988184777 591.989634802 80.0214592618 611 128 c 0 + 618.801273837 147.763227053 623.897664408 174.829638922 623.897664408 197.52305288 c 0 + 623.897664408 218.46369363 619.558131706 235.680764302 609 240 c 0 + 607.059714009 240.759242344 604.934395026 241.11995209 602.659464452 241.11995209 c 0 + 577.96754404 241.11995209 535.650235832 198.625589581 521 162 c 0 + 510.665333312 135.693575703 506.068143327 108.945807045 506.068143327 87.1471403297 c 0 + 506.068143327 62.5417301443 511.925393958 44.2419393862 522 40 c 0 +197 40 m 0 + 199.179123831 39.0525548563 201.555731167 38.5988184777 204.0907001 38.5988184777 c 0 + 228.311569742 38.5988184777 266.989634802 80.0214592618 286 128 c 0 + 293.801273837 147.763227053 298.897664408 174.829638922 298.897664408 197.52305288 c 0 + 298.897664408 218.46369363 294.558131706 235.680764302 284 240 c 0 + 282.059714009 240.759242344 279.934395026 241.11995209 277.659464452 241.11995209 c 0 + 252.96754404 241.11995209 210.650235832 198.625589581 196 162 c 0 + 185.665333312 135.693575703 181.068143327 108.945807045 181.068143327 87.1471403297 c 0 + 181.068143327 62.5417301443 186.925393958 44.2419393862 197 40 c 0 +200 0 m 0 + 183 0 173 6 153 32 c 1 + 108 -90 l 1 + 160 -90 l 2 + 175 -90 175 -120 160 -120 c 2 + -65 -120 l 2 + -79 -120 -80 -90 -65 -90 c 2 + 10 -90 l 1 + 114 195 l 2 + 115.167116963 197.917792406 120.420719938 212.754502351 120.420719938 224.605732511 c 0 + 120.420719938 233.06305846 117.745271893 240 109 240 c 0 + 83 240 72 207 28 135 c 0 + 21 124 -6 139 1 151 c 0 + 56 249 69 280 125 280 c 0 + 170 280 193 271 203 235 c 1 + 244 278 263 280 305 280 c 0 + 331 280 358 264 371 230 c 1 + 395 267 413 280 450 280 c 0 + 495 280 518 271 528 235 c 1 + 569 278 588 280 630 280 c 0 + 656 280 683 264 696 230 c 1 + 720 267 738 280 775 280 c 0 + 820 280 843 271 853 235 c 1 + 894 278 913 280 955 280 c 0 + 981 280 1008 264 1021 230 c 1 + 1045 267 1063 280 1100 280 c 0 + 1145 280 1168 271 1178 235 c 1 + 1219 278 1238 280 1280 280 c 0 + 1316 280 1355 248 1355 180 c 0 + 1355 87 1274 0 1175 0 c 0 + 1158 0 1148 6 1128 32 c 1 + 1083 -90 l 1 + 1135 -90 l 2 + 1150 -90 1150 -120 1135 -120 c 2 + 910 -120 l 2 + 896 -120 895 -90 910 -90 c 2 + 985 -90 l 1 + 1089 195 l 2 + 1090.16711696 197.917792406 1095.42071994 212.754502351 1095.42071994 224.605732511 c 0 + 1095.42071994 233.06305846 1092.74527189 240 1084 240 c 0 + 1064 240 1053 221 1030 181 c 0 + 1030 181 1030 180 1030 180 c 0 + 1030 87 949 0 850 0 c 0 + 833 0 823 6 803 32 c 1 + 758 -90 l 1 + 810 -90 l 2 + 825 -90 825 -120 810 -120 c 2 + 585 -120 l 2 + 571 -120 570 -90 585 -90 c 2 + 660 -90 l 1 + 764 195 l 2 + 765.167116963 197.917792406 770.420719938 212.754502351 770.420719938 224.605732511 c 0 + 770.420719938 233.06305846 767.745271893 240 759 240 c 0 + 739 240 728 221 705 181 c 0 + 705 181 705 180 705 180 c 0 + 705 87 624 0 525 0 c 0 + 508 0 498 6 478 32 c 1 + 433 -90 l 1 + 485 -90 l 2 + 500 -90 500 -120 485 -120 c 2 + 260 -120 l 2 + 246 -120 245 -90 260 -90 c 2 + 335 -90 l 1 + 439 195 l 2 + 440.167116963 197.917792406 445.420719938 212.754502351 445.420719938 224.605732511 c 0 + 445.420719938 233.06305846 442.745271893 240 434 240 c 0 + 414 240 403 221 380 181 c 0 + 380 181 380 180 380 180 c 0 + 380 87 299 0 200 0 c 0 +1172 40 m 0 + 1174.17912383 39.0525548563 1176.55573117 38.5988184777 1179.0907001 38.5988184777 c 0 + 1203.31156974 38.5988184777 1241.9896348 80.0214592618 1261 128 c 0 + 1268.80127384 147.763227053 1273.89766441 174.829638922 1273.89766441 197.52305288 c 0 + 1273.89766441 218.46369363 1269.55813171 235.680764302 1259 240 c 0 + 1257.05971401 240.759242344 1254.93439503 241.11995209 1252.65946445 241.11995209 c 0 + 1227.96754404 241.11995209 1185.65023583 198.625589581 1171 162 c 0 + 1160.66533331 135.693575703 1156.06814333 108.945807045 1156.06814333 87.1471403297 c 0 + 1156.06814333 62.5417301443 1161.92539396 44.2419393862 1172 40 c 0 +847 40 m 0 + 849.179123831 39.0525548563 851.555731167 38.5988184777 854.0907001 38.5988184777 c 0 + 878.311569742 38.5988184777 916.989634802 80.0214592618 936 128 c 0 + 943.801273837 147.763227053 948.897664408 174.829638922 948.897664408 197.52305288 c 0 + 948.897664408 218.46369363 944.558131706 235.680764302 934 240 c 0 + 932.059714009 240.759242344 929.934395026 241.11995209 927.659464452 241.11995209 c 0 + 902.96754404 241.11995209 860.650235832 198.625589581 846 162 c 0 + 835.665333312 135.693575703 831.068143327 108.945807045 831.068143327 87.1471403297 c 0 + 831.068143327 62.5417301443 836.925393958 44.2419393862 847 40 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE52A +Encoding: 93 58666 93 +Width: 563 +Flags: W +HStem: -120 30<-74.2249 10 108 169.668 250.775 335 433 494.668 575.775 660 758 819.668> 0 38.5988<191.014 237.319 516.014 562.319 841.014 887.319> 240 40<80.1149 147.5 239.117 318 404.386 472.5 564.117 643 729.386 797.5 889.117 973> +VStem: 120.421 60.6474<87.1471 224.606> 298.898 81.1023<108.679 217.246> 445.421 60.6474<87.1471 224.606> 623.898 81.1023<108.679 217.246> 770.421 60.6474<87.1471 224.606> 948.898 81.1023<108.462 239.669> +LayerCount: 2 +Fore +SplineSet +850 0 m 0 + 833 0 823 6 803 32 c 1 + 758 -90 l 1 + 810 -90 l 2 + 825 -90 825 -120 810 -120 c 2 + 585 -120 l 2 + 571 -120 570 -90 585 -90 c 2 + 660 -90 l 1 + 764 195 l 2 + 765.167116963 197.917792406 770.420719938 212.754502351 770.420719938 224.605732511 c 0 + 770.420719938 233.06305846 767.745271893 240 759 240 c 0 + 739 240 728 221 705 181 c 0 + 705 181 705 180 705 180 c 0 + 705 87 624 0 525 0 c 0 + 508 0 498 6 478 32 c 1 + 433 -90 l 1 + 485 -90 l 2 + 500 -90 500 -120 485 -120 c 2 + 260 -120 l 2 + 246 -120 245 -90 260 -90 c 2 + 335 -90 l 1 + 439 195 l 2 + 440.167116963 197.917792406 445.420719938 212.754502351 445.420719938 224.605732511 c 0 + 445.420719938 233.06305846 442.745271893 240 434 240 c 0 + 414 240 403 221 380 181 c 0 + 380 181 380 180 380 180 c 0 + 380 87 299 0 200 0 c 0 + 183 0 173 6 153 32 c 1 + 108 -90 l 1 + 160 -90 l 2 + 175 -90 175 -120 160 -120 c 2 + -65 -120 l 2 + -79 -120 -80 -90 -65 -90 c 2 + 10 -90 l 1 + 114 195 l 2 + 115.167116963 197.917792406 120.420719938 212.754502351 120.420719938 224.605732511 c 0 + 120.420719938 233.06305846 117.745271893 240 109 240 c 0 + 83 240 72 207 28 135 c 0 + 21 124 -6 139 1 151 c 0 + 56 249 69 280 125 280 c 0 + 170 280 193 271 203 235 c 1 + 244 278 263 280 305 280 c 0 + 331 280 358 264 371 230 c 1 + 395 267 413 280 450 280 c 0 + 495 280 518 271 528 235 c 1 + 569 278 588 280 630 280 c 0 + 656 280 683 264 696 230 c 1 + 720 267 738 280 775 280 c 0 + 820 280 843 271 853 235 c 1 + 894 278 913 280 955 280 c 0 + 991 280 1030 248 1030 180 c 0 + 1030 87 949 0 850 0 c 0 +847 40 m 0 + 849.179123831 39.0525548563 851.555731167 38.5988184777 854.0907001 38.5988184777 c 0 + 878.311569742 38.5988184777 916.989634802 80.0214592618 936 128 c 0 + 943.801273837 147.763227053 948.897664408 174.829638922 948.897664408 197.52305288 c 0 + 948.897664408 218.46369363 944.558131706 235.680764302 934 240 c 0 + 932.059714009 240.759242344 929.934395026 241.11995209 927.659464452 241.11995209 c 0 + 902.96754404 241.11995209 860.650235832 198.625589581 846 162 c 0 + 835.665333312 135.693575703 831.068143327 108.945807045 831.068143327 87.1471403297 c 0 + 831.068143327 62.5417301443 836.925393958 44.2419393862 847 40 c 0 +522 40 m 0 + 524.179123831 39.0525548563 526.555731167 38.5988184777 529.0907001 38.5988184777 c 0 + 553.311569742 38.5988184777 591.989634802 80.0214592618 611 128 c 0 + 618.801273837 147.763227053 623.897664408 174.829638922 623.897664408 197.52305288 c 0 + 623.897664408 218.46369363 619.558131706 235.680764302 609 240 c 0 + 607.059714009 240.759242344 604.934395026 241.11995209 602.659464452 241.11995209 c 0 + 577.96754404 241.11995209 535.650235832 198.625589581 521 162 c 0 + 510.665333312 135.693575703 506.068143327 108.945807045 506.068143327 87.1471403297 c 0 + 506.068143327 62.5417301443 511.925393958 44.2419393862 522 40 c 0 +197 40 m 0 + 199.179123831 39.0525548563 201.555731167 38.5988184777 204.0907001 38.5988184777 c 0 + 228.311569742 38.5988184777 266.989634802 80.0214592618 286 128 c 0 + 293.801273837 147.763227053 298.897664408 174.829638922 298.897664408 197.52305288 c 0 + 298.897664408 218.46369363 294.558131706 235.680764302 284 240 c 0 + 282.059714009 240.759242344 279.934395026 241.11995209 277.659464452 241.11995209 c 0 + 252.96754404 241.11995209 210.650235832 198.625589581 196 162 c 0 + 185.665333312 135.693575703 181.068143327 108.945807045 181.068143327 87.1471403297 c 0 + 181.068143327 62.5417301443 186.925393958 44.2419393862 197 40 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE52B +Encoding: 94 58667 94 +Width: 703 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +200 0 m 0 + 183 0 173 6 153 32 c 1 + 108 -90 l 1 + 160 -90 l 2 + 175 -90 175 -120 160 -120 c 2 + -65 -120 l 2 + -79 -120 -80 -90 -65 -90 c 2 + 10 -90 l 1 + 114 195 l 2 + 115.167116963 197.917792406 120.420719938 212.754502351 120.420719938 224.605732511 c 0 + 120.420719938 233.06305846 117.745271893 240 109 240 c 0 + 83 240 72 207 28 135 c 0 + 21 124 -6 139 1 151 c 0 + 56 249 69 280 125 280 c 0 + 170 280 193 271 203 235 c 1 + 244 278 263 280 305 280 c 0 + 331 280 358 264 371 230 c 1 + 395 267 413 280 450 280 c 0 + 495 280 518 271 528 235 c 1 + 569 278 588 280 630 280 c 0 + 666 280 705 248 705 180 c 0 + 705 87 624 0 525 0 c 0 + 508 0 498 6 478 32 c 1 + 433 -90 l 1 + 485 -90 l 2 + 500 -90 500 -120 485 -120 c 2 + 260 -120 l 2 + 246 -120 245 -90 260 -90 c 2 + 335 -90 l 1 + 439 195 l 2 + 440.167116963 197.917792406 445.420719938 212.754502351 445.420719938 224.605732511 c 0 + 445.420719938 233.06305846 442.745271893 240 434 240 c 0 + 414 240 403 221 380 181 c 0 + 380 181 380 180 380 180 c 0 + 380 87 299 0 200 0 c 0 +197 40 m 0 + 199.179123831 39.0525548563 201.555731167 38.5988184777 204.0907001 38.5988184777 c 0 + 228.311569742 38.5988184777 266.989634802 80.0214592618 286 128 c 0 + 293.801273837 147.763227053 298.897664408 174.829638922 298.897664408 197.52305288 c 0 + 298.897664408 218.46369363 294.558131706 235.680764302 284 240 c 0 + 282.059714009 240.759242344 279.934395026 241.11995209 277.659464452 241.11995209 c 0 + 252.96754404 241.11995209 210.650235832 198.625589581 196 162 c 0 + 185.665333312 135.693575703 181.068143327 108.945807045 181.068143327 87.1471403297 c 0 + 181.068143327 62.5417301443 186.925393958 44.2419393862 197 40 c 0 +522 40 m 0 + 524.179123831 39.0525548563 526.555731167 38.5988184777 529.0907001 38.5988184777 c 0 + 553.311569742 38.5988184777 591.989634802 80.0214592618 611 128 c 0 + 618.801273837 147.763227053 623.897664408 174.829638922 623.897664408 197.52305288 c 0 + 623.897664408 218.46369363 619.558131706 235.680764302 609 240 c 0 + 607.059714009 240.759242344 604.934395026 241.11995209 602.659464452 241.11995209 c 0 + 577.96754404 241.11995209 535.650235832 198.625589581 521 162 c 0 + 510.665333312 135.693575703 506.068143327 108.945807045 506.068143327 87.1471403297 c 0 + 506.068143327 62.5417301443 511.925393958 44.2419393862 522 40 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE52C +Encoding: 95 58668 95 +Width: 811 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +429 119 m 0 + 480 232 500 280 556 280 c 0 + 601 280 624 271 634 235 c 1 + 675 278 694 280 736 280 c 0 + 772 280 811 248 811 180 c 0 + 811 87 730 0 631 0 c 0 + 614 0 604 6 584 32 c 1 + 539 -90 l 1 + 591 -90 l 2 + 606 -90 606 -120 591 -120 c 2 + 366 -120 l 2 + 352 -120 351 -90 366 -90 c 2 + 441 -90 l 1 + 545 195 l 2 + 546.167116963 197.917792406 551.420719938 212.754502351 551.420719938 224.605732511 c 0 + 551.420719938 233.06305846 548.745271893 240 540 240 c 0 + 514 240 491 175 454 100 c 0 + 423 37 388 -10 323 -10 c 0 + 295.96461562 -10 276.685848474 4.31990873934 276.685848474 30.6552962356 c 0 + 276.685848474 38.4136929968 278.359032859 47.2149008096 282 57 c 2 + 334 193 l 2 + 334.687448544 195.062345631 335.007330587 196.961328373 335.007330587 198.698285174 c 0 + 335.007330587 208.224115412 325.386390673 212.876768553 314.009865299 212.876768553 c 0 + 300.302784706 212.876768553 284.047157224 206.122608782 279 193 c 2 + 214 22 l 2 + 211 14 207 0 191 -1 c 2 + 153 0 l 2 + 134 -2 132 12 136 22 c 2 + 203 193 l 2 + 203.698722351 195.018531237 204.023750859 196.886379473 204.023750859 198.6021409 c 0 + 204.023750859 208.040661137 194.187819777 212.876768553 182.617370253 212.876768553 c 0 + 169.199127766 212.876768553 153.448127054 206.372675496 148 193 c 2 + 80 21 l 2 + 76 11 74 1 57 0 c 2 + 4 0 l 2 + -6 0 0 18 4 26 c 2 + 70 193 l 2 + 77 211 69 221 60 221 c 0 + 42 221 35 210 -11 138 c 0 + -18 127 -39 139 -33 151 c 0 + 3 216 36 280 86 280 c 0 + 128 280 145 266 152 240 c 1 + 170 260 194 280 224 280 c 0 + 254 280 273 263 278 240 c 1 + 292 259 322 280 349 280 c 0 + 382.297060451 280 409.658220776 253.618221661 409.658220776 218.530504648 c 0 + 409.658220776 210.41331474 408.193901764 201.830198995 405 193 c 2 + 358 68 l 2 + 355.211869734 60.3326417674 353.881302664 53.2726015335 353.881302664 47.6241881024 c 0 + 353.881302664 39.5840041338 356.577277218 34.4040367054 361.602949871 34.4040367054 c 0 + 363.177144158 34.4040367054 364.979913018 34.9122608557 367 36 c 0 + 389 48 418 94 429 119 c 0 +628 40 m 0 + 630.179123831 39.0525548563 632.555731167 38.5988184777 635.0907001 38.5988184777 c 0 + 659.311569742 38.5988184777 697.989634802 80.0214592618 717 128 c 0 + 724.801273837 147.763227053 729.897664408 174.829638922 729.897664408 197.52305288 c 0 + 729.897664408 218.46369363 725.558131706 235.680764302 715 240 c 0 + 713.059714009 240.759242344 710.934395026 241.11995209 708.659464452 241.11995209 c 0 + 683.96754404 241.11995209 641.650235832 198.625589581 627 162 c 0 + 616.665333312 135.693575703 612.068143327 108.945807045 612.068143327 87.1471403297 c 0 + 612.068143327 62.5417301443 617.925393958 44.2419393862 628 40 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE52D +Encoding: 96 58669 96 +Width: 351 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +80 21 m 0 + 76 11 74 1 57 0 c 0 + 4 0 l 0 + -6 0 0 18 4 26 c 1 + 70 193 l 0 + 77 211 69 221 60 221 c 0 + 42 221 35 210 -11 138 c 0 + -18 127 -39 139 -33 151 c 0 + 3 216 36 280 86 280 c 0 + 128 280 145 266 152 240 c 1 + 170 260 194 280 224 280 c 0 + 254 280 273 263 278 240 c 1 + 292 259 322 280 349 280 c 0 + 382.297060451 280 409.658220776 253.618221661 409.658220776 218.530504648 c 0 + 409.658220776 210.41331474 408.193901764 201.830198995 405 193 c 0 + 358 68 l 0 + 355.211869734 60.3326417674 353.881302664 53.2726015335 353.881302664 47.6241881024 c 0 + 353.881302664 39.5840041338 356.577277218 34.4040367054 361.602949871 34.4040367054 c 0 + 363.177144158 34.4040367054 364.979913018 34.9122608557 367 36 c 0 + 389 48 404 72 419 93 c 0 + 427 104 449 93 440 78 c 0 + 411 27 388 -10 323 -10 c 0 + 295.96461562 -10 276.685848474 4.31990873934 276.685848474 30.6552962356 c 0 + 276.685848474 38.4136929968 278.359032859 47.2149008096 282 57 c 0 + 334 193 l 0 + 334.687448544 195.062345631 335.007330587 196.961328373 335.007330587 198.698285174 c 0 + 335.007330587 208.224115412 325.386390673 212.876768553 314.009865299 212.876768553 c 0 + 300.302784706 212.876768553 284.047157224 206.122608782 279 193 c 0 + 214 22 l 0 + 211 14 207 0 191 -1 c 1 + 153 0 l 16 + 134 -2 132 12 136 22 c 0 + 203 193 l 0 + 203.698722351 195.018531237 204.023750859 196.886379473 204.023750859 198.6021409 c 0 + 204.023750859 208.040661137 194.187819777 212.876768553 182.617370253 212.876768553 c 0 + 169.199127766 212.876768553 153.448127054 206.372675496 148 193 c 0 + 80 21 l 0 +393 -160 m 0 + 353 -160 313 -135 313 -90 c 0 + 313 -55 330 -30 355 -30 c 0 + 380 -30 396 -45 396 -65 c 0 + 396 -75 389 -83 378 -90 c 0 + 368 -97 368 -100 368 -110 c 0 + 368 -120 378 -124 393 -124 c 0 + 456 -124 459 -35 526 230 c 1 + 507 230 508 230 473 230 c 0 + 460.239470207 230 453.992185238 240.421191718 453.992185238 250.625180963 c 0 + 453.992185238 260.412503619 459.73968741 270 471 270 c 0 + 502 270 504 270 536 270 c 1 + 564 374 647 440 713 440 c 0 + 753 440 793 415 793 370 c 0 + 793 335 776 310 751 310 c 0 + 726 310 710 325 710 345 c 0 + 710 355 717 363 728 370 c 0 + 739 377 738 380 738 390 c 0 + 738 400 728 404 713 404 c 0 + 671 404 661 332 648 270 c 1 + 675 270 672 270 702 270 c 0 + 715 270 721.5 260 721.5 250 c 0 + 721.5 240 715 230 702 230 c 0 + 676 230 672 230 639 230 c 1 + 596 -26 523 -160 393 -160 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE52F +Encoding: 97 58671 97 +Width: 617 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +351 230 m 9 + 196 230 l 1 + 153 -26 80 -160 -50 -160 c 0 + -90 -160 -130 -135 -130 -90 c 0 + -130 -55 -113 -30 -88 -30 c 0 + -63 -30 -47 -45 -47 -65 c 0 + -47 -75 -54 -83 -65 -90 c 0 + -75 -97 -75 -100 -75 -110 c 0 + -75 -120 -65 -124 -50 -124 c 0 + 13 -124 16 -35 83 230 c 1 + 64 230 65 230 30 230 c 0 + 17.239470207 230 10.992185238 240.421191718 10.992185238 250.625180963 c 0 + 10.992185238 260.412503619 16.7396874095 270 28 270 c 0 + 59 270 61 270 93 270 c 1 + 121 374 204 440 270 440 c 0 + 310 440 350 415 350 370 c 0 + 350 335 333 310 308 310 c 0 + 283 310 267 325 267 345 c 0 + 267 355 274 363 285 370 c 0 + 296 377 295 380 295 390 c 0 + 295 400 285 404 270 404 c 0 + 228 404 218 333 205 271 c 1 + 360 270 l 1 + 388 374 471 440 537 440 c 0 + 577 440 617 415 617 370 c 0 + 617 335 600 310 575 310 c 0 + 550 310 534 325 534 345 c 0 + 534 355 541 363 552 370 c 0 + 563 377 562 380 562 390 c 0 + 562 400 552 404 537 404 c 0 + 495 404 485 332 472 270 c 1 + 499 270 496 270 526 270 c 0 + 539 270 545.5 260 545.5 250 c 0 + 545.5 240 539 230 526 230 c 0 + 500 230 496 230 463 230 c 1 + 420 -26 347 -160 217 -160 c 0 + 177 -160 137 -135 137 -90 c 0 + 137 -55 154 -30 179 -30 c 0 + 204 -30 220 -45 220 -65 c 0 + 220 -75 213 -83 202 -90 c 0 + 192 -97 192 -100 192 -110 c 0 + 192 -120 202 -124 217 -124 c 0 + 280 -124 284 -35 351 230 c 9 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE530 +Encoding: 98 58672 98 +Width: 351 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +204 270 m 9 + 360 270 l 1 + 388 374 471 440 537 440 c 0 + 577 440 617 415 617 370 c 0 + 617 335 600 310 575 310 c 0 + 550 310 534 325 534 345 c 0 + 534 355 541 363 552 370 c 0 + 563 377 562 380 562 390 c 0 + 562 400 552 404 537 404 c 0 + 495 404 485 333 472 271 c 1 + 627 270 l 1 + 655 374 738 440 804 440 c 0 + 844 440 884 415 884 370 c 0 + 884 335 867 310 842 310 c 0 + 817 310 801 325 801 345 c 0 + 801 355 808 363 819 370 c 0 + 830 377 829 380 829 390 c 0 + 829 400 819 404 804 404 c 0 + 762 404 752 332 739 270 c 1 + 766 270 763 270 793 270 c 0 + 806 270 812.5 260 812.5 250 c 0 + 812.5 240 806 230 793 230 c 0 + 767 230 763 230 730 230 c 1 + 687 -26 614 -160 484 -160 c 0 + 444 -160 404 -135 404 -90 c 0 + 404 -55 421 -30 446 -30 c 0 + 471 -30 487 -45 487 -65 c 0 + 487 -75 480 -83 469 -90 c 0 + 459 -97 459 -100 459 -110 c 0 + 459 -120 469 -124 484 -124 c 0 + 547 -124 551 -35 618 230 c 9 + 463 230 l 1 + 420 -26 347 -160 217 -160 c 0 + 177 -160 137 -135 137 -90 c 0 + 137 -55 154 -30 179 -30 c 0 + 204 -30 220 -45 220 -65 c 0 + 220 -75 213 -83 202 -90 c 0 + 192 -97 192 -100 192 -110 c 0 + 192 -120 202 -124 217 -124 c 0 + 280 -124 283 -35 351 230 c 9 + 196 230 l 1 + 153 -26 80 -160 -50 -160 c 0 + -90 -160 -130 -135 -130 -90 c 0 + -130 -55 -113 -30 -88 -30 c 0 + -63 -30 -47 -45 -47 -65 c 0 + -47 -75 -54 -83 -65 -90 c 0 + -75 -97 -75 -100 -75 -110 c 0 + -75 -120 -65 -124 -50 -124 c 0 + 13 -124 16 -35 83 230 c 1 + 64 230 65 230 30 230 c 0 + 17.239470207 230 10.992185238 240.421191718 10.992185238 250.625180963 c 0 + 10.992185238 260.412503619 16.7396874095 270 28 270 c 0 + 59 270 61 270 93 270 c 1 + 121 374 204 440 270 440 c 0 + 310 440 350 415 350 370 c 0 + 350 335 333 310 308 310 c 0 + 283 310 267 325 267 345 c 0 + 267 355 274 363 285 370 c 0 + 296 377 295 380 295 390 c 0 + 295 400 285 404 270 404 c 0 + 228 404 217 332 204 270 c 9 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE531 +Encoding: 99 58673 99 +Width: 617 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +472 271 m 9 + 628 270 l 1 + 656 374 739 440 805 440 c 0 + 845 440 885 415 885 370 c 0 + 885 335 868 310 843 310 c 0 + 818 310 802 325 802 345 c 0 + 802 355 809 363 820 370 c 0 + 831 377 830 380 830 390 c 0 + 830 400 820 404 805 404 c 0 + 763 404 753 333 740 271 c 1 + 895 270 l 1 + 923 374 1006 440 1072 440 c 0 + 1112 440 1152 415 1152 370 c 0 + 1152 335 1135 310 1110 310 c 0 + 1085 310 1069 325 1069 345 c 0 + 1069 355 1076 363 1087 370 c 0 + 1098 377 1097 380 1097 390 c 0 + 1097 400 1087 404 1072 404 c 0 + 1030 404 1020 332 1007 270 c 1 + 1034 270 1031 270 1061 270 c 0 + 1074 270 1080.5 260 1080.5 250 c 0 + 1080.5 240 1074 230 1061 230 c 0 + 1035 230 1031 230 998 230 c 1 + 955 -26 882 -160 752 -160 c 0 + 712 -160 672 -135 672 -90 c 0 + 672 -55 689 -30 714 -30 c 0 + 739 -30 755 -45 755 -65 c 0 + 755 -75 748 -83 737 -90 c 0 + 727 -97 727 -100 727 -110 c 0 + 727 -120 737 -124 752 -124 c 0 + 815 -124 819 -35 886 230 c 9 + 731 230 l 1 + 688 -26 615 -160 485 -160 c 0 + 445 -160 405 -135 405 -90 c 0 + 405 -55 422 -30 447 -30 c 0 + 472 -30 488 -45 488 -65 c 0 + 488 -75 481 -83 470 -90 c 0 + 460 -97 460 -100 460 -110 c 0 + 460 -120 470 -124 485 -124 c 0 + 548 -124 551 -36 618 230 c 9 + 463 230 l 1 + 420 -26 347 -160 217 -160 c 0 + 177 -160 137 -135 137 -90 c 0 + 137 -55 154 -30 179 -30 c 0 + 204 -30 220 -45 220 -65 c 0 + 220 -75 213 -83 202 -90 c 0 + 192 -97 192 -100 192 -110 c 0 + 192 -120 202 -124 217 -124 c 0 + 280 -124 284 -35 351 230 c 9 + 196 230 l 1 + 153 -26 80 -160 -50 -160 c 0 + -90 -160 -130 -135 -130 -90 c 0 + -130 -55 -113 -30 -88 -30 c 0 + -63 -30 -47 -45 -47 -65 c 0 + -47 -75 -54 -83 -65 -90 c 0 + -75 -97 -75 -100 -75 -110 c 0 + -75 -120 -65 -124 -50 -124 c 0 + 13 -124 16 -35 83 230 c 1 + 64 230 65 230 30 230 c 0 + 17.239470207 230 10.992185238 240.421191718 10.992185238 250.625180963 c 0 + 10.992185238 260.412503619 16.7396874095 270 28 270 c 0 + 59 270 61 270 93 270 c 1 + 121 374 204 440 270 440 c 0 + 310 440 350 415 350 370 c 0 + 350 335 333 310 308 310 c 0 + 283 310 267 325 267 345 c 0 + 267 355 274 363 285 370 c 0 + 296 377 295 380 295 390 c 0 + 295 400 285 404 270 404 c 0 + 228 404 218 333 205 271 c 1 + 360 270 l 1 + 388 374 471 440 537 440 c 0 + 577 440 617 415 617 370 c 0 + 617 335 600 310 575 310 c 0 + 550 310 534 325 534 345 c 0 + 534 355 541 363 552 370 c 0 + 563 377 562 380 562 390 c 0 + 562 400 552 404 537 404 c 0 + 495 404 485 332 472 271 c 9 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE539 +Encoding: 100 58681 100 +Width: 351 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +80 0 m 0xd8 + 41 0 0 33 0 70 c 0xe8 + 0 92 14 108 30 108 c 0xd8 + 47 108 67 100 67 84 c 0xe8 + 67 69 62 55 55 48 c 1 + 60 34 69 30 85 30 c 0 + 113 30 140 45 140 70 c 0 + 140 100 120 107 94 124 c 0 + 61 145 30 167 30 200 c 0 + 30 247 70 280 130 280 c 0 + 175 280 218 253 218 220 c 0 + 218 199 202 180 180 180 c 0 + 163.575188443 180 145.315176651 194.681601887 145.315176651 213.518742217 c 0 + 145.315176651 218.765893239 146.732008255 224.335480975 150 230 c 1 + 142 240 133 250 120 250 c 0 + 101 250 80 239 80 220 c 0 + 80 193 127 175 150 160 c 0 + 184 137 200 120 200 90 c 0 + 200 26 156 0 80 0 c 0xd8 +494 3 m 0 + 482 -6 470 16 481 26 c 0 + 655 217 l 0 + 647.065121876 221.231935 637.451249329 222.385713558 625.122178884 222.385713558 c 0 + 614.144520003 222.385713558 601.014276252 221.471008125 585 221 c 0 + 574 221 554 173 541 162 c 0 + 527 150 511 153 524 187 c 0 + 543 238 542 251 548 267 c 1 + 580.854598393 264.712654542 605.061346797 263.852204333 623.335584921 263.852204333 c 0 + 678.854023456 263.852204333 679.616120157 271.794054171 701.762784585 271.794054171 c 0 + 707.383128795 271.794054171 714.380713088 271.282571588 724 270 c 0 + 739 268 737 254 728 245 c 0 + 574 82 l 0 + 571.290722326 77.5296918374 570.067832218 74.1420610385 570.067832218 71.5487518924 c 0 + 570.067832218 54.9981455171 619.876699814 70.8006196048 651 44 c 0 + 660 36 672 52 668 64 c 0 + 661 84 629 65 629 100 c 0 + 629 115 645 130 661 130 c 0 + 681 130 699 117 699 75 c 0 + 699 35.6904170379 666.82658183 2.81551770962 623.631918047 2.81551770962 c 0 + 621.774432159 2.81551770962 619.896565457 2.87631094845 618 3 c 0 + 574.626134889 6.18925478761 553.222377354 17.5155864555 532.50873405 17.5155864555 c 0 + 520.748265557 17.5155864555 509.210259784 13.8644712743 494 3 c 0 +182 -160 m 0 + 142 -160 102 -135 102 -90 c 0 + 102 -55 119 -30 144 -30 c 0 + 169 -30 185 -45 185 -65 c 0 + 185 -75 178 -83 167 -90 c 0 + 157 -97 165 -100 165 -110 c 0 + 165 -120 167 -124 182 -124 c 0 + 245 -124 248 -35 315 230 c 1 + 296 230 297 230 262 230 c 0 + 249.239470207 230 242.992185238 240.421191718 242.992185238 250.625180963 c 0 + 242.992185238 260.412503619 248.73968741 270 260 270 c 0 + 291 270 293 270 325 270 c 1 + 353 374 436 440 502 440 c 0 + 542 440 582 415 582 370 c 0 + 582 335 565 310 540 310 c 0 + 515 310 499 325 499 345 c 0 + 499 355 506 363 517 370 c 0 + 528 377 527 380 527 390 c 0 + 527 400 517 404 502 404 c 0 + 460 404 450 332 437 270 c 1 + 464 270 461 270 491 270 c 0 + 504 270 510.5 260 510.5 250 c 0 + 510.5 240 504 230 491 230 c 0 + 465 230 461 230 428 230 c 1 + 385 -26 312 -160 182 -160 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE566 +Encoding: 101 58726 101 +Width: 509 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +310 265 m 1 + 183 258 l 1 + 126 74 l 0 + 125 70 124 67 124 63 c 0 + 124 51 132 42 144 42 c 0 + 176 42 230 60 254 80 c 9 + 310 265 l 1 +242 40 m 1 + 192 9 164 -5 120 -5 c 0 + 72 -5 52 26 52 57 c 0 + 52 64 53 72 55 79 c 0 + 110 258 l 1 + 5 258 l 1 + 5 290 l 1 + 120 290 l 1 + 142 364 l 1 + 231 410 l 1 + 193 290 l 1 + 345 300 l 1 + 367 300 370 281 370 255 c 1 + 390 281 423 296 455 296 c 0 + 488 296 508 275 508 247 c 0 + 508 223 490 202 468 202 c 0 + 447 202 430 214 430 233 c 0 + 430 249 431 253 439 270 c 1 + 402 260 378 241 368 216 c 0 + 302 0 l 1 + 230 0 l 1 + 242 40 l 1 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE567 -Encoding: 58 58727 58 +Encoding: 102 58727 102 Width: 437 Flags: W -HStem: -3 64<35.7017 100.585> 0 37<332.058 392.5> 149 63<337.781 400.299> 173 35<42.4847 103.856> -VStem: 0 14<65.2321 138.945> 423 14<71.1359 142.998> +HStem: -3 72<49.5596 110.739> 0 49<319.775 397.094> 141 71<327.059 386.441> 161 47<36.904 118.027> +VStem: 0 24<64.6579 145.71> 413 24<63.9568 143.617> LayerCount: 2 Fore SplineSet -374 37 m 0x5c - 402 37 423 69 423 106 c 0 - 423 136 416 150 401 161 c 1 - 386 152 374 149 363 149 c 0 - 344 149 335 159 335 176 c 0 - 336 196 349 212 360 212 c 0 - 405 212 437 156 437 108 c 0 +368 49 m 0x5c + 396 49 413 69 413 106 c 0 + 413 136 402 146 387 157 c 1 + 375 145 368 141 357 141 c 0 + 338 141 323 159 323 176 c 0 + 324 196 345 212 356 212 c 0 + 401 212 437 183 437 108 c 0 437 69 419 41 396 21 c 0 - 382 8 364 0 345 0 c 0x6c - 325 0 299 7 279 21 c 1 - 111 151 l 1 - 92 164 79 173 64 173 c 0 - 35 173 14 142 14 103 c 0 - 14 74 20 60 35 49 c 1 - 50 58 63 61 74 61 c 0 - 92 61 102 51 102 32 c 0 - 102 11 93 -1 77 -3 c 1x9c - 63 -3 44 6 28 23 c 1 + 382 8 362 0 343 0 c 0x6c + 323 0 295 7 275 21 c 1 + 113 143 l 1 + 94 156 85 161 70 161 c 0 + 41 161 24 142 24 103 c 0 + 24 74 34 64 49 53 c 1 + 61 65 69 69 80 69 c 0 + 98 69 114 51 114 32 c 0 + 114 11 97 -1 81 -3 c 1x9c + 67 -3 44 6 28 23 c 1 10 45 0 69 0 102 c 0 0 141 18 169 40 189 c 0 - 55 202 75 208 94 208 c 0 - 114 207 137 204 157 190 c 1 - 325 60 l 1 - 344 47 359 37 374 37 c 0x5c + 55 202 77 208 96 208 c 0 + 116 207 141 204 161 190 c 1 + 323 68 l 1 + 342 55 353 49 368 49 c 0x5c EndSplineSet Validated: 1 EndChar StartChar: uniE569 -Encoding: 59 58729 59 +Encoding: 103 58729 103 Width: 437 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1990,11 +3693,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE56C -Encoding: 60 58732 60 +Encoding: 104 58732 104 Width: 580 Flags: W HStem: 0 224 LayerCount: 2 Fore @@ -2015,11 +3718,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE56D -Encoding: 61 58733 61 +Encoding: 105 58733 105 Width: 580 Flags: W HStem: -53 326<278 305> 0 21G<197.065 232.286 418.065 453.137> VStem: 278 27<-53 70 150 273> LayerCount: 2 @@ -2047,92 +3750,289 @@ 278 -53 l 25 278 70 l 1xa0 EndSplineSet Validated: 1 EndChar + +StartChar: uniE582 +Encoding: 106 58754 106 +Width: 280 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +123 0 m 25 + 123 123 l 25 + 0 123 l 25 + 0 157 l 25 + 123 157 l 25 + 123 280 l 25 + 157 280 l 25 + 157 157 l 25 + 280 157 l 25 + 280 123 l 25 + 157 123 l 25 + 157 0 l 25 + 123 0 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE5D0 +Encoding: 107 58832 107 +Width: 310 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 0 m 1 + 0 60 l 1 + 93 79 229 114 280 370 c 1 + 310 370 l 1 + 310 175 152 13 0 0 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE5E2 +Encoding: 108 58850 108 +Width: 300 +Flags: W +HStem: 0 62<198.921 262.211> 96 64<38.8054 112.592> +VStem: 283 16<88.1179 101.401> +LayerCount: 2 +Fore +SplineSet +1 70 m 0 + 14 108 35 160 95 160 c 0 + 150 160 169 95 210 68 c 0 + 216 64 222 62 229 62 c 0 + 250 62 271 80 283 98 c 0 + 288 106 302 100 299 90 c 0 + 286 50 265 0 205 0 c 0 + 150 0 137 65 90 92 c 0 + 85 95 80 96 75 96 c 0 + 55 96 32 79 17 61 c 0 + 10 53 -2 61 1 70 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE610 +Encoding: 109 58896 109 +Width: 300 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 0 m 25 + 0 300 l 25 + 300 300 l 25 + 300 0 l 25 + 265 0 l 25 + 265 180 l 25 + 35 180 l 29 + 35 0 l 29 + 0 0 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE612 +Encoding: 110 58898 110 +Width: 250 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +105 0 m 25 + 0 450 l 29 + 40 450 l 29 + 125 90 l 25 + 210 450 l 29 + 250 450 l 29 + 145 0 l 25 + 105 0 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE614 +Encoding: 111 58900 111 +Width: 200 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +100 25 m 28 + 141 25 175 59 175 100 c 28 + 175 141 141 175 100 175 c 28 + 59 175 25 141 25 100 c 28 + 25 59 59 25 100 25 c 28 +100 0 m 28 + 45 0 0 45 0 100 c 28 + 0 155 45 200 100 200 c 28 + 155 200 200 155 200 100 c 28 + 200 45 155 0 100 0 c 28 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE618 +Encoding: 112 58904 112 +Width: 280 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +-200 0 m 1 + -200 110 -110 200 0 200 c 24 + 110 200 200 110 200 0 c 1 + 170 0 l 1 + 170 99 99 170 0 170 c 24 + -99 170 -170 99 -170 0 c 1 + -200 0 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE624 +Encoding: 113 58916 113 +Width: 250 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +90 120 m 0 + 110 120 132 165 132 200 c 28 + 132 235 110 280 90 280 c 0 + 70 280 48 235 48 200 c 24 + 48 165 70 120 90 120 c 0 +72 0 m 25 + 72 100 l 17 + 37 110 0 144.818359375 0 200 c 0 + 0 255 45 300 90 300 c 0 + 135 300 180 255 180 200 c 0 + 180 144.818359375 143 110 108 100 c 0 + 108 0 l 25 + 72 0 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE630 +Encoding: 114 58928 114 +Width: 200 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +84 102 m 1 + 36.534641833 109.00393025 -7.1054273576e-15 150.442560477 0 200 c 24 + 0 255 45 300 100 300 c 24 + 155 300 200 255 200 200 c 24 + 200 150.442560477 163.465358167 109.00393025 116 102 c 1 + 116 101.288034818 l 1 + 116 0 l 25 + 84 0 l 25 + 84 101.288034818 l 1 + 84 102 l 1 +116 126 m 5 + 149.481193966 134.213607404 175 164.479867787 175 200 c 24 + 175 241 141 275 100 275 c 24 + 59 275 25 241 25 200 c 24 + 25 164.479867787 50.5188060342 134.213607404 84 126 c 1 + 84 126.757636954 l 1 + 84 200 l 25 + 116 200 l 25 + 116 126.757636954 l 1 + 116 126 l 5 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE650 -Encoding: 62 58960 62 +Encoding: 115 58960 115 Width: 1037 Flags: W -HStem: -2 60<953.253 1010.82> 0 42<353.953 425.192 547.67 646.14> 286 33<516.961 581> 359 73<29.5 117.603> 388 51<365.056 474.516> 607 32<183.481 261 301 390.125> -VStem: 0 57<401 499.322> 207 54<373 448> 273 58<234.695 340.5> 425 56<120.828 255.23> 488 38<456.957 539.616> 586 39<188.61 284.44> 675 57<69.552 222.033> 887 59<79.8865 267.532> 952 60<-0.820206 56.8202> +HStem: -2 60<361.035 435.033 953.253 1010.82> 0 49<543.265 652.027> 286 36<514.943 580.797> 359 66<58.4784 125.129> 402 58<367.211 444.917> 607 32<177.106 261> +VStem: 0 57<406 505.924> 148 26<463.933 475.584> 200 67<410.241 442> 274.641 84.3586<205.588 329> 425 56<126.64 255.856> 452 64<466.983 558.522> 585 40<194.878 284.873> 675 60<72.5613 225.441> 887 59<79.8865 267.532> 952 60<-0.820206 56.8202> LayerCount: 2 Fore SplineSet -982 -2 m 3xa7fe - 967 -2 952 12 952 28 c 3 - 952 44 967 58 982 58 c 3 - 998 58 1012 44 1012 28 c 3 - 1012 12 1000 -2 982 -2 c 3xa7fe -460 93 m 1 - 440 125 425 152 425 186 c 27 +152 90 m 0x67ef + 221.394397964 119.985233688 274.64143816 164.649883528 274.64143816 208.902553279 c 0 + 274.64143816 216.303422646 273.152138825 223.692769088 270 231 c 0 + 252 273 185 332 185 389 c 0 + 185 407 200 441 200 442 c 2 + 261 607 l 1 + 114 601 57 505 57 460 c 0x6fef + 57 436 69 425 89 425 c 0 + 110 425 128 443 148 485 c 1 + 174 472 l 1 + 146 384 124 359 75 359 c 0x37ef + 35 359 0 389 0 423 c 0 + 0 505 74 639 277 639 c 3 + 460 639 516 565 516 503 c 0 + 516 439 482 402 420 402 c 0 + 384 402 344 435 320 493 c 1 + 344 507 l 1 + 366 469 373 460 401 460 c 0 + 437 460 452 482 452 510 c 0x2fdf + 452 530 431 601 303 608 c 1 + 276 542 l 2 + 275 538 267 498 267 479 c 0 + 267 390 359 361 359 297 c 0 + 359 211 296 140 296 140 c 1 + 334 114 366 63 394 63 c 0 + 399 63 402.9375 62.625 406.671875 62.625 c 0 + 417.875 62.625 427.25 66 458 93 c 1 + 438 125 425 152 425 186 c 27 425 226 431 247 453 276 c 0 - 479 311 522 319 563 319 c 0 - 599 319 625 289 625 247 c 3 + 479 311 522 322 563 322 c 0 + 599 322 625 289 625 247 c 3 625 233 625 214 615 195 c 0 - 591 148 543 113 518 93 c 1 - 542 64 566 42 604 42 c 0x6ffe - 630 42 675 80 675 116 c 0 + 591 148 551 110 526 90 c 1 + 550 61 566 49 604 49 c 0x6fef + 630 49 675 80 675 116 c 0 675 217 703 283 835 318 c 1 - 761 420 580 491 580 509 c 0 + 761 420 580 491 580 509 c 2 580 510 l 1 835 427 946 304 946 166 c 0 946 75 889 1 799 1 c 0 - 767 1 730 7 699 58 c 1xa7fe + 767 1 730 7 699 58 c 1xa7ef 672 15 633 0 603 0 c 3 - 553 0 506 38 485 64 c 1 - 427 14 405 -4 383 -4 c 0 + 532 0 504 33 483 59 c 1 + 425 9 405 -4 383 -4 c 0 361 -4 347 9 312 50 c 1 294 81 282 95 268 95 c 0 - 246 95 227 70 207 59 c 0 - 135 11 94 1 76 1 c 0 - 69 1 66 4 66 8 c 0 - 66 23 116 65 157 90 c 0 - 260 153 241 115 271 246 c 0 - 272 250 273 253 273 256 c 0 - 273 302 207 316 207 373 c 0 - 207 379 208 386 209 392 c 2 - 261 607 l 1 - 129 597 57 517 57 472 c 0 - 57 448 69 432 89 432 c 0 - 110 432 147 440 170 480 c 1 - 186 472 l 1 - 133 384 109 359 43 359 c 0x77fe - 16 359 0 384 0 418 c 0 - 0 494 74 639 277 639 c 3 - 460 639 526 555 526 487 c 0 - 526 437 471 388 423 388 c 0 - 387 388 344 414 320 472 c 1 - 333 484 l 1 - 355 446 383 439 411 439 c 0x2ffe - 452 439 488 458 488 495 c 0 - 488 530 443 601 301 608 c 1 - 263 448 l 1 - 262 444 261 438 261 434 c 0 - 261 384 331 366 331 315 c 0 - 331 311 331 307 330 303 c 2 - 292 140 l 1 - 330 114 355 40 383 40 c 0 - 403 40 419 57 460 93 c 1 -499 120 m 1 - 564 179 586 202 586 247 c 0 - 586 253 584 261 582 268 c 0 - 578 284 569 286 556 286 c 0 - 521 286 481 246 481 186 c 0 - 481 159 485 145 499 120 c 1 + 246 95 227 72 207 59 c 0 + 134 12 102 1 84 1 c 0 + 77 1 74 4 74 8 c 0 + 74 23 108 71 152 90 c 0x67ef +982 -2 m 3xa7cf + 967 -2 952 12 952 28 c 3 + 952 44 967 58 982 58 c 3 + 998 58 1012 44 1012 28 c 3 + 1012 12 1000 -2 982 -2 c 3xa7cf +498 126 m 1 + 563 185 585 210 585 247 c 0 + 585 253 583 261 581 268 c 0 + 577 284 568 286 555 286 c 0 + 520 286 481 246 481 186 c 0x27ef + 481 159 484 151 498 126 c 1 797 40 m 1 864 44 887 102 887 174 c 0 887 218 870 274 846 302 c 1 - 758 262 732 202 732 117 c 0 - 732 73 753 50 797 40 c 1 + 758 262 735 202 735 117 c 0 + 735 73 753 50 797 40 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE655 -Encoding: 63 58965 63 +Encoding: 116 58965 116 Width: 540 Flags: W HStem: 68 93<79.5149 155.133> 182 17<220 222.173 252.655 264.303> 192 94<18.5323 100.176 375.888 460.387> 230 56<60.9363 133.273> 230 18<300.618 361.695> 274 18<213.64 227.572 256.894 258> 315 97<73.5817 155.121 322.704 406.413> VStem: 179 23<209.875 223.47 254.181 264.625> 192 98<17.9339 97.9009 381.276 451.65> 230 18<113.95 174.519 300.936 363.797> 278 17<212.458 224.186 254.5 261> LayerCount: 2 @@ -2200,37 +4100,290 @@ 179 219 166 230 141 230 c 0xcb40 EndSplineSet Validated: 1 EndChar -StartChar: uniE95C -Encoding: 64 59740 64 +StartChar: uniE910 +Encoding: 117 59664 117 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +45 0 m 28 + 45 -113 137 -205 250 -205 c 28 + 363 -205 455 -113 455 0 c 28 + 455 113 363 205 250 205 c 28 + 137 205 45 113 45 0 c 28 +0 0 m 28 + 0 139 111 250 250 250 c 28 + 388 250 500 139 500 0 c 28 + 500 -138 389 -250 250 -250 c 28 + 112 -250 0 -138 0 0 c 28 +250 -60 m 7 + 217 -60 190 -33 190 0 c 7 + 190 33 217 60 250 60 c 7 + 283 60 310 33 310 0 c 7 + 310 -33 283 -60 250 -60 c 7 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE911 +Encoding: 118 59665 118 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +45 0 m 24 + 45 -113 137 -205 250 -205 c 24 + 363 -205 455 -113 455 0 c 24 + 455 113 363 205 250 205 c 24 + 137 205 45 113 45 0 c 24 +0 0 m 24 + 0 139 111 250 250 250 c 24 + 388 250 500 139 500 0 c 24 + 500 -138 389 -250 250 -250 c 24 + 112 -250 0 -138 0 0 c 24 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE912 +Encoding: 119 59666 119 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +228 350 m 1 + 273 350 l 1 + 273 250 l 1 + 400 237 500 131 500 0 c 0 + 500 -130 401 -237 273 -250 c 1 + 273 -350 l 5 + 228 -350 l 5 + 228 -249 l 1 + 100 -238 0 -131 0 0 c 0 + 0 132 99 238 228 249 c 1 + 228 350 l 1 +228 -203.826663616 m 1 + 228 203.826663616 l 1 + 125.298009966 192.809355922 45 105.569124751 45 0 c 0 + 45 -105.569124751 125.298009966 -192.809355922 228 -203.826663616 c 1 +273 -203.716902537 m 1 + 375.222749877 -192.242459755 455 -105.22624212 455 0 c 0 + 455 105.22624212 375.222749877 192.242459755 273 203.716902537 c 1 + 273 -203.716902537 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE914 +Encoding: 120 59668 120 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +463 130 m 0 + 464 127 465 123 465 120 c 0 + 465 112 461 103 454 99 c 0 + 451 97 447 96 443 96 c 0 + 435 96 427 100 420 110 c 1 + 386 173 323 205 250 205 c 8 + 137 205 45 113 45 0 c 24 + 45 -113 137 -205 250 -205 c 16 + 330 -205 386 -174 420 -110 c 0 + 424 -102 434 -97 444 -97 c 0 + 448 -97 451 -97 454 -99 c 0 + 462 -104 466 -111 466 -118 c 0 + 466 -122 465 -126 463 -130 c 0 + 420 -211 350 -250 250 -250 c 8 + 112 -250 0 -138 0 0 c 24 + 0 139 111 250 250 250 c 0 + 344 250 420 210 463 130 c 0 +250 -60 m 3 + 217 -60 190 -33 190 0 c 3 + 190 33 217 60 250 60 c 3 + 283 60 310 33 310 0 c 3 + 310 -33 283 -60 250 -60 c 3 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE915 +Encoding: 121 59669 121 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +463 130 m 0 + 464 127 465 123 465 120 c 0 + 465 112 461 103 454 99 c 0 + 451 97 447 96 443 96 c 0 + 435 96 427 100 420 110 c 1 + 386 173 323 205 250 205 c 8 + 137 205 45 113 45 0 c 24 + 45 -113 137 -205 250 -205 c 16 + 330 -205 386 -174 420 -110 c 0 + 424 -102 434 -97 444 -97 c 0 + 448 -97 451 -97 454 -99 c 0 + 462 -104 466 -111 466 -118 c 0 + 466 -122 465 -126 463 -130 c 0 + 420 -211 350 -250 250 -250 c 8 + 112 -250 0 -138 0 0 c 24 + 0 139 111 250 250 250 c 0 + 344 250 420 210 463 130 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE918 +Encoding: 122 59672 122 +Width: 500 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +273 249 m 1 + 356 243 424 203 463 130 c 0 + 464 127 465 123 465 120 c 0 + 465 112 461 103 454 99 c 0 + 451 97 447 96 443 96 c 0 + 435 96 427 100 420 110 c 0 + 390 166 336 198 273 204 c 1 + 273 -204 l 1 + 341 -199 389 -168 420 -110 c 0 + 424 -102 434 -97 444 -97 c 0 + 448 -97 451 -97 454 -99 c 0 + 462 -104 466 -111 466 -118 c 0 + 466 -122 465 -126 463 -130 c 0 + 423 -205 361 -244 273 -249 c 1 + 273 -350 l 1 + 228 -350 l 1 + 228 -249 l 1 + 100 -238 0 -131 0 0 c 0 + 0 132 99 238 228 249 c 1 + 228 350 l 1 + 273 350 l 1 + 273 249 l 1 +228 -204 m 1 + 228 204 l 1 + 125 193 45 106 45 0 c 0 + 45 -106 125 -193 228 -204 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE920 +Encoding: 123 59680 123 +Width: 120 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +60 -60 m 3 + 27 -60 0 -33 0 0 c 3 + 0 33 27 60 60 60 c 3 + 93 60 120 33 120 0 c 3 + 120 -33 93 -60 60 -60 c 3 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE925 +Encoding: 124 59685 124 +Width: 45 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +45 350 m 9 + 45 -350 l 1 + 0 -350 l 9 + 0 350 l 1 + 45 350 l 9 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE95D +Encoding: 125 59741 125 Width: 540 -Flags: W -HStem: -170 100<25 515> 70 100<25 515> -VStem: 0 25<-220 -170 -70 70 170 220> 515 25<-540 -170 -70 70 170 220> +Flags: HMW +LayerCount: 2 +Fore +SplineSet +30 70 m 25 + 30 -70 l 25 + 300 -70 l 25 + 300 70 l 25 + 30 70 l 25 +0 190 m 25 + 30 190 l 25 + 30 140 l 25 + 300 140 l 25 + 300 190 l 25 + 330 190 l 1 + 330 -750 l 29 + 300 -750 l 5 + 300 -140 l 1 + 30 -140 l 25 + 30 -190 l 25 + 0 -190 l 25 + 0 190 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniEA02 +Encoding: 126 59906 126 +Width: 250 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 65 m 25 + 137 250 l 25 + 221 135 l 25 + 307 250 l 25 + 389 137 l 1 + 564 370 l 1 + 598 348 l 1 + 338 0 l 1 + 254 116 l 25 + 168 0 l 25 + 85 112 l 25 + 32 41 l 25 + 0 65 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniEAA4 +Encoding: 127 60068 127 +Width: 250 +Flags: HMW LayerCount: 2 Fore SplineSet -25 70 m 25 - 25 -70 l 25 - 515 -70 l 25 - 515 70 l 25 - 25 70 l 25 -0 220 m 25 - 25 220 l 25 - 25 170 l 25 - 515 170 l 25 - 515 220 l 25 - 540 220 l 1 - 541 -540 l 25 - 516 -540 l 1 - 515 -170 l 1 - 25 -170 l 25 - 25 -220 l 25 - 0 -220 l 25 - 0 220 l 25 +0 270 m 0 + 30 300 45 311 85 311 c 0 + 125 311 170 250 210 250 c 0 + 222 250 230 250 250 270 c 0 + 252 272 256 273 260 273 c 0 + 266 273 272 271 272 264 c 0 + 272 257 266 246 250 230 c 0 + 220 200 205 189 165 189 c 0 + 125 189 80 250 40 250 c 0 + 28 250 20 250 0 230 c 0 + -2 228 -7 226 -11 226 c 0 + -17 226 -22 229 -22 236 c 0 + -22 243 -17 253 0 270 c 0 EndSplineSet Validated: 1 EndChar EndChars EndSplineFont Index: modules/MIDI.js ================================================================== --- modules/MIDI.js +++ modules/MIDI.js @@ -1,8 +1,8 @@ // MIDI.js - module to handle the %%MIDI parameters // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%MIDI" appears in a ABC source. // // Parameters (see abcMIDI for details) // %%MIDI channel n @@ -24,21 +24,20 @@ return p = ((pit / 12) | 0) * 7 - 19; // octave pit = pit % 12; // in octave p += pits[pit] note = { - pit: p, - apit: p, + pit: p } if (accs[pit]) note.acc = accs[pit] return note } // tonote() // normalize a note for mapping function norm(p) { - var a = p.match(/^([_^]*)([A-Ga-g])([,']*)$/) // ' + var a = p.match(/^([_^=]*)([A-Ga-g])([,']*)$/) // ' if (!a) return if (p.match(/[A-Z]/)) { p = p.toLowerCase(); if (p.indexOf("'") > 0) @@ -47,11 +46,11 @@ p += ',' } return p } // norm() - var n, v, + var n, v, s, maps = this.get_maps(), a = parm.split(/\s+/) switch (a[1]) { case "channel": @@ -64,11 +63,11 @@ break //fixme: should have a 'MIDIdrum' per voice? n = norm(a[2]); v = tonote(a[3]); if (!n || !v) { - this.syntax(1, abc.errs.bad_val, "%%MIDI drummap") + this.syntax(1, this.errs.bad_val, "%%MIDI drummap") break } if (!maps.MIDIdrum) maps.MIDIdrum = {} maps.MIDIdrum[n] = [null, v]; @@ -95,11 +94,17 @@ v = parseInt(a[3]) if (isNaN(v) || v < 0 || v > 127) { this.syntax(1, "Bad controller value in %%MIDI") return } - this.set_v_param("midictl", a[2] + ' ' + a[3]) + if (this.cfmt().sound != "play") + break + if (this.parse.state >= 2) { + s = this.new_block("midictl"); + s.ctrl = n; + s.val = v + } break } }, // do_midi() // set the MIDI parameters in the current voice @@ -112,11 +117,11 @@ case "instr=": // %%MIDI program curvoice.instr = a[i + 1] break case "midictl=": // %%MIDI control if (!curvoice.midictl) - curvoice.midictl = {} + curvoice.midictl = [] item = a[i + 1].split(' '); curvoice.midictl[item[0]] = Number(item[1]) break case "mididrum=": // %%MIDI drummap note midipitch if (!curvoice.map) @@ -135,20 +140,17 @@ }, set_vp: function(of, a) { abc2svg.MIDI.set_midi.call(this, a); of(a) + }, + + set_hooks: function(abc) { + abc.do_pscom = abc2svg.MIDI.do_pscom.bind(abc, abc.do_pscom); + abc.set_vp = abc2svg.MIDI.set_vp.bind(abc, abc.set_vp) } } // MIDI -abc2svg.modules.hooks.push( -// export - "errs", - "set_v_param", - "syntax", -// hooks - [ "do_pscom", "abc2svg.MIDI.do_pscom" ], - [ "set_vp", "abc2svg.MIDI.set_vp" ] -); +abc2svg.modules.hooks.push(abc2svg.MIDI.set_hooks); // the module is loaded abc2svg.modules.MIDI.loaded = true Index: modules/ambitus.js ================================================================== --- modules/ambitus.js +++ modules/ambitus.js @@ -1,32 +1,30 @@ // ambitus.js - module to insert an ambitus at start of a voice // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%ambitus" appears in a ABC source. // // Parameters // %%ambitus 1 abc2svg.ambitus = { do_ambitus: function() { - -// constants from the abc2svg core - var BASE_LEN = 1536, - NOTE = 8, - FULL = 0 - var s, v, p_v, min, max, + var C = abc2svg.C, + s, v, p_v, min, max, voice_tb = this.get_voice_tb() for (v = 0; v < voice_tb.length; v++) { p_v = voice_tb[v]; + if (p_v.second) + continue min = 100; max = -100 // search the top and bottom pitches for (s = p_v.sym; s; s = s.next) { - if (s.type != NOTE) + if (s.type != C.NOTE) continue if (s.notes[s.nhd].pit > max) max = s.notes[s.nhd].pit if (s.notes[0].pit < min) min = s.notes[0].pit @@ -34,54 +32,49 @@ if (min == 100) continue // no note s = p_v.clef; s.stem = 1; - s.head = FULL; + s.head = C.FULL; s.stemless = true; s.nhd = 1; s.notes = [{ - dur: BASE_LEN / 4, + dur: C.BLEN / 4, pit: min, shhd: 0 },{ - dur: BASE_LEN / 4, + dur: C.BLEN / 4, pit: max, shhd: 0 }] } }, // do_ambitus() draw_symbols: function(of, p_voice) { -// constants from the abc2svg core - var d, - delta_tb = this.get_delta_tb(), - staff_tb = this.get_staff_tb(), + var staff_tb = this.get_staff_tb(), s = p_voice.sym if (s.clef_type != undefined && s.nhd > 0) { - d = delta_tb[s.clef_type] + s.clef_line * 2; - s.notes[0].pit += d; - s.notes[1].pit += d; s.x -= 26; + this.set_scale(s); this.draw_note(s) if (s.notes[1].pit - s.notes[0].pit > 4) { this.xypath(s.x, 3 * (s.notes[1].pit - 18) + staff_tb[s.st].y); this.out_svg('v' + - ((s.notes[1].pit - s.notes[0].pit) * 3).toFixed(2) + + ((s.notes[1].pit - s.notes[0].pit) * 3).toFixed(1) + '" stroke-width=".6"/>\n'); } s.x += 26; p_voice.clef.nhd = 0 } of(p_voice) }, // draw_symbols() - output_music: function(of) { - if (this.cfmt().ambitus) + set_pitch: function(of, last_s) { + of(last_s) + if (!last_s && this.cfmt().ambitus) abc2svg.ambitus.do_ambitus.call(this) - of() }, set_fmt: function(of, cmd, param, lock) { if (cmd == "ambitus") { this.cfmt().ambitus = param @@ -95,20 +88,19 @@ s.wl = 40; s.wr = 12 } else { of(s) } + }, + + set_hooks: function(abc) { + abc.draw_symbols = abc2svg.ambitus.draw_symbols.bind(abc, abc.draw_symbols); + abc.set_pitch = abc2svg.ambitus.set_pitch.bind(abc, abc.set_pitch); + abc.set_format = abc2svg.ambitus.set_fmt.bind(abc, abc.set_format); + abc.set_width = abc2svg.ambitus.set_width.bind(abc, abc.set_width) } } // ambitus -abc2svg.modules.hooks.push( -// export - "draw_note", -// hooks - [ "draw_symbols", "abc2svg.ambitus.draw_symbols" ], - [ "output_music", "abc2svg.ambitus.output_music" ], - [ "set_format", "abc2svg.ambitus.set_fmt" ], - [ "set_width", "abc2svg.ambitus.set_width" ] -) +abc2svg.modules.hooks.push(abc2svg.ambitus.set_hooks); // the module is loaded abc2svg.modules.ambitus.loaded = true Index: modules/break.js ================================================================== --- modules/break.js +++ modules/break.js @@ -1,8 +1,8 @@ // break.js - module to handle the %%break command // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%break" appears in a ABC source. // // Parameters // %%break measure_nb [":" num "/" den] [" " measure ...]* @@ -9,22 +9,22 @@ abc2svg.break = { // get the %%break parameters get_break: function(parm) { - var BASE_LEN = 1536 // constant from the abc2svg core - var b, c, d, sq, + var C = abc2svg.C, + b, c, d, sq, a = parm.split(/[ ,]/), cfmt = this.cfmt() if (!cfmt.break) cfmt.break = [] for (n = 1; n < a.length; n++) { b = a[n]; - c = b.match(/(\d)([a-z]?)(:\d\/\d)?/) + c = b.match(/(\d+)([a-z]?)(:\d+\/\d+)?/) if (!c) { - this.syntax(1, errs.bad_val, "%%break") + this.syntax(1, this.errs.bad_val, "%%break") continue } if (c[2]) sq = c[2].charCodeAt(0) - 0x61 if (!c[3]) { @@ -32,18 +32,18 @@ m: c[1], t: 0, sq: sq}) continue } - d = c[3].match(/:(\d)\/(\d)/) + d = c[3].match(/:(\d+)\/(\d+)/) if (!d || d[2] < 1) { this.syntax(1, "Bad denominator in %%break") continue } cfmt.break.push({ m: c[1], - t: d[1] * BASE_LEN / d[2], + t: d[1] * C.BLEN / d[2], sq: sq}) } }, // get_break() // insert the EOLs of %%break @@ -56,21 +56,20 @@ for (i = 0; i < cfmt.break.length; i++) { brk = cfmt.break[i]; m = brk.m for (s = s1; s; s = s.next) { - if (s.bar_type && s.bar_num == m) + if (s.bar_num == m) break } if (!s) continue if (brk.sq) { seq = brk.sq for (s = s.ts_next; s; s = s.ts_next) { - if (s.bar_type - && s.bar_num == m) { + if (s.bar_num == m) { if (--seq == 0) break } } if (!s) @@ -101,19 +100,17 @@ set_bar_num: function(of) { of() if (this.cfmt().break) abc2svg.break.do_break.call(this) + }, + + set_hooks: function(abc) { + abc.do_pscom = abc2svg.break.do_pscom.bind(abc, abc.do_pscom); + abc.set_bar_num = abc2svg.break.set_bar_num.bind(abc, abc.set_bar_num) } } // break -abc2svg.modules.hooks.push( -// export - "errs", - "syntax", -// hooks - [ "do_pscom", "abc2svg.break.do_pscom" ], - [ "set_bar_num", "abc2svg.break.set_bar_num" ] -); +abc2svg.modules.hooks.push(abc2svg.break.set_hooks); // the module is loaded abc2svg.modules.break.loaded = true Index: modules/capo.js ================================================================== --- modules/capo.js +++ modules/capo.js @@ -1,8 +1,8 @@ // capo.js - module to add a capo chord line // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%capo" appears in a ABC source. // // Parameters // %%capo n 'n' is the capo fret number @@ -55,22 +55,18 @@ if (cmd == "capo") { this.cfmt().capo = param return } of(cmd, param, lock) - } + }, + set_hooks: function(abc) { + abc.gch_build = abc2svg.capo.gch_build.bind(abc, abc.gch_build); + abc.output_music = abc2svg.capo.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.capo.set_fmt.bind(abc, abc.set_format) + } } // capo - -abc2svg.modules.hooks.push( -// export - "gch_tr1", - "get_font", -// hooks - [ "set_format", "abc2svg.capo.set_fmt" ], - [ "gch_build", "abc2svg.capo.gch_build" ], - [ "output_music", "abc2svg.capo.output_music" ] -) +abc2svg.modules.hooks.push(abc2svg.capo.set_hooks); // the module is loaded abc2svg.modules.capo.loaded = true Index: modules/clip.js ================================================================== --- modules/clip.js +++ modules/clip.js @@ -1,18 +1,18 @@ // clip.js - module to handle the %%clip command // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%clip" appears in a ABC source. // // Parameters // %%clip start_measure_nb [":" num "/" den] "-" end_measure_nb [":" num "/" den] abc2svg.clip = { get_clip: function(parm) { - var BASE_LEN = 1536 // constant from the abc2svg core + var C = abc2svg.C // get the start/stop points function get_symsel(a) { var j, d, sq, b = a.match(/(\d+)([a-z]?)(:\d+\/\d+)?/) @@ -21,14 +21,14 @@ return if (b[2]) sq = b[2].charCodeAt(0) - 0x61 if (!b[3]) return {m: b[1], t: 0, sq: sq} // on measure bar - a = b[3].match(/:(\d)\/(\d)/) + a = b[3].match(/:(\d+)\/(\d+)/) if (!a || a[2] < 1) return - return {m: b[1], t: a[1] * BASE_LEN / a[2], sq: sq} + return {m: b[1], t: a[1] * C.BLEN / a[2], sq: sq} } // get_symsel() var b, c, a = parm.split(/[ -]/) @@ -48,46 +48,42 @@ this.cfmt().clip = [b, c] }, // get_clip() // cut the tune do_clip: function() { - var BAR = 0, // constants from the abc2svg core - CLEF = 1, - KEY = 5, - METER = 6, - STAVES = 12 - var voice_tb = this.get_voice_tb(), + var C = abc2svg.C + voice_tb = this.get_voice_tb(), cfmt = this.cfmt() // go to a global (measure + time) function go_global_time(s, sel) { var s2, bar_time, seq if (sel.m <= 1) { // special case: there is no measure 0/1 if (sel.m == 1) { for (s2 = s; s2; s2 = s2.ts_next) { - if (s2.type == BAR + if (s2.type == C.BAR && s2.time != 0) break } if (s2.time < voice_tb[this.get_cur_sy().top_voice]. meter.wmeasure) s = s2 } } else { for ( ; s; s = s.ts_next) { - if (s.type == BAR + if (s.type == C.BAR && s.bar_num >= sel.m) break } if (!s) return // null if (sel.sq) { seq = sel.sq for (s = s.ts_next; s; s = s.ts_next) { - if (s.type == BAR + if (s.type == C.BAR && s.bar_num == sel.m) { if (--seq == 0) break } } @@ -124,20 +120,20 @@ // update the start of voices sy = this.get_cur_sy() for (s2 = this.get_tsfirst(); s2 != s; s2 = s2.ts_next) { switch (s2.type) { - case CLEF: + case C.CLEF: s2.p_v.clef = s2 break - case KEY: + case C.KEY: s2.p_v.key = this.clone(s2.as.u.key) break - case METER: + case C.METER: s2.p_v.meter = this.clone(s2.as.u.meter) break - case STAVES: + case C.STAVES: sy = s2.sy; this.set_cur_sy(sy) break } } @@ -191,20 +187,17 @@ set_bar_num: function(of) { of() if (this.cfmt().clip) abc2svg.clip.do_clip.call(this) + }, + + set_hooks: function(abc) { + abc.do_pscom = abc2svg.clip.do_pscom.bind(abc, abc.do_pscom); + abc.set_bar_num = abc2svg.clip.set_bar_num.bind(abc, abc.set_bar_num) } } // clip -abc2svg.modules.hooks.push( -// export - "clone", - "errs", - "syntax", -// hooks - [ "do_pscom", "abc2svg.clip.do_pscom" ], - [ "set_bar_num", "abc2svg.clip.set_bar_num" ] -); +abc2svg.modules.hooks.push(abc2svg.clip.set_hooks); // the module is loaded abc2svg.modules.clip.loaded = true Index: modules/combine.js ================================================================== --- modules/combine.js +++ modules/combine.js @@ -1,8 +1,8 @@ // combine.js - module to add a combine chord line // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%voicecombine" appears in a ABC source. // // Parameters // %%voicecombine n 'n' is the combine level @@ -9,23 +9,18 @@ abc2svg.combine = { // function called at start of the generation when multi-voices comb_v: function() { - var NOTE = 8, // constants from the abc2svg core - REST = 10, - SL_ABOVE = 0x01, - SL_BELOW = 0x02, - SL_AUTO = 0x03, - SL_DOTTED = 0x08 + var C = abc2svg.C // check if voice combine may occur function may_combine(s) { var nhd2, s2 = s.ts_next - if (!s2 || (s2.type != NOTE && s2.type != REST)) + if (!s2 || (s2.type != C.NOTE && s2.type != C.REST)) return false if (s2.v == s.v || s2.st != s.st || s2.time != s.time || s2.dur != s.dur) @@ -36,11 +31,11 @@ // if (s2.a_dd) { //fixme: should check the double decorations // return false // } if (s.a_gch && s2.a_gch) return false - if (s.type == REST) { + if (s.type == C.REST) { if (s.type == s2.type && s.invis && !s2.invis) return false return true } if (s2.a_ly @@ -77,15 +72,15 @@ s.ymx = 3 * (s.notes[nhd].pit - 18) + 4; s.ymn = 3 * (s.notes[0].pit - 18) - 4; // force the tie directions type = s.notes[0].ti1 - if ((type & 0x0f) == SL_AUTO) - s.notes[0].ti1 = SL_BELOW | (type & ~SL_DOTTED); + if ((type & 0x0f) == C.SL_AUTO) + s.notes[0].ti1 = C.SL_BELOW | (type & ~C.SL_DOTTED); type = s.notes[nhd].ti1 - if ((type & 0x0f) == SL_AUTO) - s.notes[nhd].ti1 = SL_ABOVE | (type & ~SL_DOTTED) + if ((type & 0x0f) == C.SL_AUTO) + s.notes[nhd].ti1 = C.SL_ABOVE | (type & ~C.SL_DOTTED) } // combine_notes() // combine 2 voices function do_combine(s) { var s2, nhd, nhd2, type @@ -93,15 +88,15 @@ while (1) { nhd = s.nhd; s2 = s.ts_next; nhd2 = s2.nhd if (s.type != s2.type) { // if note and rest - if (s2.type != REST) { + if (s2.type != C.REST) { s2 = s; s = s2.ts_next } - } else if (s.type == REST) { + } else if (s.type == C.REST) { if (s.invis && !s2.invis) delete s.invis } else { combine_notes.call(this, s, s2) @@ -125,19 +120,19 @@ var s, s2, g, i, r for (s = this.get_tsfirst(); s; s = s.ts_next) { switch (s.type) { - case REST: + case C.REST: if (s.combine == undefined || s.combine < 0) continue if (may_combine.call(this, s)) do_combine.call(this, s) continue default: continue - case NOTE: + case C.NOTE: if (s.combine == undefined || s.combine <= 0) continue break } @@ -158,11 +153,11 @@ //fixme: may have rests in beam if (s2.beam_end) break do { s2 = s2.next - } while (s2.type != NOTE && s2.type != REST) + } while (s2.type != C.NOTE && s2.type != C.REST) } if (!s2) continue s2 = s while (1) { @@ -170,11 +165,11 @@ //fixme: may have rests in beam if (s2.beam_end) break do { s2 = s2.next - } while (s2.type != NOTE && s2.type != REST) + } while (s2.type != C.NOTE && s2.type != C.REST) } } }, // comb_v() do_pscom: function(of, text) { @@ -207,22 +202,19 @@ curvoice.combine = a[i + 1] break } } of(a) + }, + + set_hooks: function(abc) { + abc.do_pscom = abc2svg.combine.do_pscom.bind(abc, abc.do_pscom); + abc.new_note = abc2svg.combine.new_note.bind(abc, abc.new_note); + abc.set_stem_dir = abc2svg.combine.set_stem_dir.bind(abc, abc.set_stem_dir); + abc.set_vp = abc2svg.combine.set_vp.bind(abc, abc.set_vp) } } // combine -abc2svg.modules.hooks.push( -// export - "set_v_param", - "sort_pitch", - "unlksym", -// hooks - [ "do_pscom", "abc2svg.combine.do_pscom" ], - [ "new_note", "abc2svg.combine.new_note" ], - [ "set_stem_dir", "abc2svg.combine.set_stem_dir" ], - [ "set_vp", "abc2svg.combine.set_vp" ] -); +abc2svg.modules.hooks.push(abc2svg.combine.set_hooks); // the module is loaded abc2svg.modules.voicecombine.loaded = true Index: modules/diag.js ================================================================== --- modules/diag.js +++ modules/diag.js @@ -1,8 +1,8 @@ // diag.js - module to insert guitar chord diagrams // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%diagram" appears in a ABC source. // // Parameters // %%diagram 1 @@ -486,18 +486,17 @@ if (cmd == "diagram") { this.cfmt().diag = param return } of(cmd, param, lock) + }, + + set_hooks: function(abc) { + abc.output_music = abc2svg.diag.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.diag.set_fmt.bind(abc, abc.set_format) } } // diag -abc2svg.modules.hooks.push( -// export - "deco_cnv", -// hooks - [ "output_music", "abc2svg.diag.output_music" ], - [ "set_format", "abc2svg.diag.set_fmt" ] -); +abc2svg.modules.hooks.push(abc2svg.diag.set_hooks); // the module is loaded abc2svg.modules.diagram.loaded = true ADDED modules/equalbars.js Index: modules/equalbars.js ================================================================== --- /dev/null +++ modules/equalbars.js @@ -0,0 +1,118 @@ +// equalbars.js - module to set equal spaced measure bars +// +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ +// +// This module is loaded when "%%equalbars" appears in a ABC source. +// +// Parameters +// %%equalbars bool + +abc2svg.equalbars = { + + // new tune - clear the width of the start of the staff + output_music: function(of) { + this.equalbars_d = 0; + of() + }, + + // get the equalbars parameter + set_fmt: function(of, cmd, param, lock) { + if (cmd == "equalbars") + this.cfmt().equalbars = this.get_bool(param) + else + of(cmd, param, lock) + }, + + // adjust the symbol offsets of a music line + set_sym_glue: function(of, width) { + var C = abc2svg.C, + s, s2, w, i, n, x, g, t, t0, + bars = [], + tsfirst = this.get_tsfirst(); + + of(width) // compute the x offset of the symbols + if (!this.cfmt().equalbars) + return + + // search the first note/rest/bar + for (s2 = tsfirst; s2; s2 = s2.ts_next) { + if (!s2.seqst) + continue + switch (s2.type) { + default: + continue + case C.GRACE: + case C.MREST: + case C.NOTE: + case C.REST: + case C.SPACE: + break + } + break + } + if (!s2) + return + + // build an array of the bars + t0 = t = s2.time + for (s = s2; s.ts_next; s = s.ts_next) { + if (s.type == C.BAR && s.seqst) { + bars.push([s, s.time - t]); + t = s.time + } + } + bars.push([s, s.time - t]); + t = s.time + if (s.dur) + t += s.dur; + + n = bars.length + if (n <= 1) + return // one or no bar + + // set the measure parameters + x = s2.type == C.GRACE ? s2.extra.x : s2.x; + d = this.equalbars_d + if (!d) + d = this.equalbars_d = x; // offset first note/rest + + w = (width - d) / (t - t0) // width per time unit + + // loop on the bars + for (i = 0; i < n; i++) { + s = bars[i][0]; // next bar + f = w * bars[i][1] / (s.x - x) + + // and update the x offsets + for ( ; s2 != s; s2 = s2.ts_next) { + if (s2.type == C.GRACE) { + for (g = s2.extra; g; g = g.next) + g.x = d + (g.x - x) * f + } else if (s2.x) { + s2.x = d + (s2.x - x) * f + } + } + d += w * bars[i][1]; + x = s2.x + while (1) { + s2.x = d; + s2 = s2.ts_next + if (!s2 || s2.seqst) + break + } + if (!s2) + break + } + }, // set_sym_glue() + + set_hooks: function(abc) { + abc.output_music = abc2svg.equalbars.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.equalbars.set_fmt.bind(abc, abc.set_format); + abc.set_sym_glue = abc2svg.equalbars.set_sym_glue.bind(abc, abc.set_sym_glue) + } +} // equalbars + +abc2svg.modules.hooks.push(abc2svg.equalbars.set_hooks); + +// the module is loaded +abc2svg.modules.equalbars.loaded = true Index: modules/grid.js ================================================================== --- modules/grid.js +++ modules/grid.js @@ -1,225 +1,328 @@ // grid.js - module to insert a chord grid before or after a tune // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%grid" appears in a ABC source. // // Parameters -// %%grid 1 | -1 (above the tune | below the tune) +// %%grid [include=] [nomusic] [norepeat] +// = number of columns (1: auto) +// > 0: above the tune, < 0: under the tune +// = comma separated list of (continuous) measure numbers +// 'nomusic' displays only the grid +// 'norepeat' omits the ':' indications // %%gridfont font_name size (default: 'serif 16') abc2svg.grid = { // function called before tune generation do_grid: function() { - var tsfirst = this.get_tsfirst(), - voice_tb = this.get_voice_tb() - -// constants from the abc2svg core - var BASE_LEN = 1536, - BAR = 0, - METER = 6, - NOTE = 8, - REST = 10, - BLOCK = 16 - - var img, font_cl, cls, - cfmt = this.cfmt() + var C = abc2svg.C, + tsfirst = this.get_tsfirst(), + voice_tb = this.get_voice_tb(), + img, font_cl, cls, + cfmt = this.cfmt(), + grid = cfmt.grid function get_beat(s) { - var beat = BASE_LEN / 4 + var beat = C.BLEN / 4 if (!s.a_meter[0] || s.a_meter[0].top[0] == 'C' || !s.a_meter[0].bot) return beat; - beat = BASE_LEN / s.a_meter[0].bot[0] |0 + beat = C.BLEN / s.a_meter[0].bot[0] |0 if (s.a_meter[0].bot[0] == 8 && s.a_meter[0].top[0] % 3 == 0) - beat = BASE_LEN / 8 * 3 + beat = C.BLEN / 8 * 3 return beat } // get_beat() // generate the grid -function build_grid(chords, bars, font) { - var i, j, nr, line, bar, bar2, chord, cell, w, hr, x0, x, y, - wmx = 0, +function build_grid(chords, bars, font, wmx) { + var i, j, k, l, nr, line, bar, w, hr, x0, x, y, yl, + cell = '', + pcell = '', cells = [], - nc = chords.length % 6 == 0 ? 6 : 8; // number of columns + nc = grid.n + + // set some chord(s) in each cell + function set_chords() { + var i, ch, + pch = '-' + + for (i = 0; i < chords.length; i++) { + ch = chords[i] + if (!ch[0]) + ch[0] = pch + if (ch.length == 0) + continue + if (ch.length == 1) { + pch = ch[0] + continue + } + if (ch.length == 2) { + ch[2] = ch[1]; + ch[1] = null; + pch = ch[2] + continue + } + if (ch.length == 3) { + pch = ch[2] + continue + } + if (!ch[2]) + ch[2] = ch[1] || ch[0]; + pch = ch[3] + } + } // set_chords() - if (nc > chords.length) - nc = chords.length; + // set some chords in each cell + set_chords() // build the content of the cells - nr = 0 - for (i = 0; i < chords.length; i++) { - if (i % nc == 0) - nr++; // number of rows - chord = chords[i] - if (chord.length == 0) { - cell = '%' - } else { - cell = '' - for (j = 0; j < chord.length; j++) { - if (chord[j]) { - if (j != 0) - cell += ' / '; - cell += chord[j] - } else if (j == 0) { - cell += '%' - } - } - } - bar = bars[i]; - if (bar[bar.length - 1] == ':') - cell = ' ' + cell - bar2 = bars[i + 1] - if (bar2 && bar2[0] == ':') - cell += ' '; - cells.push(cell) - - // and find their max width - if (bar[bar.length - 1] == ':') - cell += ' ' - if (bar2 && bar2[0] == ':') - cell += ' '; - w = this.strwh(cell)[0] - if (w > wmx) - wmx = w - } - if (wmx < 20) - wmx = 20; + if (!grid.ls) { + cells = chords + } else { // with list of mesure numbers + bar = bars; + bars = [] + for (i = 0; i < grid.ls.length; i++) { + l = grid.ls[i] + if (l.indexOf('-') < 0) + l = [l, l] + else + l = l.split('-') + for (k = l[0] - 1; k < l[1]; k++) { + if (!chords[k]) // error + break + cells.push(chords[k]); + bars.push(bar[k]) + } + } + } + + // get the number of columns and rows + if (nc < 0) + nc = -nc + if (nc < 3) // auto + nc = cells.length % 6 == 0 ? 6 : 8 + if (nc > cells.length) + nc = cells.length; + nr = ((cells.length + nc - 1) / nc) |0; + + hr = font.size * 2 + if (wmx < hr * 1.4) + wmx = hr * 1.4; // cell width + w = wmx * nc if (w > img.width) { nc /= 2; nr *= 2; w /= 2 } // build the SVG image - hr = font.size + 8; // vert: 4 - cell - 4 line = '' + - cells[i] + '\n'; + if (cell.length > 1) { + line += '\n'; + if (cell[1]) { + line += '\n'; + line += '' + + cell[0] + '\n'; + line += '' + + cell[1] + '\n' + } else { + line += '' + + cell[0] + '\n' + } + if (cell.length >= 3) { + if (cell[3]) { + line += '\n'; + line += '' + + cell[2] + '\n'; + line += '' + + cell[3] + '\n' + } else { + line += '' + + cell[2] + '\n' + } + } + } else { + line += '' + + cell[0] + '\n' + } x += wmx } // show the repeat signs - y = -1 - hr * .2; + y = 1 - hr / 2 + font.size * .3; x = x0 for (i = 0; i < bars.length; i++) { bar = bars[i] if (bar[0] == ':') line += ':|\n' + (font.size + 2).toFixed(1) + '">:\n' if (i % nc == 0) { y += hr; // new row x = x0 } if (bar[bar.length - 1] == ':') line += '|:\n' + (font.size + 2).toFixed(1) + '">:\n' x += wmx } return line + '' } // build_grid() - var s, beat, cur_beat, i, beat_i, p_voice, n, font, + var s, beat, cur_beat, i, beat_i, p_voice, n, font, wm, bt, w, wmx, rep, bars = [], chords = [], - chord = [] + chord = []; img = this.get_img(); // get the beat beat = get_beat(voice_tb[0].meter); + wm = voice_tb[0].meter.wmeasure; + + // set the text style + if (!cfmt.gridfont) + this.param_set_font("gridfont", "serif 16"); + font = this.get_font('grid'); + font_cl = this.font_class(font) + cls = font_cl + " mid"; + this.set_font('grid'); // (for strwh()) - // scan the tune - cur_beat = beat_i = n = 0; + // scan the first voice of the tune + cur_beat = beat_i = n = wmx = 0; bars.push('|') for (s = voice_tb[0].sym; s; s = s.next) { while (s.time > cur_beat) { - beat_i++; + if (beat_i < 3) // only 2, 3 or 4 beats / measure... + beat_i++; cur_beat += beat } switch (s.type) { - case NOTE: - case REST: + case C.NOTE: + case C.REST: if (s.a_gch) { // search a chord symbol for (i = 0; i < s.a_gch.length; i++) { if (s.a_gch[i].type == 'g') { if (!chord[beat_i]) { chord[beat_i] = s.a_gch[i].text; + w = this.strwh(chord[beat_i])[0] + if (w > wmx) + wmx = w; n++ } break } } } break - case BAR: - if (s.time < beat) { // if anacrusis - bars[0] = s.bar_type; -// chord = []; - beat_i = 0; - cur_beat = s.time // re-synchronize - break - } - if (s.time != cur_beat) // if out of time - break - chords.push(chord); - bars.push(s.bar_type); + case C.BAR: + bt = grid.norep ? '|' : s.bar_type + if (s.time < wm) { // if anacrusis + if (chord.length) { + chords.push(chord); + bars.push(bt) + } else { + bars[0] = bt + } + } else { + if (!s.bar_num) // if not normal measure bar + break + chords.push(chord); + bars.push(bt) + } chord = []; + cur_beat = s.time; // synchronize in case of error beat_i = 0 + if (bt.indexOf(':')) + rep = true // some repeat break - case METER: + case C.METER: beat = get_beat(s) + wm = s.wmeasure break } } if (n == 0) // no chord in this tune return @@ -227,32 +330,30 @@ if (chord.length != 0) { bars.push('') chords.push(chord) } - // set the text style - if (!this.cfmt().gridfont) - this.param_set_font("gridfont", "serif 16"); - font = this.get_font('grid'); - font_cl = this.font_class(font) - cls = font_cl + " mid"; - this.set_font('grid'); // (for strwh()) - // create the grid + wmx += this.strwh(rep ? ' ' : ' ')[0]; p_voice = voice_tb[this.get_top_v()] s = { - type: BLOCK, + type: C.BLOCK, subtype: 'ml', dur: 0, time: 0, p_v: p_voice, v: p_voice.v, - text: build_grid.call(this, chords, bars, font) + text: build_grid.call(this, chords, bars, font, wmx) + } + + if (grid.nomusic) { // if no music + this.set_tsfirst(s) + return } // and insert it in the tune - if (cfmt.grid < 0) { // below + if (cfmt.grid.n < 0) { // below for (var s2 = tsfirst; s2.ts_next; s2 = s2.ts_next) ; s.time = s2.time; s.prev = p_voice.last_sym; s.ts_prev = s2; @@ -261,11 +362,10 @@ } else { // above s.time = 0; s.next = p_voice.sym; s.ts_next = tsfirst; tsfirst.ts_prev = s; - tsfirst = s; this.set_tsfirst(s); p_voice.sym.prev = s; p_voice.sym = s } }, // do_grid() @@ -274,28 +374,43 @@ if (this.cfmt().grid) abc2svg.grid.do_grid.call(this); of() }, - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, parm, lock) { if (cmd == "grid") { - this.cfmt().grid = param + if (!parm) + parm = "1"; + parm = parm.split(/\s+/) + var grid = {n: Number(parm.shift())} + if (isNaN(grid.n)) { + if (parm.length) { + this.syntax(1, this.errs.bad_val, "%%grid") + return + } + grid.n = 1 + } + while (parm.length) { + var item = parm.shift() + if (item == "norepeat") + grid.norep = true + else if (item == "nomusic") + grid.nomusic = true + else if (item.slice(0, 8) == "include=") + grid.ls = item.slice(8).split(',') + } + this.cfmt().grid = grid return } - of(cmd, param, lock) + of(cmd, parm, lock) + }, + + set_hooks: function(abc) { + abc.output_music = abc2svg.grid.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.grid.set_fmt.bind(abc, abc.set_format) } } // grid -abc2svg.modules.hooks.push( -// export - "font_class", - "get_font", - "param_set_font", - "set_font", - "strwh", -// hooks - [ "output_music", "abc2svg.grid.output_music" ], - [ "set_format", "abc2svg.grid.set_fmt" ] -) +abc2svg.modules.hooks.push(abc2svg.grid.set_hooks); // the module is loaded abc2svg.modules.grid.loaded = true Index: modules/grid2.js ================================================================== --- modules/grid2.js +++ modules/grid2.js @@ -1,8 +1,8 @@ // grid2.js - module to replace a voice in the music by a chord grid // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%grid2" appears in a ABC source. // // Parameters // %%grid2 y @@ -17,19 +17,20 @@ for (v = 0; v < voice_tb.length; v++) { p_v = voice_tb[v] if (!p_v.grid2) continue - p_v.stafflines = '...'; // no staff lines p_v.clef.invis = true; // no clef p_v.key.k_sf = p_v.key.k_a_acc = 0; // no key signature p_v.staffnonote = 2 // draw the staff for (s = p_v.sym; s; s = s.next) { if (s.dur) { // set all notes s.invis = true; // as invisible delete s.sl1; // with no slur s.ti1 = 0 // and no tie + if (s.tf) // don't show the tuplets + s.tf[0] = 1 } } } }, // do_grid() @@ -58,30 +59,28 @@ output_music: function(of) { abc2svg.grid2.do_grid.call(this); of() }, - set_format: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param, lock) { if (cmd == "grid2") { var curvoice = this.get_curvoice() - if (curvoice) + if (curvoice) { + this.set_v_param("stafflines", "..."); // no staff lines curvoice.grid2 = param + } return } of(cmd, param, lock) + }, + + set_hooks: function(abc) { + abc.draw_gchord = abc2svg.grid2.draw_gchord.bind(abc, abc.draw_gchord); + abc.output_music = abc2svg.grid2.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.grid2.set_fmt.bind(abc, abc.set_format) } } // grid2 -abc2svg.modules.hooks.push( -// export - "set_dscale", - "set_font", - "use_font", - "xy_str", -// hooks - [ "draw_gchord", "abc2svg.grid2.draw_gchord" ], - [ "output_music", "abc2svg.grid2.output_music" ], - [ "set_format", "abc2svg.grid2.set_format" ] -); +abc2svg.modules.hooks.push(abc2svg.grid2.set_hooks); // the module is loaded abc2svg.modules.grid2.loaded = true ADDED modules/page.js Index: modules/page.js ================================================================== --- /dev/null +++ modules/page.js @@ -0,0 +1,449 @@ +// page.js - module to generate one SVG image per page +// +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ +// +// This module is loaded when "%%pageheight" appears in a ABC source. +// +// Parameters +// %%pageheight + +abc2svg.page = { + + // output a new block + img_out: function(page, p) { + var cur_img_out = user.img_out; + + page.user_out(p) + + // user.img_out may have been changed .. + if (user.img_out != cur_img_out) { + page.user_out = user.img_out; + if (cur_img_out == page.img_out_sav) { // .. by the backend + user.img_out = abc2svg.page.img_in.bind(page.abc); + page.img_out_sav = user.img_out // keep our reference + } else { + user.img_out = cur_img_out // .. by an other extension + } + } + }, + + //function called at end of generation + abc_end: function(of) { + var page = this.page + if (page.h) { + abc2svg.page.img_out(page, + page.head + page.style + page.hf + page.out + ''); + abc2svg.page.img_out(page, ''); + page.h = 0; + page.out = '' + } + of() + }, // abc_end() + + // define the SVG header of the page + svg_head: function(cfmt) { + return '\n' + }, // svg_head() + + // start a new page + svg_out: function(abc, page) { + var h, + cfmt = abc.cfmt() + + function header_footer(str) { + var c, i, t, + nl = 1, + j = 0, + r = ["", "", ""] + + if (str[0] == '"') + str = str.slice(1, -1) + if (str.indexOf('\t') < 0) // if no TAB + str = '\t' + str // center + + for (i = 0; i < str.length; i++) { + c = str[i] + switch (c) { + case '\t': + if (j < 2) + j++ // next column + continue + case '\\': // hope '\n' + for (j = 0; j < 3; j++) + r[j] += '\n'; + nl++; + j = 0; + i++ + continue + default: + r[j] += c + continue + case '$': + break + } + c = str[++i] + switch (c) { + case 'd': // cannot know the modification date of the file + break + case 'D': + r[j] += new Date().toUTCString() + break + case 'F': + r[j] += abc.get_fname() + break + case 'I': + c = str[++i] + case 'T': + t = abc.info()[c] + if (t) + r[j] += t.split('\n', 1)[0] + break + case 'P': + case 'Q': + t = c == 'P' ? page.pn : page.pna + switch (str[i + 1]) { + case '0': + i++ + if (!(t & 1)) + r[j] += t + break + case '1': + i++ + if (t & 1) + r[j] += t + break + default: + r[j] += t + break + } + break + case 'V': + r[j] += "abc2svg-" + abc2svg.version + break +//fixme: handle the font changes ($) ? + } + } + r[4] = nl // number of lines + return r + } // header_footer() + + function font_class(font) { + if (font.class) + return 'f' + font.fid + cfmt.fullsvg + ' ' + font.class + return 'f' + font.fid + cfmt.fullsvg + } + + // generate a header or footer + function gen_hf(up, font, str) { + var a, i, j, k, x, y, y0, s, + fh = font.size * 1.1, + pos = [ '">', + '" text-anchor="middle">', + '" text-anchor="end">' ] + + if (str[0] == '-') { // not on 1st page + if (page.pn == 1) + return 0 + str = str.slice(1) + } + + a = header_footer(str) + if (up) + y0 = page.hbase + fh + else + y0 = cfmt.pageheight - page.topmargin - fh * a[4] + for (i = 0; i < 3; i++) { + str = a[i] + if (!str) + continue + if (i == 0) + x = cfmt.leftmargin + else if (i == 1) + x = cfmt.pagewidth / 2 + else + x = cfmt.pagewidth - cfmt.rightmargin; + x += page.gutter; + y = y0; + k = 0 + while (1) { + j = str.indexOf('\n', k) + if (j >= 0) + s = str.slice(k, j) + else + s = str.slice(k) + if (s) + page.hf += '/, + '') + .replace('', '\n'); + h += b.h + } + page.blk = null + page.h = h + } // blkcpy() + + // get the style from the image and remove it from the block + function get_style(p, page) { + var i, + sty = p.match(/((.|\n)*?)<\/style>/) + + if (!sty) + return p + sty = sty[1].split('\n') + if (!page.style) + page.style = '\n' + for (i = 0; i < sty.length; i++) { + if (page.style.indexOf(sty[i]) < 0) + page.style = page.style.replace('\n', + sty[i] + '\n\n') + } + return p.replace(/\n/, '') + } // get_style() + + // img_in() + switch (p.slice(0, 4)) { + case " 0 + || (page.oneperpage && this.info().X) + || page.h == 0) { + if (page.h) { + abc2svg.page.img_out(page, + page.head + page.style + page.hf + + page.out + ''); + abc2svg.page.img_out(page, '') + } + abc2svg.page.svg_out(this, page) + if (!this.cfmt().fullsvg) + page.style = '' + } + page.blk = []; + page.hb = page.h + break + case "= page.hmax) { // if page overflow + if (!page.out) // if at start of page + blkcpy(page); // output the start of tune + abc2svg.page.img_out(page, + page.head + page.style + page.hf + + page.out + ''); + abc2svg.page.img_out(page, ''); + abc2svg.page.svg_out(this, page); + page.h = page.hb = this.cfmt().topspace; + if (page.blk) + blkcpy(page) // output the start of tune + if (!this.cfmt().fullsvg) + page.style = '' + } + + p = get_style(p, page) + + // if no overflow yet, keep the block + if (page.blk) { + page.blk.push({p: p, h: h}) + } else { + page.out += p + .replace(//, + '') + .replace('', '\n') + } + page.h += h + break + case "'; + svgbuf += ''; g = 2 } svgbuf += s.replace(/<|>|&| /g, function(c){ switch (c) { case '<': return "<" @@ -485,11 +485,11 @@ } Psvg.prototype.stroke = function() { path_end() if (gcur.linewidth != 0.7) - svgbuf += '" stroke-width="' + gcur.linewidth.toFixed(2); + svgbuf += '" stroke-width="' + gcur.linewidth.toFixed(1); svgbuf += '" stroke="currentColor" fill="none"' + gcur.dash + '/>\n' } Psvg.prototype.translate = function(x, y) { gcur.xoffs += x; @@ -556,11 +556,11 @@ gcur.xorig = gcur.xoffs = abcobj.sx(0); gcur.yorig = gcur.yoffs = abcobj.sy(0); gcur.cx = 0; gcur.cy = 0; wps.parse(script + - (x / abcobj.stv_g().scale).toFixed(2) + ' ' + y.toFixed(2) + ' ' + f); + (x / abcobj.stv_g().scale).toFixed(1) + ' ' + y.toFixed(1) + ' ' + f); ps_flush(true) // + setg(0) return true } // try to generate a decoration by PS @@ -581,11 +581,11 @@ defl |= 4; Os.pop(); script = '/defl ' + defl + ' def ' if (de.lden) { - script += x.toFixed(2) + ' ' + y.toFixed(2) + ' '; + script += x.toFixed(1) + ' ' + y.toFixed(1) + ' '; de2 = de.start; x = de2.x; y = de2.y + staff_tb[de2.st].y if (x > de.x - 20) x = de.x - 20 @@ -739,11 +739,11 @@ /y0{.svg(y0)1 .call}.bdef\n\ /y1{.svg(y1)1 .call}.bdef\n") } // Psvg() -abc2svg.modules.psvg = { +abc2svg.psvg = { do_begin_end: function(of, type, opt, text) { if (type != "ps") { of(type, opt, text) return } @@ -760,23 +760,18 @@ }, psxygl: function(of, x, y, gl) { if (!this.psvg) return false return this.psvg.psxygl.call(this.psvg, x, y, gl) - } -} - -abc2svg.modules.hooks.push( -// export - "out_arp", - "out_deco_str", - "out_deco_val", - "out_ltr", - "xygl", -// hooks - [ "do_begin_end", "abc2svg.modules.psvg.do_begin_end" ], - [ "psdeco", "abc2svg.modules.psvg.psdeco" ], - [ "psxygl", "abc2svg.modules.psvg.psxygl" ] -); + }, + + set_hooks: function(abc) { + abc.do_begin_end = abc2svg.psvg.do_begin_end.bind(abc, abc.do_begin_end); + abc.psdeco = abc2svg.psvg.psdeco.bind(abc, abc.psdeco); + abc.psxygl = abc2svg.psvg.psxygl.bind(abc, abc.psxygl) + } +} // psvg + +abc2svg.modules.hooks.push(abc2svg.psvg.set_hooks); // the module is loaded abc2svg.modules.beginps.loaded = true ADDED modules/soloffs.js Index: modules/soloffs.js ================================================================== --- /dev/null +++ modules/soloffs.js @@ -0,0 +1,73 @@ +// soloffs.js - module to set the X offset of some elements at start of music line +// +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ +// +// Parameters +// %%soloffs = [=]* +// is one of 'part', 'tempo' or 'space' +// is the X offset from the start of staff + +abc2svg.soloffs = { + + set_fmt: function(of, cmd, parm, lock) { + if (cmd == "soloffs") { + var i, v, + C = abc2svg.C, + soloffs = this.cfmt().soloffs = {} + + parm = parm.split(/\s+/) + while (parm.length) { + i = parm.shift().split('=') + v = Number(i[1]) + if (isNaN(v)) + continue // error + switch (i[0]) { +// case 'bar': +// soloffs[C.BAR] = v +// break + case 'part': + soloffs[C.PART] = v + 10 // see deco.js + break + case 'tempo': + soloffs[C.TEMPO] = v + 16 // see deco.js + break + case 'space': + soloffs[C.SPACE] = v + break +// default: +// // error +// break + } + } + return + } + of(cmd, parm, lock) + }, + + set_sym_glue: function(of, width) { + var s, + C = abc2svg.C, + tsfirst = this.get_tsfirst(), + soloffs = this.cfmt().soloffs; + + of(width) // compute the x offset of the symbols + if (!soloffs) + return + for (s = tsfirst; s; s = s.ts_next) { + if (s.dur) + break + if (soloffs[s.type] != undefined) + s.x = soloffs[s.type] + } + }, // set_sym_glue() + + set_hooks: function(abc) { + abc.set_sym_glue = abc2svg.soloffs.set_sym_glue.bind(abc, abc.set_sym_glue); + abc.set_format = abc2svg.soloffs.set_fmt.bind(abc, abc.set_format) + } +} // soloffs + +abc2svg.modules.hooks.push(abc2svg.soloffs.set_hooks); + +// the module is loaded +abc2svg.modules.soloffs.loaded = true Index: modules/sth.js ================================================================== --- modules/sth.js +++ modules/sth.js @@ -1,8 +1,8 @@ // sth.js - module to set the stem heights // -// Copyright (C) 2018 Jean-Francois Moine - GPL3+ +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%sth" appears in a ABC source. // // Parameters // %%sth h1 h2 h3 ... @@ -13,20 +13,22 @@ abc2svg.sth = { // function called after beam calculation recal_beam: function(bm, s) { var staff_tb = this.get_staff_tb(), - st = s.st, - s2 = bm.s2 + y = staff_tb[s.st].y, + s2 = bm.s2, + y2 = staff_tb[s2.st].y + if (s.sth) s.ys = s.sth if (s2.sth) s2.ys = s2.sth; - bm.a = (s.ys- s2.ys) / (s.xs - s2.xs); - bm.b = s.ys - s.xs * bm.a + staff_tb[st].y + bm.a = (s.ys + y - s2.ys - y2) / (s.xs - s2.xs); + bm.b = s.ys - s.xs * bm.a + y while (1) { - s.ys = bm.a * s.xs + bm.b - staff_tb[st].y + s.ys = bm.a * s.xs + bm.b - y if (s.stem > 0) s.ymx = s.ys + 2.5 else s.ymn = s.ys - 2.5; s = s.next @@ -79,22 +81,23 @@ } }, // set_sth() calculate_beam: function(of, bm, s1) { var done = of(bm, s1) - if (done && bm.s2 && s1.sth) + if (done && bm.s2 && (s1.sth || bm.s2.sth)) abc2svg.sth.recal_beam.call(this, bm, s1) return done }, new_note: function(of, grace, tp_fact) { - var NOTE = 8 // constant from the abc2svg core - var s = of(grace, tp_fact), + var C = abc2svg.C, + s = of(grace, tp_fact), curvoice = this.get_curvoice() - if (curvoice.sth && s && s.type == NOTE) { + + if (curvoice.sth && s && s.type == C.NOTE) { s.sth = curvoice.sth; - curvoice.sth = null + curvoice.sth = null // some stem widths in this voice } return s }, set_format: function(of, cmd, param, lock) { @@ -110,22 +113,19 @@ }, set_stems: function(of) { of(); abc2svg.sth.set_sth.call(this) - } + }, + set_hooks: function(abc) { + abc.calculate_beam = abc2svg.sth.calculate_beam.bind(abc, abc.calculate_beam); + abc.new_note = abc2svg.sth.new_note.bind(abc, abc.new_note); + abc.set_format = abc2svg.sth.set_format.bind(abc, abc.set_format); + abc.set_stems = abc2svg.sth.set_stems.bind(abc, abc.set_stems) + } } // sth -abc2svg.modules.hooks.push( -// export - "goto_tune", - "parse", -// hooks - [ "calculate_beam", "abc2svg.sth.calculate_beam" ], - [ "new_note", "abc2svg.sth.new_note" ], - [ "set_format", "abc2svg.sth.set_format" ], - [ "set_stems", "abc2svg.sth.set_stems" ] -); +abc2svg.modules.hooks.push(abc2svg.sth.set_hooks); // the module is loaded abc2svg.modules.sth.loaded = true ADDED modules/temper.js Index: modules/temper.js ================================================================== --- /dev/null +++ modules/temper.js @@ -0,0 +1,74 @@ +// temper.js - module to define the temperament +// +// Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ +// +// This module is loaded when "%%temperament" appears in a ABC source. +// +// Parameters +// %%temperament +// The must contain 12 integer values that are the detune values in cents +// of the 12 notes of the equal scale. +// Examples: +// +// % pythagore (~500 B.C) +// %%temperament +00 +14 +04 -06 +08 -02 +12 +02 +16 +06 -04 +10 +// +// % just intonation +// %%temperament +00 -08 -18 -06 -14 -02 -10 +02 -08 -16 -04 -12 +// +// % meantone (Pietro Aaron 1523) +// %%temperament +00 -24 -07 +10 -14 +03 -21 -03 -27 +10 +07 -17 +// +// % Andreas Werckmeister III (1681) +// %%temperament +00 -04 +04 +00 -04 +04 +00 +02 -08 +00 +02 -02 +// +// % well temperament (F.A. Vallotti 1754) +// %%temperament +00 -06 -04 -02 -08 +02 -08 -02 -04 -06 +00 -10 + +abc2svg.temper = { + + // move the temperament to the 1st voice + set_bar_num: function(of) { + of() + if (this.cfmt().temper) { + var v0 = this.get_voice_tb()[0]; + + v0.temper = new Float32Array(12) + for (var i = 0; i < 12; i++) + v0.temper[i] = this.cfmt().temper[i] / 100 + } + }, + + // get the temperament + set_fmt: function(of, cmd, param, lock) { + if (cmd == "temperament") { + var ls = new Float32Array(param.split(/ +/)), + i = ls.length + + if (i == 12) { + while (--i >= 0) { + if (isNaN(parseInt(ls[i]))) + break + } + if (i < 0) { + this.cfmt().temper = ls + return + } + } + this.syntax(1, this.errs.bad_val, "%%temperament") + return + } + of(cmd, param, lock) + }, + + set_hooks: function(abc) { + abc.set_bar_num = abc2svg.temper.set_bar_num.bind(abc, abc.set_bar_num); + abc.set_format = abc2svg.temper.set_fmt.bind(abc, abc.set_format) + } +} // temper + + +abc2svg.modules.hooks.push(abc2svg.temper.set_hooks); + +// the module is loaded +abc2svg.modules.temperament.loaded = true Index: package.json ================================================================== --- package.json +++ package.json @@ -1,8 +1,8 @@ { "name": "abc2svg", - "version": "1.17.4", + "version": "1.19.1", "description": "ABC music notation translator", "devDependencies": { "uglify-js": "^2.5.0" }, "files": [ @@ -14,10 +14,11 @@ "abc2svg", "abc2svg-1.js", "abc2svg.ttf", "abcdoc-1.js", "abcemb-1.js", + "abcemb2-1.js", "ambitus-1.js", "break-1.js", "capo-1.js", "clip-1.js", "cmdline.js", @@ -29,27 +30,31 @@ "edit-de.js", "edit-en.js", "edit-fr.js", "edit-it.js", "edit-pt_BR.js", + "equalbars-1.js", "err-de.js", "err-en.js", "err-fr.js", "err-it.js", "err-pt_BR.js", "follow-1.js", "grid-1.js", "grid2-1.js", "json-1.js", + "page-1.js", "perc-1.js", "play-1.js", "psvg-1.js", "setmidi-1.js", "sth-1.js", + "soloffs-1.js", + "temper-1.js", "toabc.js", - "toabw.js", "toaudio-1.js", + "toabw.js", "toodt.js", "toxhtml.js" ], "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -57,20 +62,20 @@ "bin": { "abc2odt": "./abc2odt", "abc2svg": "./abc2svg" }, "repository": { - "type": "git", - "url": "git+https://github.com/moinejf/abc2svg.git" + "type": "fossil", + "url": "https://chiselapp.com/user/moinejf/repository/abc2svg" }, "keywords": [ "ABC", "music", "SVG" ], "author": "Jean-François Moine", "license": "LGPL-3.0", "bugs": { - "url": "https://github.com/moinejf/abc2svg/issues" + "url": "https://chiselapp.com/user/moinejf/repository/abc2svg/reportlist" }, - "homepage": "https://github.com/moinejf/abc2svg#readme" + "homepage": "https://chiselapp.com/user/moinejf/repository/abc2svg" } Index: toabc.js ================================================================== --- toabc.js +++ toabc.js @@ -1,8 +1,8 @@ // abc2svg - toabc.js - convert ABC to ABC // -// Copyright (C) 2016-2018 Jean-Francois Moine +// Copyright (C) 2016-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,34 +16,11 @@ // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . // constants from core/abc2svg.js - var BAR = 0, - CLEF = 1, - CUSTOS = 2, -// FORMAT = 3, - GRACE = 4, - KEY = 5, - METER = 6, - MREST = 7, - NOTE = 8, - PART = 9, - REST = 10, - SPACE = 11, - STAVES = 12, - STBRK = 13, - TEMPO = 14, -// TUPLET = 15, - BLOCK = 16, - REMARK = 17, - - SL_ABOVE = 0x01, - SL_BELOW = 0x02, - SL_AUTO = 0x03, - SL_HIDDEN = 0x04, - SL_DOTTED = 0x08, + var C = abc2svg.C, OPEN_BRACE = 0x01, CLOSE_BRACE = 0x02, OPEN_BRACKET = 0x04, CLOSE_BRACKET = 0x08, @@ -53,13 +30,11 @@ FL_VOICE = 0x80, OPEN_BRACE2 = 0x0100, CLOSE_BRACE2 = 0x0200, OPEN_BRACKET2 = 0x0400, CLOSE_BRACKET2 = 0x0800, - MASTER_VOICE = 0x1000, - - BASE_LEN = 1536 + MASTER_VOICE = 0x1000 var deco_l = { // decorations dot: '.', fermata: 'H', emphasis: 'L', @@ -155,13 +130,13 @@ case "scale": case "staffwidth": ln += s.param break case "sep": - ln += s.sk1.toFixed(2) + ' ' + - s.l.toFixed(2) + ' ' + - s.sk2.toFixed(2) + ln += s.sk1.toFixed(1) + ' ' + + s.l.toFixed(1) + ' ' + + s.sk2.toFixed(1) break case "skip": ln += s.sk break case "text": @@ -223,11 +198,11 @@ } } // deco_dump function dur_dump(dur, grace) { var d = 0, - l = grace ? BASE_LEN / 4 : ulen + l = grace ? C.BLEN / 4 : ulen if (dur == l) return while (1) { if (dur % l == 0) { dur /= l @@ -342,11 +317,11 @@ } if (nly == 0) continue for (s = voice_tb[v].sym; s; s = s.next) { switch (s.type) { - case BAR: + case C.BAR: if (w.length == 0) continue if (++nb < 4) continue nb = 0 @@ -361,11 +336,11 @@ // } // for (i = 0; i < nly; i++) // w[i] += t default: continue - case NOTE: + case C.NOTE: break } ly = s.a_ly if (!ly) { for (i = 0; i < nly; i++) @@ -439,15 +414,15 @@ } if (note.micro_n) { if (s.p_v.uscale) line += note.micro_n else - line += dur_dump(BASE_LEN / 4 * + line += dur_dump(C.BLEN / 4 * note.micro_n / note.micro_d, true) } - p = note.apit + p = note.pit if (p >= 23) { line += "abcdefg"[p % 7] if (p >= 30) { line += "'" if (p >= 37) @@ -470,18 +445,18 @@ if (note.sl2) line += ')' } // note_dump() function slti_dump(fl, ty) { - if (fl & SL_DOTTED) + if (fl & C.SL_DOTTED) line += "."; line += ty switch (fl & 0x07) { - case SL_ABOVE: + case C.SL_ABOVE: line += "'" break - case SL_BELOW: + case C.SL_BELOW: line += ',' break } } // slti_dump() @@ -551,11 +526,11 @@ if (staff.flags & CLOSE_BRACKET) ln += ']'; // output the following bars for (s = s.ts_next; s; s = s.ts_next) { - if (s.type != BAR) + if (s.type != C.BAR) break if (s.time != vti[s.v]) continue sym_dump(s); s.del = true @@ -574,11 +549,11 @@ var i, ln = 'Q:' function qdur_dump(dur) { var d = 0, - l = BASE_LEN + l = C.BLEN if (dur == l) ln += "1/1" while (1) { if (dur % l == 0) { dur /= l; @@ -675,18 +650,18 @@ } if (s.a_gch) gch_dump(s.a_gch) if (s.a_dd) deco_dump(s.a_dd) - if (s.invis && s.type != REST && s.type != SPACE) + if (s.invis && s.type != C.REST && s.type != C.SPACE) line += "!invisible!" if (s.color) line += "!" + s.color + "!" if (s.feathered_beam) line += s.feathered_beam > 0 ? "!beam-accel!" : "!beam-rall!" switch (s.type) { - case BAR: + case C.BAR: if (s.beam_on) line += "!beamon!" if (s.bar_dotted) line += '.'; line += s.bar_type @@ -695,47 +670,47 @@ line += s.text + ' ' else line += '"' + s.text + '"' } break - case CLEF: + case C.CLEF: info_out("K: " + clef_dump(s)) break - case CUSTOS: + case C.CUSTOS: break - case GRACE: + case C.GRACE: line += '{' if (s.sappo) line += '/' for (g = s.extra; g; g = g.next) sym_dump(g) if (s.gr_shift) line += ' '; line += '}' break - case KEY: + case C.KEY: info_out(key_dump(s)) break - case METER: + case C.METER: info_out(meter_dump(s)) break - case MREST: + case C.MREST: line += s.invis ? 'X' : 'Z' if (s.nmes != 1) line += s.nmes break - case NOTE: + case C.NOTE: if (s.beam_br1) line += "!beambr1!" if (s.beam_br2) line += "!beambr2!" if (s.trem1) line += '!' + "///".slice(0, s.ntrem) + '!' if (s.xstem) line += "!xstem!" if (s.stemless - && s.notes[0].dur < BASE_LEN) // head duration + && s.notes[0].dur < C.BLEN) // head duration line += "!stemless!" if (s.trem22) line += "!trem" + s.ntrem + "!" else if (s.trem2 && s.next && s.next.trem2) s.next.trem22 = true @@ -775,40 +750,40 @@ while (tmp) { line += ')'; tmp-- } break - case PART: + case C.PART: info_out('P:' + s.text) break - case REST: + case C.REST: line += s.invis ? 'x' : 'z'; dur_dump(s.dur) break - case SPACE: + case C.SPACE: line += 'y' if (s.width != 10) line += s.width break - case STAVES: + case C.STAVES: if (nv == 1) break staves_dump(s) break - case STBRK: + case C.STBRK: voice_out(); abc2svg.print('%%staffbreak ' + s.xmx.toString() + (s.stbrk_forced ? 'f' : '')) break - case TEMPO: + case C.TEMPO: tempo_dump(s) break - case BLOCK: + case C.BLOCK: voice_out(); block_dump(s) break - case REMARK: + case C.REMARK: info_out('r:' + s.text) break default: voice_out(); abc2svg.print('% ??sym: ' + music_types[s.type]) @@ -819,12 +794,12 @@ abc2svg.print('\nX:' + info['X']) header_dump("TC") abc2svg.print(meter_dump(voice_tb[0].meter)); - ulen = voice_tb[0].ulen < 0 ? BASE_LEN / 4 : voice_tb[0].ulen; - abc2svg.print('L:1/' + (BASE_LEN / ulen).toString()); + ulen = voice_tb[0].ulen < 0 ? C.BLEN / 4 : voice_tb[0].ulen; + abc2svg.print('L:1/' + (C.BLEN / ulen).toString()); header_dump("OABDFGRNPSZH") for (v = 0; v < nv; v++) { vo[v] = []; @@ -831,11 +806,11 @@ vti[v] = 0 } if (info.Q) { for (s = tsfirst; s; s = s.ts_next) { - if (s.type == TEMPO) { + if (s.type == C.TEMPO) { tempo_dump(s); s.del = true break } } @@ -848,11 +823,11 @@ voice_out(); if (s.del) continue line = ""; // (all voices are synchronized on %%score) - if (s.type != STAVES && s.time > vti[s.v]) { + if (s.type != C.STAVES && s.time > vti[s.v]) { //fixme: put 'X' if more than one measure line += 'x'; dur_dump(s.time - vti[s.v]); vti[s.v] = s.time } Index: toabw.js ================================================================== --- toabw.js +++ toabw.js @@ -1,8 +1,8 @@ // abc2svg - toabw.js - SVG generation for Abiword // -// Copyright (C) 2018 Jean-Francois Moine +// Copyright (C) 2018-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -46,12 +46,12 @@ // set a value in page unit function set_unit(p) { if (typeof p == "string") return p if (page_type[0] == 'L') - return (p / 96).toFixed(2) + 'in' - return (p / 37.8).toFixed(2) + 'cm' + return (p / 96).toFixed(1) + 'in' + return (p / 37.8).toFixed(1) + 'cm' } function header_footer(str) { var c, i, t, j = 0, @@ -240,24 +240,66 @@ else section += "

" + e.message + "\n*** Abort ***\n" + e.stack + "

\n"; abc2svg.abc_end(); abc2svg.quit() } + +function font_bug(str) { + var i, k, l, r, w, + j = 0 + + while (1) { + i = str.indexOf('font:', j) + if (i < 0) + return str + if (str[i - 1] == '"') { + j = str.indexOf('"', i) + } else { + j = str.indexOf('}', i); + k = str.indexOf(';', i) + if (j < 0 || (k >= 0 && k < j)) + j = k + } + w = str.slice(i + 5, j).match(/[^ \t"]+|".+?"/g) // " + + l = w.length; + r = 'font-family:' + w[--l] + + ';font-size:' + w[--l] + while (--l >= 0) { + switch (w[l]) { + case 'italic': + r += ';font-style:italic' + break + case 'oblique': + r += ';font-style:oblique' + break + case 'bold': + r += ';font-weight:bold' + break + } + } + str = str.replace(str.slice(i, j), r) + } +} function svg_out(str) { var r, w, h, cfmt = abc.cfmt() switch (str.slice(0, 4)) { case '\n\ \n\ \n'; + r = str.slice(0, 200).match(/.*width="(.*?)px" height="(.*?)px"/); + w = r[1] / 96; + h = r[2] / 96; section += '

\n'; @@ -296,11 +338,11 @@ return '' case '
': // hope followed by '\n'! return '' default: // size:..px var r = c.match(/size:(.+)px/) - return 'size:' + (r[1] * 72 / 96).toFixed(2) + 'pt' + return 'size:' + (r[1] * 72 / 96).toFixed(1) + 'pt' } }) section += '\n' break } @@ -316,12 +358,16 @@ page_type = pw > 800 ? 'Letter' : 'A4'; page_size = pw > 800 ? 'width="8.50" height="11.00" units="in"' : 'width="210.00" height="297.00" units="mm"'; - topmargin = set_unit(cfmt.topmargin || 37.8); - botmargin = set_unit(cfmt.botmargin || 37.8); + if (abc.page) { + topmargin = botmargin = 0 + } else { + topmargin = set_unit(cfmt.topmargin || 37.8); + botmargin = set_unit(cfmt.botmargin || 37.8) + } // output the first generated string svg_out(str); // change the output function Index: tolead.js ================================================================== --- tolead.js +++ tolead.js @@ -15,28 +15,27 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . -var BASE_LEN = 1536 - function lead(tsfirst, voice_tb, music_types, info) { - var s, beat, cur_beat, i, - line = ''; + var C = abc2svg.C + s, beat, cur_beat, i, + line = ''; function get_beat(s) { if (s.a_meter[0].top[0] == 'C' || !s.a_meter[0].bot) { - beat = BASE_LEN / 4 + beat = C.BLEN / 4 } else { - beat = BASE_LEN / s.a_meter[0].bot[0] |0 + beat = C.BLEN / s.a_meter[0].bot[0] |0 if (isNaN(beat)) { abc2svg.print('** Cannot get the beat') return } if (s.a_meter[0].bot[0] == 8 && s.a_meter[0].top[0] % 3 == 0) - beat = BASE_LEN / 8 * 3 + beat = C.BLEN / 8 * 3 } } // get_beat() abc2svg.print('-- ' + info.T + ' --'); @@ -50,13 +49,13 @@ for (s = voice_tb[0].sym; s; s = s.next) { while (s.time > cur_beat) { line += '/ '; cur_beat += beat } - switch (music_types[s.type]) { - case 'note': - case 'rest': + switch (s.type) { + case C.NOTE: + case C.REST: if (s.a_gch) { // search a chord symbol for (i = 0; i < s.a_gch.length; i++) { if (s.a_gch[i].type == 'g') { line += s.a_gch[i].text + ' '; cur_beat = s.time + beat @@ -63,11 +62,11 @@ break } } } break - case 'bar': + case C.BAR: if (s.eoln) { if (s.bar_type == '::') line += ':|\n|: ' else line += s.bar_type +'\n' @@ -77,11 +76,11 @@ else line += s.bar_type + ' ' } cur_beat = s.time // re-synchronize break - case 'meter': + case C.METER: get_beat(s) break } } abc2svg.print(line) Index: toodt.js ================================================================== --- toodt.js +++ toodt.js @@ -1,8 +1,8 @@ // abc2svg - toodt.js - ABC translation to ODT+SVG // -// Copyright (C) 2017-2018 Jean-Francois Moine +// Copyright (C) 2017-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -29,11 +29,11 @@ // // Constraints: // This module runs only with the nodeJS script 'abc2svg' and asks for // the npm module 'jszip' to be installed. - var margins, page_size, page_type, page_mid, page_right, + var margins, page_size, page_type, page_left, page_mid, page_right, header, footer, headerfont, footerfont, in_p, t_info, title, style = '', content = '', imgs = '', seq = 0, @@ -62,20 +62,20 @@ // convert a pixel value into page unit function set_unit(p) { if (typeof p == "string") return p if (page_type[0] == 'L') - return (p / 96).toFixed(2) + 'in' - return (p / 37.8).toFixed(2) + 'cm' + return (p / 96).toFixed(1) + 'in' + return (p / 37.8).toFixed(1) + 'cm' } // output a header or a footer function gen_hf(type, stype, str) { var c, i, res_left, j = 0, res = '\n\ -' +' if (str[0] == '"') str = str.slice(1, -1) if (str.indexOf('\t') < 0) // if no TAB str = '\t' + str // center @@ -274,11 +274,11 @@ xmlns:ooo="http://openoffice.org/2004/office"\ xmlns:ooow="http://openoffice.org/2004/writer"\ office:version="1.1">\n\ \n\ \n\ - \n\ + \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ + \n\ \n\ \n\ \n\ \n\ \n\ @@ -299,10 +300,11 @@ \n\ \n\ \n\ \n\ + \n\ \n\ \n\ \n\ \n\ \n\ @@ -312,11 +314,11 @@ \n\ \n\ \n\ \n\ \n\ + fo:margin-left="0" fo:margin-right="0"/>\n\ \n\ \n\ \n\ \n' + (header || '') + @@ -345,21 +347,70 @@ abc2svg.quit() } // convert a CSS font definition (in pixels) to ODT (in points) function def_font(font) { - var ws = '', - css_font = abc.style_font(abc.cfmt()[font]), - r = css_font.match(/font-family:(.+?); (.*)font-size:(.+)px/) - -// r[2] may be empty or -// font-weight:bold, font-style:italic or font-style:oblique - if (r[2]) - ws = r[2].replace(/(font-.+?):(.+?);/g, - 'fo:$1="$2"') - return 'style:font-name="' + r[1] + '" ' + ws + - 'fo:font-size="' + (r[3] * 72 / 96).toFixed(1) + 'pt"' + var css_font = abc.style_font(abc.cfmt()[font]) + .slice(5) // remove 'font:' + .split(' '), + l = css_font.length, + fo = 'fo:font-family="' + css_font[--l] + '"', + i = css_font[--l].slice(0, -2) + + fo += ' fo:font-size="' + + (i * 72 / 96).toFixed(1) + 'pt"' + while (--l >= 0) { + i = css_font[l] + switch (i) { + case 'italic': + case 'oblique': + fo += ' fo:font-style="' + i + '"' + break + case 'bold': + fo += ' fo:font-weight="' + i + '"' + break + } + } + return fo +} + +function font_bug(str) { + var i, k, l, r, w, + j = 0 + + while (1) { + i = str.indexOf('font:', j) + if (i < 0) + return str + if (str[i - 1] == '"') { + j = str.indexOf('"', i) + } else { + j = str.indexOf('}', i); + k = str.indexOf(';', i) + if (j < 0 || (k >= 0 && k < j)) + j = k + } + w = str.slice(i + 5, j).match(/[^ \t"]+|".+?"/g) // " + + l = w.length; + r = 'font-family:' + w[--l] + + ';font-size:' + w[--l] + while (--l >= 0) { + switch (w[l]) { + case 'italic': + r += ';font-style:italic' + break + case 'oblique': + r += ';font-style:oblique' + break + case 'bold': + r += ';font-weight:bold' + break + } + } + str = str.replace(str.slice(i, j), r) + } } function svg_out(str) { var img, r, w, h, cfmt = abc.cfmt() @@ -376,10 +427,15 @@ if (footer == undefined) { r = cfmt.footer; footer = r ? gen_hf("footer", "Footer", r) : ''; footerfont = def_font("footerfont") } + +//fixme: the shorthand 'font:' does not work in the library 'librsvg' +// used by libreoffice and abiword +// (https://gitlab.gnome.org/GNOME/librsvg/issues/34) + str = font_bug(str) // save the image img = 'Pictures/abc' + (++seq).toString() + '.svg'; zip.file(img, str, { compression: "DEFLATE" }); @@ -465,11 +521,10 @@ { compression: "STORE" }); // define some functions in the Abc object abc.tosvg("toodt", "\ %%fullsvg 1\n\ -%%printmargin 1.5cm\n\ %%musicfont abc2svg") // get the page parameters user.img_out = function(str) { var cfmt = abc.cfmt(), @@ -477,21 +532,26 @@ // page size if (pw > 800) { page_type = 'Letter'; page_size = 'fo:page-width="8.5in" fo:page-height="11in"'; - page_mid = '3.66in'; // with margin = 1.5cm = 0.59in - page_right = '7.32in' + page_left = set_unit(cfmt.leftmargin); + page_mid = '4.25in'; + page_right = set_unit(816 - cfmt.rightmargin) } else { page_type = 'A4'; page_size = 'fo:page-width="21cm" fo:page-height="29.7cm"'; - page_mid = '9cm'; // with margin 1.5cm - page_right = '18cm' + page_left = set_unit(cfmt.leftmargin); + page_mid = '10.5cm'; + page_right = set_unit(793.8 - cfmt.rightmargin) } - // top and bottom margins default = 1cm - margins = 'fo:margin-top="' + + // if abc2svg page formatting + if (abc.page) + margins = 'fo:margin-top="0" fo:margin-bottom="0"' + else + margins = 'fo:margin-top="' + set_unit(cfmt.topmargin || 37.8) + '" fo:margin-bottom="' + set_unit(cfmt.botmargin || 37.8) + '"'; // output the first generated string Index: toxhtml.js ================================================================== --- toxhtml.js +++ toxhtml.js @@ -1,8 +1,8 @@ // abc2svg - toxhtml.js - SVG generation // -// Copyright (C) 2014-2018 Jean-Francois Moine +// Copyright (C) 2014-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -15,22 +15,20 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . - var o_font, c_font, wto, - init_done, pw, ml, mr, pkf, lkf + var init_done, pw, ml, mr, pkf, lkf // replace <>& by XML character references function clean_txt(txt) { return txt.replace(/<|>|&.*?;|&/g, function(c) { switch (c) { case '<': return "<" case '>': return ">" + case '&': return "&" } - if (c == '&') - return "&" return c }) } abc2svg.abort = function(e) { @@ -114,17 +112,17 @@ nml = cfmt.leftmargin; if (nml != ml) { if (ml == undefined) ml = nml; - psty += 'margin-left:' + nml.toFixed(2) + 'px;' + psty += 'margin-left:' + nml.toFixed(1) + 'px;' } nmr = cfmt.rightmargin; if (nmr != mr) { if (mr == undefined) mr = nmr; - psty += 'margin-right:' + nmr.toFixed(2) + 'px;' + psty += 'margin-right:' + nmr.toFixed(1) + 'px;' } nlkf = cfmt.lineskipfac; if (nlkf != lkf) { if (lkf == undefined) lkf = nlkf; @@ -138,141 +136,13 @@ } npw = cfmt.pagewidth if (npw != pw || nml != ml || nmr != mr) { if (pw == undefined) pw = npw; - psty += 'width:' + (npw - nml - nmr).toFixed(2) + 'px;' - } - - return psty -} - -function para_start(action, skip) { - var r, - cfmt = abc.cfmt(), - sc = cfmt.scale, - newpage = abc.get_newpage() ? 'newpage ' : '', - sty = '

' -} // para_start() - -function para_build(str) { - var n_font, txt, - span = '' - - if (c_font != o_font) { - span += '' - } - txt = str.replace(/<|>|&.*?;|&| |\$./g, function(c){ - switch (c[0]) { - case '<': return "<" - case '>': return ">" - case '&': - if (c == '&') - return "&" - return c - case ' ': - return '  ' // space + nbspace - case '$': - if (c[1] == '0') - n_font = o_font - else if (c[1] >= '1' && c[1] <= '9') - n_font = abc.get_font("u" + c[1]) - else - return c - c = '' - if (n_font == c_font) - return c - if (c_font != o_font) - c = ""; - c_font = n_font - if (c_font == o_font) - return c - if (c_font.class) - return c + '' - return c + '' - } - }) - if (c_font != o_font) - txt += '' - return span + txt -} // para_build() - -// output a text (called from write_text) -function write_xhtml(text, action) { - var i, j, text2, skip - - abc.svg_flush(); - skip = abc.get_posy() // handle %%vskip - - // output the XHTML header if not done yet - if (!init_done) - user.img_out(''); - - o_font = c_font = abc.get_font("text") - while (1) { - i = text.indexOf('\n\n') - if (i > 0) { - text2 = text.slice(i + 2); - text = text.slice(0, i) - } - text = para_build(text) - switch (action) { - default: // left -// case 'c': // center -// case 'r': // right - user.img_out(para_start(action, skip) + - text.replace(/\n/g, '
\n') + '

') - break - case 'f': // fill - case 'j': // justify - user.img_out(para_start(action, skip) + text + '

') - break - } - if (i <= 0) - break - text = text2; - skip = 0 - } -} // write_xhtml() - -// replacement of Abc write_text() -function write_text(text, action) { - if (action == 's') // skip - return - if (!abc.get_multi()) - write_xhtml(text, action) - else - wto(text, action) + psty += 'width:' + (npw - nml - nmr).toFixed(1) + 'px;' + } + return psty } // entry point from cmdline abc2svg.abc_init = function() { var cfmt = abc.cfmt() @@ -340,10 +210,14 @@ }\n\ div.left {text-align: left}\n\ div.center {text-align: center}\n\ div.right {text-align: right}\n\ }'; + + // no margin / header / footer when SVG page formatting + if (abc.page) + topmargin = botmargin = header = footer = 0; abc2svg.print('\n\ \n\ \n\ @@ -369,14 +243,12 @@ // output the first generated string abc2svg.print(str); init_done = true; // change the output function - user.img_out = function(str) { abc2svg.print(str) } + user.img_out = abc2svg.print } - - wto = abc.set_xhtml(write_text) // switch write_text() } abc2svg.abc_end = function() { var font_style = abc.get_font_style() Index: util/abcdoc.js ================================================================== --- util/abcdoc.js +++ util/abcdoc.js @@ -1,9 +1,9 @@ //#javascript // abcdoc-1.js file to include in html pages with abc2svg-1.js // -// Copyright (C) 2014-2018 Jean-Francois Moine +// Copyright (C) 2014-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -89,10 +89,13 @@ document.head.appendChild(s) } var page = document.body.innerHTML + // accept page formatting + abc2svg.abc_end = function() {} + // load the required modules if (!abc2svg.modules.load(page, dom_loaded)) return // search the ABC tunes and add their rendering as SVG images @@ -114,11 +117,11 @@ j = re.lastIndex - res[0].length; new_page += page.slice(i, j); // get the end of the ABC sequence // including the %%beginxxx/%%endxxx sequences - re_stop.lastIndex = j + re_stop.lastIndex = ++j while (1) { res = re_stop.exec(page) if (!res || res[0] == "\n<") break k = page.indexOf(res[0].replace("begin", "end"), @@ -129,11 +132,11 @@ } if (!res || k < 0) k = page.length else k = re_stop.lastIndex - 2; - tune = page.slice(j + 1, k); + tune = page.slice(j, k); new_page += '
' +
 				clean_txt(tune) +
 				'
\n\
\n' // not "float:right" @@ -142,24 +145,25 @@ } catch (e) { alert("abc2svg javascript error: " + e.message + "\nStack:\n" + e.stack) } if (errtxt) { - i = page.indexOf("\n", j + 1); + i = page.indexOf("\n", j); i = page.indexOf("\n", i + 1); alert("Errors in\n" + - page.slice(j + 1, i) + + page.slice(j, i) + "\n...\n\n" + errtxt); errtxt = "" } + abc2svg.abc_end(); // close the page if %%pageheight new_page += '

\n'; i = k if (k >= page.length) break re.lastIndex = i } -//console.log('result:\n' + new_page) + try { document.body.innerHTML = new_page + page.slice(i) } catch (e) { alert("abc2svg bad generated SVG: " + e.message + "\nStack:\n" + e.stack) Index: util/abcemb.js ================================================================== --- util/abcemb.js +++ util/abcemb.js @@ -1,9 +1,9 @@ //#javascript // abcemb-1.js file to include in html pages with abc2svg-1.js // -// Copyright (C) 2014-2018 Jean-Francois Moine +// Copyright (C) 2014-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -86,15 +86,10 @@ if (typeof AbcPlay == "undefined") { // as play-1.js not loaded, playseq = function(){} // don't come here anymore return } abcplay = AbcPlay(playconf); - outputs = abcplay.get_outputs() - if (outputs.length == 0) { - playseq = function(){} - return // playing is not possible - } } if (playing) { abcplay.stop(); return } @@ -145,28 +140,35 @@ document.head.appendChild(s) } page = document.body.innerHTML; + // accept page formatting + abc2svg.abc_end = function() {} + // load the required modules - if (!abc2svg.modules.load(page, dom_loaded)) - return + if (abc2svg.modules.load(page, render)) + render() +} + +function render() { + page = document.body.innerHTML; // search the ABC tunes, // replace them by SVG images with play on click var i = 0, j, k, res, src, seq = 0, re = /\n%abc|\nX:/g, re_stop = /\nX:|\n<|\n%.begin/g, - select = window.location.hash.slice(1) + select = window.location.hash.slice(1); abc = new abc2svg.Abc(user) // check if a selection if (select) { select = decodeURIComponent(select); - select = page.indexOf(select) + select = page.search(select) if (select < 0) select = 0 } for (;;) { @@ -212,10 +214,11 @@ abc.tosvg('abcemb', page, j, k) } catch (e) { alert("abc2svg javascript error: " + e.message + "\nStack:\n" + e.stack) } + abc2svg.abc_end() // close the page if %%pageheight if (errtxt) { i = page.indexOf("\n", j); i = page.indexOf("\n", i + 1); alert("Errors in\n" + page.slice(j, i) + ADDED util/abcemb2.js Index: util/abcemb2.js ================================================================== --- /dev/null +++ util/abcemb2.js @@ -0,0 +1,231 @@ +//#javascript +// abcemb2-1.js file to include in html pages with abc2svg-1.js +// +// Copyright (C) 2018-2019 Jean-Francois Moine +// +// This file is part of abc2svg. +// +// abc2svg is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// abc2svg is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with abc2svg. If not, see . + +window.onerror = function(msg, url, line) { + if (typeof msg == 'string') + alert("window error: " + msg + + "\nURL: " + url + + "\nLine: " + line) + else if (typeof msg == 'object') + alert("window error: " + msg.type + ' ' + msg.target.src) + else + alert("window error: " + msg) + return false +} + +var errtxt = '', + abc, // (must be global for follow.js) + elts, // ABC HTML elements + tunes = '', // source of the ABC sequences + indx = [], // indexes of the tunes in tunes + select, + playing, + abcplay, + playconf = { + onend: endplay + }, + a_pe = [], // index: #sequence, value: playing events + glop, // global sequence index for play + old_gm, + jsdir = document.currentScript ? + document.currentScript.src.match(/.*\//) : + (function() { + var scrs = document.getElementsByTagName('script'); + return scrs[scrs.length - 1].src.match(/.*\//) || '' + })() + +// -- abc2svg init argument +var user = { + errmsg: function(msg, l, c) { // get the errors + errtxt += clean_txt(msg) + '\n' + }, + img_out: function(str) { // image output + new_page += str + }, + page_format: true // define the non-page-breakable blocks +} + +// replace <>& by XML character references +function clean_txt(txt) { + return txt.replace(/<|>|&.*?;|&/g, function(c) { + switch (c) { + case '<': return "<" + case '>': return ">" + case '&': return "&" + } + return c + }) +} + +function endplay() { + playing = false +} + +// function called on click on the music +function playseq(i) { + var outputs + + if (!abcplay) { + if (typeof AbcPlay == "undefined") { // as play-1.js not loaded, + playseq = function(){} // don't come here anymore + return + } + abcplay = AbcPlay(playconf); + } + if (playing) { + abcplay.stop() + return + } + playing = true + if (!a_pe[i]) { // if no playing event + abc = new abc2svg.Abc(user); + + abcplay.clear(); + abc.tosvg("play", "%%play") + if (select) + abc.tosvg('abcemb2', select) + try { + if (glop != undefined) + abc.tosvg("abcemb2", tunes, indx[glop], indx[glop + 1]); + abc.tosvg("abcemb2-" + i, tunes, indx[i], indx[i + 1]) + } catch(e) { + alert(e.message + '\nabc2svg tosvg bug - stack:\n' + e.stack); + playing = false; + a_pe[seq] = null + return + } + a_pe[i] = abcplay.clear() // keep the playing events + } + abcplay.play(0, 100000, a_pe[i]) +} + +// function called when the page is loaded +function dom_loaded() { + + // loop until abc2svg is fully loaded + if (typeof abc2svg != "object" + || !abc2svg.modules) { + setTimeout(dom_loaded, 500) + return + } + + // convert HTML to ABC + function toabc(s) { + return s.replace(/>/g, '>') + .replace(/</g, '<') + .replace(/&/g, '&') + .replace(/[ \t]+(%%)/g, '$1') + .replace(/[ \t]+(.:)/g, '$1') + } + +// function to load javascript files + abc2svg.loadjs = function(fn, relay, onerror) { + var s = document.createElement('script'); + if (/:\/\//.test(fn)) + s.src = fn // absolute URL + else + s.src = jsdir + fn; + s.type = 'text/javascript' + if (relay) + s.onload = relay; + s.onerror = onerror || function() { + alert('error loading ' + fn) + } + document.head.appendChild(s) + } + + // extract the ABC code + elts = document.getElementsByClassName('abc') + for (var i = 0; i < elts.length; i++) { + var elt = elts[i]; + indx[i] = tunes.length; + tunes += toabc(elt.innerHTML) + '\n' + } + indx[i] = tunes.length; + ready() +} + +function ready() { + var i, j + + // load the required modules + if (!abc2svg.modules.load(tunes, ready)) + return + + // accept page formatting + abc2svg.abc_end = function() {} + + var sel = window.location.hash.slice(1) + if (sel) + select = '%%select ' + decodeURIComponent(sel); + + abc = new abc2svg.Abc(user) + + // generate and replace + for (var i = 0; i < elts.length; i++) { + new_page = "" + + // set the playing callback + j = tunes.indexOf('X:', indx[i]) + if (j >= 0 && j < indx[i + 1]) + new_page += '
\n' + else if (glop == undefined) + glop = i + + if (sel) { + abc.tosvg('abcemb2', select); + sel = '' + } + + try { + abc.tosvg('abcemb2', tunes, indx[i], indx[i + 1]) + } catch (e) { + alert("abc2svg javascript error: " + e.message + + "\nStack:\n" + e.stack) + } + if (errtxt) { + new_page += '

' + + errtxt + "

\n"; + errtxt = "" + } + try { + elts[i].innerHTML = new_page + } catch (e) { + alert("abc2svg bad generated SVG: " + e.message + + "\nStack:\n" + e.stack) + } + + if (j >= 0 && j < indx[i + 1]) + new_page += '
\n' + abc2svg.abc_end() // close the page if %%pageheight + } + + // prepare for playing + delete user.img_out; // stop SVG generation + old_gm = user.get_abcmodel; + user.get_abcmodel = function(tsfirst, voice_tb, music_types, info) { + if (old_gm) + old_gm(tsfirst, voice_tb, music_types, info); + abcplay.add(tsfirst, voice_tb) + } +} // dom_loaded() + +// wait for the page to be loaded +document.addEventListener("DOMContentLoaded", dom_loaded, false) Index: util/follow.js ================================================================== --- util/follow.js +++ util/follow.js @@ -1,10 +1,10 @@ // follow-1.js - file to include in html pages after -// abc2svg-1.js, abcemb-1.js and play-1.js. +// abc2svg-1.js, abcemb[2]-1.js and play-1.js. // This script permits to follow the notes while playing. // -// Copyright (C) 2015-2018 Jean-Francois Moine +// Copyright (C) 2015-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by Index: util/midi.js ================================================================== --- util/midi.js +++ util/midi.js @@ -36,17 +36,11 @@ // // s.notes[i].midi // } // AbcMIDI creation function AbcMIDI() { - - // constants from Abc - var BAR = 0, - CLEF = 1, - GRACE = 4, - KEY = 5, - NOTE = 8 + var C = abc2svg.C // add MIDI pitches AbcMIDI.prototype.add = function(s, // starting symbol voice_tb) { // voice table @@ -53,10 +47,11 @@ var scale = new Int8Array( // note to pitch [0, 2, 4, 5, 7, 9, 11]), bmap = new Int8Array(7), // measure base map map = new Int8Array(70), // current map - 10 octaves tie_map, // index = MIDI pitch + tie_time, v, transp // clef transpose // re-initialize the map on bar function bar_map() { @@ -91,11 +86,11 @@ // convert ABC pitch to MIDI function pit2midi(p, a) { if (a) map[p] = a == 3 ? 0 : a; // (3 = natural) return ((p / 7) | 0) * 12 + scale[p % 7] + - (tie_map[p] || map[p]) + (tie_time[p] ? tie_map[p] : map[p]) } // pit2midi() // initialize the clefs and keys for (v = 0; v < voice_tb.length; v++) { if (!voice_tb[v].sym) @@ -114,70 +109,70 @@ } function vloop(v) { var i, g, p, note, s = voice_tb[v].sym, vtime = s.time, // next time - tie_time = [], rep_tie_map = [] tie_map = [] + tie_time = [] while (s) { if (s.time > vtime) { // if time skip bar_map() // force a measure bar vtime = s.time } if (s.dur) vtime = s.time + s.dur switch (s.type) { - case BAR: + case C.BAR: //fixme: pb when lack of measure bar (voice overlay, new voice) // x times repeat if (s.text) { if (s.text[0] == '1') { // 1st time rep_tie_map = []; rep_tie_time = [] - for (i in tie_map) + for (i = 0; i < tie_map.length; i++) rep_tie_map[i] = tie_map[i] } else if (rep_tie_map.length != 0) { tie_map = [] tie_time = [] - for (i in rep_tie_map) { + for (i = 0; i < rep_tie_map.length; i++) { tie_map[i] = rep_tie_map[i]; tie_time[i] = s.time } } } if (!s.invis) bar_map() break - case CLEF: + case C.CLEF: if (!s.clef_octave || s.clef_oct_transp) transp = 0 else transp = s.clef_octave break - case GRACE: + case C.GRACE: for (g = s.extra; g; g = g.next) { - if (!g.type != NOTE) + if (!g.type != C.NOTE) continue for (i = 0; i <= g.nhd; i++) { note = g.notes[i]; - p = note.apit + 19 + transp; + p = note.pit + 19 + transp; note.midi = pit2midi(p, note.acc) } } break - case KEY: + case C.KEY: key_map(s) break - case NOTE: + case C.NOTE: for (i = 0; i <= s.nhd; i++) { note = s.notes[i]; - p = note.apit + 19 + // pitch from C-1 + p = note.pit + 19 + // pitch from C-1 transp - if (tie_map[p]) { + if (tie_time[p]) { if (s.time > tie_time[p]) { delete tie_map[p] delete tie_time[p] } } Index: util/play.js ================================================================== --- util/play.js +++ util/play.js @@ -1,8 +1,8 @@ // play-1.js - file to include in html pages with abc2svg-1.js for playing // -// Copyright (C) 2015-2018 Jean-Francois Moine +// Copyright (C) 2015-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,59 +22,28 @@ // - Audio5 (toaudio5.js - play the audio sequences with webaudio and SF2) // - Midi5 (tomidi5.js - play the audio sequences with webmidi) // AbcPlay methods: // -// get_outputs() - return an array of output devices -// -// set_output() - set the output type/port -// // set_sfu() - get/set the soundfont URL // @url: URL - undefined = return current value // // set_speed() - get/set the play speed // @speed: < 1 slower, > 1 faster - undefined = return current value // // set_vol() - get/set the current sound volume // @volume: range [0..1] - undefined = return current value -// -// set_follow() - get/set the flag to call or not the 'onnote' callback -// @follow: boolean - undefined = return current value function AbcPlay(i_conf) { var conf = i_conf, + init = {}, audio = ToAudio(), audio5, midi5, current, abcplay = { // returned object (only instance) - - // get the output type/ports - get_outputs: function() { - var o, - outputs = [] - - if (midi5) { - o = midi5.get_outputs() - if (o) - outputs = o - } - if (audio5) { - o = audio5.get_outputs() - if (o) - outputs = outputs.concat(o) - } - return outputs - }, - set_output: set_output, clear: audio.clear, add: audio.add, - set_sft: vf -, - set_follow: function(v) { - if (v == undefined) - return conf.follow - conf.follow = v - }, + set_sft: vf, set_sfu: function(v) { if (v == undefined) return conf.sfu conf.sfu = v }, @@ -96,46 +65,63 @@ function vf() {} // void function // start playing when no defined output function play(istart, i_iend, a_e) { - var o, - os = abcplay.get_outputs() - if (os.length == 1) { - o = 0 + init.istart = istart; + init.i_iend = i_iend; + init.a_e = a_e + if (midi5) + midi5.get_outputs(play2) // get the MIDI ports + else + play2() + } // play() + + // if set, out contains an array of the MIDI output ports + function play2(out) { + var o + + if (!out) + out = [] + o = audio5.get_outputs() // get the HTML5 audio port + if (o) + out = out.concat(o) + if (out.length == 0) { + if (conf.onend) // no output port + conf.onend() + } + if (out.length == 1) { + o = 0 // only one port } else { - o = -1 - var res = window.prompt('Use \n0: ' + os[0] + - '\n1: ' + os[1] + '?', '0') + o = -1 // ask which port? + var pr = "Use" + for (var i = 0; i < out.length; i++) + pr += "\n " + i + ": " + out[i] + var res = window.prompt(pr, '0') if (res) { o = Number(res) - if (isNaN(o) || o < 0 || o >= os.length) + if (isNaN(o) || o < 0 || o >= out.length) o = -1 } if (!res || o < 0) { if (conf.onend) conf.onend() return } } - set_output(os[o]); - abcplay.play(istart, i_iend, a_e) - } - - // set the current output changing the play functions - function set_output(name) { - current = name == 'sf2' ? audio5 : midi5 - if (!current) - return + + // set the current output changing the play functions + current = out[o] == 'sf2' ? audio5 : midi5; abcplay.play = current.play; abcplay.stop = current.stop if (current.set_output) - current.set_output(name) - } // set_output() + current.set_output(out[o]); + abcplay.play(init.istart, init.i_iend, init.a_e); + init = {} + } // play2() // set default configuration values - conf.follow = true; conf.gain = 0.7; conf.speed = 1; // get the play parameters from localStorage (function get_param() { @@ -143,14 +129,11 @@ if (!localStorage) return } catch (e) { return } - var v = localStorage.getItem("follow") - if (v) - conf.follow = v != "0"; - v = localStorage.getItem("sfu") + var v = localStorage.getItem("sfu") if (v) conf.sfu = v; v = localStorage.getItem("volume") if (v) conf.gain = Number(v) Index: util/sf2-parser.js ================================================================== --- util/sf2-parser.js +++ util/sf2-parser.js @@ -8,11 +8,11 @@ * * Based on code from the "SoundFont Synthesizer for WebMidiLink" * https://github.com/gree/sf2synth.js * * Adapted to abc2svg - * Copyright (C) 2018 Jean-Francois Moine + * Copyright (C) 2018-2019 Jean-Francois Moine * * Licensed under the MIT License. */ /*global require*/ Index: util/toaudio.js ================================================================== --- util/toaudio.js +++ util/toaudio.js @@ -1,8 +1,8 @@ // toaudio.js - audio generation // -// Copyright (C) 2015-2018 Jean-Francois Moine +// Copyright (C) 2015-2019 Jean-Francois Moine // // This file is part of abc2svg-core. // // abc2svg-core is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by @@ -18,20 +18,11 @@ // along with abc2svg-core. If not, see . // ToAudio creation function ToAudio() { -// constants from Abc - var BAR = 0, - CLEF = 1, - GRACE = 4, - KEY = 5, - NOTE = 8, - REST = 10, - STAVES = 12, - TEMPO = 14, - BASE_LEN = 1536, + var C = abc2svg.C, scale = new Uint8Array([0, 2, 4, 5, 7, 9, 11]), // note to pitch conversion a_e, // event array @@ -39,11 +30,21 @@ abc_time, // last ABC time play_factor; // play time factor // ToAudio return { -// clear the playing events and return the old ones + +// clear the playing events and +// return the old ones as an array of Float32Array: +// [0]: index of the note in the ABC source +// [1]: time in seconds +// [2]: if >= 0: MIDI instrument (MIDI GM number - 1) +// else: MIDI control message +// [3]: MIDI note pitch (with cents) / controller +// [4]: duration / controller value +// [5]: volume (0..1) +// [6]: voice number clear: function() { var a_pe = a_e; a_e = null return a_pe }, // clear() @@ -52,10 +53,11 @@ add: function(start, // starting symbol voice_tb) { // voice table var kmaps = [], // accidentals per voice from key signature cmaps = [], // current accidental table map, // map of the current voice - 10 octaves + temper, // temperament i, n, dt, d, v, top_v, // top voice rep_st_s, // start of sequence to be repeated rep_en_s, // end ("|1") rep_nx_s, // restart at end of repeat @@ -68,20 +70,36 @@ // set the accidentals, transpositions and instruments of the voices function set_voices() { var v, p_v, s, mi + temper = voice_tb[0].temper; // (set by the module temper.js) transp = new Int8Array(voice_tb.length) for (v = 0; v < voice_tb.length; v++) { p_v = voice_tb[v]; mi = p_v.instr || 0 if (p_v.midictl) { - if (p_v.midictl[32]) // bank LSB - mi += p_v.midictl[32] * 128 - if (p_v.midictl[0]) // bank MSB - mi += p_v.midictl[0] * 128 * 128 + p_v.midictl.forEach(function(val, i) { + switch(i) { + case 0: // bank MSB + mi += val * 128 * 128 + break + case 32: // bank LSB + mi += val * 128 + break + default: // generate a MIDI control + a_e.push(new Float32Array([ + p_v.sym.istart, + 1, // (time) + -1, // MIDI control + i, + val, + 1, + v])) + } + }) } instr[v] = mi; // MIDI instrument s = p_v.clef; transp[v] = (!s.clef_octave || s.clef_oct_transp) ? @@ -98,14 +116,15 @@ function key_map(s) { var i, bmap if (s.k_bagpipe) { // detune for just intonation in A (C is C#, F is F# and G is Gnat) - bmap = new Float32Array([100-13.7, -2, 2, 100-15.6, -31.2, 0, 3.9]) - for (i = 0; i < 7; i++) - bmap[i] = (bmap[i] + 150.6) / 100 // 'A' bagpipe = 480Hz - // 150.6 = (Math.log2(480/440) - 1)*1200 +// bmap = new Float32Array([100-13.7, -2, 2, 100-15.6, -31.2, 0, 3.9]) +// for (i = 0; i < 7; i++) +// bmap[i] = (bmap[i] + 150.6) / 100 // 'A' bagpipe = 480Hz +// // 150.6 = (Math.log2(480/440) - 1)*1200 + bmap = new Float32Array([2.37, 1.49, 1.53, 2.35, 1.19, 1.51, 1.55]) } else { bmap = new Float32Array(7) switch (s.k_sf) { case 7: bmap[6] = 1 case 6: bmap[2] = 1 @@ -128,13 +147,12 @@ cmaps[s.v].set(kmaps[s.v]) } // key_map() // convert ABC pitch to MIDI index function pit2mid(s, i) { - var n, oct, - note = s.notes[i]; - p = note.apit + 19, // pitch from C-1 + var note = s.notes[i], + p = note.pit + 19, // pitch from C-1 a = note.acc if (transp[s.v]) p += transp[s.v] if (a) { @@ -142,19 +160,24 @@ a = 0 else if (note.micro_n) a = (a < 0 ? -note.micro_n : note.micro_n) / note.micro_d * 2; map[p] = a + } else { + a = map[p] } - return ((p / 7) | 0) * 12 + scale[p % 7] + map[p] + p = ((p / 7) | 0) * 12 + scale[p % 7] + a + if (!temper || a | 0 != a) // if equal temperament or micro-tone + return p + return p + temper[p % 12] } // pit2mid() // handle the ties function do_tie(s, note, d) { var n, end_time = s.time + s.dur, - pit = note.apit, + pit = note.pit, p = pit + 19, a = note.acc if (transp[s.v]) p += transp[s.v] @@ -174,17 +197,17 @@ return d end_time = s.time } if (s.time != end_time) return d - if (s.type == NOTE) + if (s.type == C.NOTE) break } n = s.notes.length for (i = 0; i < n; i++) { note = s.notes[i] - if (note.apit == pit) { + if (note.pit == pit) { d += s.dur / play_factor; note.ti2 = true return note.ti1 ? do_tie(s, note, d) : d } } @@ -196,13 +219,13 @@ var g, i, n, t, d, s2, next = s.next // before beat if (s.sappo) { - d = BASE_LEN / 16 - } else if ((!next || next.type != NOTE) - && s.prev && s.prev.type == NOTE) { + d = C.BLEN / 16 + } else if ((!next || next.type != C.NOTE) + && s.prev && s.prev.type == C.NOTE) { d = s.prev.dur / 2 // on beat } else { @@ -217,27 +240,32 @@ s2.ts_prev = next break } } - if (!next.dots) - d = next.dur / 2 - else if (next.dots == 1) - d = next.dur / 3 +// if (!next.dots) +// d = next.dur / 2 +// else if (next.dots == 1) +// d = next.dur / 3 +// else +// d = next.dur * 2 / 7; + d = next.dur / 12 + if (d & (d - 1) == 0) + d = next.dur / 2 // no dot else - d = next.dur * 2 / 7; + d = next.dur / 3; next.time += d; next.dur -= d } n = 0 for (g = s.extra; g; g = g.next) - if (g.type == NOTE) + if (g.type == C.NOTE) n++; d /= n * play_factor; t = p_time for (g = s.extra; g; g = g.next) { - if (g.type != NOTE) + if (g.type != C.NOTE) continue gen_notes(g, t, d); t += d } } // gen_grace() @@ -246,16 +274,18 @@ function gen_notes(s, t, d) { for (var i = 0; i <= s.nhd; i++) { var note = s.notes[i] if (note.ti2) continue - a_e.push([ + a_e.push(new Float32Array([ s.istart, t, instr[s.v], pit2mid(s, i), - note.ti1 ? do_tie(s, note, d) : d]) + note.ti1 ? do_tie(s, note, d) : d, + 1, + s.v])) } } // gen_note() // add() main @@ -262,19 +292,20 @@ set_voices(); // initialize the voice parameters if (!a_e) { // if first call a_e = [] abc_time = rep_st_t = p_time = 0; - play_factor = BASE_LEN / 4 * 120 / 60 // default: Q:1/4=120 + play_factor = C.BLEN / 4 * 120 / 60 // default: Q:1/4=120 } else if (s.time < abc_time) { abc_time = rep_st_t = s.time } // loop on the symbols while (s) { - if (s.type == TEMPO - && s.tempo) { +// if (s.type == C.TEMPO +// && s.tempo) { + if (s.tempo) { // tempo change d = 0; n = s.tempo_notes.length for (i = 0; i < n; i++) d += s.tempo_notes[i]; play_factor = d * s.tempo / 60 @@ -291,11 +322,11 @@ abc_time = s.time } map = cmaps[s.v] switch (s.type) { - case BAR: + case C.BAR: //fixme: does not work if different measures per voice if (s.v != top_v) break // right repeat @@ -346,46 +377,68 @@ // 1st time repeat } else if (s.text && s.text[0] == '1') { rep_en_s = s } break - case CLEF: + case C.CLEF: transp[s.v] = (!s.clef_octave || s.clef_oct_transp) ? 0 : s.clef_octave break - case GRACE: + case C.GRACE: if (s.time == 0 // if before beat at start time && abc_time == 0) { dt = 0 if (s.sappo) - dt = BASE_LEN / 16 - else if (!s.next || s.next.type != NOTE) + dt = C.BLEN / 16 + else if (!s.next || s.next.type != C.NOTE) dt = d / 2; abc_time -= dt } gen_grace(s) break - case KEY: + case C.KEY: key_map(s) break - case REST: - case NOTE: + case C.REST: + case C.NOTE: d = s.dur - if (s.next && s.next.type == GRACE) { + if (s.next && s.next.type == C.GRACE) { dt = 0 if (s.next.sappo) - dt = BASE_LEN / 16 - else if (!s.next.next || s.next.next.type != NOTE) + dt = C.BLEN / 16 + else if (!s.next.next || s.next.next.type != C.NOTE) dt = d / 2; s.next.time -= dt; d -= dt } - if (s.type == NOTE) - gen_notes(s, p_time, d / play_factor) + d /= play_factor + if (s.type == C.NOTE) + gen_notes(s, p_time, d) + else + a_e.push(new Float32Array([ + s.istart, + p_time, + 0, + 0, + d, + 0, + s.v])) break - case STAVES: + case C.STAVES: top_v = s.sy.top_voice + break + case C.BLOCK: + if (s.subtype != "midictl") + break + a_e.push(new Float32Array([ // generate a MIDI control + s.istart, + p_time, + -1, // MIDI control + s.ctrl, + s.val, + 1, + s.v])) break } s = s.ts_next } } // add() Index: util/toaudio5.js ================================================================== --- util/toaudio5.js +++ util/toaudio5.js @@ -1,8 +1,8 @@ // toaudio5.js - audio output using HTML5 audio // -// Copyright (C) 2015-2018 Jean-Francois Moine +// Copyright (C) 2015-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,36 +16,48 @@ // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . // Audio5 creation -// one argument: + // @conf: configuration object - all items are optional: -// ac: audio context -// sfu: soundfont URL (sf2 base64 encoded) +// ac: audio context - (default: created on play start) +// sfu: soundfont URL (sf2 base64 encoded - default: "Scc1t2") // onend: callback function called at end of playing // (no arguments) // onnote: callback function called on note start/stop playing // Arguments: // i: start index of the note in the ABC source // on: true on note start, false on note stop +// instr_load: function to load the sound font of an instrument +// (default: js_instr_load) +// Arguments: +// instr: MIDI instrument number +// done: callback function in case of success +// Arguments: soundfont in binary format +// fail: callback function in case of error +// no argument // errmsg: function called on error (default: alert) +// +// When playing, the following items must/may be set: +// gain: (mandatory) volume, must be set to [0..1] +// speed: (mandatory) must be set to 1 +// new_speed: (optional) new speed value // Audio5 methods // get_outputs() - get the output devices // return ['sf2'] or null // // play() - start playing // @start_index - -// @stop_index: play the notes found in ABC source between -// the start and stop indexes -// @play_event: optional (default: previous generated events) -// array of array +// @stop_index: indexes of the play_event array +// @play_event: array of array // [0]: index of the note in the ABC source // [1]: time in seconds -// [2]: MIDI instrument (MIDI GM number - 1) +// [2]: if >= 0: MIDI instrument (MIDI GM number - 1) +// else: MIDI control message (not treated here) // [3]: MIDI note pitch (with cents) // [4]: duration // [5]: volume (0..1 - optional) // // stop() - stop playing @@ -68,12 +80,25 @@ rates = [], // [instr][key] playback rates w_instr = 0, // number of instruments being loaded // -- play the memorized events -- evt_idx, // event index while playing - iend, // source stop index - stime // start playing time + iend, // play array stop index + stime, // start playing time + timouts = [] // note start events + + // default sound font load function + function js_instr_load(instr, done, fail) { + abc2svg.loadjs(conf.sfu + '/' + instr + '.js', + function() { + done(b64dcod(abcsf2[instr])) + }, + fail + ) + } + if (!conf.instr_load) + conf.instr_load = js_instr_load // base64 stuff var b64d = [] function init_b64d() { var b64l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', @@ -190,39 +215,41 @@ } } } // sf2_create() // load an instrument (.js file) - function load_instr(instr) { + function load_instr(instr, a_e) { w_instr++; - abc2svg.loadjs(conf.sfu + '/' + instr + '.js', - function() { - var parser = new sf2.Parser(b64dcod(abcsf2[instr])); + conf.instr_load(instr, + function(sf2_bin) { + var parser = new sf2.Parser(sf2_bin); parser.parse(); sf2_create(parser, instr); - w_instr-- + if (--w_instr == 0) + play_start(a_e) }, function() { errmsg('could not find the instrument ' + ((instr / 128) | 0).toString() + '-' + (instr % 128).toString()); - w_instr-- + if (--w_instr == 0) + play_start(a_e) }) } // load_instr() // start loading the instruments function load_res(a_e) { var i, e, instr for (i = evt_idx; ; i++) { e = a_e[i] - if (!e || e[0] > iend) + if (!e || evt_idx >= iend) break instr = e[2] - if (!params[instr]) { + if (instr >= 0 && !params[instr]) { params[instr] = []; - load_instr(instr) + load_instr(instr, a_e) } } } // create a note @@ -280,13 +307,13 @@ // play the next time sequence function play_next(a_e) { var t, e, e2, maxt, st, d; // play the next events - e = a_e[evt_idx] - if (!e - || e[0] > iend) { // if source ref > source end + if (a_e) // if not stop + e = a_e[evt_idx] + if (!e || evt_idx >= iend) { onend() return } // if speed change, shift the start time @@ -296,28 +323,29 @@ conf.speed / conf.new_speed; conf.speed = conf.new_speed; conf.new_speed = 0 } + timouts = []; //fixme: better, count the number of events? t = e[1] / conf.speed; // start time maxt = t + 3 // max time = evt time + 3 seconds while (1) { d = e[4] / conf.speed - if (e[5] != 0) // if not a rest + if (e[2] >= 0) { // if not a MIDI control message + if (e[5] != 0) // if not a rest note_run(e, t + stime, d) - if (conf.follow) { + // follow the notes while playing var i = e[0]; - st = (t + stime - ac.currentTime) * 1000; - setTimeout(onnote, st, i, true); + timouts.push(setTimeout(onnote, st, i, true)); setTimeout(onnote, st + d * 1000, i, false) } e = a_e[++evt_idx] - if (!e) { + if (!e || evt_idx >= iend) { setTimeout(onend, (t + stime - ac.currentTime + d) * 1000) return } t = e[1] / conf.speed @@ -324,25 +352,25 @@ if (t > maxt) break } // delay before next sound generation - setTimeout(play_next, (t + stime - ac.currentTime) + timouts.push(setTimeout(play_next, (t + stime - ac.currentTime) * 1000 - 300, // wake before end of playing - a_e) + a_e)) } // play_next() // wait for all resources, then start playing function play_start(a_e) { - if (iend == 0) // play stop + if (iend == 0) { // play stop + onend() return + } // wait for instruments - if (w_instr != 0) { - setTimeout(play_start, 300, a_e) + if (w_instr != 0) return - } // all resources are there gain.connect(ac.destination); stime = ac.currentTime + .2 // start time + 0.2s - a_e[evt_idx][1] * conf.speed; @@ -365,11 +393,11 @@ ['sf2'] : null }, // get_outputs() // play the events play: function(istart, i_iend, a_e) { - if (!a_e || !a_e.length) { + if (!a_e || istart >= a_e.length) { onend() // nothing to play return } // initialize the audio subsystem if not done yet @@ -382,24 +410,22 @@ gain = ac.createGain(); gain.gain.value = conf.gain } iend = i_iend; - evt_idx = 0 - while (a_e[evt_idx] && a_e[evt_idx][0] < istart) - evt_idx++ - if (!a_e[evt_idx]) { - onend() // nothing to play - return - } + evt_idx = istart; load_res(a_e); play_start(a_e) }, // play() // stop playing stop: function() { iend = 0 + timouts.forEach(function(id) { + clearTimeout(id) + }) + play_next() if (gain) { gain.disconnect(); gain = null } }, // stop() Index: util/tomidi5.js ================================================================== --- util/tomidi5.js +++ util/tomidi5.js @@ -1,8 +1,8 @@ // tomidi5.js - audio output using HTML5 MIDI // -// Copyright (C) 2018 Jean-Francois Moine +// Copyright (C) 2018-2019 Jean-Francois Moine // // This file is part of abc2svg. // // abc2svg is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,119 +16,149 @@ // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . // Midi5 creation -// one argument: + // @conf: configuration object - all items are optional: // onend: callback function called at end of playing // (no arguments) // onnote: callback function called on note start/stop playing // Arguments: // i: start index of the note in the ABC source // on: true on note start, false on note stop + +// When playing, the following items must/may be set: +// speed: (mandatory) must be set to 1 +// new_speed: (optional) new speed value // Midi5 methods // get_outputs() - get the output ports // // set_output() - set the output port // // play() - start playing // @start_index - -// @stop_index: play the notes found in ABC source between -// the start and stop indexes -// @play_event: optional (default: previous generated events) -// array of array +// @stop_index: indexes of the play_event array +// @play_event: array of array // [0]: index of the note in the ABC source // [1]: time in seconds -// [2]: MIDI instrument (MIDI GM number - 1) -// [3]: MIDI note pitch (with cents) -// [4]: duration +// [2]: if >= 0: MIDI instrument (MIDI GM number - 1) +// else: MIDI control message +// [3]: MIDI note pitch (with cents) / controller +// [4]: duration / controller value // [5]: volume (0..1 - optional) +// [6]: voice number // // stop() - stop playing function Midi5(i_conf) { var conf = i_conf, // configuration onend = conf.onend || function() {}, onnote = conf.onnote || function() {}, + rf, // get_outputs result function // MIDI variables op, // output port - instr, // instrument -> channel - ch, // channel allocation + v_i = [], // voice (channel) to instrument // -- play the memorized events -- evt_idx, // event index while playing - iend, // source stop index - stime // start playing time in ms + iend, // play array stop index + stime, // start playing time in ms + timouts = [] // note start events // create a note // @e[2] = instrument index // @e[3] = MIDI key + detune +// @e[6] = voice (channel) number // @t = audio start time (ms) // @d = duration adjusted for speed (ms) function note_run(e, t, d) { var k = e[3] | 0, i = e[2], - c = instr[i] + c = e[6] & 0x0f, //fixme + a = (e[3] * 100) % 100 // detune in cents + + if (i == 16384) { // if bank 128 + c = 9 // channel 10 (percussion) + } else if (i != v_i[c]) { // if program change + + // at channel start, reset all controllers +//fixme: does not work with fluidsynth + if (v_i[c] == undefined) + op.send(new Uint8Array([0xb0 + c, 121, 0])); - if (c == undefined) { - c = ch++; - instr[i] = c; + v_i[c] = i op.send(new Uint8Array([ 0xb0 + c, 0, (i >> 14) & 0x7f, // MSB bank 0xb0 + c, 32, (i >> 7) & 0x7f, // LSB bank 0xc0 + c, i & 0x7f // program ])) + } + if (a && Midi5.ma.sysexEnabled) { // if microtone +// fixme: should cache the current microtone values + op.send(new Uint8Array([ + 0xf0, 0x7f, // realtime SysEx + 0x7f, // all devices + 0x08, // MIDI tuning standard + 0x02, // note change + i & 0x7f, // tuning prog number + 0x01, // number of notes + k, // key + k, // note + a / .78125, // MSB fract + 0, // LSB fract + 0xf7 // SysEx end + ]), t); } op.send(new Uint8Array([0x90 + c, k, 127]), t); // note on - op.send(new Uint8Array([0x80 + c, k, 0x40]), t + d - 20) // note off + op.send(new Uint8Array([0x80 + c, k, 0]), t + d - 20) // note off } // note_run() // play the next time sequence function play_next(a_e) { var t, e, e2, maxt, st, d // play the next events - if (!op) { + if (a_e) // if not stop + e = a_e[evt_idx] + if (!op || evt_idx >= iend || !e) { onend() return } - e = a_e[evt_idx] - if (!e - || e[0] > iend) { // if source ref > source end - onend() - return - } - // if speed change, shift the start time if (conf.new_speed) { stime = window-performance.now() - (window.performance.now() - stime) * conf.speed / conf.new_speed; conf.speed = conf.new_speed; conf.new_speed = 0 } + timouts = []; t = e[1] / conf.speed * 1000; // start time maxt = t + 3000 // max time = evt time + 3 seconds while (1) { d = e[4] / conf.speed * 1000 - if (e[5] != 0) // if not a rest + if (e[2] >= 0) { // if not a MIDI control message + if (e[5] != 0) // if not a rest note_run(e, t + stime, d) - if (conf.follow) { + // follow the notes while playing st = t + stime - window.performance.now(); - setTimeout(onnote, st, e[0], true); + timouts.push(setTimeout(onnote, st, e[0], true)); setTimeout(onnote, st + d, e[0], false) + } else { // MIDI control + op.send(new Uint8Array([0xb0 + (e[6] & 0x0f), + e[3], e[4]]), t + stime) } e = a_e[++evt_idx] - if (!e) { + if (!e || evt_idx >= iend) { setTimeout(onend, t + stime - window.performance.now() + d) return } t = e[1] / conf.speed * 1000 @@ -135,73 +165,120 @@ if (t > maxt) break } // delay before next sound generation - setTimeout(play_next, (t + stime - window.performance.now()) + timouts.push(setTimeout(play_next, (t + stime - window.performance.now()) - 300, // wake before end of playing - a_e) + a_e)) } // play_next() + + // MIDI output is possible, + // return the possible ports in return to get_outputs() + function send_outputs(access) { + var o, os, + out = []; + + Midi5.ma = access; // store the MIDI access in the Midi5 function + + if (access && access.outputs.size > 0) { + os = access.outputs.values() + while (1) { + o = os.next() + if (!o || o.done) + break + out.push(o.value.name) + } + } + rf(out) + } // send_outputs() // Midi5 object creation (only one instance) // public methods return { // get outputs - get_outputs: function() { -//fixme: just the first output port for now... - if (Midi5.ma) - op = Midi5.ma.outputs.values().next().value - if (op) - return [op.name] + get_outputs: function(f) { + if (!navigator.requestMIDIAccess) { + f() // no MIDI + return + } + rf = f; + + // open MIDI with SysEx + navigator.requestMIDIAccess({sysex: true}).then( + send_outputs, + function(msg) { + + // open MIDI without SysEx + navigator.requestMIDIAccess().then( + send_outputs, + function(msg) { + rf() + } + ) + } + ) }, // get_outputs() // set the output port set_output: function(name) { -//fixme: todo -// if (!Midi5.ma) -// return + var o, os + if (!Midi5.ma) + return + os = Midi5.ma.outputs.values() + while (1) { + o = os.next() + if (!o || o.done) + break + if (o.value.name == name) { + op = o.value + break + } + } }, // play the events play: function(istart, i_iend, a_e) { - if (!a_e || !a_e.length) { + if (!a_e || istart >= a_e.length) { onend() // nothing to play return } iend = i_iend; - evt_idx = 0 - while (a_e[evt_idx] && a_e[evt_idx][0] < istart) - evt_idx++ - if (!a_e[evt_idx]) { - onend() // nothing to play - return - } - + evt_idx = istart; +if (0) { +// temperament + op.send(new Uint8Array([ + 0xf0, 0x7f, // realtime SysEx + 0x7f, // all devices + 0x08, // MIDI tuning standard + 0x02, // note change + 0x00, // tuning prog number + 0x01, // number of notes + 0x69, // key + 0x69, // note + 0x00, // MSB fract + 0, // LSB fract + 0xf7 // SysEx end + ]), t); +} + + v_i = []; // must do a reset of all channels stime = window.performance.now() + 200 // start time + 0.2s - a_e[evt_idx][1] * conf.speed * 1000; - instr = []; - ch = 0; play_next(a_e) }, // play() // stop playing stop: function() { iend = 0 + timouts.forEach(function(id) { + clearTimeout(id) + }) + play_next() //fixme: op.clear() should exist... if (op && op.clear) op.clear() } // stop() } } // end Midi5 - -// check MIDI access at script load time -function onMIDISuccess(access) { - Midi5.ma = access // store the MIDI access in the Midi5 function -} // onMIDISuccess() - -function onMIDIFailure(msg) { -} // onMIDIFailure() - -if (navigator.requestMIDIAccess) - navigator.requestMIDIAccess().then(onMIDISuccess, onMIDIFailure)