From 510bdc0413c98a1a4dec52ae28949faacf8719f7 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Thu, 29 May 2008 18:54:30 +0000 Subject: [PATCH] Merge 1.1-dev --- .gitignore | 1 + English.lproj/InfoPlist.strings | Bin 742 -> 842 bytes English.lproj/VLDocument.xib | 2905 +++++++++----------------- Filters/VLMusicXMLType.reader | 9 +- Filters/VLMusicXMLType.writer | 33 +- Filters/vl.rb | 2 + Resources/Info.plist | 72 +- Resources/bck.icns | Bin 0 -> 38349 bytes Resources/fwd.icns | Bin 0 -> 30412 bytes Resources/installLame.scpt | Bin 0 -> 1070 bytes Resources/installLilypond.scpt | Bin 1066 -> 1078 bytes Resources/play.icns | Bin 0 -> 43336 bytes Resources/run.icns | Bin 2887 -> 0 bytes Resources/stop.icns | Bin 0 -> 29766 bytes Resources/stop.tiff | Bin 15740 -> 0 bytes Resources/tobeg.icns | Bin 0 -> 37992 bytes Resources/toend.icns | Bin 0 -> 37992 bytes Sources/VLAIFFDocument.h | 18 + Sources/VLAIFFDocument.mm | 34 + Sources/VLAppController.h | 5 +- Sources/VLAppController.mm | 27 + Sources/VLDocument.h | 3 +- Sources/VLDocument.mm | 70 +- Sources/VLLayout.cpp | 19 +- Sources/VLLayout.h | 6 +- Sources/VLLilypondWriter.cpp | 16 +- Sources/VLMIDIDocument.mm | 1 + Sources/VLMIDIWriter.cpp | 69 + Sources/VLMIDIWriter.h | 44 + Sources/VLMMAWriter.cpp | 2 +- Sources/VLMP3Document.h | 18 + Sources/VLMP3Document.mm | 69 + Sources/VLModel.cpp | 50 +- Sources/VLModel.h | 4 + Sources/VLPListDocument.mm | 7 +- Sources/VLSheetView.h | 14 +- Sources/VLSheetView.mm | 77 +- Sources/VLSheetViewLyrics.h | 1 + Sources/VLSheetViewLyrics.mm | 56 +- Sources/VLSheetViewNotes.h | 1 + Sources/VLSheetViewNotes.mm | 115 +- Sources/VLSheetViewSelection.h | 4 + Sources/VLSheetViewSelection.mm | 76 + Sources/VLSheetWindow.h | 8 +- Sources/VLSheetWindow.mm | 26 + Sources/VLSoundOut.cpp | 52 +- Sources/VLSoundOut.h | 8 +- Sources/VLXMLDocument.mm | 2 +- Tools/lameWrapper | 3 + Tools/lilyWrapper | 3 +- VocalEasel.xcodeproj/project.pbxproj | 60 +- 51 files changed, 1980 insertions(+), 2010 deletions(-) create mode 100644 Resources/bck.icns create mode 100644 Resources/fwd.icns create mode 100644 Resources/installLame.scpt create mode 100644 Resources/play.icns delete mode 100644 Resources/run.icns create mode 100644 Resources/stop.icns delete mode 100644 Resources/stop.tiff create mode 100644 Resources/tobeg.icns create mode 100644 Resources/toend.icns create mode 100644 Sources/VLAIFFDocument.h create mode 100644 Sources/VLAIFFDocument.mm create mode 100644 Sources/VLMIDIWriter.cpp create mode 100644 Sources/VLMIDIWriter.h create mode 100644 Sources/VLMP3Document.h create mode 100644 Sources/VLMP3Document.mm create mode 100755 Tools/lameWrapper diff --git a/.gitignore b/.gitignore index 378eac2..dee53c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build +*~ diff --git a/English.lproj/InfoPlist.strings b/English.lproj/InfoPlist.strings index 414b71685a7bea934092d4e9bdac22dccf5a88ce..dc02ef1fdfc5ec40ea6a48e149f8390bf67ac6f4 100644 GIT binary patch delta 80 zcmaFHdWvnsGbYY31|J4T22TdJ$&F0HieMIl8-oHv8bc;S4nrz~5`#4Z7XwI@FGB!> O@#H`zVG$sWp#lK4%?^J6 delta 7 OcmX@b_KbDIGbR8IAp=wZ diff --git a/English.lproj/VLDocument.xib b/English.lproj/VLDocument.xib index 9d66833..70ef153 100644 --- a/English.lproj/VLDocument.xib +++ b/English.lproj/VLDocument.xib @@ -1,18 +1,19 @@ - + 1040 9C7010 - 629 + 652 949.26 352.00 YES + YES - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES @@ -27,8 +28,8 @@ 2 {{25, 304}, {971, 397}} 1886912512 - Window - NSWindow + Window + NSWindow View {3.40282e+38, 3.40282e+38} {890, 350} @@ -52,13 +53,12 @@ 265 {{656, 42}, {82, 26}} - YES -2076049856 16779264 - LucidaGrande + LucidaGrande 1.300000e+01 1044 @@ -66,33 +66,34 @@ 109199615 1 - + LucidaGrande 1.300000e+01 16 - + 400 75 - + - C#m - + YES + YES + + 1048576 2147483647 1 - - NSImage + + NSImage NSMenuCheckmark - - + + NSImage NSMenuMixedState _popUpItemAction: - 1279 YES @@ -105,11 +106,11 @@ C - + 1048576 2147483647 - - + + _popUpItemAction: 1 @@ -118,23 +119,23 @@ YES YES - - + + 1048576 2147483647 - - + + _popUpItemAction: F - + 1048576 2147483647 - - + + _popUpItemAction: -255 @@ -142,11 +143,11 @@ QuKZrQ - + 1048576 2147483647 - - + + _popUpItemAction: -511 @@ -154,11 +155,11 @@ ReKZrQ - + 1048576 2147483647 - - + + _popUpItemAction: -767 @@ -166,11 +167,11 @@ QeKZrQ - + 1048576 2147483647 - - + + _popUpItemAction: -1023 @@ -178,11 +179,11 @@ ROKZrQ - + 1048576 2147483647 - - + + _popUpItemAction: -1279 @@ -190,37 +191,24 @@ R+KZrQ - + 1048576 2147483647 - - + + _popUpItemAction: -1535 - - - YES - YES - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - + G - + 1048576 2147483647 - - + + _popUpItemAction: 257 @@ -228,11 +216,11 @@ D - + 1048576 2147483647 - - + + _popUpItemAction: 513 @@ -240,11 +228,11 @@ A - + 1048576 2147483647 - - + + _popUpItemAction: 769 @@ -252,11 +240,11 @@ E - + 1048576 2147483647 - - + + _popUpItemAction: 1025 @@ -264,11 +252,11 @@ B - + 1048576 2147483647 - - + + _popUpItemAction: 1281 @@ -276,11 +264,11 @@ F# - + 1048576 2147483647 - - + + _popUpItemAction: 1537 @@ -289,23 +277,23 @@ YES YES - - + + 1048576 2147483647 - - + + _popUpItemAction: Am - + 1048576 2147483647 - - + + _popUpItemAction: 255 @@ -314,23 +302,23 @@ YES YES - - + + 1048576 2147483647 - - + + _popUpItemAction: Dm - + 1048576 2147483647 - - + + _popUpItemAction: -1 @@ -338,11 +326,11 @@ Gm - + 1048576 2147483647 - - + + _popUpItemAction: -257 @@ -350,11 +338,11 @@ Cm - + 1048576 2147483647 - - + + _popUpItemAction: -513 @@ -362,11 +350,11 @@ Fm - + 1048576 2147483647 - - + + _popUpItemAction: -769 @@ -374,11 +362,11 @@ QuKZrW0 - + 1048576 2147483647 - - + + _popUpItemAction: -1025 @@ -386,11 +374,11 @@ ReKZrW0 - + 1048576 2147483647 - - + + _popUpItemAction: -1281 @@ -399,23 +387,23 @@ YES YES - - + + 1048576 2147483647 - - + + _popUpItemAction: Em - + 1048576 2147483647 - - + + _popUpItemAction: 511 @@ -423,11 +411,11 @@ Bm - + 1048576 2147483647 - - + + _popUpItemAction: 767 @@ -435,24 +423,36 @@ F#m - + 1048576 2147483647 - - + + _popUpItemAction: 1023 - + + + C#m + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 1279 + + G#m - + 1048576 2147483647 - - + + _popUpItemAction: 1535 @@ -460,11 +460,11 @@ D#m - + 1048576 2147483647 - - + + _popUpItemAction: 1791 @@ -483,7 +483,6 @@ 265 {{740, 42}, {91, 26}} - YES -2076049856 @@ -493,7 +492,7 @@ 109199615 1 - + @@ -502,12 +501,12 @@ 4/4 - + 1048576 2147483647 1 - - + + _popUpItemAction: 1028 @@ -523,11 +522,11 @@ 6/8 - + 1048576 2147483647 - - + + _popUpItemAction: 1544 @@ -535,11 +534,11 @@ 3/4 - + 1048576 2147483647 - - + + _popUpItemAction: 772 @@ -547,11 +546,11 @@ 12/8 - + 1048576 2147483647 - - + + _popUpItemAction: 3080 @@ -559,11 +558,11 @@ 5/4 - + 1048576 2147483647 - - + + _popUpItemAction: 1284 @@ -581,7 +580,6 @@ 265 {{833, 42}, {130, 26}} - YES -2076049856 @@ -591,7 +589,7 @@ 109199615 1 - + @@ -600,12 +598,12 @@ 12 - + 1048576 2147483647 1 - - + + _popUpItemAction: 12 @@ -620,11 +618,11 @@ 2 (Straight) - + 1048576 2147483647 - - + + _popUpItemAction: 2 @@ -632,11 +630,11 @@ 3 (Swing) - + 1048576 2147483647 - - + + _popUpItemAction: 3 @@ -644,35 +642,35 @@ 4 (Sixteenths) - + 1048576 2147483647 - - + + _popUpItemAction: 4 - 6 - + 6 + 1048576 2147483647 - - + + _popUpItemAction: 6 - 8 - + 8 + 1048576 2147483647 - - + + _popUpItemAction: 8 @@ -692,7 +690,6 @@ 256 {{92, 45}, {350, 22}} - YES -1804468671 @@ -703,7 +700,7 @@ YES 6 - System + System textBackgroundColor 3 @@ -712,7 +709,7 @@ 6 - + System textColor 3 @@ -726,7 +723,6 @@ 256 {{13, 47}, {54, 17}} - YES 67239424 @@ -736,7 +732,7 @@ 6 - + System controlColor 3 @@ -745,7 +741,7 @@ 6 - + System controlTextColor @@ -756,7 +752,6 @@ 256 {{13, 22}, {114, 17}} - YES 67239424 @@ -773,12 +768,11 @@ 256 {{92, 20}, {142, 22}} - YES -1804468671 272630784 - Dizzy Gillespie + Dizzy Gillespie YES @@ -791,7 +785,6 @@ 256 {{246, 22}, {57, 17}} - YES 67239424 @@ -808,12 +801,11 @@ 256 {{300, 20}, {142, 22}} - YES -1804468671 272630784 - + Dizzy Gillespie YES @@ -826,7 +818,6 @@ 256 {{447, 47}, {57, 17}} - YES 67239424 @@ -843,7 +834,6 @@ 256 {{501, 45}, {33, 22}} - YES -1804468671 @@ -861,7 +851,6 @@ 256 {{539, 42}, {19, 27}} - YES 917024 @@ -880,7 +869,6 @@ 256 {{447, 22}, {57, 17}} - YES 67239424 @@ -897,7 +885,6 @@ 256 {{498, 18}, {130, 26}} - YES -2076049856 @@ -907,7 +894,7 @@ 109199615 1 - + @@ -916,12 +903,12 @@ Select... - + 1048576 2147483647 1 - - + + _popUpItemAction: 1 @@ -938,34 +925,34 @@ YES YES - - + + 1048576 2147483647 - - + + _popUpItemAction: Swing - + 1048576 2147483647 - - + + _popUpItemAction: BossaNova - + 1048576 2147483647 - - + + _popUpItemAction: @@ -980,19 +967,17 @@ {989, 80} - {{-3, 319}, {989, 80}} - - {0, 0} + {0, 0} 67239424 0 Title - + LucidaGrande 1.100000e+01 3100 @@ -1023,14 +1008,12 @@ 274 {988, 328} - VLSheetView - NSView + NSView {{1, 1}, {954, 328}} - @@ -1041,9 +1024,8 @@ 256 {{955, 1}, {15, 312}} - - _doScroller: + _doScroller: 1.000000e+00 2.560976e-01 @@ -1052,17 +1034,15 @@ 256 {{1, 329}, {954, 15}} - YES 1 - + _doScroller: 9.655870e-01 {{0, -17}, {971, 345}} - 178 @@ -1084,12 +1064,11 @@ 258 {{10, 6}, {271, 22}} - YES -1804468671 138413056 - + YES @@ -1102,7 +1081,6 @@ 257 {{289, 4}, {19, 23}} - YES 67239424 @@ -1117,8 +1095,8 @@ -2038021889 32 - - + + 400 75 @@ -1128,7 +1106,6 @@ 257 {{311, 4}, {19, 23}} - YES 67239424 @@ -1139,8 +1116,8 @@ -2038021889 32 - - + + 400 75 @@ -1148,13 +1125,11 @@ {336, 37} - {{627, 330}, {336, 37}} - - + {0, 0} 67239424 0 @@ -1175,7 +1150,6 @@ {971, 397} - {{0, 0}, {1280, 778}} {890, 372} @@ -1198,7 +1172,7 @@ {3.40282e+38, 3.40282e+38} {213, 107} - + 256 YES @@ -1211,9 +1185,9 @@ 67239424 134217728 - Preview + Preview - + LucidaGrande 1.000000e+01 16 @@ -1221,11 +1195,11 @@ -2037628673 2 - + NSImage music - - + Preview + 400 75 @@ -1239,17 +1213,17 @@ 67239424 134217728 - Show Log + Show Log -2037628673 2 - + NSImage console - - + Show Log + 400 75 @@ -1263,17 +1237,17 @@ 67239424 134217728 - Play + Play -2037628673 - 2 + 130 - - run + NSImage + play - - + Play + 400 75 @@ -1287,17 +1261,17 @@ 67239424 134217728 - Zoom In + Zoom In -2037628673 2 - + NSImage zoomin - - + Zoom In + 400 75 @@ -1311,17 +1285,17 @@ 67239424 134217728 - Zoom Out + Zoom Out -2037628673 2 - + NSImage zoomout - - + Zoom Out + 400 75 @@ -1335,17 +1309,17 @@ 67239424 134217728 - Stop + Stop -2037628673 - 2 + 130 - + NSImage stop - - + Stop + 400 75 @@ -1368,23 +1342,124 @@ 67239424 134217728 - Display + Display -2037628673 2 - + NSImage display - - + Display + + 400 + 75 + + + + + 256 + {{218, 94}, {58, 56}} + + 1 + YES + + 67239424 + 134217728 + Fwd + + + -2037628673 + 130 + + NSImage + fwd + + Fwd + + 400 + 75 + + + + + 256 + {{329, 94}, {58, 56}} + + -1 + YES + + 67239424 + 134217728 + Rew + + + -2037628673 + 130 + + NSImage + bck + + Rew + + 400 + 75 + + + + + 256 + {{218, 31}, {58, 56}} + + -2 + YES + + 67239424 + 134217728 + Start + + + -2037628673 + 130 + + NSImage + tobeg + + Start + + 400 + 75 + + + + + 256 + {{329, 31}, {58, 56}} + + 2 + YES + + 67239424 + 134217728 + End + + + -2037628673 + 130 + + NSImage + toend + + End + 400 75 {480, 360} + {{0, 0}, {1280, 778}} {213, 129} @@ -1395,7 +1470,7 @@ 2 {{515, 195}, {338, 127}} 1886912512 - + Window NSWindow @@ -1434,7 +1509,7 @@ -1804468671 -1874852864 - 2 + 2 @@ -1459,7 +1534,7 @@ YES - 0 + 0 YES @@ -1470,9 +1545,9 @@ - . + . - , + , 0 1 @@ -1489,16 +1564,16 @@ 1 AgAAAAAAAAAAAAAAAAAAAA - -0 + -0 LeKIng - - + + 0 K+KIng - - + 0 + -0 @@ -1512,8 +1587,8 @@ - - + . + , NO YES YES @@ -1574,8 +1649,8 @@ -2038284033 1 - - fw + + fw 200 25 @@ -1590,15 +1665,15 @@ 67239424 134217728 - Cancel + Cancel 1001 -2038284033 1 - - Gw + + Gw 200 25 @@ -1613,15 +1688,15 @@ -2080244224 134217728 - Repeat + Repeat 1000 -2038284033 1 - - DQ + + DQ 200 25 @@ -1638,8 +1713,8 @@ 2 {{503, 135}, {372, 142}} 1886912512 - - + Window + NSWindow View @@ -1683,8 +1758,8 @@ -2038284033 1 - - + + fw 200 25 @@ -1699,15 +1774,15 @@ 67239424 134217728 - + Cancel 1001 -2038284033 1 - - + + Gw 200 25 @@ -1729,8 +1804,8 @@ -2038284033 1 - - + + DQ 200 25 @@ -1767,14 +1842,14 @@ YES - 1 + 1 2.000000e+01 2.000000e+01 2.000000e+01 75628032 134217728 - + 1 3 @@ -1782,7 +1857,7 @@ 6 - + System headerTextColor @@ -1790,9 +1865,9 @@ 67239424 0 - + - + LucidaGrande 1.200000e+01 16 @@ -1920,14 +1995,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + 2 2.000000e+01 2.000000e+01 2.000000e+01 75628032 134217728 - + 2 @@ -1935,17 +2010,17 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - - + + NSImage NSSwitch - + 400 75 @@ -1953,18 +2028,18 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - 4 + 4 2.000000e+01 2.000000e+01 2.000000e+01 67239424 134217728 - 3 + 3 6 - + System headerColor @@ -1973,14 +2048,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -1988,14 +2063,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + 8 2.000000e+01 2.000000e+01 2.000000e+01 67239424 134217728 - + 4 @@ -2003,14 +2078,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -2018,14 +2093,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - 16 + 16 2.000000e+01 2.000000e+01 2.000000e+01 67239424 134217728 - 5 + 5 @@ -2033,14 +2108,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -2055,7 +2130,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 134217728 - + 6 @@ -2063,14 +2138,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -2085,7 +2160,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 134217728 - 7 + 7 @@ -2093,14 +2168,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -2115,7 +2190,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 134217728 - + 8 @@ -2123,14 +2198,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 0 - + 1211912703 2 - + - + 400 75 @@ -2143,7 +2218,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 6 - + System gridColor 3 @@ -2164,7 +2239,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 6 - + System controlBackgroundColor @@ -2176,7 +2251,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA{{-100, -100}, {15, 37}} - + _doScroller: 1.947368e-01 @@ -2186,7 +2261,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 1 - + _doScroller: 9.904762e-01 @@ -2228,8 +2303,8 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA2 {{417, 204}, {543, 189}} 1886912512 - - + Window + NSWindow View @@ -2250,15 +2325,15 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239424 134217728 - + Cancel 1001 -2038284033 1 - - + + Gw 200 25 @@ -2280,8 +2355,8 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA-2038284033 1 - - + + DQ 200 25 @@ -2326,7 +2401,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA109199615 1 - + @@ -2334,13 +2409,13 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA75 - - + 0 + 1048576 2147483647 1 - - + + _popUpItemAction: @@ -2354,45 +2429,45 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - - + 1 + 1048576 2147483647 - - + + _popUpItemAction: - - + 2 + 1048576 2147483647 - - + + _popUpItemAction: - - + 3 + 1048576 2147483647 - - + + _popUpItemAction: - - + 4 + 1048576 2147483647 - - + + _popUpItemAction: @@ -2434,7 +2509,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA109199615 1 - + @@ -2442,13 +2517,13 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA75 - - + 0 + 1048576 2147483647 1 - - + + _popUpItemAction: @@ -2462,45 +2537,45 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - - + 1 + 1048576 2147483647 - - + + _popUpItemAction: - - + 2 + 1048576 2147483647 - - + + _popUpItemAction: - - + 3 + 1048576 2147483647 - - + + _popUpItemAction: - - + 4 + 1048576 2147483647 - - + + _popUpItemAction: @@ -2558,7 +2633,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA109199615 1 - + @@ -2566,13 +2641,13 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA75 - - + 8 + 1048576 2147483647 1 - - + + _popUpItemAction: @@ -2585,89 +2660,89 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAAYES - - + 0 + 1048576 2147483647 - - + + _popUpItemAction: - - + 1 + 1048576 2147483647 - - + + _popUpItemAction: - - + 2 + 1048576 2147483647 - - + + _popUpItemAction: - - + 3 + 1048576 2147483647 - - + + _popUpItemAction: - - + 4 + 1048576 2147483647 - - + + _popUpItemAction: - - + 5 + 1048576 2147483647 - - + + _popUpItemAction: - - + 6 + 1048576 2147483647 - - + + _popUpItemAction: - - + 7 + 1048576 2147483647 - - + + _popUpItemAction: @@ -2688,7 +2763,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA {{17, 53}, {246, 116}} - + {0, 0} 67239424 0 @@ -2725,7 +2800,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 343014976 272630784 - + 6 YES @@ -2736,9 +2811,9 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA YES -1 - - - + 0 + 1 + 2 @@ -2758,7 +2833,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 75628032 0 - + 3 @@ -2769,7 +2844,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 338820672 1024 - + 1 YES @@ -2823,7 +2898,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 67239488 272630784 - + @@ -2871,7 +2946,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 343014976 272630784 - + 6 YES @@ -2881,10 +2956,10 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAAYES YES - - - - + 4 + 5 + 6 + 7 @@ -2904,7 +2979,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 75628032 0 - + 3 @@ -2962,7 +3037,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAAYES YES - + 16 18 20 22 @@ -2985,7 +3060,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 75628032 0 - + 3 @@ -3047,7 +3122,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA {{293, 56}, {233, 112}} - + {0, 0} 67239424 0 @@ -3084,7 +3159,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAAYES - delegate + delegate @@ -3116,7 +3191,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - hideFieldEditor: + hideFieldEditor: @@ -3124,7 +3199,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + hideFieldEditor: @@ -3148,14 +3223,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: editTarget.stringValue + value: editTarget.stringValue - - value + value: editTarget.stringValue + value editTarget.stringValue 2 @@ -3164,7 +3239,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + delegate @@ -3172,13 +3247,13 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - hidden: editTarget + hidden: editTarget - + hidden: editTarget hidden editTarget @@ -3232,14 +3307,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.songTitle + value: document.songTitle - - + value: document.songTitle + value document.songTitle 2 @@ -3248,14 +3323,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.songComposer + value: document.songComposer - - + value: document.songComposer + value document.songComposer 2 @@ -3264,28 +3339,20 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.songLyricist + value: document.songLyricist - - + value: document.songLyricist + value document.songLyricist 2 170 - - - play: - - - - 174 - playToolItem @@ -3296,15 +3363,15 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.songTempo + value: document.songTempo - - - document.songTempo + value: document.songTempo + value + document.songTempo 2 @@ -3312,15 +3379,15 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + value: document.songTempo - - - + value: document.songTempo + value + document.songTempo 2 @@ -3360,15 +3427,15 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.repeatVolta + value: document.repeatVolta - - - document.repeatVolta + value: document.repeatVolta + value + document.repeatVolta 2 @@ -3376,15 +3443,15 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + value: document.repeatVolta - - - + value: document.repeatVolta + value + document.repeatVolta 2 @@ -3432,7 +3499,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + delegate @@ -3456,7 +3523,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - selectGroove: + selectGroove: @@ -3480,7 +3547,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + selectGroove: @@ -3488,14 +3555,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - selectedIndex: editNumTopLedgers + selectedIndex: editNumTopLedgers - - selectedIndex + selectedIndex: editNumTopLedgers + selectedIndex editNumTopLedgers 2 @@ -3504,14 +3571,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - selectedIndex: editNumBotLedgers + selectedIndex: editNumBotLedgers - - + selectedIndex: editNumBotLedgers + selectedIndex editNumBotLedgers 2 @@ -3520,14 +3587,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - selectedIndex: editNumStanzas + selectedIndex: editNumStanzas - - + selectedIndex: editNumStanzas + selectedIndex editNumStanzas 2 @@ -3544,7 +3611,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - endSheetWithButton: + endSheetWithButton: @@ -3552,7 +3619,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3560,7 +3627,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3568,7 +3635,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3576,7 +3643,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3584,7 +3651,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3592,7 +3659,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3600,7 +3667,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + endSheetWithButton: @@ -3648,14 +3715,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.lyricSize + value: document.lyricSize - - + value: document.lyricSize + value document.lyricSize 2 @@ -3664,14 +3731,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.chordSize + value: document.chordSize - - + value: document.chordSize + value document.chordSize 2 @@ -3680,14 +3747,14 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - value: document.staffSize + value: document.staffSize - - + value: document.staffSize + value document.staffSize 2 @@ -3710,6 +3777,78 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA 100386 + + + fwdToolItem + + + + 100436 + + + + bckToolItem + + + + 100437 + + + + tobegToolItem + + + + 100438 + + + + toendToolItem + + + + 100439 + + + + playMusic: + + + + 100440 + + + + playMusic: + + + + 100441 + + + + playMusic: + + + + 100442 + + + + playMusic: + + + + 100443 + + + + playMusic: + + + + 100444 + @@ -3824,9 +3963,13 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + + + + + @@ -3906,7 +4049,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + Repeat 197 @@ -4188,7 +4331,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - + Display 267 @@ -5323,6 +5466,62 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA + + 100428 + + + YES + + + + + + 100429 + + + + + 100430 + + + YES + + + + + + 100431 + + + + + 100432 + + + YES + + + + + + 100433 + + + + + 100434 + + + YES + + + + + + 100435 + + + @@ -5360,6 +5559,18 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA100425.IBPluginDependency 100426.IBPluginDependency 100427.IBPluginDependency + 100428.IBAttributePlaceholdersKey + 100428.IBPluginDependency + 100428.ImportedFromIB2 + 100430.IBAttributePlaceholdersKey + 100430.IBPluginDependency + 100430.ImportedFromIB2 + 100432.IBAttributePlaceholdersKey + 100432.IBPluginDependency + 100432.ImportedFromIB2 + 100434.IBAttributePlaceholdersKey + 100434.IBPluginDependency + 100434.ImportedFromIB2 101.IBPluginDependency 101.ImportedFromIB2 102.IBPluginDependency @@ -5368,6 +5579,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA114.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 + 144.IBEditorWindowLastContentRect 144.IBPluginDependency 144.IBWindowTemplateEditedContentRect 144.ImportedFromIB2 @@ -5491,6 +5703,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA238.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect @@ -5628,6 +5841,7 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA47.ImportedFromIB2 48.IBPluginDependency 48.ImportedFromIB2 + 5.IBEditorWindowLastContentRect 5.IBPluginDependency 5.IBWindowTemplateEditedContentRect 5.ImportedFromIB2 @@ -5675,397 +5889,440 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA YES - - - - - - - - - - - - - - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - - - - - {{687, 67}, {480, 360}} - - - {3.40282e+38, 3.40282e+38} - {213, 107} - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Stop Playback + + + com.apple.InterfaceBuilder.CocoaPlugin - ToolTip + ToolTip - + ToolTip + + Stop Playback + + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + Stop Playback + + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + Stop Playback + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{56, 92}, {480, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + {{56, 92}, {480, 360}} + + {{687, 67}, {480, 360}} + + + {3.40282e+38, 3.40282e+38} + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip Typeset and Show Lead Sheet - + com.apple.InterfaceBuilder.CocoaPlugin - + ToolTip - + ToolTip Show Console Log - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + ToolTip - + ToolTip Play the Song - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + ToolTip - + ToolTip - + Zoom In - + com.apple.InterfaceBuilder.CocoaPlugin - + ToolTip - + ToolTip - + Zoom Out - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - - + {3.40282e+38, 3.40282e+38} + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - - + {3.40282e+38, 3.40282e+38} + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + {{642, 151}, {104, 573}} + com.apple.InterfaceBuilder.CocoaPlugin {{608, 171}, {117, 573}} - + ToolTip - + ToolTip Stop Playback - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - {{245, 314}, {543, 189}} + com.apple.InterfaceBuilder.CocoaPlugin + {{245, 314}, {543, 189}} - + {{245, 314}, {543, 189}} - - - + {3.40282e+38, 3.40282e+38} + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + ToolTip - + ToolTip Set Display and Print Options - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - {{-34, 357}, {971, 397}} + {{0, 337}, {971, 397}} + com.apple.InterfaceBuilder.CocoaPlugin + {{0, 337}, {971, 397}} {{-34, 357}, {971, 397}} - + {3.40282e+38, 3.40282e+38} {890, 350} - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin {{751, 588}, {103, 103}} - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin {{844, 568}, {163, 123}} - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin @@ -6089,58 +6346,25 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA - 100427 + 100444 YES - VLSheetWindow - NSWindowController + FirstResponder - YES - - YES - - - YES - - - - YES - - YES - displayToolItem - logToolItem - outputToolItem - playToolItem - progressToolItem - sheetView - stopToolItem - zoomInToolItem - zoomOutToolItem - - - YES - id - - - - - - - - - + playMusic: + id - IBProjectSource - Sources/VLSheetWindow.h + IBUserSource + VLSheetView - + NSView YES @@ -6152,16 +6376,18 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAAsetDivisions: setKey: setTime: + transposeOctave: YES - - - - - - - + id + id + id + id + id + id + id + id @@ -6181,78 +6407,46 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA YES - - - - - - - - - - + id + id + id + id + id + id + id + id + id + id - + IBProjectSource Sources/VLSheetView.h VLSheetView - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - + IBProjectSource Sources/VLSheetViewChords.h VLSheetView - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - + IBProjectSource Sources/VLSheetViewLyrics.h VLSheetView - + + IBProjectSource + Sources/VLSheetViewNotes.h + + + + VLSheetView YES @@ -6269,1098 +6463,69 @@ AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAAA YES - - - - - - - - - - - - - YES - - YES - - - YES + id + id + id + id + id + id + id + id + id - + IBProjectSource Sources/VLSheetViewSelection.h - VLSheetView - - - YES - - YES - - - YES - - + VLSheetWindow + NSWindowController YES - + YES + bckToolItem + displayToolItem + fwdToolItem + logToolItem + outputToolItem + playToolItem + progressToolItem + sheetView + stopToolItem + tobegToolItem + toendToolItem + zoomInToolItem + zoomOutToolItem YES + id + id + id + id + id + id + id + id + id + id + id + id + id - - Sources/VLSheetViewNotes.h + IBProjectSource + Sources/VLSheetWindow.h 0 - ../../VocalEasel.xcodeproj + ../VocalEasel.xcodeproj 3 - - YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEFiQALAAwAMQA1ADYAPAA9 -AEEARQCOAJYApQC3AAsAuAC5ALoAvgDaANsAmgDcAOAA5ADlAOYA7AD0AP0A/gEOAQ8BFwEYARsBJQEm -AScBLAEuATMBNAE3ATsBPwFIAUkBXQFeAV8BYAFjAWYBbgFvAXcBeAF5AYEBggGLAYwBjQGhAakBswG3 -AdQB1QHcAeUB5gHpAe4B7wHyAf0CDAINAhQCGQIcAiECIgIlAjACNQI9Aj4CQgHEAkcCSwJMAlACUwJW -AlkCXAJgAmECZAJnAm4CbwJ1An0CWwJgAoIChQKMAo0CkwKUApkCmgKdAqUCrAKtArMCuwLCAsMCyQLK -AtIC2QLaAuAC4QLpAvAC8QL3AvgDAAMJAwoDEAMYAx0DHgMhAyMDJAMpAyoDLQM4AzkDOgM9A0UDRgNK -A0sDTANPA1ADUgNTAOQDVANXA1gDXANhA2gDbQNuA3YDdwN4A3sDgAOJA5ADkQOcA6EDogOnA6gDqQOt -A7QDuQO6A8MDxAPIA8wDzQPOA9MD2APfA+AD6APtA/QD+QP6BAIEBwQaBB8EIAQkBCUEKQQqBCsEPwRB -BEIERwRTBFQEVgDkAOUEWARiBGkEagRxBHIEeQR6BIUEpwTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTS -BNME3gFUBOEE5gTnBOgE6QSmBOsE8AT0BPcE+gGABPsE/AT/AV4FAgUGBQcFCgURBRIFHgUhBSQFKwUs -BTMFNAU7BTwFRAVFA1IDUwDkBUYFRwVLBVIFUwVbBVwFYAVhBWIFZwVoBW0FbgVzBXgFfwWABYgFiQWN -BY4FjwWTBZoFmwWjBaQFqAWpBaoFrwW2BbcFvwXABcQFxQXGBcsF1AXbBdwF6QXsBe4F+AX8BCoF/QYA -BggGEgQqBhMGHQQqBh4GKAQqBikGMwQqBjQGNgY6Bj0GPgZDBksGTAZaBlwGZgZqBCoGawZtBnYGfwQq -BoAGiQQqBooGkwQqBpQEKgadBCoGpwaoBqwGswa0BrwGvQbBBsIGwwbIBtAG0QbeBuAG6gbuBCoG7wbx -BxMHHAQqBx0EKgcqBzQEKgc1Bz8EKgdAB0oEKgdLB1UEKgdWB2AEKgdhB2sEKgdsBCoHdweBBCoHggeM -BCoHjQeXBCoHmAeiBCoHowetBCoHrge4BCoHuQQqB8QHzgQqB88EKgfaB+MEKgfkB+4EKgfvB/kEKgf6 -CAQEKggFCA8EKggQCBoEKggbBCoIJggwBCoIMQg7BCoIPAhGBCoIRwhRBCoIUghcBCoIXQheCGMIZAhp -CGoIbwh2CHcIfwiACIQIhQiGCIsIjAiRCJkImgicCJ4IpQQqCLAIuQQqCLoIwwQqCMQIxQjKCMsI0AjR -CNYI2wjnCOgA5ADlCOoI8Qj4CPkJAQkCCRMJFwkdCScJLgkvCTYJNwk+CT8JSwlNCVYEKglaCVwJZAQq -CW0EKgl2BCoJfwQqCYgJjwmQCZcJmAmfCaAJrAmuCbcEKgm7Cb0JxQQqCc4EKgnXBCoJ4AQqCekJ8Anx -CfgJ+QoACgEKCAoJChAKEQodCh8KKAQqCiwKLgo6BCoKQwQqCkwEKgpVBCoKXgQqCmcEKgpwBCoKeQQq -CoIKgwqECoUKiwqMCo8KkgqcCqAKpgqxCrkKugrMCtMK1AALCucACwroCuwK9gr8Cv4LCAsJCwwLDwsS -CxkLGgsiCyMLKgsrCzILOQs6C0ELQgtJC0oLUQtSC1kLWgtmC20ACwrnAAsLfAuAC4cLjQuPCwgLlgud -C54LqgurC7ILswu0C7UACwrnAAsLxAvIC88L1QvXCwgL3gvlC+YL7QvuC+8L8Av2C/cL+QNSA1MA5Av6 -C/sMAAwBDAYMBwwMDBEMHQDfAOQMHgwfDCYMLAw4DDwMTQxVDFYMXgxfDGcMaAxvDHAMeAx5DIAMgQyJ -DIoMkgyTDJsMnAyjDKQMrAytDLUMvQy+DMUMxgzODM8M1wzYDOAM4QzoDPAM8Qz4DPkM+gz7DQENAg0E -DRANFg0aDRsNJQ0mDTANMQ0yDT4NQg1IDVANUQ1bDVwNYA1hDWkNag1yDXMNdA11DXsNfA1+AAsDUg1/ -AOQNgA2FDYYNiw2MDZENlQ2WDZsNnA2hDaYNpw2sDbENsg23DcINxA3HDcgNyw3MDdEN0g3XDdwN3Q3h -DeIN5w3oDfIN8w30DfUN+A3/DgAOAQ4IDgkOCg4LDhIOEw4UDhsOHA4dDiQOJQ4mDi0OLg4vDjYOPQ4+ -Dj8ORg5HDkgOTw5WDlcOWA5hDmIOYw5kDmoOaw5sDnMOdA51DnwOfQ5+DoUOhg6HDooOjw6QDpUOlg6b -DqAOpQ6mDqsOrA+KD5YPlw+ZD5sA5ADlD50PqANSA1MA5A+pD60PsQ+0D7UQkxFyElESUhJTElQSVRJW -ElcSWBJZEloSWxJcEl0SXhJfEmASYRJiEmMSZBJlEmYSZxJoEmkSahJrEmwSbRJuEm8ScBJxEnIScxJ0 -EnUSdhJ3EngSeRJ6EnsSfBJ9En4SfxKAEoESghKDEoQShRKGEocSiBKJEooSixKMEo0SjhKPEpASkRKS -EpMSlBKVEpYSlxKYEpkSmhKbEpwSnRKeEp8SoBKhEqISoxKkEqUSphKnEqgSqRKqEqsSrBKtEq4SrxKw -ErESshKzErQStRK2ErcSuBK5EroSuxK8Er0SvhK/EsASwRLCEsMSxBLFEsYSxxLIEskSyhLLEswSzRLO -Es8S0BLREtIS0xLUEtUS1hLXEtgS2RLaEtsS3BLdEt4S3xLgEuES4hLjEuQS5RLmEucS6BLpEuoS6xLs -Eu0S7hLvEvAS8RLyEvMS9BL1EvYS9xL4EvkS+hL7EvwS/RL+Ev8TABMBEwITAxMEEwUTBhMHEwgTCRMK -EwsTDBMNEw4TDxMQExETEhMTExQTFRMWExcTGBMZExoTGxMcEx0THhMfEyATIRMiEyMTJBMlEyYTJxMo -EykTKhMrEy4TMRRWFXsVfBV9FX4VfxWAFYEJDxWCFYMVhBWFFYYA6xWHFYgViRWKFYsVjBWNFY4VjxWQ -FZEVkhWTFZQVlRWWFZcVmBWZFZoVmxWcFZ0VnhWfFaAVoRWiFaMVpBWlFaYVpxWoFakVqhWrFawVrRWu -Fa8VsBWxASIVshWzFbQVtRW2FbcVuBW5FboVuxW8Fb0VvgOFFb8VwBXBFcIVwxXEFcUVxhXHFcgVyRXK -FcsVzBXNFc4VzxXQFdEV0hXTFdQV1RXWFdcV2BXZFdoV2xXcFd0V3hXfFeAV4RXiFeMV5BXlFeYV5xXo -FekV6hXrFewV7RXuAVoV7xXwFfEV8hXzDQkV9BX1FfYV9xX4FfkV+gfNFfsV/BX9Ff4V/xYAFgEWAhYD -FgQWBRYGFgcWCBYJFgoWCxYMFg0WDhYPFhAGWRYRFhIWEwq2FhQWFRYWDDMWFxYYAVMWGQXQFhoWGxYc -Fh0WHhYfFiAWIRYiFiMWJBYlFiYWJxYoFikWKhYrFiwWLRYuFi8WMBYxFjIWMxY0FjUWNhY3FjgWORY6 -FjsWPBY9Fj4WPxZAFkEWQhZDFkQWRRZGFkcWSAeAFkkWShZLFkwCKRZNFk4WTxZQFlEWUhZTFlQWVRZW -FlcWWBZZFloWWxZcFl0WXhZfFmAWYRZiFmMWZBZlFmYWZxZoFmkWahZrFmwWbRZuFm8WcBZxFnIWcxZ0 -FnUWdhZ3FngWeQ1UFnoWexZ8Fn0WfhZ/FoAWgRaCFoMWhBaFFoYWhxaIFokWihaLFowWjRaOFpEWlBaX -VSRudWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUA -JgAnACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nl -c1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5 -c1tOU0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNj -ZXNzaWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09i -amVjdHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVz -gAKBBYiBA3GBBGCBBYeACIEDg4AFgQRfgQRhgQOEgQWFgACABoEDgoEFhhIAAYhUgQRi0gAOADIAMwA0 -W05TQ2xhc3NOYW1lgASAA11WTFNoZWV0V2luZG930gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWi -ADoAO15OU0N1c3RvbU9iamVjdFhOU09iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMu -b2JqZWN0c4AHoNIANwA4AEIAQ6MAQwBEADtcTlNNdXRhYmxlU2V0VU5TU2V00gAOAD4ARgBHgF+vEEYA -SABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUA -ZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMA -hACFAIYAhwCIAIkAigCLAIwAjYAJgKeAr4C5gMOAxIDIgM2A2YEBH4EBJ4EBKYEBK4EBLIEBNIEBPIEB -RIEBYYEBeoEBgoEB44EB5YEB54EB74EB8YECAIECAoECBIECBYECuYECu4ECvYECvoEDFIEDFoEDGIED -GYEDG4EDHYEDHoEDIIEDIYEDI4EDKoEDLIEDLYEDL4EDMYEDM4EDOIEDO4EDP4EDQoEDRYEDSIEDS4ED -TIEDT4EDUoEDU4EDVoEDXYEDYIEDY4EDZ4EDaYEDa4EDbIEDbYEDb9QADgCPAJAAkQCSAJMAlACVXU5T -RGVzdGluYXRpb25YTlNTb3VyY2VXTlNMYWJlbICmgBGACoCl2ACXAA4AmACZAJoAMgCbAJwAnQCeAJ8A -oAChAKIAowCdXxAPTlNOZXh0UmVzcG9uZGVyWE5TdkZsYWdzW05TRnJhbWVTaXplWE5TV2luZG93W05T -RXh0ZW5zaW9uW05TU3VwZXJ2aWV3gAuAEBEBEoAMgA2ADoAPgAvbAJcADgCmAKcAqACYAKkAmgCqAJwA -qwCsAK0ArgCvALAAsQCUAKEAtACsAJRXTlNGcmFtZVlOU2N2RmxhZ3NaTlNTdWJ2aWV3c1lOU0RvY1Zp -ZXdZTlNCR0NvbG9yXU5TTmV4dEtleVZpZXeBAvSAlIEC9xAEgQL2EQgAgAqADYAigQL0gApaezk4OCwg -MzI4fVtWTFNoZWV0Vmlld1ZOU1ZpZXfSADcAOAC7ALykALwAuQC9ADtcTlNDdXN0b21WaWV3W05TUmVz -cG9uZGVy3gC/AA4AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA -2ADZXE5TV2luZG93Vmlld18QFk5TV2luZG93Q29udGVudE1heFNpemVcTlNTY3JlZW5SZWN0XU5TV2lu -ZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NfEBZOU1dpbmRvd0NvbnRlbnRNaW5TaXplXE5T -V2luZG93UmVjdFlOU01heFNpemVfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dpbmRvd1N0eWxlTWFza1lO -U01pblNpemVbTlNWaWV3Q2xhc3OAGYCkgBeAoYATEnB4AACAFIAYgBKAoxACEAeAooAVXxAYe3s1MDMs -IDEzNX0sIHszNzIsIDE0Mn19VldpbmRvd9IADgDdAN4A31lOUy5zdHJpbmeAFlRWaWV30gA3ADgA4QDi -owDiAOMAO18QD05TTXV0YWJsZVN0cmluZ1hOU1N0cmluZ18QGnszLjQwMjgyZSszOCwgMy40MDI4MmUr -Mzh9WnsyMTMsIDEwN33VAJcADgCmAKgAmAArAOgA6QDqAOuAAICggJ+AGhEBANIADgA+AEYA7oBfpQDv -APAA8QDyAPOAG4AsgDSAOYA+1wCXAA4ApgD1AJgA9gCcAMwA+AD5APoA6wD7AMxWTlNDZWxsWU5TRW5h -YmxlZIAZgCuAHIAdCYAZXxAWe3sxNywgMTA1fSwgezM1NCwgMTd9fdgA/wAOAQABAQECAQMBBAEFAQYB -BwC0AQkBCgDvAQwBDVtOU0NlbGxGbGFnc18QEU5TQmFja2dyb3VuZENvbG9yWk5TQ29udGVudHNZTlNT -dXBwb3J0XU5TQ29udHJvbFZpZXdcTlNDZWxsRmxhZ3MyW05TVGV4dENvbG9yEgQB/gCAKoAigB6AH4Ab -EhBAAACAJ18QNEVuZGluZyBpbiBtZWFzdXJlcyAxIHRocm91Z2ggMTAgYXBwbGllcyB0byByZXBlYXRz -OgrUAA4BEAERARIBEwEUARUBFlZOU1NpemVWTlNOYW1lWE5TZkZsYWdzgCEjQCoAAAAAAACAIBEEFFxM -dWNpZGFHcmFuZGXSADcAOAEZARqiARoAO1ZOU0ZvbnTVAA4BHAEdAR4BHwEgASEBIgEjASRXTlNDb2xv -clxOU0NvbG9yU3BhY2VbTlNDb2xvck5hbWVdTlNDYXRhbG9nTmFtZYAmgCUQBoAkgCNWU3lzdGVtXGNv -bnRyb2xDb2xvctMADgEdASgBIAEqAStXTlNXaGl0ZYAmEANLMC42NjY2NjY2OQDSADcAOAEtARyiARwA -O9UADgEcAR0BHgEfASABMAEiATEBJIAmgCmAKIAjXxAQY29udHJvbFRleHRDb2xvctMADgEdASgBIAEq -ATaAJkIwANIANwA4ATgBOaQBOQE6APUAO18QD05TVGV4dEZpZWxkQ2VsbFxOU0FjdGlvbkNlbGzSADcA -OAE8AT2lAT0BPgC5AL0AO1tOU1RleHRGaWVsZFlOU0NvbnRyb2zYAJcADgCmAPUAmAD2AJwBQADMAUIB -QwFEAOsA+wDMAUdVTlNUYWeAGYAzgC2ALgmAGRED6l8QFXt7MTQsIDEyfSwgezEyOCwgMzJ9fd4A/wAO -AUoBSwFMAU0BTgEBAQIBAwFPAQQBUAFAAQYBUQFSAVMBVAEKAVYBVwEKAPABWgFbAVwBR18QE05TQWx0 -ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJfEBBOU0FsdGVy -bmF0ZUltYWdlXxAPTlNLZXlFcXVpdmFsZW50XxAPTlNQZXJpb2RpY0RlbGF5XU5TQnV0dG9uRmxhZ3OA -MoAwEBkQAYAfgDGAL4AfgCwQyBIIAAAAE/////+GgkD/XURlbGV0ZSBFbmRpbmdQUX/SADcAOAFhAWKk -AWIBOgD1ADtcTlNCdXR0b25DZWxs0gA3ADgBZAFlpQFlAT4AuQC9ADtYTlNCdXR0b27YAJcADgCmAPUA -mAD2AJwBQADMAUIBaQFqAOsA+wDMAW2AGYAzgDWANgmAGRED6V8QFXt7MTYzLCAxMn0sIHs4MiwgMzJ9 -fd4A/wAOAUoBSwFMAU0BTgEBAQIBAwFPAQQBUAFAAQYBUQFSAVMBVAEKAXMBdAEKAPEBWgFbAVwBbYAy -gDCAH4A4gDeAH4A0VkNhbmNlbFEb2ACXAA4ApgD1AJgA9gCcAUAAzAFCAXwBfQDrAPsAzAGAgBmAM4A6 -gDsJgBkRA+hfEBZ7ezI0NSwgMTJ9LCB7MTEzLCAzMn193gD/AA4BSgFLAUwBTQFOAQEBAgEDAU8BBAFQ -AUABgwFRAVIBUwFUAQoBhwGIAQoA8gFaAVsBXAGAE/////+EAf4AgDKAMIAfgD2APIAfgDlaQWRkIEVu -ZGluZ1EN3gCXAY4ADgCmAY8BkAGRAKgBkgCYAJwBkwCrAZQAzAGWAZcBmADWAZkBmgGbAZwA6wDMAZ4B -nwGfW05TSFNjcm9sbGVyWE5Tc0ZsYWdzXE5TQ29ybmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNT -Y3JvbGxBbXRzW05TVlNjcm9sbGVyXU5TQ29udGVudFZpZXeAGYCZgJ6AnYBIgEWAP08QEEEgAABBIAAA -QZgAAEGYAACAGYCVgECAQNIADgA+AEYBo4BfpQGfAZ4BlgGaAZmAQICVgJmARYBI2gCXAA4ApgCnAKgA -mACpAKoAnACrAPMArQGsAK8BrQGuAa8BsADzAa+APoCUgJGAQREJAIBCgJKAPoBC0gAOAD4ARgG1gF+h -Aa+AQt8QEwCXAbgADgG5AboBAAG7AZABvAG9Ab4AmACZAPYBvwHAAJwBwQHCAZ8BxAHFAcYBxwHIAPsB -mQHLAK8BzADrAc0A+wHPAdABnwHSAdNfEB9OU0RyYWdnaW5nU291cmNlTWFza0Zvck5vbkxvY2FsWU5T -VHZGbGFnc1xOU0hlYWRlclZpZXdfEBJOU0FsbG93c1R5cGVTZWxlY3RfEBdOU0ludGVyY2VsbFNwYWNp -bmdXaWR0aF8QGU5TQ29sdW1uQXV0b3Jlc2l6aW5nU3R5bGVfEBhOU0ludGVyY2VsbFNwYWNpbmdIZWln -aHRbTlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5z -W05TUm93SGVpZ2h0gEAQAICQEhJAAACARIB0CYBII0AIAAAAAAAAI0AAAAAAAAAAgEMJgI0T//////// -//+AQIBLI0AxAAAAAAAAWXsxODQsIDE5fdYAlwAOAJgAmQCcAdYBmgHYAOsB2QGaAa9bTlNUYWJsZVZp -ZXeARYBHgEaARYBC2gCXAA4ApgCnAKgAmACpAKoAnACrAPMArQHfAK8B4AGuAccBsADzAceAPoCUgJyA -m4BEgJKAPoBEWXsxODQsIDE3fdIANwA4AecB6KQB6AC5AL0AO18QEU5TVGFibGVIZWFkZXJWaWV31QCX -AA4ApgCYAJwA8wHrAewA6wDzgD6ASoBJgD5fEBR7ey0yNiwgMH0sIHsxNiwgMTd9fdIANwA4AfAB8aQB -8QC5AL0AO11fTlNDb3JuZXJWaWV30gAOAD4ARgH0gF+oAfUB9gH3AfgB+QH6AfsB/IBMgGaAboB2gHqA -f4CEgInZAA4B/gH/AgACAQICAgMCBAHWAgUCBgIHAggCCQIIAggA+wGvXE5TSGVhZGVyQ2VsbFxOU0lk -ZW50aWZpZXJXTlNXaWR0aFpOU0RhdGFDZWxsWk5TTWluV2lkdGhaTlNNYXhXaWR0aFxOU0lzRWRpdGFi -bGWAZYBOgE0jQDQAAAAAAACAVAmAQlEx1wD/AA4BAAEBAQIBBAEFAg4CDwIQAgcCEgFbAhMSBIH+AIBT -gFCATYBPgFHUAA4BEAERARIBEwIWARUCGIAhI0AmAAAAAAAAgCARDBzTAA4BHQEoASABKgIbgCZLMC4z -MzMzMzI5OQDVAA4BHAEdAR4BHwEgATABIgIfASSAJoApgFKAI18QD2hlYWRlclRleHRDb2xvctIANwA4 -AiMCJKUCJAE5AToA9QA7XxARTlNUYWJsZUhlYWRlckNlbGzcAP8ADgImAUsBTAFNAQEBAgEDAU8BBAFQ -AQYBUQIoAikA1gIqAVICLAGvAi4BxAIvXU5TTm9ybWFsSW1hZ2WAMoBWEEuAYoAwgFWAQhEBkBJIPFH/ -1AAOARABEQESARMCMgEVAjSAISNAKAAAAAAAAIAgEBDVAA4BEAI2AjcBHAI4AjkCOgI7AjxcTlNJbWFn -ZUZsYWdzVk5TUmVwc4BhgFcSIMAAAIBYgGBYezE4LCAxOH3SAA4APgBGAkCAX6ECQYBZ0gAOAD4CQwJE -gF6iAkUCRoBagFvSAA4CSAJJAkpfEBROU1RJRkZSZXByZXNlbnRhdGlvboBdgFxPERWOTU0AKgAABRgA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMA -AAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE1NTW4ZmZm/29vb/9zc3P/c3Nz/3Jycv9y -cnL/cnJy/3Jycv9vb2//ZWVl/yUlJZ8AAAAiAAAAAAAAAAAAAAAAAAAAAkNDQ5W3t7f/+fn5//z8/P/8 -/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+fn5/8DAwP9UVFS7AAAAAgAAAAAAAAABAAAACJGRkf/c -3Nz/8/Pz//T09P/19fX/9fX1//T09P/09PT/9PT0//T09P/09PT/8/Pz/97e3v+JiYn/AAAACAAAAAEA -AAABAAAAEIGBgf/f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/9/f3/+S -kpL/AAAAEAAAAAEAAAABAAAAFZGRkf/d3d3/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7Ozs/+7u7v/t -7e3/7Ozs/9/f3/+QkJD/AAAAFAAAAAEAAAABAAAAGJ6env/b29v/6enp/+np6f/q6ur/6+vr/+rq6v/q -6ur/6urq/+rq6v/q6ur/6Ojo/9jY2P+bm5v/AAAAGAAAAAEAAAABAAAAG6CgoP/T09P/2tra/9ra2v/b -29v/29vb/9vb2//Z2dn/29vb/9nZ2f/a2tr/2tra/9HR0f+ioqL/AAAAGwAAAAEAAAABAAAAHKurq//a -2tr/39/f/9/f3//g4OD/4ODg/+Dg4P/h4eH/39/f/9/f3//f39//4ODg/9fX1/+mpqb/AAAAHAAAAAEA -AAACAAAAHrS0tP/j4+P/5ubm/+Xl5f/m5ub/5+fn/+fn5//n5+f/6enp/+fn5//n5+f/6Ojo/93d3f+t -ra3/AAAAHgAAAAIAAAACAAAAILi4uP/p6en/7e3t//Dw8P/w8PD/8PDw/+3t7f/t7e3/8fHx/+zs7P/v -7+//7e3t/+bm5v+0tLT/AAAAIAAAAAIAAAABAAAAILu7u//v7+//9/f3//b29v/4+Pj/9vb2//b29v/2 -9vb/9/f3//f39//39/f/9/f3//Dw8P+7u7v/AAAAIAAAAAEAAAABAAAAHY2Njej4+Pj///////////// -/////////////////////////////////////v7+//n5+f+Tk5PoAAAAHQAAAAEAAAABAAAAEjo6Oq28 -vLz3/////////////////////////////////////////////////////7u7u/c/Pz+rAAAAEgAAAAEA -AAAAAAAACAAAAEEAAACZAAAAxgAAANMAAADVAAAA1gAAANQAAADWAAAA2AAAANgAAADTAAAAxQAAAJkA -AABBAAAACAAAAAAAAAAAAAAAAgAAAA0AAAAlAAAANgAAAEEAAABDAAAAQwAAAEMAAABEAAAAQwAAAEQA -AABBAAAANgAAACUAAAANAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAYAAAAGAAAABgAAAAYA -AAAGAAAABgAAAAYAAAAGAAAAAwAAAAMAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEBAAMAAAABABIA -AAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEA -AAEVAAMAAAABAAQAAAEWAAMAAAABBxwAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFSAAMAAAABAAEA -AAFTAAMAAAAEAAAFzodzAAcAAA+4AAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAPuGFwcGwCAAAAbW50 -clJHQiBYWVogB9YADAAHABEAFQAbYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEA -AAAA0y1hcHBsJNLJy134Mnx572GDPUg6gwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOclhZ -WgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAAAXwAAAAsclRS -QwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAYSbmRpbgAAB+wAAAY+ZGVz -YwAADiwAAABkZHNjbQAADpAAAADQbW1vZAAAD2AAAAAoY3BydAAAD4gAAAAtWFlaIAAAAAAAAFt8AAA0 -xwAABrNYWVogAAAAAAAAc8UAALNEAAAe9FhZWiAAAAAAAAAnlAAAGBAAAK1+WFlaIAAAAAAAAPNSAAEA -AAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1cnYAAAAAAAAA -AQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAAYUD -GgSmBjEHuQlGCtEMXA3sD28Q+BKDFBMVmhckGKsaNBu3HTwewyBHIcYjSCTEJkYnvyk5KrAsKC2aLw0w -ejHlM080szYZN3c41DovO4U82j4sP3hAwUIKQ1BEkEXORwtIQ0l7Sq9L4k0RTj9Pa1CVUb5S5VQLVTBW -U1d1WJZZtlrWW/NdEV4vX0tgaGGDYp5juWTSZexnBWgeaTZqTWtlbHttkW6lb7lwzHHecu9z/3UNdht3 -J3gyeTt6Q3tKfE99UX5Tf1OAUYFNgkeDQIQ3hS2GIIcSiAOI8onfisuLtoyfjYeObo9TkDeRGpH8kt6T -vpSdlXuWWZc1mBGY7JnHmqGbepxTnSqeAp7Zn6+ghaFaoi6jAqPWpKmlfKZOpyCn8qjDqZSqY6szrAOs -0q2hrm+vPbALsNixprJzs0C0DLTYtaS2cLc7uAe40rmdume7Mrv8vMe9kb5avyO/7cC2wX7CR8MPw9fE -n8Vnxi7G9ce8yILJSMoOytPLmMxdzSHN5c6pz2zQL9Dy0bXSd9M40/rUu9V81jzW/de82HzZO9n72rrb -eNw33PbdtN5z3zLf8eCx4XHiMuLz47XkeOU95gLmyeeS6FzpJ+n16sXrl+xs7UPuHO7379bwt/Gb8oLz -a/RX9UX2Nfco+Bz5E/oM+wb8APz7/fr++v//AAABWwLzBGwF7QdpCOMKVwvVDUsOyBA+EbcTLRSpFhsX -kxkIGn8b8x1lHtUgSSG1IyQkjyX4J2AoxiorK4os6S5GL50w8zJGM5c04zYuN3Q4tzn1OzI8bD2hPtNA -BEEwQlpDf0SjRcVG40f/SRpKMktHTFtNbE58T4xQmVGmUrFTvVTGVc5W11ffWOZZ7lr0W/pdAV4GXwxg -EmEYYh1jImQnZSxmMmc2aDppP2pDa0ZsSW1Lbk5vT3BQcVByT3NOdEx1SHZEdz94OXkxeih7H3wUfQh9 -+37tf96AzoG9gquDl4SDhW2GVoc/iCaJDInyiteLuoyejYCOYY9CkCGRAJHekryTmZR1lVGWLJcGl+CY -uZmSmmqbQpwZnPCdx56dn3OgSaEeofSiyaOepHKlR6YcpvCnxaiZqW6qQqsWq+uswK2UrmivPbASsOax -u7KQs2W0OrUQteW2ureQuGa5PboTuuq7wLyXvW++R78fv/jA0sGswobDYcQ9xRnF9sbUx7LIkslyylPL -NcwYzPzN4c7Hz67QltF/0mnTVNRA1S7WHNcL1/vY7Nnf2tLbxty63bDept+c4JPhiuKB43jkb+Vm5lzn -UehG6TrqLOse7A7s/O3o7tLvuvCf8YPyZPNC9B/0+fXP9qT3dvhG+RT54Pqp+3D8N/z9/cH+g/9D//8A -AAEDAiwDPwRVBW0GigehCLkJzwrnDAINFw4tD0AQWBFtEoETkxSoFbsWzRfeGO8Z/xsNHBsdKB4yHzkg -QSFJIksjTiRQJU4mSidFKD0pNConKxgsCSz0Ld8uxy+tMJExczJTMzA0CjTjNbs2kDdkODg5BznWOqQ7 -cTw+PQc90D6ZP2FAKUDvQbVCe0NBRAVEykWPRlNHF0fcSKBJZEopSu5Lskx3TT1OAU7GT4xQU1EYUd5S -pVNsVDNU+lXBVolXUVgZWOFZqlpyWztcBFzNXZZeYF8qX/RgvmGJYlNjHmPqZLZlgmZOZxpn52i0aYFq -T2sca+psuG2GblRvIm/xcL9xjnJbcylz93TFdZN2YHctd/l4xXmRel17J3vxfLt9hX5NfxV/3YCkgWqC -MIL1g7qEfoVChgWGx4eKiEuJDYnOio+LT4wPjM6Njo5Ojw2PzZCMkUySC5LLk4qUSpUKlcuWjJdNmA6Y -0JmTmlabGZvdnKGdZ54tnvSfu6CDoUyiFqLho6ykeaVHpham5qe3qIqpXqo0qwur5Ky/rZyufK9fsEOx -K7IWswWz+LTvteu27LfzuQG6FbswvFO9fr6yv/HBOsKNw+zFWMbOyFXJ5suIzTnO99DE0qLUj9aL2Jfa -s9zb3xXhXeOx5hLoger47XvwB/Kf9TP30vp7/TL//wAAbmRpbgAAAAAAAAY2AACXkQAAWLgAAFVBAACM -FQAAKFcAABaoAABQDQAAVDkAAvCjAAK1wgABqPUAAwEAAAIAAAABAAUACgARABkAIwAvADsASQBZAGkA -ewCOAKIAuADPAOcBAAEaATUBUgFvAY4BrgHPAfECFQI5Al8ChQKtAtYDAAMsA1gDhgO1A+QEFgRIBHwE -sQTnBR4FVwWRBcwGCQZIBocGyAcLB08HlAfcCCQIbwi7CQkJWAmpCfwKUQqoCwELWwu3DBYMdgzZDT0N -pA4MDncO4w9SD8MQNhCrESIRmxIWEpMTEhOTFBYUmxUiFasWNRbCF1EX4RhzGQcZnBo0Gs0baBwFHKQd -RB3mHoofMB/YIIEhLSHaIoojOyPvJKUlXSYXJtQnkyhUKRkp3yqpK3UsRC0WLewuxC+fMH4xYDJGMy80 -HDUMNgA2+DfzOPI59Tr7PAY9FD4mPztAVUFyQpJDt0TfRgpHOUhsSaJK3EwZTVlOnU/lUS9SfVPPVSRW -fFfYWTdamVv/XWhe1WBEYbhjLmSnZiRnpWkoaq9sOG3Fb1Vw6XJ/dBh1tXdUePd6nXxGffF/oIFSgwiE -wIZ8iDuJ/YvCjYuPV5EnkvqU0ZasmIqaa5xRnjqgJ6IXpAymBKgAqgCsBK4LsBeyJrQ4tk64aLqEvKO+ -xMDnwwvFMMdWyXvLn83Bz+HR/dQX1i3YPtpK3FHeVOBS4krkPuYt6Bfp/uvg7b/vm/F180z1IPby+Mj6 -m/xr/jn//wAAAAIABQALABIAHAAmADIAQABPAGAAcgCFAJoAsADHAOAA+gEVATIBTwFuAY8BsAHTAfcC -HAJCAmoCkwK9AukDFQNDA3MDowPVBAgEPQRzBKoE4wUdBVkFlgXVBhUGVwabBuAHJwdvB7oIBghUCKQI -9glKCaEJ+QpTCrALDwtwC9MMOQyhDQwNeQ3oDloOzw9GD78QOxC6ETsRvxJFEs0TWBPlFHUVBhWaFjEW -yRdkGAAYnxk/GeIahxstG9YcgB0sHdoeih88H/AgpSFcIhYi0SOOJE0lDyXSJpgnXygpKPUpxCqVK2gs -Pi0XLfIu0C+xMJUxfDJlM1I0QjU1Nis3JDggOSA6IzspPDM9QD5QP2RAe0GVQrND1ET4RiBHS0h6SaxK -4UwaTVZOlU/YUR5SZ1O0VQRWV1etWQZaYlvBXSNeh1/vYVlixmQ1ZadnG2iSagtrh20EboRwB3GLcxJ0 -m3Ymd7N5QnrTfGZ9/H+TgSuCxoRihgCHoIlAiuKMho4qj8+RdZMclMOWa5gUmb2bZp0PnrigYaIKo7Ol -XKcFqK2qVqv+raWvTbD0spu0QrXpt4+5NrrdvIS+LL/UwX3DJ8TSxn/ILsney5HNR87/0LvSe9Q/1gfX -1dmo24LdYt9K4TnjMOUv5zfpSutl7YrvufHx9DP2fvjN+yX9iP//AAAAAwAJABMAIAAwAEIAVwBvAIkA -pgDFAOYBCgEwAVkBgwGwAd8CEQJFAnoCswLtAyoDaQOqA+4ENAR8BMcFFQVlBbcGDQZlBr8HHQd+B+II -SQizCSEJkgoGCn8K+wt7C/8Mhw0TDaQOOQ7SD3AQEhC4EWQSExLHE38UPBT9FcIWixdYGCkY/RnWGrEb -kRxzHVkeQh8tIBwhDiICIvoj9CTwJfAm8if2KP0qBysULCMtNC5IL18weDGUMrIz0zT1Nhs3QzhtOZk6 -xzv4PSs+YD+XQNBCDENKRIpFzUcSSFlJo0rvTD9NkU7mUD5RmVL4VFpVv1coWJVaBVt6XPJeb1/vYXRi -/WSKZhtnsWlLauhsim4wb9lxh3M4dOx2pHheehx73H2ff2WBLIL2hMGGjohciiyL/Y3Pj6KRdZNIlR2W -8ZjFmpqcbp5BoBSh5qO3pYenVakhquuss653sDex9LOttWG3D7i4ulu7972NvxvAosIhw5jFCMZwx9HJ -Ksp6y8LNBM5Az3TQoNHH0unUAtUX1ifXMNg12TXaMNso3BrdCt303tzfv+Ch4X7iWeMw5Abk1+Wo5nXn -QugJ6NLplupa6xzr3Oyc7VjuFe7P74jwQfD48a/yZPMY88z0fvUx9eD2kPdB9/P4pflU+gT6s/tg/A78 -uv1k/g7+tf9a//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAA -AAAAAAUAAAAMZW5VUwAAABIAAABMZnJGUgAAAEIAAABeZGVERQAAABAAAACgamFKUAAAAA4AAACwZXNF -UwAAABIAAAC+AEMAbwBsAG8AcgAgAEwAQwBEAMkAYwByAGEAbgAgAOAAIABjAHIAaQBzAHQAYQB1AHgA -IABsAGkAcQB1AGkAZABlAHMAIABjAG8AdQBsAGUAdQByAEYAYQByAGIALQBMAEMARDCrMOkw/AAgAEwA -QwBEAEwAQwBEACAAYwBvAGwAbwBybW1vZAAAAAAAAAYQAACcXwAAAADAHWWAAAAAAAAAAAAAAAAAAAAA -AHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDA1AAAAANIANwA4Ak0CTqMC -TgJPADtfEBBOU0JpdG1hcEltYWdlUmVwWk5TSW1hZ2VSZXDSADcAOAJRAlKiAlIAO1dOU0FycmF50gA3 -ADgCVAJVowJVAlIAO15OU011dGFibGVBcnJhedMADgEdASgBIAEqAliAJkQwIDAA0gA3ADgCWgJbogJb -ADtXTlNJbWFnZdIADgJdAl4CX1tOU0ltYWdlTmFtZYBkgGNYTlNTd2l0Y2jSADcAOAJiAmOiAmMAO18Q -E05TQnV0dG9uSW1hZ2VTb3VyY2XSADcAOAJlAmaiAmYAO11OU1RhYmxlQ29sdW1u2QAOAf4B/wIAAgEC -AgIDAgQB1gIFAmkCagIIAmsCCAIIAPsBr4BlgGiAZ4BpCYBCUTLXAP8ADgEAAQEBAgEEAQUCDgIPAhAC -agISAVsCE4BTgFCAZ4BPgFHdAP8ADgImAUsBTAFNAU4BAQECAQMBTwEEAVABBgFRAncCKQDWAioBUgFS -AiwBrwIuAcQCL4AygGqAYoAwgDCAVYBC0wAOADICfgJ/AoACgV5OU1Jlc291cmNlTmFtZYBtgGuAbNIA -NwA4AoMChKIChAA7XxAQTlNDdXN0b21SZXNvdXJjZdkADgH+Af8CAAIBAgICAwIEAdYCBQKHAogCCAKJ -AggCCAD7Aa+AZYBwgG+AdQmAQlE01wD/AA4BAAEBAQIBBAEFAQYCDwKPApACEgFbAhOAU4BygHGAT4BR -UTPVAA4BHAEdAR4BHwEgAcgBIgKXASSAJoB0gHOAI1toZWFkZXJDb2xvctMADgEdASgBIAEqApyAJkIx -AN0A/wAOAiYBSwFMAU0BTgEBAQIBAwFPAQQBUAEGAVECdwIpANYCKgFSAVICLAGvAi4BxAIvgDKAaoBi -gDCAMIBVgELZAA4B/gH/AgACAQICAgMCBAHWAgUCpwKoAggCqQIIAggA+wGvgGWAeIB3gHkJgEJRONcA -/wAOAQABAQECAQQBBQEGAg8CjwKIAhIBWwITgFOAcoBvgE+AUd0A/wAOAiYBSwFMAU0BTgEBAQIBAwFP -AQQBUAEGAVECdwIpANYCKgFSAVICLAGvAi4BxAIvgDKAaoBigDCAMIBVgELZAA4B/gH/AgACAQICAgMC -BAHWAgUCvQK+AggCvwIIAggA+wGvgGWAfIB7gH4JgEJSMTbXAP8ADgEAAQEBAgEEAQUBBgIPAo8CxgIS -AVsCE4BTgHKAfYBPgFFRNd0A/wAOAiYBSwFMAU0BTgEBAQIBAwFPAQQBUAEGAVECdwIpANYCKgFSAVIC -LAGvAi4BxAIvgDKAaoBigDCAMIBVgELZAA4B/gH/AgACAQICAgMCBAHWAgUC1ALVAggC1gIIAggA+wGv -gGWAgYCAgIMJgEJSMzLXAP8ADgEAAQEBAgEEAQUBBgIPAo8C3QISAVsCE4BTgHKAgoBPgFFRNt0A/wAO -AiYBSwFMAU0BTgEBAQIBAwFPAQQBUAEGAVECdwIpANYCKgFSAVICLAGvAi4BxAIvgDKAaoBigDCAMIBV -gELZAA4B/gH/AgACAQICAgMCBAHWAgUC6wLsAggC7QIIAggA+wGvgGWAhoCFgIgJgEJSNjTXAP8ADgEA -AQEBAgEEAQUBBgIPAo8C9AISAVsCE4BTgHKAh4BPgFFRN90A/wAOAiYBSwFMAU0BTgEBAQIBAwFPAQQB -UAEGAVECdwIpANYCKgFSAVICLAGvAi4BxAIvgDKAaoBigDCAMIBVgELZAA4B/gH/AgACAQICAgMCBAHW -AgUDAgMDAwQDBQMGAggA+wGvgGWAi4CKI0Az9KBAAAAAgIwjQC3pQIAAAAAJgEJTMTI41wD/AA4BAAEB -AQIBBAEFAQYCDwKPAqgCEgFbAhOAU4BygHeAT4BR3QD/AA4CJgFLAUwBTQFOAQEBAgEDAU8BBAFQAQYB -UQJ3AikA1gIqAVIBUgIsAa8CLgHEAi+AMoBqgGKAMIAwgFWAQtUADgEcAR0BHgEfASADGgEiAxsBJIAm -gI+AjoAjWWdyaWRDb2xvctMADgEdASgBIAEqAyCAJkQwLjUA0gA3ADgDIgHWpQHWAT4AuQC9ADtfEBR7 -ezEsIDE3fSwgezE4NCwgMTl9fdUADgEcAR0BHgEfASABIQEiAycBJIAmgCWAk4AjXxAWY29udHJvbEJh -Y2tncm91bmRDb2xvctIANwA4AysDLKQDLAC5AL0AO1pOU0NsaXBWaWV32ACXAy4ADgCmAJgDLwCcAzAA -8wDzAzMDNADrAzUA8wM3WE5TVGFyZ2V0WE5TQWN0aW9uWU5TUGVyY2VudIA+gD6AmICWgJeAPiM/yO0i -oAAAAF8QGHt7LTEwMCwgLTEwMH0sIHsxNSwgMzd9fVxfZG9TY3JvbGxlcjrSADcAOAM7AzylAzwBPgC5 -AL0AO1pOU1Njcm9sbGVy2QCXAy4ADgCmAY8AmAMvAJwDMADzAPMDMwNBAVQA6wM1APMDRIA+gD6AmICa -gJeAPiM/77H7IAAAAF8QGXt7LTEwMCwgLTEwMH0sIHsxNDMsIDE1fX3SAA4APgBGA0iAX6EBx4BEXxAT -e3sxLCAwfSwgezE4NCwgMTd9fV8QFXt7OTUsIDYwfSwgezE4NiwgMzd9fdIANwA4A00DTqQDTgC5AL0A -O1xOU1Njcm9sbFZpZXdfEBR7ezEsIDl9LCB7MzcyLCAxNDJ9fdIANwA4A1EAuaMAuQC9ADtfEBV7ezAs -IDB9LCB7MTI4MCwgNzc4fX1aezIxMywgMTI5fdIANwA4A1UDVqIDVgA7XxAQTlNXaW5kb3dUZW1wbGF0 -ZVxmRW5kaW5nU2hlZXTSADcAOANZA1qjA1oDWwA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJD -b25uZWN0b3LUAA4AjwCQAJEDXQCUA18DYICugAqAqICt2ACXAA4ApgD1AJgA9gCcAUADYgFCA2QDZQDr -APsDYgFHgKmAM4CqgKsJgKnVAJcADgCmAKgAmAArAOgDawNsAOuAAICggQEagOBfEBV7ezE0LCAxMn0s -IHsxMjEsIDMyfX3eAP8ADgFKAUsBTAFNAU4BAQECAQMBTwEEAVABQAEGAVEBUgFTAVQBCgFWA3MBCgNf -AVoBWwFcAUeAMoAwgB+AMYCsgB+AqFxEb24ndCBSZXBlYXRfEBNlbmRTaGVldFdpdGhCdXR0b2460gA3 -ADgDeQN6owN6A1sAO18QFU5TTmliQ29udHJvbENvbm5lY3RvctQADgCPAJAAkQCSA30AlAN/gKaAsIAK -gLjYAJcADgCmAPUAmAD2AJoAnAOBAPgDgwOEA4UA+wChA4GAsYArgLKAsxEBAgmADYCx1wCXAA4AqACY -AJkAmgCcA4oA6AOMAOsDjQChA4qBAv2AoIEC/4EDCoANgQL9XxAUe3sxMCwgNn0sIHsyNzEsIDIyfX3Z -AP8ADgEAAQEBAgEDAQQDkgEFA5MBBwOVAVIBCgN9A5kA+wObXxARTlNEcmF3c0JhY2tncm91bmQT//// -/5Rx/kGAKoC0gDCAH4CwEghABAAJgLbVAA4BHAEdAR4BHwEgAcgBIgOfASSAJoB0gLWAI18QE3RleHRC -YWNrZ3JvdW5kQ29sb3LVAA4BHAEdAR4BHwEgATABIgOlASSAJoApgLeAI1l0ZXh0Q29sb3JcZkZpZWxk -RWRpdG9y0wAOAJAAkQNdA6sDrICugLqAwtcAlwAOAKYA9QCYAPYAnAOuAUIDsAOxAOsA+wOugLuAM4C8 -gL0JgLvVAJcADgCoAJgAmQArAOgDtwDrA7iAAICggQN5gQN6XxAVe3syNSwgMjU0fSwgezc1LCA3OH19 -3QD/AA4BSgImAUsBTAFOAQEBAgEDAU8BBAFQAQYBUQO8A70CKQDWAVIDvAPAA6sCLgFbA8KAMoC+gMCA -MIC+gL+AuhP/////hoxA/1dQcmV2aWV31AAOARABEQESARMDxgEVAjSAISNAJAAAAAAAAIAg0wAOADIC -fgJ/AoADy4BtgGuAwVVtdXNpY1tzaG93T3V0cHV0OtQADgCPAJAAkQNdAJQA8gNggK6ACoA5gK3UAA4A -jwCQAJEDXQCUA9YDYICugAqAxYCt2ACXAA4ApgD1AJgA9gCcAUADYgFCA9sD3ADrAPsDYgFtgKmAM4DG -gMcJgKlfEBV7ezE1OSwgMTJ9LCB7ODIsIDMyfX3eAP8ADgFKAUsBTAFNAU4BAQECAQMBTwEEAVABQAEG -AVEBUgFTAVQBCgFzAXQBCgPWAVoBWwFcAW2AMoAwgB+AOIA3gB+AxdQADgCPAJAAkQNdAJQD6wNggK6A -CoDJgK3YAJcADgCmAPUAmAD2AJwBQAPuAUID8APxAOsA+wPuAW2AyoAzgMuAzAmAytUAlwAOAKgAmACZ -ACsA6AP3AOsD+IAAgKCBAguBArRfEBV7ezMzNCwgMTJ9LCB7ODIsIDMyfX3eAP8ADgFKAUsBTAFNAU4B -AQECAQMBTwEEAVABQAEGAVEBUgFTAVQBCgFzAXQBCgPrAVoBWwFcAW2AMoAwgB+AOIA3gB+AydQADgCP -AJAAkQNdAJQEBQQGgK6ACoDOgNjcAy4ADgQIBAkECgQLBAwEDQQOAy8BQAQPBBAEEQQSBBMBUgQVBBYE -FwQYBBkBVAFUV05TVGl0bGVfEBFOU0tleUVxdWl2TW9kTWFza1pOU0tleUVxdWl2XU5TTW5lbW9uaWNM -b2NZTlNPbkltYWdlXE5TTWl4ZWRJbWFnZVZOU01lbnVXTlNTdGF0ZYDWgNeA0BIAEAAAgDASf////4DR -gNOAz4DV0wAOBAgEGwQcBB0EHltOU01lbnVJdGVtc4EBXYEB9YEB9llTZWxlY3QuLi7TAA4AMgJ+An8C -gAQjgG2Aa4DSXxAPTlNNZW51Q2hlY2ttYXJr0wAOADICfgJ/AoAEKIBtgGuA1F8QEE5TTWVudU1peGVk -U3RhdGVfEBFfcG9wVXBJdGVtQWN0aW9uOt8QEwD/BCwELQFKAUsADgFMAU0BTgECBC4BAwQvBDAEMQFP -AQQEDgFQBDIA+wFUAVICKQQ1AVQENgQ3AQoEBQQ6ASoA+wD7Ai4AsQQYBD5fEBpOU01lbnVJdGVtUmVz -cGVjdEFsaWdubWVudF8QD05TQXJyb3dQb3NpdGlvblpOU01lbnVJdGVtXxAPTlNQcmVmZXJyZWRFZGdl -XxASTlNVc2VzSXRlbUZyb21NZW51XU5TQWx0ZXJzU3RhdGUT/////4RB/kAJgDCBAV6BAUmBAfSAH4DO -gQHyCQmAzxIGgkD/0gA3ADgEQAQuogQuADtdc2VsZWN0R3Jvb3ZlOtQADgCPAJAAkQCSBEQAlARGgKaA -2oAKgQEe3gC/AA4AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsDYgDNBEoESwDQANEETQROBE8EUADWANcE -UQRSgKmApIDegQEbgBOA3IDfgNuBAR2BARyA3V8QGHt7NTE1LCAxOTV9LCB7MzM4LCAxMjd9fdIADgDd -AN4AmoAW0gAOAN0A3gDfgBbSAA4APgBGBFqAX6cEWwRcBF0EXgNfA9YEYYDhgOWBAQ2BARKAqIDFgQEW -1wCXAA4ApgD1AJgA9gCcA2IA+ARlBGYA6wD7A2KAqYArgOKA4wmAqV8QFXt7MTcsIDkwfSwgezIwOCwg -MTd9fdgA/wAOAQABAQECAQMBBAEFAQYBBwC0BG0BCgRbAQwBDYAqgCKA5IAfgOGAJ18QHFJlcGVhdCBt -ZWFzdXJlcyAxIHRob3VnaCAxNArXAJcADgCmAPUAmAD2AJwDYgD4BHUEdgDrAPsDYoCpgCuA5oDnCYCp -XxAUe3syMCwgNjB9LCB7MjcsIDIyfX3aAP8ADgEAAQEBAgEDBHsBBAOSAQUDkwEHA5UCagEKBFwEgQSC -APsDm1tOU0Zvcm1hdHRlcoAqgLSAZ4AfgOWA6BP/////kEAEAAmAtt8QEQAOBIYEhwSIBIkEigSLBIwE -jQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQArBJsAKwSdBJ4EnwD7BKEAKwSjBKQA+wSmVk5TLm5pbFpO -Uy5kZWNpbWFsVk5TLm5hbltOUy5yb3VuZGluZ1dOUy56ZXJvXxAQTlMubmVnYXRpdmVhdHRyc1ZOUy5t -YXhdTlMuYXR0cmlidXRlc18QEU5TLnBvc2l0aXZlZm9ybWF0XxAPTlMuYWxsb3dzZmxvYXRzXxARTlMu -bmVnYXRpdmVmb3JtYXRfEBBOUy5wb3NpdGl2ZWF0dHJzW05TLnRob3VzYW5kVk5TLm1pblxOUy5sb2Nh -bGl6ZWRfEA9OUy5oYXN0aG91c2FuZHOBAQyBAQiBAQSBAQqAAIEBAIAAgPqA6YD+CYD7gACBAQaA9wkI -0wAOBKgAPgSpBKoEuFdOUy5rZXlzgQEHrQSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3gOqA64DsgO2A -7oDvgPCA8YDygPOA9ID1gPatBKQEugSdBKEEvQS+AVIEnwTBBJsEmATEBKOA94D5gPqA+4D8gP2AMID+ -gP+BAQCBAQSBAQWBAQZXbWluaW11bVxhbGxvd3NGbG9hdHNXbWF4aW11bV5uZWdhdGl2ZUZvcm1hdF8Q -FnBvc2l0aXZlSW5maW5pdHlTeW1ib2xfEBZuZWdhdGl2ZUluZmluaXR5U3ltYm9sWW5pbFN5bWJvbF5w -b3NpdGl2ZUZvcm1hdF8QFXVzZXNHcm91cGluZ1NlcGFyYXRvcl8QF2F0dHJpYnV0ZWRTdHJpbmdGb3Ja -ZXJvXxAQZGVjaW1hbFNlcGFyYXRvcl8QEWZvcm1hdHRlckJlaGF2aW9yXxARZ3JvdXBpbmdTZXBhcmF0 -b3LXAA4E1ATVBNYE1wTYBNkE2gD7AcQBVAFUBNwEplpOUy5jb21wYWN0W05TLmV4cG9uZW50Xk5TLm1h -bnRpc3NhLmJvWU5TLmxlbmd0aFtOUy5tYW50aXNzYVtOUy5uZWdhdGl2ZYD4CU8QEAIAAAAAAAAAAAAA -AAAAAAAI0gA3ADgE3wTgogTgADtfEBpOU0RlY2ltYWxOdW1iZXJQbGFjZWhvbGRlctcADgTUBNUE1gTX -BNgE2QTaAPsBxAFUAVQE5ASmgPgJTxAQEAAAAAAAAAAAAAAAAAAAAAhSLTBiACsiHmIALSIeUTAI0wAO -BOwA4wTtBO4En1xOU0F0dHJpYnV0ZXOBAQOBAQGA/tMADgSoAD4E8QTyBPOBAQKgoNIANwA4BPUE9qIE -9gA7XE5TRGljdGlvbmFyedIANwA4BPgE+aIE+QA7XxASTlNBdHRyaWJ1dGVkU3RyaW5nUS5RLNIANwA4 -BP0E/qME/gT2ADtfEBNOU011dGFibGVEaWN0aW9uYXJ50gAOAOME7QUBgQEDgQEJ0wAOBOwA4wTtBO4F -BYEBA4EBAYEBC1NOYU7SADcAOAUIBQmjBQkEewA7XxARTlNOdW1iZXJGb3JtYXR0ZXLXAJcADgCmAPUA -mAD2AJwDYgUMBQ0FDgDrAPsDYoCpgQERgQEOgQEPCYCpXxAUe3s1MiwgNTd9LCB7MTksIDI3fX3ZBRMA -/wAOBRQFFQUWAQMBBAUXAcwFGAUZBRoFGwHMBF0BxAD7V05TVmFsdWVbTlNJbmNyZW1lbnRaTlNNYXhW -YWx1ZVpOU01pblZhbHVlXE5TQXV0b3JlcGVhdBIADf4ggQEQIz/wAAAAAAAAI0AwAAAAAAAAgQENCdIA -NwA4BR8FIKQFIAE6APUAO11OU1N0ZXBwZXJDZWxs0gA3ADgFIgUjpQUjAT4AuQC9ADtZTlNTdGVwcGVy -1wCXAA4ApgD1AJgA9gCcA2IA+AUnBSgA6wD7A2KAqYArgQETgQEUCYCpXxAVe3s3MywgNjV9LCB7MTE0 -LCAxN3192AD/AA4BAAEBAQIBAwEEAQUBBgEHALQFLwEKBF4BDAENgCqAIoEBFYAfgQESgCdWdGltZXMu -2ACXAA4ApgD1AJgA9gCcAUADYgFCBTcFOADrAPsDYgGAgKmAM4EBF4EBGAmAqV8QFXt7MjQxLCAxMn0s -IHs4MywgMzJ9fd4A/wAOAUoBSwFMAU0BTgEBAQIBAwFPAQQBUAFAAYMBUQFSAVMBVAEKAYcFQQEKBGEB -WgFbAVwBgIAygDCAH4A9gQEZgB+BARZWUmVwZWF0XxAUe3sxLCA5fSwgezMzOCwgMTI3fX1cZlJlcGVh -dFNoZWV00wAOAJAAkQNdBUkFSoCugQEggQEm1wCXAA4ApgD1AJgA9gCcA64BQgVOBU8A6wD7A66Au4Az -gQEhgQEiCYC7XxAWe3szMTgsIDE5MX0sIHs1OCwgNTZ9fd0A/wAOAUoCJgFLAUwBTgEBAQIBAwFPAQQB -UAEGAVEFVQVWAikA1gFSBVUDwAVJAi4BWwPCgDKBASOBASSAMIEBI4C/gQEgVFN0b3DTAA4AMgJ+An8C -gAVfgG2Aa4EBJVRzdG9wVXN0b3A61AAOAI8AkACRAJIAlAGvBWaApoAKgEKBAShaZGF0YVNvdXJjZdQA -DgCPAJAAkQCSAJQBrwVsgKaACoBCgQEqWGRlbGVnYXRl1AAOAI8AkACRA10AlADxA2CAroAKgDSArdQA -DgCPAJAAkQCSBXUAHwV3gKaBAS2AAoEBM9cAlwAOAKYA9QCYAPYAnAOuAUIFewV8AOsA+wOugLuAM4EB -LoEBLwmAu18QFnt7MTQ5LCAxOTd9LCB7NTgsIDU2fX3dAP8ADgFKAiYBSwFMAU4BAQECAQMBTwEEAVAB -BgFRBYIFgwIpANYBUgWCA8AFdQIuAVsDwoAygQEwgQExgDCBATCAv4EBLVdab29tIElu0wAOADICfgJ/ -AoAFjIBtgGuBATJWem9vbWluXnpvb21JblRvb2xJdGVt0wAOAJAAkQNdBZEFkoCugQE1gQE71wCXAA4A -pgD1AJgA9gCcA64BQgWWBZcA6wD7A66Au4AzgQE2gQE3CYC7XxAWe3sxMTAsIDI3Nn0sIHs1OCwgNTZ9 -fd0A/wAOAUoCJgFLAUwBTgEBAQIBAwFPAQQBUAEGAVEFnQWeAikA1gFSBZ0DwAWRAi4BWwPCgDKBATiB -ATmAMIEBOIC/gQE1WFNob3cgTG9n0wAOADICfgJ/AoAFp4BtgGuBATpXY29uc29sZVhzaG93TG9nOtQA -DgCPAJAAkQCSBawAHwWugKaBAT2AAoEBQ9cAlwAOAKYA9QCYAPYAnAOuAUIFsgWzAOsA+wOugLuAM4EB -PoEBPwmAu18QFnt7MjE4LCAxOTd9LCB7NTgsIDU2fX3dAP8ADgFKAiYBSwFMAU4BAQECAQMBTwEEAVAB -BgFRBbkFugIpANYBUgW5A8AFrAIuAVsDwoAygQFAgQFBgDCBAUCAv4EBPVhab29tIE91dNMADgAyAn4C -fwKABcOAbYBrgQFCV3pvb21vdXRfEA96b29tT3V0VG9vbEl0ZW3UAA4AjwCQAJEDXQCUBckFyoCugAqB -AUWBAWDYAJcADgCmAPUAmAD2AJoAnAXMBc0FzgXPBdAA+wChBcyBAUaBAV+BAUeBAUgRAQkJgA2BAUbX -AJcADgCoAJgAmQCaAJwF1QDoBdcA6wXYAKEF1YECxoCggQLIgQLvgA2BAsZfEBV7ezc0MCwgNDJ9LCB7 -OTEsIDI2fX3fEBMA/wQsBC0BSgFLAA4BTAFNAU4BAgQuAQMELwQwBDEBTwEEBA4BUAQyAPsBVAFSAikE -NQFUBDYF4QEKBeMFyQEqAPsA+wIuBecF6AQ+CYAwgQFegQFJgQFKgB+BAUuBAUUJCRIBAAgAgQFM1AAO -ARABEQESARMBFAEVAjSAIYAg0gAOAN0A3gFegBbcAy4ADgQIBAkECgQLBAwEDQQOAy8BQAQPBc8EEQXx -BBMBUgQVBBYEFwXoBfYF9wFUgQFIgNeBAU2AMIDRgNOBAUyBAU4RBATTAA4ECAQbBBwF+gX7gQFdgQFP -gQFQUzQvNNIADgDdAN4F/4AWWk90aGVyVmlld3PSAA4APgBGBgKAX6UF4wYEBgUGBgYHgQFLgQFRgQFU -gQFXgQFa2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAFzwQRBgsEEwFSBBUEFgQXBegGEAYRgQFIgNeBAVKA -MIDRgNOBAUyBAVMRBghTNi842wMuAA4ECAQJBAoECwQMBA0EDgMvAUAFzwQRBhYEEwFSBBUEFgQXBegG -GwYcgQFIgNeBAVWAMIDRgNOBAUyBAVYRAwRTMy802wMuAA4ECAQJBAoECwQMBA0EDgMvAUAFzwQRBiEE -EwFSBBUEFgQXBegGJgYngQFIgNeBAViAMIDRgNOBAUyBAVkRDAhUMTIvONsDLgAOBAgECQQKBAsEDAQN -BA4DLwFABc8EEQYsBBMBUgQVBBYEFwXoBjEGMoEBSIDXgQFbgDCA0YDTgQFMgQFcEQUEUzUvNNIANwA4 -BjUEDqIEDgA70gA3ADgGNwY4pgY4BjkBYgE6APUAO18QEU5TUG9wVXBCdXR0b25DZWxsXk5TTWVudUl0 -ZW1DZWxs0gA3ADgGOwY8pgY8AWUBPgC5AL0AO11OU1BvcFVwQnV0dG9uWHNldFRpbWU61AAOAI8AkACR -AJIGQACUBkKApoEBYoAKgQF52ACXAA4ApgD1AJgA9gCaAJwFzAXNBkYGRwXQAPsAoQXMgQFGgQFfgQFj -gQFkCYANgQFGXxAWe3s4MzMsIDQyfSwgezEzMCwgMjZ9fd8QFAD/BCwELQFKAUsADgFMAU0BTgECBC4B -AwQvBDAEMQFPAQQEDgFQBk0EMgD7AVQBUgIpBDUBVAQ2BlIBCgZUBkABKgD7APsCLgXnBlgEPgZZXxAP -TlNTZWxlY3RlZEluZGV4CYAwgQFegQFJgQFlgB+BAWaBAWIJCYEBZxAF0gAOAN0A3gFegBbcAy4ADgQI -BAkECgQLBAwEDQQOAy8BQAQPBkcEEQZfBBMBUgQVBBYEFwZYBmQGZQFUgQFkgNeBAWiAMIDRgNOBAWeB -AWkQDNMADgQIBBsEHAZoBmmBAV2BAWqBAWtSMTLSAA4A3QDeBf+AFtIADgA+AEYGb4BfpgZwBnEGcgZz -BnQGVIEBbIEBb4EBcoEBdYEBd4EBZtsDLgAOBAgECQQKBAsEDAQNBA4DLwFABkcEEQZ5BBMBUgQVBBYE -FwZYBn4A1oEBZIDXgQFtgDCA0YDTgQFngQFuXDIgKFN0cmFpZ2h0KdsDLgAOBAgECQQKBAsEDAQNBA4D -LwFABkcEEQaDBBMBUgQVBBYEFwZYBogBKoEBZIDXgQFwgDCA0YDTgQFngQFxWTMgKFN3aW5nKdsDLgAO -BAgECQQKBAsEDAQNBA4DLwFABkcEEQaNBBMBUgQVBBYEFwZYBpIAr4EBZIDXgQFzgDCA0YDTgQFngQF0 -XjQgKFNpeHRlZW50aHMp2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGRwQRAt0EEwFSBBUEFgQXBlgGnAEi -gQFkgNeAgoAwgNGA04EBZ4EBdtsDLgAOBAgECQQKBAsEDAQNBA4DLwFABkcEEQKoBBMBUgQVBBYEFwZY -BqUGpoEBZIDXgHeAMIDRgNOBAWeBAXgQCF1mRGl2aXNpb25NZW510wAOAJAAkQNdBqoGq4CugQF7gQGB -1wCXAA4ApgD1AJgA9gCcA64BQgavBrAA6wD7A66Au4AzgQF8gQF9CYC7XxAWe3syNjcsIDI3MX0sIHs1 -OCwgNTZ9fd0A/wAOAUoCJgFLAUwBTgEBAQIBAwFPAQQBUAEGAVEGtga3AikA1gFSBrYDwAaqAi4BWwPC -gDKBAX6BAX+AMIEBfoC/gQF7VFBsYXnTAA4AMgJ+An8CgAbAgG2Aa4EBgFNydW5VcGxheTrUAA4AjwCQ -AJEDXQCUBsYGx4CugAqBAYOBAeLYAJcADgCmAPUAmAD2AJoAnAXMBc0GywbMBdAA+wChBcyBAUaBAV+B -AYSBAYUJgA2BAUZfEBV7ezY1NiwgNDJ9LCB7ODIsIDI2fX3fEBQA/wQsBC0BSgFLAA4BTAFNAU4BAgQu -AQMELwQwBDEBTwEEBA4BUAZNBDIA+wFUAVICKQQ1AVQENgbWAQoG2AbGASoA+wD7Ai4F5wbcBD4G3QmA -MIEBXoEBSYEBhoAfgQGHgQGDCQmBAYgQHNIADgDdAN4BXoAW3AMuAA4ECAQJBAoECwQMBA0EDgMvAUAE -DwbMBBEG4wQTAVIEFQQWBBcG3AboBukBVIEBhYDXgQGJgDCA0YDTgQGIgQGKEQT/0wAOBAgEGwQcBuwG -7YEBXYEBi4EBjFNDI23SAA4A3QDeBf+AFtIADgA+AEYG84BfrxAfBvQG9Qb2BvcG+Ab5BvoG+wb8Bv0G -/gb/BwAHAQcCBwMHBAcFBwYHBwcIBwkHCgcLBwwHDQcOBw8G2AcRBxKBAY2BAZCBAZKBAZWBAZiBAZuB -AZ6BAaGBAaSBAaaBAamBAayBAa+BAbKBAbWBAbiBAbqBAb2BAb+BAcKBAcWBAciBAcuBAc6BAdGBAdOB -AdaBAdmBAYeBAdyBAd/bAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEHFgQTAVIEFQQWBBcG3AcbAVSB -AYWA14EBjoAwgNGA04EBiIEBj1FD3AMuAA4ECAQJBx4ECgcfBAsEDAQNBA4DLwbMBBEBUgQTAPsBUgD7 -BBUEFgQXBtwHKV1OU0lzU2VwYXJhdG9yXE5TSXNEaXNhYmxlZIEBhYDXgDAJgDAJgNGA04EBiIEBkdsD -LgAOBAgECQQKBAsEDAQNBA4DLwFABswEEQctBBMBUgQVBBYEFwbcBzIHM4EBhYDXgQGTgDCA0YDTgQGI -gQGUE/////////8BUUbbAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEHOAQTAVIEFQQWBBcG3Ac9Bz6B -AYWA14EBloAwgNGA04EBiIEBlxP////////+AWIAQiZt2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGzAQR -B0MEEwFSBBUEFgQXBtwHSAdJgQGFgNeBAZmAMIDRgNOBAYiBAZoT/////////QFiAEUmbdsDLgAOBAgE -CQQKBAsEDAQNBA4DLwFABswEEQdOBBMBUgQVBBYEFwbcB1MHVIEBhYDXgQGcgDCA0YDTgQGIgQGdE/// -//////wBYgBBJm3bAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEHWQQTAVIEFQQWBBcG3AdeB1+BAYWA -14EBn4AwgNGA04EBiIEBoBP////////7AWIARCZt2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGzAQRB2QE -EwFSBBUEFgQXBtwHaQdqgQGFgNeBAaKAMIDRgNOBAYiBAaMT////////+gFiAEcmbd0DLgAOBAgECQce -BAoHHwQLBAwEDQQOAy8EDwbMBBEBUgQTAPsBUgD7BBUEFgQXBtwHdgFUgQGFgNeAMAmAMAmA0YDTgQGI -gQGl2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGzAQRB3oEEwFSBBUEFgQXBtwHfweAgQGFgNeBAaeAMIDR -gNOBAYiBAagRAQFRR9sDLgAOBAgECQQKBAsEDAQNBA4DLwFABswEEQeFBBMBUgQVBBYEFwbcB4oHi4EB -hYDXgQGqgDCA0YDTgQGIgQGrEQIBUUTbAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEHkAQTAVIEFQQW -BBcG3AeVB5aBAYWA14EBrYAwgNGA04EBiIEBrhEDAVFB2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGzAQR -B5sEEwFSBBUEFgQXBtwHoAehgQGFgNeBAbCAMIDRgNOBAYiBAbERBAFRRdsDLgAOBAgECQQKBAsEDAQN -BA4DLwFABswEEQemBBMBUgQVBBYEFwbcB6sHrIEBhYDXgQGzgDCA0YDTgQGIgQG0EQUBUULbAy4ADgQI -BAkECgQLBAwEDQQOAy8BQAbMBBEHsQQTAVIEFQQWBBcG3Ae2B7eBAYWA14EBtoAwgNGA04EBiIEBtxEG -AVJGI9wDLgAOBAgECQceBAoHHwQLBAwEDQQOAy8GzAQRAVIEEwD7AVIA+wQVBBYEFwbcB8OBAYWA14Aw -CYAwCYDRgNOBAYiBAbnbAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEHxwQTAVIEFQQWBBcG3AfMB82B -AYWA14EBu4AwgNGA04EBiIEBvBD/UkFt3AMuAA4ECAQJBx4ECgcfBAsEDAQNBA4DLwbMBBEBUgQTAPsB -UgD7BBUEFgQXBtwH2YEBhYDXgDAJgDAJgNGA04EBiIEBvtsDLgAOBAgECQQKBAsEDAQNBA4DLwFABswE -EQfdBBMBUgQVBBYEFwbcB+IB0IEBhYDXgQHAgDCA0YDTgQGIgQHBUkRt2wMuAA4ECAQJBAoECwQMBA0E -DgMvAUAGzAQRB+cEEwFSBBUEFgQXBtwH7AftgQGFgNeBAcOAMIDRgNOBAYiBAcQT/////////v9SR23b -Ay4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEH8gQTAVIEFQQWBBcG3Af3B/iBAYWA14EBxoAwgNGA04EB -iIEBxxP////////9/1JDbdsDLgAOBAgECQQKBAsEDAQNBA4DLwFABswEEQf9BBMBUgQVBBYEFwbcCAII -A4EBhYDXgQHJgDCA0YDTgQGIgQHKE/////////z/UkZt2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAGzAQR -CAgEEwFSBBUEFgQXBtwIDQgOgQGFgNeBAcyAMIDRgNOBAYiBAc0T////////+/9jAEImbQBt2wMuAA4E -CAQJBAoECwQMBA0EDgMvAUAGzAQRCBMEEwFSBBUEFgQXBtwIGAgZgQGFgNeBAc+AMIDRgNOBAYiBAdAT -////////+v9jAEUmbQBt3AMuAA4ECAQJBx4ECgcfBAsEDAQNBA4DLwbMBBEBUgQTAPsBUgD7BBUEFgQX -BtwIJYEBhYDXgDAJgDAJgNGA04EBiIEB0tsDLgAOBAgECQQKBAsEDAQNBA4DLwFABswEEQgpBBMBUgQV -BBYEFwbcCC4IL4EBhYDXgQHUgDCA0YDTgQGIgQHVEQH/UkVt2wMuAA4ECAQJBAoECwQMBA0EDgMvAUAG -zAQRCDQEEwFSBBUEFgQXBtwIOQg6gQGFgNeBAdeAMIDRgNOBAYiBAdgRAv9SQm3bAy4ADgQIBAkECgQL -BAwEDQQOAy8BQAbMBBEIPwQTAVIEFQQWBBcG3AhECEWBAYWA14EB2oAwgNGA04EBiIEB2xED/1NGI23b -Ay4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEISgQTAVIEFQQWBBcG3AhPCFCBAYWA14EB3YAwgNGA04EB -iIEB3hEF/1NHI23bAy4ADgQIBAkECgQLBAwEDQQOAy8BQAbMBBEIVQQTAVIEFQQWBBcG3AhaCFuBAYWA -14EB4IAwgNGA04EBiIEB4REG/1NEI21Xc2V0S2V5OtQADgCPAJAAkQCSBZEAHwhigKaBATWAAoEB5Fts -b2dUb29sSXRlbdQADgCPAJAAkQNdAJQDfQhogK6ACoCwgQHmXxAQaGlkZUZpZWxkRWRpdG9yOtQADgCP -AJAAkQNdAJQIbQhugK6ACoEB6IEB7tcAlwAOAKYA9QCYAPYAnAOuAUIIcghzAOsA+wOugLuAM4EB6YEB -6gmAu18QFXt7MTgsIDEyMn0sIHs1OCwgNjV9fd0A/wAOAUoCJgFLAUwBTgEBAQIBAwFPAQQBUAEGAVEI -eQh6AikA1gFSCHkDwAhtAi4BWwPCgDKBAeuBAeyAMIEB64C/gQHoV0Rpc3BsYXnTAA4AMgJ+An8CgAiD -gG2Aa4EB7VdkaXNwbGF5XxATZWRpdERpc3BsYXlPcHRpb25zOtQADgCPAJAAkQCSBFsAlAiKgKaA4YAK -gQHwWmZSZXBlYXRNc2fUAA4AjwCQAJEAkgQ6AJQIkICmgQHygAqBAf/YAJcADgCmAPUAmAD2AJoAnAXM -Bc0IlAQQAOsA+wChBcyBAUaBAV+BAfOA1gmADYEBRl8QFnt7NDk4LCAxOH0sIHsxMzAsIDI2fX3SAA4A -3QDeAV6AFtIADgDdAN4F/4AW0gAOAD4ARgiggF+kBAUIogijCKSAzoEB94EB+YEB/NwDLgAOBAgECQce -BAoHHwQLBAwEDQQOAy8EEAQRAVIEEwD7AVIA+wQVBBYEFwQYCK+A1oDXgDAJgDAJgNGA04DPgQH42gMu -AA4ECAQJBAoECwQMBA0EDgMvBBAEEQizBBMBUgQVBBYEFwQYCLiA1oDXgQH6gDCA0YDTgM+BAftVU3dp -bmfaAy4ADgQIBAkECgQLBAwEDQQOAy8EEAQRCL0EEwFSBBUEFgQXBBgIwoDWgNeBAf2AMIDRgNOAz4EB -/llCb3NzYU5vdmFbZkdyb292ZU1lbnXUAA4AjwCQAJEAkgCUAB8IyYCmgAqAAoECAVlzaGVldFZpZXfU -AA4AjwCQAJEAkgaqAB8Iz4CmgQF7gAKBAgNccGxheVRvb2xJdGVt1AAOAI8AkACRA10AlARhA2CAroAK -gQEWgK3UAA4AjwCQAJEAkgjYAJQI2oCmgQIGgAqBArjeAL8ADgDAAMEAwgDDAMQAxQDGAMcAyADJAMoA -ywPuAM0I3gjfANAA0QDSCOII4wjkANYA1wjlCOaAyoCkgQIJgQK1gBOAFIECCoECB4ECt4ECtoECCF8Q -GHt7NDE3LCAyMDR9LCB7NTQzLCAxODl9fdIADgDdAN4A34AW0gAOAD4ARgjsgF+kA+sI7gjvCPCAyYEC -DIECEIECZtgAlwAOAKYA9QCYAPYAnAFAA+4BQgj0CPUA6wD7A+4BgIDKgDOBAg2BAg4JgMpfEBZ7ezQx -NiwgMTJ9LCB7MTEzLCAzMn193gD/AA4BSgFLAUwBTQFOAQEBAgEDAU8BBAFQAUABgwFRAVIBUwFUAQoB -hwj+AQoI7gFaAVsBXAGAgDKAMIAfgD2BAg+AH4ECDFJPS90AlwkDAA4JBACmCQUAqACYCQYJBwkIAJwB -lAPuAcQJCgkLCQwEpgkOCQ8BVAkQANYD7gkSWU5TQm94VHlwZVtOU1RpdGxlQ2VsbF1OU1RyYW5zcGFy -ZW50XE5TQm9yZGVyVHlwZVlOU09mZnNldHNfEA9OU1RpdGxlUG9zaXRpb26AyoECZYECYoECYAiBAhEQ -JIECYYDKgQIS0gAOAD4ARgkVgF+hCRKBAhLWAJcADgCmAKgAmACcCO8A6AkaCRsA6wjvgQIQgKCBAl+B -AhOBAhDSAA4APgBGCR+AX6cJIAkhCSIJIwkkCSUJJoECFIECGIECKYECLYECPoECQoECRtcAlwAOAKYA -9QCYAPYAnAkSAPgJKgkrAOsA+wkSgQISgCuBAhWBAhYJgQISXxAVe3sxMDksIDcyfSwgezY5LCAxN319 -2AD/AA4BAAEBAQIBAwEEAQUBBgEHALQJMgEKCSABDAENgCqAIoECF4AfgQIUgCdUVG9wOtcAlwAOAKYA -9QCYAPYAnAkSBc0JOgk7AOsA+wkSgQISgQFfgQIZgQIaCYECEl8QFXt7MTY0LCA2Nn0sIHs2NSwgMjZ9 -fd8QEwD/BCwELQFKAUsADgFMAU0BTgECBC4BAwQvBDAEMQFPAQQEDgFQBDIA+wFUAVICKQQ1AVQENglE -AQoJRgkhASoA+wD7Ai4AsQlKBD4JgDCBAV6BAUmBAhuAH4ECHIECGAkJgQId0gAOAN0A3gFegBbbAy4A -DgQIBAkECgQLBAwEDQQOAy8EDwk7BBEEnwQTAVIEFQQWBBcJSglVAVSBAhqA14D+gDCA0YDTgQIdgQIe -0wAOBAgEGwQcCVgJWYEBXYECH4ECINIADgDdAN4F/4AW0gAOAD4ARglegF+lCUYJYAlhCWIJY4ECHIEC -IYECI4ECJYECJ9oDLgAOBAgECQQKBAsEDAQNBA4DLwk7BBECBwQTAVIEFQQWBBcJSglsgQIagNeATYAw -gNGA04ECHYECItoDLgAOBAgECQQKBAsEDAQNBA4DLwk7BBECagQTAVIEFQQWBBcJSgl1gQIagNeAZ4Aw -gNGA04ECHYECJNoDLgAOBAgECQQKBAsEDAQNBA4DLwk7BBECkAQTAVIEFQQWBBcJSgl+gQIagNeAcYAw -gNGA04ECHYECJtoDLgAOBAgECQQKBAsEDAQNBA4DLwk7BBECiAQTAVIEFQQWBBcJSgmHgQIagNeAb4Aw -gNGA04ECHYECKNcAlwAOAKYA9QCYAPYAnAkSAPgJiwmMAOsA+wkSgQISgCuBAiqBAisJgQISXxAVe3sx -MDksIDQ2fSwgezYyLCAxN3192AD/AA4BAAEBAQIBAwEEAQUBBgEHALQJkwEKCSIBDAENgCqAIoECLIAf -gQIpgCdfEBZCb3R0b206CiAKTGVkZ2VyIExpbmVz1wCXAA4ApgD1AJgA9gCcCRIFzQmbCZwA6wD7CRKB -AhKBAV+BAi6BAi8JgQISXxAVe3sxNjQsIDQwfSwgezY1LCAyNn193xATAP8ELAQtAUoBSwAOAUwBTQFO -AQIELgEDBC8EMAQxAU8BBAQOAVAEMgD7AVQBUgIpBDUBVAQ2CaUBCgmnCSMBKgD7APsCLgCxCasEPgmA -MIEBXoEBSYECMIAfgQIxgQItCQmBAjLSAA4A3QDeAV6AFtsDLgAOBAgECQQKBAsEDAQNBA4DLwQPCZwE -EQSfBBMBUgQVBBYEFwmrCbYBVIECL4DXgP6AMIDRgNOBAjKBAjPTAA4ECAQbBBwJuQm6gQFdgQI0gQI1 -0gAOAN0A3gX/gBbSAA4APgBGCb+AX6UJpwnBCcIJwwnEgQIxgQI2gQI4gQI6gQI82gMuAA4ECAQJBAoE -CwQMBA0EDgMvCZwEEQIHBBMBUgQVBBYEFwmrCc2BAi+A14BNgDCA0YDTgQIygQI32gMuAA4ECAQJBAoE -CwQMBA0EDgMvCZwEEQJqBBMBUgQVBBYEFwmrCdaBAi+A14BngDCA0YDTgQIygQI52gMuAA4ECAQJBAoE -CwQMBA0EDgMvCZwEEQKQBBMBUgQVBBYEFwmrCd+BAi+A14BxgDCA0YDTgQIygQI72gMuAA4ECAQJBAoE -CwQMBA0EDgMvCZwEEQKIBBMBUgQVBBYEFwmrCeiBAi+A14BvgDCA0YDTgQIygQI91wCXAA4ApgD1AJgA -9gCcCRIA+AnsCe0A6wD7CRKBAhKAK4ECP4ECQAmBAhJfEBR7ezE1LCA3Mn0sIHs5MiwgMTd9fdgA/wAO -AQABAQECAQMBBAEFAQYBBwC0CfQBCgkkAQwBDYAqgCKBAkGAH4ECPoAnXExlZGdlciBMaW5lc9cAlwAO -AKYA9QCYAPYAnAkSAPgJ/An9AOsA+wkSgQISgCuBAkOBAkQJgQISXxAVe3sxNSwgMTR9LCB7MTE0LCAx -N3192AD/AA4BAAEBAQIBAwEEAQUBBgEHALQKBAEKCSUBDAENgCqAIoECRYAfgQJCgCdfEA9MeXJpY3Mg -U3RhbnphczrXAJcADgCmAPUAmAD2AJwJEgXNCgwKDQDrAPsJEoECEoEBX4ECR4ECSAmBAhJfEBR7ezE2 -NCwgOH0sIHs2NSwgMjZ9fd8QFAD/BCwELQFKAUsADgFMAU0BTgECBC4BAwQvBDAEMQFPAQQEDgFQBk0E -MgD7AVQBUgIpBDUBVAQ2ChYBCgoYCSYBKgD7APsCLgCxChwEPgamCYAwgQFegQFJgQJJgB+BAkqBAkYJ -CYECS9IADgDdAN4BXoAW2wMuAA4ECAQJBAoECwQMBA0EDgMvBA8KDQQRAqgEEwFSBBUEFgQXChwKJwFU -gQJIgNeAd4AwgNGA04ECS4ECTNMADgQIBBsEHAoqCiuBAV2BAk2BAk7SAA4A3QDeBf+AFtIADgA+AEYK -MIBfqQoxCjIKMwo0CjUKNgo3CjgKGIECT4ECUYECU4ECVYECV4ECWYECW4ECXYECStoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBEEnwQTAVIEFQQWBBcKHApCgQJIgNeA/oAwgNGA04ECS4ECUNoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBECBwQTAVIEFQQWBBcKHApLgQJIgNeATYAwgNGA04ECS4ECUtoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBECagQTAVIEFQQWBBcKHApUgQJIgNeAZ4AwgNGA04ECS4ECVNoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBECkAQTAVIEFQQWBBcKHApdgQJIgNeAcYAwgNGA04ECS4ECVtoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBECiAQTAVIEFQQWBBcKHApmgQJIgNeAb4AwgNGA04ECS4ECWNoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBECxgQTAVIEFQQWBBcKHApvgQJIgNeAfYAwgNGA04ECS4ECWtoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBEC3QQTAVIEFQQWBBcKHAp4gQJIgNeAgoAwgNGA04ECS4ECXNoDLgAOBAgECQQK -BAsEDAQNBA4DLwoNBBEC9AQTAVIEFQQWBBcKHAqBgQJIgNeAh4AwgNGA04ECS4ECXl8QFHt7MSwgMX0s -IHsyNDQsIDEwMH19XxAWe3sxNywgNTN9LCB7MjQ2LCAxMTZ9fVZ7MCwgMH3XAP8ADgEAAQEBAgEEAQUB -BgEHA5UKiAISAcQKioAqgLSBAmOAT4ECZF8QD0Rpc3BsYXkgT3B0aW9uc9MADgEdASgBIAEqCo6AJk0w -IDAuODAwMDAwMDEA0gA3ADgKkAqRpAqRALkAvQA7VU5TQm943QCXCQMADgkEAKYJBQCoAJgJBgkHCQgA -nAGUA+4BxAkKCpUKlgSmCpgJDwFUCRAA1gPuCpuAyoECZYECsYECsAiBAmeBAmGAyoECaNIADgA+AEYK -noBfoQqbgQJo1gCXAA4ApgCoAJgAnAjwAOgKowqkAOsI8IECZoCggQKvgQJpgQJm0gAOAD4ARgqogF+o -CqkKqgqrCqwKrQquCq8KsIECaoECfIECgIECg4ECh4ECi4ECmYECq9cAlwAOAKYA9QCYAPYAnAqbCrMK -tAq1CrYA+wqbgQJogQJ7gQJrgQJsEQEMCYECaF8QFXt7MTU2LCAxMH0sIHs2MCwgMjZ9fd4KuwD/AA4B -AAEBAQIBAwEECrwDkgq9AdYKvgEFCqkKwArBA5UC3QEKCqkKxgrHAPsGWQrJAPsBDVpOU0RlbGVnYXRl -XxAPTlNQb3BVcExpc3REYXRhXxASTlNWaXNpYmxlSXRlbUNvdW50XxAVTlNIYXNWZXJ0aWNhbFNjcm9s -bGVygQJqEhRx/kCBAnqAtICCgB+BAmoSEEAEAIECbQmBAm8JgCfSAA4APgBGCs6AX6QKzwSfAgcCaoEC -boD+gE2AZ1ItMd8QFgCXCrsDLgG5AbgADgEAAbsBvAG9Ab4K1QCYAJkA9gCaAy8BvwHAAJwBwQHCCtYK -tQq1CtkBxAraAbAA+wHLAVQBzAq1AJ8K3gD7CuAK4QHPCuMK1grlCuZcTlNEYXRhU291cmNlgQJwgQJs -gQJsE//////SYIAAgQJ5gJIJgQJsgQJxCYECcoECeICNEA+BAnCBAnMjQDMAAAAAAABYezEzLCA4NH3S -AA4APgBGCuqAX6EK64ECdNoK7QAOAf4B/wIAAgEK7gICAgMB1gD7AgUK8QJFA8YK8wEqA8YK9ArJXk5T -SXNSZXNpemVhYmxlXk5TUmVzaXppbmdNYXNrCYBlgQJ1gFqBAncjQI9AAAAAAACBAm/XAP8ADgEAAQEB -AgEEAQUCDgIPCvgBUgIsAcQByIBTgQJ2gDCAVYB00wAOAR0BKAEgASoCG4Am2QD/AA4BAAEBAQIBAwEE -A5IBBQr/AQcBsAIHAQoKyQsFAPsBDRIUMf5AgCqAkoBNgB+BAm8RBAAJgCdfEBB0YWJsZVZpZXdBY3Rp -b2460gA3ADgLCgsLpgsLAdYBPgC5AL0AO18QEE5TQ29tYm9UYWJsZVZpZXfSADcAOAsNCw6lCw4BOQE6 -APUAO15OU0NvbWJvQm94Q2VsbNIANwA4CxALEaYLEQE9AT4AuQC9ADtaTlNDb21ib0JveNcAlwAOAKYA -9QCYAPYAnAqbAPgLFQsWCrYA+wqbgQJogCuBAn2BAn4JgQJoXxAUe3s5NywgMTV9LCB7NTQsIDE3fX3Y -AP8ADgEAAQEBAgEDAQQBBQsbAQcAtAseAQoKqgrGAQ0SBAH+QIAqgCKBAn+AH4ECfIAnV0x5cmljczrX -AJcADgCmAPUAmAD2AJwKmwD4CyYLJwq2APsKm4ECaIArgQKBgQKCCYECaF8QFHt7OTcsIDY3fSwgezU0 -LCAxN3192AD/AA4BAAEBAQIBAwEEAQULGwEHALQBUgEKCqsKxgENgCqAIoAwgB+BAoCAJ9cAlwAOAKYA -9QCYAPYAnAqbAPgLNQs2CrYA+wqbgQJogCuBAoSBAoUJgQJoXxAUe3sxNSwgNDN9LCB7NjksIDE3fX3Y -AP8ADgEAAQEBAgEDAQQBBQsbAQcAtAs9AQoKrArGAQ2AKoAigQKGgB+BAoOAJ1pGb250IFNpemVz1wCX -AA4ApgD1AJgA9gCcCpsA+AtFC0YKtgD7CpuBAmiAK4ECiIECiQmBAmhfEBR7ezk3LCA0M30sIHs1NCwg -MTd9fdgA/wAOAQABAQECAQMBBAEFCxsBBwC0C00BCgqtCsYBDYAqgCKBAoqAH4ECh4AnV0Nob3JkczrX -AJcADgCmAPUAmAD2AJwKmwqzC1ULVgq2APsKm4ECaIECe4ECjIECjQmBAmhfEBV7ezE1NiwgMzh9LCB7 -NjAsIDI2fX3eCrsA/wAOAQABAQECAQMBBAq8A5IKvQHWCr4BBQquCsAKwQOVAt0BCgquCsYLYQD7BlkL -YwD7AQ2BAouBAnqAtICCgB+BAouBAo4JgQKPCYAn0gAOAD4ARgtogF+kAogCxgLdAvSAb4B9gIKAh98Q -FgCXCrsDLgG5AbgADgEAAbsBvAG9Ab4K1QCYAJkA9gCaAy8BvwHAAJwBwQHCC24LVgtWCtkBxAraAbAA -+wHLAVQBzAtWAJ8LdQD7C3cLeAHPCuMLbgt7CuaBApCBAo2BAo2BAnmAkgmBAo2BApEJgQKSgQKYgI2B -ApCBApPSAA4APgBGC36AX6ELf4EClNoK7QAOAf4B/wIAAgEK7gICAgMB1gD7AgULgwJFA8YLhQEqA8YK -9AtjCYBlgQKVgFqBApeBAo/XAP8ADgEAAQEBAgEEAQUCDgIPC4kBUgIsAcQByIBTgQKWgDCAVYB00wAO -AR0BKAEgASoCG4Am2AD/AA4BAAECAQMBBAOSAQUK/wEHAbABCgtjCwUA+wENgCqAkoAfgQKPCYAn1wCX -AA4ApgD1AJgA9gCcCpsKswuZC5oKtgD7CpuBAmiBAnuBApqBApsJgQJoXxAVe3sxNTYsIDYyfSwgezYw -LCAyNn193gq7AP8ADgEAAQEBAgEDAQQKvAOSCr0B1gq+AQUKrwrACsEDlQuiAQoKrwrGC6UA+wZZC6cA -+wENgQKZgQJ6gLSBApyAH4ECmYECnQmBAqEJgCdUMTkuNdIADgA+AEYLrYBfpAK+C68LsAuxgHuBAp6B -Ap+BAqBSMThSMjBSMjLfEBYAlwq7Ay4BuQG4AA4BAAG7AbwBvQG+CtUAmACZAPYAmgMvAb8BwACcAcEB -wgu2C5oLmgrZAcQK2gGwAPsBywFUAcwLmgCfC70A+wu/C8ABzwrjC7YLwwrmgQKigQKbgQKbgQJ5gJIJ -gQKbgQKjCYECpIECqoCNgQKigQKl0gAOAD4ARgvGgF+hC8eBAqbaCu0ADgH+Af8CAAIBCu4CAgIDAdYA -+wIFC8sCRQPGC80BKgPGCvQLpwmAZYECp4BagQKpgQKh1wD/AA4BAAEBAQIBBAEFAg4CDwvRAVICLAHE -AciAU4ECqIAwgFWAdNMADgEdASgBIAEqAhuAJtgA/wAOAQABAgEDAQQDkgEFCv8BBwGwAQoLpwsFAPsB -DYAqgJKAH4ECoQmAJ9cAlwAOAKYA9QCYAPYAnAqbAPgL4QviCrYA+wqbgQJogCuBAqyBAq0JgQJoXxAU -e3sxNSwgNjd9LCB7NjksIDE3fX3YAP8ADgEAAQEBAgEDAQQBBQsbAQcAtAvpAQoKsArGAQ2AKoAigQKu -gB+BAquAJ1pTdGFmZiBTaXplXxATe3sxLCAxfSwgezIzMSwgOTZ9fV8QF3t7MjkzLCA1Nn0sIHsyMzMs -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 -ZktleU1lbnXUAA4AjwCQAJEDXQCUAPADYICugAqALICt1AAOAI8AkACRAJIAlAN9DduApoAKgLCBAy5b -bmV4dEtleVZpZXfTAA4AkACRA10FrA3ggK6BAT2BAzBYem9vbU91dDrUAA4AjwCQAJEDXQN9DUYN5oCu -gLCBAwCBAzJbc2VsZWN0VGV4dDrXAA4Ajw3pDeoAkACRDesN7AAfDe4N7wkhDfEA1llOU0tleVBhdGhZ -TlNCaW5kaW5nXxAcTlNOaWJCaW5kaW5nQ29ubmVjdG9yVmVyc2lvboEDN4ACgQM2gQM1gQIYgQM0XxAg -c2VsZWN0ZWRJbmRleDogZWRpdE51bVRvcExlZGdlcnNdc2VsZWN0ZWRJbmRleF8QEWVkaXROdW1Ub3BM -ZWRnZXJz0gA3ADgN9g33ow33A1sAO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctcADgCPDekN6gCQAJEN -6w3sAB8N+w3vCSYN/gDWgQM3gAKBAzqBAzWBAkaBAzlfEB1zZWxlY3RlZEluZGV4OiBlZGl0TnVtU3Rh -bnphc15lZGl0TnVtU3Rhbnphc9cADgCPDekN6gCQAJEN6w3sAB8OBA4FA30OBwDWgQM3gAKBAz6BAz2A -sIEDPF8QHXZhbHVlOiBlZGl0VGFyZ2V0LnN0cmluZ1ZhbHVlVXZhbHVlXxAWZWRpdFRhcmdldC5zdHJp -bmdWYWx1ZdcADgCPDekN6gCQAJEN6w3sAB8ODg4FBFwOEQDWgQM3gAKBA0GBAz2A5YEDQF8QG3ZhbHVl -OiBkb2N1bWVudC5yZXBlYXRWb2x0YV8QFGRvY3VtZW50LnJlcGVhdFZvbHRh1wAOAI8N6Q3qAJAAkQ3r -DewAHw4XDe8JIw4aANaBAzeAAoEDRIEDNYECLYEDQ18QIHNlbGVjdGVkSW5kZXg6IGVkaXROdW1Cb3RM -ZWRnZXJzXxARZWRpdE51bUJvdExlZGdlcnPXAA4Ajw3pDeoAkACRDesN7AAfDiAOBQxJDiMA1oEDN4AC -gQNHgQM9gQLkgQNGXxAZdmFsdWU6IGRvY3VtZW50LnNvbmdUZW1wb18QEmRvY3VtZW50LnNvbmdUZW1w -b9cADgCPDekN6gCQAJEN6w3sAB8OKQ4FCrUOLADWgQM3gAKBA0qBAz2BAmyBA0lfEBl2YWx1ZTogZG9j -dW1lbnQubHlyaWNTaXplXxASZG9jdW1lbnQubHlyaWNTaXpl1wAOAI8N6Q3qAJAAkQ3rDewAHw4ODgUE -XQ4RANaBAzeAAoEDQYEDPYEBDYEDQNcADgCPDekN6gCQAJEN6w3sAB8OOQ4FCq8OPADWgQM3gAKBA06B -Az2BApmBA01fEBl2YWx1ZTogZG9jdW1lbnQuc3RhZmZTaXplXxASZG9jdW1lbnQuc3RhZmZTaXpl1wAO -AI8N6Q3qAJAAkQ3rDewAHw5CDgUMRw5FANaBAzeAAoEDUYEDPYEC3YEDUF8QHHZhbHVlOiBkb2N1bWVu -dC5zb25nTHlyaWNpc3RfEBVkb2N1bWVudC5zb25nTHlyaWNpc3TXAA4Ajw3pDeoAkACRDesN7AAfDiAO -BQxKDiMA1oEDN4ACgQNHgQM9gQLogQNG1wAOAI8N6Q3qAJAAkQ3rDewAHw5SDgUMRQ5VANaBAzeAAoED -VYEDPYEC1YEDVF8QHHZhbHVlOiBkb2N1bWVudC5zb25nQ29tcG9zZXJfEBVkb2N1bWVudC5zb25nQ29t -cG9zZXLYAA4Ajw3pDeoAkACRDlkN6w3sAB8OXA5dA4oOXw5gANZZTlNPcHRpb25zgQM3gAKBA1mBA1iB -Av2BA1eBA1pfEBJoaWRkZW46IGVkaXRUYXJnZXRWaGlkZGVuWmVkaXRUYXJnZXTTAA4EqAA+BPEOZg5o -gQECoQ5ngQNboQ5pgQNcXxAWTlNWYWx1ZVRyYW5zZm9ybWVyTmFtZVdOU0lzTmls1wAOAI8N6Q3qAJAA -kQ3rDewAHw5vDgUMQg5yANaBAzeAAoEDX4EDPYECyYEDXl8QGXZhbHVlOiBkb2N1bWVudC5zb25nVGl0 -bGVfEBJkb2N1bWVudC5zb25nVGl0bGXXAA4Ajw3pDeoAkACRDesN7AAfDngOBQquDnsA1oEDN4ACgQNi -gQM9gQKLgQNhXxAZdmFsdWU6IGRvY3VtZW50LmNob3JkU2l6ZV8QEmRvY3VtZW50LmNob3JkU2l6ZdQA -DgCPDn8OgA6BA6sOgw6EWE5TTWFya2VyVk5TRmlsZYEDZoC6gQNlgQNkXxAQTlNUb29sVGlwSGVscEtl -eV8QG1R5cGVzZXQgYW5kIFNob3cgTGVhZCBTaGVldNIANwA4DogOiaIOiQA7XxARTlNJQkhlbHBDb25u -ZWN0b3LUAA4Ajw5/DoAOgQWRDo0OhIEDZoEBNYEDaIEDZF8QEFNob3cgQ29uc29sZSBMb2fUAA4Ajw5/ -DoAOgQaqDpMOhIEDZoEBe4EDaoEDZF1QbGF5IHRoZSBTb25n1AAOAI8Ofw6ADoEFdQWCDoSBA2aBAS2B -ATCBA2TUAA4Ajw5/DoAOgQWsBbkOhIEDZoEBPYEBQIEDZNQADgCPDn8OgA6BBUkOow6EgQNmgQEggQNu -gQNkXVN0b3AgUGxheWJhY2vUAA4Ajw5/DoAOgQhtDqkOhIEDZoEB6IEDcIEDZF8QHVNldCBEaXNwbGF5 -IGFuZCBQcmludCBPcHRpb25z0gAOAD4CQw6ugF6vENsLmgs2A9wB9wb/BSgD7gNfDUYGBQijBwEA7wvi -BwIC1gPxA2IKDQjwDQ0OxAD6CjUKGAo2BsYKrAyFA30G/gZ0CYwMRQn9AokGBw1HBBADBQREBTgKNAZY -DBIMSQH5CSAGQAH6DEQJYAqqBwoIpAxDBtwEXQWsAfgO6wnEAZYCqQxLBegEOgb8BwAI7wCUBZcKrgb4 -CrAMUQzKCjEKrw7+DOwNBgWzBU8JYQliAccJJQxIA9YFkQoyBIEMRgcEDHQBRAZHDEoKqQFqBnMEGAju -CcIFDgsWCPUJOwRbCacHCAnDAMwF4wb9BnIB9gwPAfUBrwPrCKIArAjYCycIcwb0CG0G9wOxAPEJ7QZU -AfsDqwReBrAHDAbMCSMJJAK/DKgFzw1lBFwKrQ20BqoFSQH8BnADhA1MBwYFyQtWAPMGBAq1BXwHBwOK -AmsMRwkmBGYHAwcFBAUJnAcOBnEG9QqrCjMM3AbYCUYMYwkhBdUHDwcJBgYKHAb5BXUCCQlKC0YJwQcL -A2UMlwljBHYKNwy5BxIBngkrDEIAkwb7Bw0Drgb6BxEG9gF9CjgA8AmrAu0JIgRhAPKBApuBAoWAx4Bu -gQGsgQEUgMqAqIEDAIEBVIEB+YEBsoAbgQKtgQG1gIOAzICpgQJIgQJmgQL4gQNygB2BAleBAkqBAlmB -AYOBAoOBAteAsIEBqYEBd4ECK4EC1YECRIB1gQFagQMGgNaAjIDagQEYgQJVgQFngQLEgQLkgHqBAhSB -AWKAf4EC0YECIYECfIEBy4EB/IECzYEBiIEBDYEBPYB2gQN+gQI8gJmAeYEC64EBTIEB8oEBpIEBr4EC -EIAKgQE3gQKLgQGYgQKrgQLLgQLmgQJPgQKZgQOAgQLtgQL6gQE/gQEigQIjgQIlgESBAkKBAuCAxYEB -NYECUYDogQLZgQG6gQLTgC6BAWSBAuiBAmqANoEBdYDPgQIMgQI4gQEPgQJ+gQIOgQIagOGBAjGBAcWB -AjqAGYEBS4EBpoEBcoBmgQK/gEyAQoDJgQH3gQL0gQIGgQKCgQHqgQGNgQHogQGVgL2ANIECQIEBZoCE -gLqBARKBAX2BAdGBAYWBAi2BAj6AfoEC34EBSIEDCIDlgQKHgQMkgQF7gQEggImBAWyAs4EDAoEBv4EB -RYECjYA+gQFRgQJsgQEvgQHCgQL9gGmBAt2BAkaA44EBuIEBvYDOgQIvgQHWgQFvgQGQgQKAgQJTgQLq -gQGHgQIcgQLPgQIYgQLGgQHZgQHIgQFXgQJLgQGbgQEtgFSBAh2BAomBAjaBAc6Aq4EC24ECJ4DngQJb -gQLigQHfgJWBAhaBAsmAEYEBoYEB04C7gQGegQHcgQGSgDuBAl2ALIECMoCIgQIpgQEWgDneAL8ADgDA -AMEAwgDDAMQAxQDGAMcAyADJAMoAywOuAM0PjQ+OD48A0Q+QD5EPkg+TANYK4w+UD5WAu4CkgQN3gQN7 -gQN0gQN1gQN4gQNzgQN9gQN8gQN2XxAYe3szMDgsIDE0OX0sIHs0ODAsIDM2MH190gAOAN0A3gDbgBbS -AA4A3QDeAJqAFtIADgDdAN4A34AW0gAOAD4ARg+fgF+oA6sFkQaqBXUFrAVJDbQIbYC6gQE1gQF7gQEt -gQE9gQEggQMkgQHoWns0ODAsIDM2MH3SAA4Pqg+rAPtfEBBOU1NoYXJlZEluc3RhbmNlgQN/CdIANwA4 -D64Pr6MPrw+wADtfEBhOU1VzZXJEZWZhdWx0c0NvbnRyb2xsZXJcTlNDb250cm9sbGVy0gAOADIAMw+z -gASBA4FdTlNBcHBsaWNhdGlvbtIADgA+AkMPt4BerxDbCq8KrAPWAa8G3AReCNgDYgOKBegEGAbcAMwK -sAbcAfoD6wRECSYD7gCsAB8A7wocChwKHAXVCPAMRQOKBtwGWAkiBdUJJQH3BegDigQ6AfwAHwRhChwG -RwwPBdUBrwjvBdUBrwXVCUoI8AbcBBgF1QbMA2IDrgGvAB8JqwDzAfgF1QXPBdUG3AbcA+4ArAWRCPAG -3AjwDEIMSQocCPAAHwxLAKwFrAVJCUoJSgDzCO8F1QNiA64KHAR2BdUG3AxEAPAGQAXVCPAA8QZYBBAD -7gmrBF0KqgjuCSEDYgmrBtwJqwCTBegG3AZYAa8AHwGvAPMD7gQYDBIAHwqrCG0G3AOuBtwDqwDMCSQG -WAGvA64DYgaqBtwGxgjvCO8B+QxHBckNRwNiCPADrgOuA64BrwZYA30NRgbcBdUKrgDMBegKqQV1BtwM -EgH2BdUI7wRbBtwG3AQYCSMG3AZYBtwI8AocDEoG3AlKDEMI7wwSBtwG3AXoCg0G3AOuAfUJOwqtCasG -3ANfDEYJSgRcChwMSAbcAPMJIAXVAB8G3AbcDsQG3AbcBtwA8gocAMwJnAH7CO8DYgDMgQKZgQKDgMWA -QoEBiIEBEoECBoCpgQL9gQFMgM+BAYiAGYECq4EBiIB/gMmA2oECRoDKgQL0gAKAG4ECS4ECS4ECS4EC -xoECZoEC1YEC/YEBiIEBZ4ECKYECxoECQoBugQFMgQL9gQHygImAAoEBFoECS4EBZIECv4ECxoBCgQIQ -gQLGgEKBAsaBAh2BAmaBAYiAz4ECxoEBhYCpgLuAQoACgQIygD6AdoECxoEBSIECxoEBiIEBiIDKgQL0 -gQE1gQJmgQGIgQJmgQLJgQLkgQJLgQJmgAKBAuuBAvSBAT2BASCBAh2BAh2APoECEIECxoCpgLuBAkuA -54ECxoEBiIEC0YAsgQFigQLGgQJmgDSBAWeA1oDKgQIygQENgQJ8gQIMgQIYgKmBAjKBAYiBAjKAEYEB -TIEBiIEBZ4BCgAKAQoA+gMqAz4ECxIACgQKAgQHogQGIgLuBAYiAuoAZgQI+gQFngEKAu4CpgQF7gQGI -gQGDgQIQgQIQgHqBAt2BAUWBAwaAqYECZoC7gLuAu4BCgQFngLCBAwCBAYiBAsaBAouAGYEBTIECaoEB -LYEBiIECxIBmgQLGgQIQgOGBAYiBAYiAz4ECLYEBiIEBZ4EBiIECZoECS4EC6IEBiIECHYECzYECEIEC -xIEBiIEBiIEBTIECSIEBiIC7gEyBAhqBAoeBAjKBAYiAqIEC2YECHYDlgQJLgQLggQGIgD6BAhSBAsaA -AoEBiIEBiIEDcoEBiIEBiIEBiIA5gQJLgBmBAi+AhIECEICpgBnSAA4APgJDEJWAXq8Q3AuaCzYD7gPc -BSgB9wb/A18NRgYFCKMHAQDvC+IC1gcCA/EDYgjwCg0NDQ7EAPoKNQoYCjYGxgqsDIUDfQb+CYwGdAxF -Cf0CiQYHDUcEEAMFBEQFOAo0BlgMEgxJCSAB+QZAAfoMRAlgCqoHCgikDEMEXQbcBawO6wH4CcQBlgKp -DEsF6AQ6BvwHAAjvAJQFlwquBvgKsAxRDMoKrwoxDv4M7A0GBbMFTwlhCWIBxwklDEgD1gWRCjIEgQxG -BwQBRAx0DEoKqQZHAWoGcwjuCxYEGAUOCcII9Qk7BFsJpwcICcMAzAXjBv0B9gZyDA8D6wGvAfUIogjY -AKwLJwhzBvQIbQOxBvcA8QntBlQB+wOrBF4GsAcMBswJIwkkAr8EXAqtDWUFzwyoDbQGqgVJAfwGcAOE -BckNTAtWBwYA8wq1BgQFfAcHA4oCawxHCSYEZgcDBwUJnAQFBw4GcQb1CqsKMwzcBtgJRgxjCSEAHwXV -Bw8HCQYGChwG+QV1AgkJSgtGCcEHCwNlDJcKNwR2CWMMuQGeCSsHEgCTDEIDrgb7Bw0G+gF9BxEG9go4 -APAJqwLtCSIEYQDygQKbgQKFgMqAx4EBFIBugQGsgKiBAwCBAVSBAfmBAbKAG4ECrYCDgQG1gMyAqYEC -ZoECSIEC+IEDcoAdgQJXgQJKgQJZgQGDgQKDgQLXgLCBAamBAiuBAXeBAtWBAkSAdYEBWoEDBoDWgIyA -2oEBGIECVYEBZ4ECxIEC5IECFIB6gQFigH+BAtGBAiGBAnyBAcuBAfyBAs2BAQ2BAYiBAT2BA36AdoEC -PICZgHmBAuuBAUyBAfKBAaSBAa+BAhCACoEBN4ECi4EBmIECq4ECy4EC5oECmYECT4EDgIEC7YEC+oEB -P4EBIoECI4ECJYBEgQJCgQLggMWBATWBAlGA6IEC2YEBuoAugQLTgQLogQJqgQFkgDaBAXWBAgyBAn6A -z4EBD4ECOIECDoECGoDhgQIxgQHFgQI6gBmBAUuBAaaAZoEBcoECv4DJgEKATIEB94ECBoEC9IECgoEB -6oEBjYEB6IC9gQGVgDSBAkCBAWaAhIC6gQESgQF9gQHRgQGFgQItgQI+gH6A5YECh4EDCIEBSIEC34ED -JIEBe4EBIICJgQFsgLOBAUWBAwKBAo2BAb+APoECbIEBUYEBL4EBwoEC/YBpgQLdgQJGgOOBAbiBAb2B -Ai+AzoEB1oEBb4EBkIECgIECU4EC6oEBh4ECHIECz4ECGIACgQLGgQHZgQHIgQFXgQJLgQGbgQEtgFSB -Ah2BAomBAjaBAc6Aq4EC24ECW4DngQIngQLigJWBAhaBAd+AEYECyYC7gQGhgQHTgQGegDuBAdyBAZKB -Al2ALIECMoCIgQIpgQEWgDnSAA4APgJDEXSAXq8Q3BF1EXYRdxF4EXkRehF7EXwRfRF+EX8RgBGBEYIR -gxGEEYURhhGHEYgRiRGKEYsRjBGNEY4RjxGQEZERkhGTEZQRlRGWEZcRmBGZEZoRmxGcBUERnhGfEaAR -oRGiEaMRpBGlEaYRpxGoEakRqhGrEawRrRGuEa8RsBGxEbIRsxG0EbURthG3EbgRuRG6EbsRvBG9Eb4R -vxHAEcERwhHDEcQRxRHGEccRyBHJEcoRyxHMEc0RzhHPEdAR0RHSEdMR1BHVEdYR1xHYEdkR2hHbEdwR -3RHeEd8R4BHhEeIR4xHkEeUR5hHnEegR6RHqEesR7BHtEe4R7wh5EfER8hHzEfQR9RH2EfcR+BH5EfoR -+xH8Ef0R/hH/EgASARICEgMSBBIFEgYSBxIIEgkSChILEgwSDRIOEg8SEBIREhISExIUEhUSFhIXEhgS -GRIaEhsSHBIdEh4SHxIgEiESIhIjEiQSJRImEicSKBIpEioSKxIsEi0SLhIvEjASMRIyEjMSNBI1EjYS -NxI4EjkSOhI7EjwSPRI+Ej8SQBJBEkISQxJEEkUSRhJHEkgSSRJKEksSTBJNEk4STxJQgQOFgQOGgQOH -gQOIgQOJgQOKgQOLgQOMgQONgQOOgQOPgQOQgQORgQOSgQOTgQOUgQOVgQOWgQOXgQOYgQOZgQOagQOb -gQOcgQOdgQOegQOfgQOggQOhgQOigQOjgQOkgQOlgQOmgQOngQOogQOpgQOqgQOrgQOsgQEZgQOtgQOu -gQOvgQOwgQOxgQOygQOzgQO0gQO1gQO2gQO3gQO4gQO5gQO6gQO7gQO8gQO9gQO+gQO/gQPAgQPBgQPC -gQPDgQPEgQPFgQPGgQPHgQPIgQPJgQPKgQPLgQPMgQPNgQPOgQPPgQPQgQPRgQPSgQPTgQPUgQPVgQPW -gQPXgQPYgQPZgQPagQPbgQPcgQPdgQPegQPfgQPggQPhgQPigQPjgQPkgQPlgQPmgQPngQPogQPpgQPq -gQPrgQPsgQPtgQPugQPvgQPwgQPxgQPygQPzgQP0gQP1gQP2gQP3gQP4gQP5gQP6gQP7gQP8gQP9gQP+ -gQHrgQP/gQQAgQQBgQQCgQQDgQQEgQQFgQQGgQQHgQQIgQQJgQQKgQQLgQQMgQQNgQQOgQQPgQQQgQQR -gQQSgQQTgQQUgQQVgQQWgQQXgQQYgQQZgQQagQQbgQQcgQQdgQQegQQfgQQggQQhgQQigQQjgQQkgQQl -gQQmgQQngQQogQQpgQQqgQQrgQQsgQQtgQQugQQvgQQwgQQxgQQygQQzgQQ0gQQ1gQQ2gQQ3gQQ4gQQ5 -gQQ6gQQ7gQQ8gQQ9gQQ+gQQ/gQRAgQRBgQRCgQRDgQREgQRFgQRGgQRHgQRIgQRJgQRKgQRLgQRMgQRN -gQROgQRPgQRQgQRRgQRSgQRTgQRUgQRVgQRWgQRXgQRYgQRZgQRagQRbgQRcgQRdgQReXxAVQ29tYm8g -Qm94IENlbGwgKDE5LjUpXxAcVGV4dCBGaWVsZCBDZWxsIChGb250IFNpemVzKV5Db250ZW50IFZpZXct -NF8QFEJ1dHRvbiBDZWxsIChDYW5jZWwpXxAYVGV4dCBGaWVsZCBDZWxsICh0aW1lcy4pXxAQVGFibGUg -Q29sdW1uICg0KV1NZW51IEl0ZW0gKEEpXxAaUHVzaCBCdXR0b24gKERvbid0IFJlcGVhdClvEBoAUwBx -AHUAYQByAGUAIABUAGUAeAB0AHUAcgBlAGQAIABCAHUAdAB0AG8AbgAgACgiGgApXxAPTWVudSBJdGVt -ICgzLzQpXxARTWVudSBJdGVtIChTd2luZyldTWVudSBJdGVtIChCKV8QQlN0YXRpYyBUZXh0IChFbmRp -bmcgaW4gbWVhc3VyZXMgMSB0aHJvdWdoIDEwIGFwcGxpZXMgdG8gcmVwZWF0czoKKV8QHFRleHQgRmll -bGQgQ2VsbCAoU3RhZmYgU2l6ZSldQnV0dG9uIENlbGwtMl5NZW51IEl0ZW0gKEYjKV8QFkJ1dHRvbiBD -ZWxsIChDYW5jZWwpLTJeQ29udGVudCBWaWV3LTJfEBNCb3ggKFByaW50IE9wdGlvbnMpXxAWUG9wIFVw -IEJ1dHRvbiBDZWxsICg4KV8QEVZlcnRpY2FsIFNjcm9sbGVyXVRvb2xiYXIgSXRlbXNfEEZUZXh0IEZp -ZWxkIENlbGwgKEVuZGluZyBpbiBtZWFzdXJlcyAxIHRocm91Z2ggMTAgYXBwbGllcyB0byByZXBlYXRz -OgopXxAPTWVudSBJdGVtICg0KS0xXxAPTWVudSBJdGVtICg4KS0xXU1lbnUgSXRlbSAoNSlfEBJQb3B1 -cCBCdXR0b24gKEMjbSlfEBhTdGF0aWMgVGV4dCAoRm9udCBTaXplcylfECFUZXh0IEZpZWxkIENlbGwg -KERpenp5IEdpbGxlc3BpZSlaVGV4dCBGaWVsZF1NZW51IEl0ZW0gKEQpXxAoVGV4dCBGaWVsZCBDZWxs -IChCb3R0b206CiAKTGVkZ2VyIExpbmVzKV1NZW51IEl0ZW0gKDgpXxAcVGV4dCBGaWVsZCAoRGl6enkg -R2lsbGVzcGllKV8QIVRleHQgRmllbGQgQ2VsbCAoTHlyaWNzIFN0YW56YXM6KVtCdXR0b24gQ2VsbF8Q -D01lbnUgSXRlbSAoNS80KV8QGlNxdWFyZSBUZXh0dXJlZCBCdXR0b24gKFgpXxAeUG9wIFVwIEJ1dHRv -biBDZWxsIChTZWxlY3QuLi4pXUJ1dHRvbiBDZWxsLTdfEBRCdXR0b24gQ2VsbCAoUmVwZWF0KV8QD01l -bnUgSXRlbSAoMyktMV8QE01lbnUgKE90aGVyVmlld3MpLTFcQ29udGVudCBWaWV3XxAQVGV4dCBGaWVs -ZCAoMjc2KV8QElN0YXRpYyBUZXh0IChUb3A6KV8QEVRhYmxlIENvbHVtbiAoMTYpXxARUG9wdXAgQnV0 -dG9uICgxMilfEBFUYWJsZSBDb2x1bW4gKDMyKV8QGFN0YXRpYyBUZXh0IChDb21wb3NlcjoKKV8QD01l -bnUgSXRlbSAoMSktMl8QFVN0YXRpYyBUZXh0IChMeXJpY3M6KW8QDwBNAGUAbgB1ACAASQB0AGUAbQAg -ACgAQiZtAG0AKV8QFU1lbnUgSXRlbSAoQm9zc2FOb3ZhKV8QFVN0YXRpYyBUZXh0IChUaXRsZToKKVdT -dGVwcGVyXxARTWVudSAoT3RoZXJWaWV3cylfEBdCZXZlbCBCdXR0b24gKFpvb20gT3V0KV8QH1NoYXJl -ZCBVc2VyIERlZmF1bHRzIENvbnRyb2xsZXJfEBBUYWJsZSBDb2x1bW4gKDgpXU1lbnUgSXRlbSAoNClf -EBVIb3Jpem9udGFsIFNjcm9sbGVyLTFdQnV0dG9uIENlbGwtM18QFlN0YXRpYyBUZXh0IChHcm9vdmU6 -CilfEBNNZW51IChPdGhlclZpZXdzKS0zXxAYUG9wdXAgQnV0dG9uIChTZWxlY3QuLi4pWVNlcGFyYXRv -cl1NZW51IEl0ZW0gKEUpXxAVQm94IChEaXNwbGF5IE9wdGlvbnMpWlNoZWV0IFZpZXdfEBZCdXR0b24g -Q2VsbCAoU2hvdyBMb2cpXUNvbWJvIEJveCAoNiluAE0AZQBuAHUAIABJAHQAZQBtACAAKABFJm0AKV8Q -GFN0YXRpYyBUZXh0IChTdGFmZiBTaXplKV8QMVRleHQgRmllbGQgQ2VsbCAoU29mdGx5LCBBcyBJbiBB -IE1vcm5pbmcgU3VucmlzZSlfEBVUZXh0IEZpZWxkIENlbGwgKDI3NilfEBBDb21ibyBCb3ggKDE5LjUp -XxAPTWVudSBJdGVtICgwKS0xW0FwcGxpY2F0aW9uXxAaVGV4dCBGaWVsZCBDZWxsIChHcm9vdmU6Cilf -EBNIb3Jpem9udGFsIFNjcm9sbGVyXxAWQnV0dG9uIENlbGwgKFpvb20gT3V0KV8QEkJ1dHRvbiBDZWxs -IChTdG9wKV8QD01lbnUgSXRlbSAoMiktMl8QD01lbnUgSXRlbSAoMyktMl8QEVRhYmxlIEhlYWRlciBW -aWV3XxAdU3RhdGljIFRleHQgKEx5cmljcyBTdGFuemFzOilfEBRTdGF0aWMgVGV4dCAoVGVtcG86KV8Q -FFB1c2ggQnV0dG9uIChDYW5jZWwpXxAXQmV2ZWwgQnV0dG9uIChTaG93IExvZylfEA9NZW51IEl0ZW0g -KDEpLTFfEBBOdW1iZXIgRm9ybWF0dGVyXxAXU3RhdGljIFRleHQgKEx5cmljaXN0OileTWVudSBJdGVt -IChBbSlfEBtCdXR0b24gQ2VsbCAoRGVsZXRlIEVuZGluZylfEBxUZXh0IEZpZWxkIENlbGwgKENvbXBv -c2VyOgopWVN0ZXBwZXItMV8QD0NvbWJvIEJveCAoNiktMV8QF1BvcCBVcCBCdXR0b24gQ2VsbCAoMTIp -XxAWQnV0dG9uIENlbGwgKENhbmNlbCktMV1NZW51IEl0ZW0gKDYpXxAQUHVzaCBCdXR0b24gKE9LKV8Q -GVRleHQgRmllbGQgQ2VsbCAoTHlyaWNzOilfEBNNZW51IChPdGhlclZpZXdzKS0yXFN0ZXBwZXIgQ2Vs -bF1NZW51IEl0ZW0gKDIpXxAQQnV0dG9uIENlbGwgKE9LKV8QGFBvcCBVcCBCdXR0b24gQ2VsbCAoMCkt -MV8QKlN0YXRpYyBUZXh0IChSZXBlYXQgbWVhc3VyZXMgMSB0aG91Z2ggMTQKKV1NZW51IEl0ZW0gKDAp -Xk1lbnUgSXRlbSAoQ20pXU1lbnUgSXRlbSAoMyleQ29udGVudCBWaWV3LTNfEA9NZW51IEl0ZW0gKDQv -NCldTWVudSBJdGVtIChHKV8QEFRhYmxlIENvbHVtbiAoMilfEBpNZW51IEl0ZW0gKDQgKFNpeHRlZW50 -aHMpKV8QElNoZWV0IE11c2ljIFdpbmRvd18QFlB1c2ggQnV0dG9uIChDYW5jZWwpLTJfECNUYWJsZSBW -aWV3ICgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KV8QEFRhYmxlIENvbHVtbiAoMSlbU2VwYXJhdG9yLTVb -U2Nyb2xsIFZpZXdfEBFUZXh0IEZpZWxkIENlbGwtMV8QFUJ1dHRvbiBDZWxsIChEaXNwbGF5KV1NZW51 -IEl0ZW0gKEMpXxAWQmV2ZWwgQnV0dG9uIChEaXNwbGF5KV8QFUJ1dHRvbiBDZWxsIChQcmV2aWV3KW4A -TQBlAG4AdQAgAEkAdABlAG0AIAAoAEImbQApXxAWUHVzaCBCdXR0b24gKENhbmNlbCktMV8QHlRleHQg -RmllbGQgQ2VsbCAoTGVkZ2VyIExpbmVzKV5NZW51IEl0ZW0gKDEyKV8QEVRhYmxlIENvbHVtbiAoNjQp -XxAWQmV2ZWwgQnV0dG9uIChQcmV2aWV3KV8QFFN0YXRpYyBUZXh0ICh0aW1lcy4pXxASQnV0dG9uIENl -bGwgKFBsYXkpW1NlcGFyYXRvci0xXxAYUG9wIFVwIEJ1dHRvbiBDZWxsIChDI20pXxAQUG9wdXAgQnV0 -dG9uICgwKV8QGlN0YXRpYyBUZXh0IChMZWRnZXIgTGluZXMpXUJ1dHRvbiBDZWxsLTFeVGV4dCBGaWVs -ZCAoMilfEBVTdGF0aWMgVGV4dCAoQ2hvcmRzOilfEA9CdXR0b24gQ2VsbCAoWClfEBhQb3AgVXAgQnV0 -dG9uIENlbGwgKDQvNClfECNUZXh0IEZpZWxkIENlbGwgKERpenp5IEdpbGxlc3BpZSktMVxBc3luYyBB -cnJvd3NfEBNCZXZlbCBCdXR0b24gKFBsYXkpXxATQmV2ZWwgQnV0dG9uIChTdG9wKV8QElRhYmxlIENv -bHVtbiAoMTI4KV8QGE1lbnUgSXRlbSAoMiAoU3RyYWlnaHQpKV8QD1RleHQgRmllbGQgQ2VsbF8QElBv -cHVwIEJ1dHRvbiAoNC80KW8QDwBCAHUAdAB0AG8AbgAgAEMAZQBsAGwAIAAoIhoAKV8QEkNvbWJvIEJv -eCBDZWxsICg2KV5NZW51IEl0ZW0gKERtKV1TY3JvbGwgVmlldy0xXxAUQ29tYm8gQm94IENlbGwgKDYp -LTFfEA9NZW51IEl0ZW0gKDYvOClfEBVCdXR0b24gQ2VsbCAoWm9vbSBJbileTWVudSBJdGVtIChHbSlf -EBJCb3ggKEZpZWxkIEVkaXRvcildQnV0dG9uIENlbGwtNF8QHlRleHQgRmllbGQgKERpenp5IEdpbGxl -c3BpZSktMV8QEFBvcHVwIEJ1dHRvbiAoOClfEC5UZXh0IEZpZWxkIENlbGwgKFJlcGVhdCBtZWFzdXJl -cyAxIHRob3VnaCAxNAopW1NlcGFyYXRvci0yW1NlcGFyYXRvci0zXxAWUG9wIFVwIEJ1dHRvbiBDZWxs -ICgwKV8QFU1lbnUgSXRlbSAoU2VsZWN0Li4uKV5NZW51IEl0ZW0gKEJtKV8QFU1lbnUgSXRlbSAoMyAo -U3dpbmcpKVtTZXBhcmF0b3ItNFtTdGF0aWMgVGV4dF8QD01lbnUgSXRlbSAoMiktMV5TdGVwcGVyIENl -bGwtMV8QD01lbnUgSXRlbSAoQyNtKV8QD01lbnUgSXRlbSAoMCktMl8QGVRleHQgRmllbGQgQ2VsbCAo -VGl0bGU6CilfEBJQb3B1cCBCdXR0b24gKDApLTFcRmlsZSdzIE93bmVyW0JveCAoVGl0bGUpXxAPTWVu -dSBJdGVtIChGI20pXk1lbnUgSXRlbSAoRm0pXxAQTWVudSBJdGVtICgxMi84KV8QE01lbnUgKE90aGVy -Vmlld3MpLTVuAE0AZQBuAHUAIABJAHQAZQBtACAAKABBJm0AKV8QFkJldmVsIEJ1dHRvbiAoWm9vbSBJ -bildQnV0dG9uIENlbGwtNV8QE01lbnUgKE90aGVyVmlld3MpLTZfEBlUZXh0IEZpZWxkIENlbGwgKENo -b3JkczopXU1lbnUgSXRlbSAoMSlvEA8ATQBlAG4AdQAgAEkAdABlAG0AIAAoAEUmbQBtAClfEBpCdXR0 -b24gQ2VsbCAoRG9uJ3QgUmVwZWF0KV8QG1RleHQgRmllbGQgQ2VsbCAoTHlyaWNpc3Q6KV8QD01lbnUg -SXRlbSAoNiktMV8QE1RleHQgRmllbGQgQ2VsbCAoMilfEA9NZW51IEl0ZW0gKDQpLTJfEBhUZXh0IEZp -ZWxkIENlbGwgKFRlbXBvOilfEBNWZXJ0aWNhbCBTY3JvbGxlci0xXxAWVGV4dCBGaWVsZCBDZWxsIChU -b3A6KV8QD01lbnUgSXRlbSAoRCNtKVdFbmRpbmdzXxAsVGV4dCBGaWVsZCAoU29mdGx5LCBBcyBJbiBB -IE1vcm5pbmcgU3VucmlzZSleQ29udGVudCBWaWV3LTFuAE0AZQBuAHUAIABJAHQAZQBtACAAKABHJm0A -KV5NZW51IEl0ZW0gKEVtKW4ATQBlAG4AdQAgAEkAdABlAG0AIAAoAEQmbQApXxAYQnV0dG9uIENlbGwg -KEFkZCBFbmRpbmcpXxAPTWVudSBJdGVtIChHI20pXU1lbnUgSXRlbSAoRildTWVudSBJdGVtICg3KV8Q -G1B1c2ggQnV0dG9uIChEZWxldGUgRW5kaW5nKV8QE01lbnUgKE90aGVyVmlld3MpLTRdQnV0dG9uIENl -bGwtNl8QJFN0YXRpYyBUZXh0IChCb3R0b206CiAKTGVkZ2VyIExpbmVzKV8QFFB1c2ggQnV0dG9uIChS -ZXBlYXQpXxAYUHVzaCBCdXR0b24gKEFkZCBFbmRpbmcp0gAOAD4CQxMtgF6g0gAOAD4CQxMwgF6g0gAO -AD4CQxMzgF6vEQEiAHYLmgs2AIcAdQPcAfcG/wUoA+4DXw1GBgUIowcBAO8ASgviBwIC1gPxA2IKDQjw -DQ0OxAD6CjUKGAo2AIgGxgqsDIUAaQN9AG0G/gZ0CYwMRQn9AEwAfwKJBgcAig1HAHgEEAMFAIQERAU4 -AFoKNAZYDBIMSQH5CSAGQABOAfoAbAxEAGQJYAqqAG8HCgikDEMG3ARdBawAewH4DusJxAGWAIYAagKp -AGsMSwXoAIEEOgCMBvwHAAjvAFQAlAWXAHwKrgb4CrAMUQzKCjEKrwBVDv4AhQzsDQYFswVPCWEJYgHH -CSUAWAxIA9YFkQoyBIEMRgcEDHQBRAZHDEoKqQFqAIAAXgBIAFAGcwQYCO4JwgUOCxYAgwBoAFII9Qk7 -AG4AcQRbCacAjQcICcMAzAByBeMG/QZyAfYMDwBhAfUBrwPrAIkIogCsCNgLJwhzBvQIbQBPBvcDsQDx -Ce0GVAH7A6sEXgawAE0HDAbMCSMJJAK/DKgFzw1lBFwKrQBwDbQAXwaqAHMFSQH8BnAAWQOEDUwHBgXJ -C1YA8wYECrUFfAcHA4oCawxHCSYEZgBWBwMHBQQFCZwAZwB6Bw4GcQb1CqsAXQozDNwG2AlGDGMAggBj -CSEAHwB+BdUHDwBgBwkGBgocAFEG+QV1AgkJSgtGCcEHCwNlDJcJYwR2CjcAfQy5AEkHEgGeCSsMQgCT -BvsHDQOuAHkAVwb6BxEG9gF9CjgAUwBbAFwASwB0APAAZQmrAGIAZgB3Au0JIgCLBGEA8oEDL4ECm4EC -hYEDY4EDLYDHgG6BAayBARSAyoCogQMAgQFUgQH5gQGygBuAr4ECrYEBtYCDgMyAqYECSIECZoEC+IED -coAdgQJXgQJKgQJZgQNngQGDgQKDgQLXgQMUgLCBAxuBAamBAXeBAiuBAtWBAkSAw4EDS4B1gQFagQNr -gQMGgQMzgNaAjIEDVoDagQEYgQF6gQJVgQFngQLEgQLkgHqBAhSBAWKAyIB/gQMZgQLRgQIFgQIhgQJ8 -gQMegQHLgQH8gQLNgQGIgQENgQE9gQM/gHaBA36BAjyAmYEDYIEDFoB5gQMYgQLrgQFMgQNPgQHygQNt -gQGkgQGvgQIQgQErgAqBATeBA0KBAouBAZiBAquBAsuBAuaBAk+BApmBASyBA4CBA12BAu2BAvqBAT+B -ASKBAiOBAiWARIECQoEBRIEC4IDFgQE1gQJRgOiBAtmBAbqBAtOALoEBZIEC6IECaoA2gQNMgQHngAmA -2YEBdYDPgQIMgQI4gQEPgQJ+gQNTgQK+gQEngQIOgQIagQMdgQMhgOGBAjGBA2+BAcWBAjqAGYEDI4EB -S4EBpoEBcoBmgQK/gQIAgEyAQoDJgQNpgQH3gQL0gQIGgQKCgQHqgQGNgQHogM2BAZWAvYA0gQJAgQFm -gISAuoEBEoEBfYDEgQHRgQGFgQItgQI+gH6BAt+BAUiBAwiA5YECh4EDIIEDJIEB74EBe4EDKoEBIICJ -gQFsgQFhgLOBAwKBAb+BAUWBAo2APoEBUYECbIEBL4EBwoEC/YBpgQLdgQJGgOOBATSBAbiBAb2AzoEC -L4ECvYEDO4EB1oEBb4EBkIECgIEB5YECU4EC6oEBh4ECHIECz4EDUoECBIECGIACgQNIgQLGgQHZgQHx -gQHIgQFXgQJLgQEfgQGbgQEtgFSBAh2BAomBAjaBAc6Aq4EC24ECJ4DngQJbgQNFgQLigKeBAd+AlYEC -FoECyYARgQGhgQHTgLuBAziBATyBAZ6BAdyBAZKAO4ECXYEBKYEBgoEB44C5gQMsgCyBArmBAjKBAgKB -AruBAzGAiIECKYEDbIEBFoA50gAOAD4CQxRYgF6vEQEiFFkUWhRbFFwUXRReFF8UYBRhFGIUYxRkFGUU -ZhRnFGgUaRRqFGsUbBRtFG4UbxRwFHEUchRzFHQUdRR2FHcUeBR5FHoUexR8FH0UfhR/FIAUgRSCFIMU -hBSFFIYUhxSIFIkUihSLFIwUjRSOFI8UkBSRFJIUkxSUFJUUlhSXFJgUmRSaFJsUnBSdFJ4UnxSgFKEU -ohSjFKQUpRSmFKcUqBSpFKoUqxSsFK0UrhSvFLAUsRSyFLMUtBS1FLYUtxS4FLkUuhS7FLwUvRS+FL8U -wBTBFMIUwxTEFMUUxhTHFMgUyRTKFMsUzBTNFM4UzxTQFNEU0hTTFNQU1RTWFNcU2BTZFNoU2xTcFN0U -3hTfFOAU4RTiFOMU5BTlFOYU5xToFOkU6hTrFOwU7RTuFO8U8BTxFPIU8xT0FPUU9hT3FPgU+RT6FPsU -/BT9FP4U/xUAFQEVAhUDFQQVBRUGFQcVCBUJFQoVCxUMFQ0VDhUPFRAVERUSFRMVFBUVFRYVFxUYFRkV -GhUbFRwVHRUeFR8VIBUhFSIVIxUkFSUVJhUnFSgVKRUqFSsVLBUtFS4VLxUwFTEVMhUzFTQVNRU2FTcV -OBU5FToVOxU8FT0VPhU/FUAVQRVCFUMVRBVFFUYVRxVIFUkVShVLFUwVTRVOFU8VUBVRFVIVUxVUFVUV -VhVXFVgVWRVaFVsVXBVdFV4VXxVgFWEVYhVjFWQVZRVmFWcVaBVpFWoVaxVsFW0VbhVvFXAVcRVyFXMV -dBV1FXYVdxV4FXkVeoEEY4EEZIEEZYEEZoEEZ4EEaIEEaYEEaoEEa4EEbIEEbYEEboEEb4EEcIEEcYEE -coEEc4EEdIEEdYEEdoEEd4EEeIEEeYEEeoEEe4EEfIEEfYEEfoEEf4EEgIEEgYEEgoEEg4EEhIEEhYEE -hoEEh4EEiIEEiYEEioEEi4EEjIEEjYEEjoEEj4EEkIEEkYEEkoEEk4EElIEElYEEloEEl4EEmIEEmYEE -moEEm4EEnIEEnYEEnoEEn4EEoIEEoYEEooEEo4EEpIEEpYEEpoEEp4EEqIEEqYEEqoEEq4EErIEErYEE -roEEr4EEsIEEsYEEsoEEs4EEtIEEtYEEtoEEt4EEuIEEuYEEuoEEu4EEvIEEvYEEvoEEv4EEwIEEwYEE -woEEw4EExIEExYEExoEEx4EEyIEEyYEEyoEEy4EEzIEEzYEEzoEEz4EE0IEE0YEE0oEE04EE1IEE1YEE -1oEE14EE2IEE2YEE2oEE24EE3IEE3YEE3oEE34EE4IEE4YEE4oEE44EE5IEE5YEE5oEE54EE6IEE6YEE -6oEE64EE7IEE7YEE7oEE74EE8IEE8YEE8oEE84EE9IEE9YEE9oEE94EE+IEE+YEE+oEE+4EE/IEE/YEE -/oEE/4EFAIEFAYEFAoEFA4EFBIEFBYEFBoEFB4EFCIEFCYEFCoEFC4EFDIEFDYEFDoEFD4EFEIEFEYEF -EoEFE4EFFIEFFYEFFoEFF4EFGIEFGYEFGoEFG4EFHIEFHYEFHoEFH4EFIIEFIYEFIoEFI4EFJIEFJYEF -JoEFJ4EFKIEFKYEFKoEFK4EFLIEFLYEFLoEFL4EFMIEFMYEFMoEFM4EFNIEFNYEFNoEFN4EFOIEFOYEF -OoEFO4EFPIEFPYEFPoEFP4EFQIEFQYEFQoEFQ4EFRIEFRYEFRoEFR4EFSIEFSYEFSoEFS4EFTIEFTYEF -ToEFT4EFUIEFUYEFUoEFU4EFVIEFVYEFVoEFV4EFWIEFWYEFWoEFW4EFXIEFXYEFXoEFX4EFYIEFYYEF -YoEFY4EFZIEFZYEFZoEFZ4EFaIEFaYEFaoEFa4EFbIEFbYEFboEFb4EFcIEFcYEFcoEFc4EFdIEFdYEF -doEFd4EFeIEFeYEFeoEFe4EFfIEFfYEFfoEFf4EFgIEFgYEFgoEFg4EFhBDDEgABiA4SAAGIAxIAAYhN -EgABiCISAAGHbhDiEgABh2oRAQsQzRBkEEASAAGIQRDaEIYSAAGIDxIAAYhEEO0SAAGHrBDFEgABh9oS -AAGIEBIAAYf0EJASAAGHehEBPREBRBEBQRIAAYhOEBcSAAGIAhIAAYdFEgABh/oQYRIAAYf9ECMQTxIA -AYfIEKUSAAGH2REBUhDMEOoQQhIAAYhQEGURAUUSAAGHnhDvEI0QxBIAAYdvEK4RATwQShCxEOQRATEQ -SREBTBDlEMIQpBEBSBEBJBIAAYgHEPESAAGIRhCjEBgQyRC9EMsQ4xIAAYgTEQE0EgABh/cSAAGIHRCe -EOsQbxC1ED4QqhD+EgABiFIQIRIAAYhDEgABh/8RAVEQFhIAAYczEQFGEgABiAAQHhIAAYgKEgABh0IS -AAGHUREBPhIAAYgLEMAT//////////0QqBIAAYdVEgABh/USAAGHXRIAAYeZEQEmEQElEgABh/gRATkQ -RRCwEM4QkxEBQBCmECYSAAGHRBIAAYd7EgABhukSAAGIBhIAAYd8EgABiCASAAGH+xDwENAQTBEBDhEB -NxIAAYdpEgABiAgQqRAREPcSAAGHrhIAAYfCEQFLEP0QxhEBOBIAAYhTEC4RATYQ2REBCBA/ECIQTRDh -EgABiCEQ4BDfEgABiE8RAQMQghIAAYgNEgABh/MRAVMQGhIAAYcyENwSAAGHrRBQEOYQkhDKEgABh0sR -AU4QMBIAAYa3EQEyEQENEOwSAAGHRxIAAYbdEgABhwUQxxIAAYgEEQEEEQEHENQQqxIAAYf8EPkQ5xBO -EgABh/4SAAGHARIAAYcEECcQPRIAAYgBEN4QQRIAAYgJEgABh1wQLBBmEOkQpxEBOhIAAYdmEJcQJRAo -EgABh9IQiBCHEC0QHRIAAYgMEG4RAT8SAAGHUhIAAYhLEQEvEgABh0MQsxEBTxEBIhIAAYhMEgABiBsQ -chIAAYhKEQEGECsQQxEBOxD8EB8QvBIAAYeAEQEjEgABiAURATUSAAGIRRIAAYdtEgABh0YRAScSAAGH -ZxEBQhC0EgABh1ARAU0SAAGIRxIAAYf2EgABh9EQohDYEgABiEAQLxCREQFHEMESAAGISRAbEgABh30R -AUMQ+BBGEJwQmREBUBDbEFURATMQrxCbEHAQ7hEBKBIAAYhREM8Q3dIADgA+AEYWkIBfoNIADgA+AkMW -k4BeoNIADgA+AkMWloBeoNIANwA4FpgWmaIWmQA7Xk5TSUJPYmplY3REYXRhAAgAGQAiACcAMQA6AD8A -RABSAFQAZgt8C4ILzQvUC9sL6Qv7DBcMJQwxDD0MSwxWDGQMgAyODKEMswzNDNcM5AzmDOkM7AzvDPIM -9Az3DPkM/Az/DQINBQ0HDQkNDA0PDRQNFw0gDSwNLg0wDT4NRw1QDVsNYA1vDXgNiw2UDZ8NoQ2iDasN -sg2/DcUNzg3QDl8OYQ5jDmUOZw5pDmsObQ5vDnEOdA53DnoOfQ6ADoMOhg6JDowOjw6SDpUOmA6bDp4O -oQ6kDqcOqg6tDrAOsw62DrkOvA6/DsIOxQ7IDssOzg7RDtQO1w7aDt0O4A7jDuYO6Q7sDu8O8g71DvgO -+w7+DwEPBA8HDwoPDQ8QDxMPFg8ZDxwPHw8iDyUPKA85D0cPUA9YD1oPXA9eD2APgQ+TD5wPqA+xD70P -yQ/LD80P0A/SD9QP1g/YD9oQBxAPEBkQJBAuEDgQRhBJEEsQThBQEFMQVhBYEFoQXBBfEGEQbBB4EH8Q -iBCREJ4QqhDjEPARCREWESQRLhE8EVURYhFsEX4RkhGcEagRqhGsEa4RsBGyEbcRuRG7Eb0RvxHBEcMR -xRHHEeIR6RHyEfwR/hIDEgwSExIlEi4SSxJWEmsSbRJvEnEScxJ2En8SgRKMEo4SkBKSEpQSlhKzEroS -xBLGEsgSyhLMEs0SzxLoEwkTFRMpEzQTPhNME1kTZRNqE2wTbhNwE3ITdBN5E3sTshPDE8oT0RPaE9wT -5RPnE+oT9xQAFAUUDBQhFCkUNhRCFFAUUhRUFFYUWBRaFGEUbhR7FIMUhRSHFJMUnBShFLYUuBS6FLwU -vhTRFN4U4BTjFOwU9RUHFRQVHRUoFTQVPhVfFWUVZxVpFWsVbRVuFXAVcxWLFcQV2hXvFf4WERYjFjUW -QxZFFkcWSRZLFk0WTxZRFlMWVRZXFlwWZRZzFnQWdhZ/FogWlRaeFqkWshbTFtUW1xbZFtsW3BbeFuEW -+RcyFzQXNhc4FzoXPBc+F0AXRxdJF2oXbBduF3AXchdzF3UXeBeRF8oX0xfVF9cX2RfbF90X3xfhF+wX -7hgnGDMYPBhJGFwYaRh1GIMYhRiHGIkYixiNGI8YkRikGKYYqBiqGKwYtRi3GMIYxBjGGMgYyhjMGPUY -9xj5GPsY/RkAGQIZBBkGGQgZERkTGRYZGBlnGYkZkxmgGbUZzxnrGgYaEhoxGkAaTBpOGlAaUhpXGlka -WxpcGl4aZxpwGnIacxp1Gn4agBqCGosalRquGroavBq+GsAawhrEGu0a7xrxGvMa9Rr3Gvka+xr9Gwcb -EBsZGy0bQhtEG0YbSBtKG2EbahtzG4EbihuMG50bnxuhG6MbpRunG6kbqxutG9Ib3xvsG/Qb/xwKHBUc -IhwkHCYcKBwxHDMcNBw2HDgcVRxaHFwcXhxgHGIcZBx1HHccgByCHIUckhyUHKActRy3HLkcuxy9HM8c -2BzjHPcdKB02HTgdOh08HT4dQB1CHUQdRx1MHV0dXx1oHWodbB2BHY4dlR2XHZkdnh2gHaIdqx20HbYd -uR27HcQdxh3LHc0dzx3YHe8d8R3zM4UzjjOVM6gzszO8M8EzyTPSM9kz6DP1M/cz/DQFNAo0EjQbNCc0 -KTQrNDQ0PTRCNFg0YTRmNHQ0mTSbNJ00nzShNKI0pDSmNMM0xTTHNMk0yzTNNQI1BDUGNQg1CjUMNQ41 -EDUdNSw1LjUwNTI1OzVANVM1eDV6NXw1fjWANYE1gzWFNaI1pDWmNag1qjWsNa41wzXFNcc1yTXLNdc1 -5DXmNek2HjYgNiI2JDYmNig2KjYsNlE2UzZVNlc2WTZaNlw2XjZ7Nn02fzaBNoM2hTa6Nrw2vjbANsI2 -xDbGNsg27TbvNvE28zb1NvY2+Db7Nxg3GjccNx43IDciNyQ3WTdbN103XzdhN2M3ZTdnN4w3jjeQN5I3 -lDeVN5c3mje3N7k3uze9N783wTfDN/g3+jf8N/44ADgCOAQ4BjgrOC04LzgxODM4NDg2ODk4VjhYOFo4 -XDheOGA4YjiXOJk4mzidOJ84oTijOKU4yjjMOM440DjZONs45DjlOOc46zkIOQo5DDkOORA5EjlHOUk5 -SzlNOU85UTlTOVU5ajlsOW45cDlyOXw5iTmLOZA5mTmkObs50DnSOdQ51jnYOfE5+joDOg46Lzo4OkE6 -SzpNOk86UTpTOlU6VzpgOns6iDqROpw6pzrMOs460DrSOtQ61jrYOuE6/TsGOwg7CzsNOyM7OztEO007 -WjtxO3o7gTuZO6Q7rTuyO8U70jvbO+I7+TwIPBk8GzwdPB88ITxCPEQ8RjxIPEo8SzxNPGI8ZDxmPGk8 -azyDPLw8vjzAPMI8xDzGPMg8yjzXPO089jz9PRU9Jj0oPSo9LD0uPU89UT1TPVU9Vz1aPVs9XT1fPXw9 -fz2BPYQ9hz2JPYw9oz3IPdw95T3nPek96z3tPe899D31Pfc+DD4OPhA+Ej4UPio+Pz5BPkM+RT5HPlE+ -Xj5rPm0+bz5xPo4+kD6SPpQ+lj6XPpk+rj6wPrI+tT64PtA/BT8HPwk/Cz8NPw8/ET8TPxw/JD81Pzc/ -QD9CP08/UT9TP1U/Wz9nP3g/ej98P34/gD+RP5M/lT+XP5k/uj+8P74/wD/CP8M/xT/dQBZAGEAaQBxA -HkAgQCJAJEA1QDdAOUA7QD1AXkBgQGJAZEBmQGdAaUB+QIBAgkCFQIhAoEDZQNtA3UDfQOFA40DlQOdA -+ED6QPxA/kEAQTFBOUFNQVhBZkFwQX1BhEGMQY5BkEGSQZdBmUGeQaBBokGkQaZBs0G/QcJBxUHIQdJB -30HhQeNB5UH3QgRCBkIIQgpCHUIxQoBCnUKvQrpCzELhQu9C+EL5QvtC/kMBQwRDBkMIQwtDDEMNQw9D -FEMdQyJDMENBQ0NDRUNHQ0pDg0OFQ4dDiUOMQ45DkEOSQ5RDl0OaQ5xDt0PAQ8JDy0PNQ9ZD2EPnQ+lD -60PuQ/FD80P1Q/hEFUQXRBlEG0QdRB5EIEQ4RFlEW0RdRF9EYURjRGVEhEShRKNEpUSnRKlEqkSsRMNE -7ET4RPpE/ET+RQBFAkUERQ1FDkUQRVdFXkVpRXBFfEWERZdFnkWsRcBF0kXmRflGBUYMRhlGK0YuRjFG -NEY3RjlGPEY+RkBGQkZERkVGR0ZJRkxGTkZPRlBGXUZlRmhGg0aFRodGiUaLRo1Gj0aRRpNGlUaXRplG -m0adRrhGuka8Rr5GwEbCRsRGxkbIRspGzUbQRtNG1kbeRutG80cCRxtHNEc+R01HZUd/R5JHpke6R9dH -4kfuR/1IB0gTSB9IIUgiSDVINkg/SERIYUh+SIBIgUiUSJVImEidSKJIpEilSLJIv0jCSMVIx0jUSNdI -2EjZSOJI50j0SP1JAkkXSRlJG0kkSStJQUlKSU1JUEldSWBJY0lmSWpJc0l6SY5Jq0mtSbBJs0m2SbdJ -uUnQSfVJ/UoJShRKH0osSjFKNEo9SkZKSUpKSlNKXEpqSnNKfkqISqVKp0qpSqxKr0qwSrJKykrrSu1K -70rySvRK90r5SwBLIUsjSyVLKEsrSyxLLktGS39LgUuDS4VLh0uKS4xLj0uWS61LukvHS8lLzEvPS+xL -7kvwS/NL9kv3S/lMEkxHTElMTExPTFFMVExWTFlMXkxrTG1Mb0xyTHdMfUyOTJBMkkyUTJdMokyzTLVM -t0y5TLxMxUzWTNhM2kzcTN5M70zxTPRM9kz5TRZNGE0aTR1NIE0hTSNNPE1xTXNNdk15TXtNfk2ATYNN -i02YTZpNnE2fTaZNtU3CTcRNx03KTedN6U3rTe5N8U3yTfRODU5CTkROR05KTkxOT05RTlROXU5qTmxO -bk5xTnlOgk6TTpVOmE6aTp1Ouk68Tr5OwU7ETsVOx07gTxVPF08aTx1PH08iTyRPJ08wTz1PP09BT0RP -TE9eT29PcU9zT3ZPeU+aT51PoE+jT6ZPqU+qT6xPr0/MT89P0U/UT9dP2U/cT/RQQ1BEUEZQSVBMUE9Q -UVBUUFdQWFBZUF5QYVByUHRQdlB/UIFQslC1ULdQulC8UL5QwFDDUMZQyVDWUNlQ3FDfUONQ7FDuUPlR -AlEEUQ9RElEVURhRG1EeUUtRTlFQUVNRVVFXUVlRXFFfUWJRZlGTUZZRmFGbUZ1Rn1GhUaRRp1GqUa5R -21HeUeBR41HlUedR6VHsUe9R8lH3UiRSJ1IpUixSLlIwUjJSNVI4UjtSP1JIUk1SVlJjUndShlKPUpxS -qlKzUsRSxlLJUstSzlLvUvJS9VL4UvtS/FL+UwFTGlNtU39TgFOCU4VTiFOLU41TkFOTU5RTlVOYU5pT -o1OlU9ZT2VPbU95T4FPiU+RT51PqU+xT+VP8U/9UAlQFVA5UEFQZVBtUKFQrVC5UMVQ0VDdUOlRnVGpU -bFRvVHFUc1R1VHhUe1SIVLVUuFS6VL1Uv1TBVMNUxlTJVNNVAFUDVQVVCFUKVQxVDlURVRRVI1VQVVNV -VVVXVVlVW1VdVWBVY1WQVZNVlVWXVZlVm1WdVaBVo1WlVbNVwFXCVcVVyFXlVedV6VXsVe9V8FXyVgtW -QFZCVkVWSFZKVk1WT1ZSVldWZFZmVmhWa1ZvVnVWhlaIVopWjVaQVrFWtFa3VrpWvVa+VsBWw1bbVy5X -L1cxVzRXN1c6VzxXP1dCV0NXRFdHV0lXUldUV4VXiFeKV41Xj1eRV5NXlleZV5xXqVesV69Xsle2V79X -wVfKV8xYDVgQWBNYFlgZWBxYH1giWCVYKFgrWC5YMVg0WDdYOlg9WEBYQ1hGWElYTFhPWFJYVVhYWFtY -XlhhWGRYZ1hqWJdYmlicWJ9YoVijWKVYqFirWK1Y3ljsWPlY/Fj+WQBZAVkDWQRZBlkIWQtZDlk7WT5Z -QFlDWUVZR1lJWUxZT1lYWVpZh1mKWYxZj1mRWZNZlVmYWZtZpFmpWdZZ2VnbWd5Z4FniWeRZ51nqWfNZ -+FolWihaKlotWi9aMVozWjZaOVpCWkdadFp3WnlafFp+WoBaglqFWohakVqWWsNaxlrIWstazVrPWtFa -1FrXWuBa5VsaWx1bH1shWyJbJFslWydbKVssWy9bXFtfW2FbZFtmW2hbalttW3Bbc1t1W6JbpVunW6pb -rFuuW7Bbs1u2W7lbu1voW+tb7VvwW/Jb9Fv2W/lb/Fv/XAFcLlwxXDNcNlw4XDpcPFw/XEJcRVxHXHRc -d1x5XHxcflyAXIJchVyIXItcjVy6XL1cv1zCXMRcxlzIXMtczlzRXNRdBV0IXQpdDF0NXQ9dEF0SXRRd -F10aXUddSl1MXU9dUV1TXVVdWF1bXV1dYF2RXZRdll2YXZldm12cXZ5doF2jXaZd013WXdhd213dXd9d -4V3kXedd6l4XXhpeHF4fXiFeI14lXiheK140XjdeZF5nXmlebF5uXnBecl51XnhegV6EXrFetF62Xrle -u169Xr9ewl7FXs5e0V7+XwFfA18GXwhfCl8MXw9fEl8bXyJfT19SX1RfV19ZX1tfXV9gX2NfbF9zX6Rf -p1+pX6tfrF+uX69fsV+zX7ZfuV/mX+lf61/uX/Bf8l/0X/df+l/9YABgLWAwYDJgNWA3YDlgO2A+YEFg -RGBHYHRgd2B5YHxgfmCAYIJghWCIYItgj2C8YL9gwWDEYMZgyGDKYM1g0GDTYNdhBGEHYQlhDGEOYRBh -EmEVYRhhG2EfYSdhOGE6YT1hP2FCYU5hX2FhYWNhZWFoYXthjGGOYZBhk2GWYbNhtWG3YbphvWG+YcBh -2GINYg9iEmIVYhdiGmIcYh9iJ2I0YjZiOGI7YkNiWWJqYmxibmJwYnNifmKPYpFilGKWYpliumK9YsBi -w2LFYsZiyGLLYuRi7WLvYvhi+mMDYwVjDmMQYxNjFmMZY0pjTGNOY1BjUWNTY1RjVmNYY1pjXWOGY4hj -imONY49jkWOTY5VjmGOeY8djyWPLY85j0GPSY9Rj1mPZY+Nj72QAZAJkBGQGZAlkE2QkZCZkKWQrZC5k -O2RMZE5kUGRTZFVkZmRoZGtkbWRwZKlkq2StZLBks2S1ZLdkumS9ZMBkw2TGZOFk6mTsZPVk92UAZQJl -BWUIZQtlLGUuZTBlM2U2ZTdlOWVSZYtljWWPZZFlk2WWZZhlm2WeZdNl3WXpZfdmBGYOZiBmImYlZihm -K2YsZi9mMWY0ZjZmOWZCZkRmR2ZKZmNmZmZoZmtmbmZxZnpmfGaLZo5mkWaUZpdmmmadZqBmvWbAZsJm -xWbIZslmzGbkZwVnB2cJZwxnDmcRZxNnGGc1ZzhnO2c+Z0FnQmdFZ11nrGetZ69nsme1Z7hnume9Z8Bn -wWfCZ8VnzmfQZ/1oAGgCaARoBmgIaApoDWgQaB1oIGgjaCZoL2gxaDpoPGhHaEpoTWhQaFNoVmh/aIJo -hGiGaIhoimiMaI9okmi7aL5owGjCaMRoxmjIaMtozmj3aPpo/Gj+aQBpAmkEaQdpCmkzaTZpOGk6aTxp -PmlAaUNpRmljaWZpaGlraW5pb2lyaYppq2mtaa9psmm0abdpuWnSae9p8mn1afhp+2n8af9qF2pmamdq -aWpsam9qcmp0andqemp7anxqf2qIaopqt2q6arxqvmrAasJqxGrHaspq12raat1q4Grpautq9Gr2awFr -BGsHawprDWsQazlrPGs+a0BrQmtEa0ZrSWtMa3VreGt6a3xrfmuAa4JrhWuIa7FrtGu2a7hrumu8a75r -wWvEa+1r8Gvya/Rr9mv4a/pr/WwAbB1sIGwibCVsKGwpbCxsQ2xkbGZsaGxrbG1scGxybH9snGyfbKFs -pGynbKhsq2zDbORs5mzobOts7WzwbPJtBG0hbSRtJ20qbS1tLm0xbUhtm22cbZ5toW2kbadtqW2sba9t -sG2xbbRtvW2/bext723xbfNt9W33bflt/G3/bgxuD24SbhVuHm4gbiluK24+bkFuRG5HbkpuTW5QblNu -Vm5ZboJuhW6Hbolui26Nbo9ukm6Vbr5uwW7DbsVux27Jbstuzm7Rbvpu/W7/bwFvA28FbwdvCm8NbzZv -OW87bz1vP29Bb0NvRm9Jb3JvdW93b3lve299b39vgm+Fb65vsW+zb7Vvt2+5b7tvvm/Bb+pv7W/vb/Fv -82/1b/dv+m/9cCZwKXArcC1wL3AxcDNwNnA5cFBwaXBwcI1wj3CRcJRwlnCZcKtwuHC6cMhw0XDacOBx -FXEXcRpxHXEgcSFxJHEncSlxLHE1cTdxOnE9cVZxWXFbcV5xYXFkcW1xb3GAcYNxhnGJcYxxj3GScZVx -mHG1cbhxu3G+ccFxxHHFcchx4HIZciRyNnJLcmNyZnJrcm5ycHJycnRyd3J8cn9ygHKDcoRyhnKPcpFy -mnKdcp9yoXKjcqZzAXMOcxFzFHMXcyBzI3MlcyZzKXMscy1zMHMzczVzN3M6cz1zRnNPc1hzWnNdc2Bz -iXOYc6dzqHOqc61zr3Oyc7tzvnPbc91z4HPic+Rz5nPzc/V0GnQfdCF0I3QldCd0KnQtdC50MHRDdEx0 -WXRsdHV0gHSPdJh0pXSwdM100HTSdNV02HTZdNx083UUdRl1G3UddSB1InUldSd1L3VMdU91UXVUdVd1 -WHVbdXJ1k3WVdZd1mXWbdZ51oHW9dcB1wnXFdch1yXXMdeN2BHYGdgh2C3YNdhB2EnYddjp2PXY/dkJ2 -RXZGdkl2YHaBdoN2hXaIdop2jXaPdpd2tHa3drp2vXbAdsF2xHbcdxV3GHcbdx13H3chdyR3J3codyt3 -LHcudzd3OXdCd0R3RndId0p3pXeod6t3rnexd7N3tHe3d7p3u3e+d8F3w3fGd8l30nfUd9d32ngDeAR4 -BngJeAt4DngReC54MHgzeDV4N3g5eEZ4SHhpeGt4bXhveHJ4c3h1eJJ4lXiYeJt4nnifeKJ4unjzePZ4 -+Xj7eP55AHkDeQZ5B3kKeQt5DXkSeRt5HXkmeSh5K3kueTF5NHk3eTp5lXmYeZt5nnmheaN5pHmneap5 -q3muebF5s3m2ebl5wnnEecd5ynnzefR59nn5eft5/noBeh56IHojeiV6J3opejZ6OHpZelt6XXpfemJ6 -Y3pleoJ6hXqHeop6jXqOepF6qHrJest6zXrQetJ61XrXeuJ6+HsSey97MXszezZ7OHs7e0l7VntYe2N7 -cXuCe4R7hnuJe4x7mnure617r3uxe7R7w3vUe9Z72Hvae9177nvwe/J79Xv4fDF8NHw2fDl8PHw+fEB8 -Q3xGfEl8THxPfGl8dHyRfJN8lXyYfJt8nXygfKl8q3yyfLV8uHy7fPR893z6fP19AH0BfQR9B30JfQx9 -D30SfRt9HX0gfSN9LH0ufUt9Tn1RfVR9V31afV19YH1jfWZ9aX1sfW99cn11fZZ9mX2bfZ59oX2ifaR9 -p32/feR95n3ofet97X3wffF9834VfjZ+OX47fj5+QX5CfkR+R35efn9+gX6DfoZ+iH6Lfo1+lX62frl+ -u36+fsF+wn7Efsd+338AfwJ/BH8Hfwl/DH8Ofxl/On89fz9/Qn9Ff0Z/SH9Lf2N/iH+Kf4x/j3+Rf5R/ -lX+Xf6l/yn/Nf89/0n/Vf9Z/2H/bf/OAFIAWgBiAG4AdgCCAIoAsgE2AUIBSgFWAWIBZgFuAXoB3gJyA -noCggKOApYCogKmAq4DMgM+A0YDUgNeA2IDagN2A9YEWgRiBGoEdgR+BIoEkgSuBTIFPgVGBVIFXgViB -WoFdgXWBmoGcgZ6BoYGjgaaBp4Gpga2BzoHRgdSB14HagduB3YHggfiCIYIugjGCMoI7gj6CP4JggmOC -ZYJogmuCbIJugnGCiYKqgqyCroKxgrOCtoK4gsGCy4LkgwGDA4MFgwiDCoMNgxODIIMig1ODVoNZg1uD -XoNgg2ODZYNog2uDbYNvg3iDeoOBg4ODhoOJg5KDlIOXg5mDsIPZg+SD54Pqg+yD74Pxg/OD9oP/hBeE -RIRHhEqETIRPhFCEUoRUhFeEYIR4hJGEyoTNhNCE04TWhNeE2oTjhOWE6ITrhO2E9oT4hPuE/YUGhQiF -D4URhRSFF4U4hTqFPIU/hUKFQ4VFhUeFXoWThZWFl4WZhZyFnoWhhaSFp4WwhbOFxIXGhcmFzIXghgGG -A4YFhgiGC4YMhg6GEIYnhlyGXoZghmOGZYZohmuGboZwhnqGlIaxhrOGtYa4hrqGvYbKhteG2Ybkhu+H -AIcChwWHB4cKhxyHLYcvhzKHNIc3hz6HT4dRh1OHVodZh2aHaIdrh26HdoeHh4mHjIeOh5GHm4esh66H -sIezh7WHxofIh8qHzIfPh9qH64fth++H8of0iAWIB4gKiAyID4gciC2IL4gyiDSIN4hYiGKIb4hxiHSI -d4iAiIOIhoiIiIuIkIiTiJyIoYisiMWIzojXiO2JAIkRiROJFokYiRuJJIk1iTeJOYk7iT2JTolQiVKJ -VIlXiWOJcIlyiXWJeImBiZKJlImWiZmJnImoicWJz4nZifiJ+4n9igCKA4oGigmKLIo6ik6KV4peinaK -k4qWipiKm4qeiqGKpIrEitOK8IrzivWK+Ir7iv2LAIsgiyaLP4tci1+LYYtki2eLaYtsi4qLoYu+i8GL -w4vGi8mLzIvPi/KMBowjjCaMKIwrjC6MMYw0jFCMZYyCjIWMh4yKjI2MkIyTjK+MxIzhjOSM5ozpjOyM -74zyjQ+NEo0UjReNGo0djSCNPI1RjW6NcY1zjXaNeY18jX+Nno22jdON1o3YjduN3o3hjeSOAY4EjgaO -CY4Mjg+OEo4xjkmOao50jneOeY58jn+Ogo6FjoiOnY6kjq+OvI6/jsKOxY7IjsuO5I7sjwmPDI8OjxGP -FI8XjxqPNo9Lj2iPa49tj3CPc492j3mPlY+qj7uPxI/Lj86P0I/Tj9aP6ZAHkBCQFZApkDqQPZBAkEOQ -RpBZkGqQbZBwkHOQdpCEkJWQmJCbkJ6QoZCykLWQuJC7kL6Qz5DSkNWQ2JDbkOmQ+pD9kQCRA5EGkSaR -L5ExkuqS7ZLwkvKS9JL3kvqS/JL+kwGTBJMHkwqTDJMPkxKTFJMWkxiTG5MekyGTJJMmkymTLJMvkzKT -NZM4kzqTPZNAk0OTRpNJk0uTTpNRk1OTVZNXk1qTXZNgk2OTZpNok2uTbpNwk3OTdpN5k3yTf5OCk4WT -iJOLk42TkJOTk5WTl5Oak52ToJOjk6aTqZOrk66TsZO0k7eTupO9k8CTw5PGk8mTzJPPk9KT1ZPYk9qT -3ZPgk+KT5ZPok+qT7ZPwk/OT9ZP4k/uT/pQAlAOUBZQIlAuUDpQRlBSUF5QZlByUH5QilCSUJ5QqlC2U -L5QylDSUNpQ4lDuUPpRBlESUR5RKlE2UUJRSlFSUV5RalFyUXpRhlGSUZ5RqlG2UcJRylHWUeJR7lH2U -gJSDlIaUiZSLlI6UkJSTlJaUmZSclJ6UoZSklKeUqpStlK+UspS1lLeUupS9lL+UwpTFlMiUy5TOlNGU -1JTXlNqU3ZTglOOU5pTplOyU75TylPWU95T6lP2VAJUDlQWVCJULlQ2VEJUTlRaVGJUblR6VIJUjlSaV -KJUrlS6VMZUzlTaVOJU7lT2VQJVDlUWVfpWAlYKVhZWIlYuVjpWRlZSVl5WalZ2VuJXBlcOVzJXOldeV -2ZXileSV9ZX3lfqV/ZYAlgOWBpYJlgyWF5YgljOWNpY3lkCWR5Zilm+WeJZ6ln2Wi5aUlpaYT5hSmFWY -V5hZmFyYX5himGSYZ5hqmGyYb5hxmHSYd5h5mHuYfZiAmIKYhZiHmImYjJiPmJKYlZiYmJuYnpihmKSY -p5iqmK2Yr5iymLWYuJi6mLyYv5jCmMWYyJjLmM2Y0JjTmNWY2JjbmN6Y4ZjjmOaY6ZjrmO2Y75jxmPSY -9pj4mPuY/pkBmQSZB5kJmQyZD5kSmRWZGJkbmR6ZIZkkmSaZKZksmS+ZMpk1mTiZOpk9mUCZQplEmUeZ -SZlMmU+ZUplUmVeZWpldmV+ZYplkmWaZaZlsmW+Zcpl1mXeZepl9mYCZgpmFmYiZi5mNmY+ZkZmTmZWZ -l5mamZyZn5mimaWZp5mqmayZrpmxmbSZtpm4mbqZvZnAmcOZxpnJmcuZzpnRmdSZ1pnZmduZ3ZnfmeGZ -5JnmmemZ7JnvmfKZ9Jn3mfqZ/ZoAmgOaBZoImguaDZoQmhOaFZoYmhuaHpohmiSaJ5oqmi2aMJozmjaa -OZo8mj+aQppFmkiaSppMmk+aUppVmliaWppdmmCaYpplmmiaa5ptmnCac5p1mniae5p+moGahJqHmoma -jJqOmpGak5qWmpiampqjmqWcYJxjnGacaJxqnG2cb5xynHScd5x6nH2cgJyCnIWch5yKnIycjpyRnJSc -l5yanJycn5yinKWcqJyrnK6csJyznLacuZy8nL+cwZzEnMecyZzLnM2c0JzTnNac2ZzcnN+c4ZzknOac -6ZzsnO+c8pz1nPic+5z+nQGdBJ0GnQmdC50NnRCdE50WnRmdHJ0fnSGdJJ0nnSqdLZ0wnTOdNp05nTyd -P51CnUWdSJ1LnU6dUJ1TnVadWJ1bnV6dYJ1jnWadaJ1rnW6dcZ10nXadeZ18nX+dgZ2EnYedip2NnY+d -kp2VnZidmp2dnaCdop2lnaidqp2sna6dsZ20nbedup29ncCdw53Fncidyp3NndCd0p3Unded2p3dneCd -453mneid6p3tnfCd8532nfmd/J3/ngGeBJ4GngmeDJ4PnhKeFJ4XnhqeHZ4gniOeJZ4oniueLZ4wnjOe -Np44njuePp5BnkSeR55Knk2eUJ5TnlaeWJ5bnl6eYZ5knmeeap5tnm+ecp51nniee559noCeg56Fnoie -i56NnpCek56Vnpiemp6dnqCeo56lnqieq56unrCes561nrieu569nsaeyKCDoIagiaCMoI+gkqCVoJig -m6CeoKGgpKCnoKqgraCwoLOgtqC5oLygv6DCoMWgyKDLoM6g0aDUoNeg2qDdoOCg46DmoOmg7KDvoPKg -9aD4oPug/qEBoQShB6EKoQ2hEKEToRahGaEcoR+hIqEloSihK6EuoTGhNKE3oTqhPaFAoUOhRqFJoUyh -T6FSoVWhWKFboV6hYaFkoWehaqFtoXChc6F2oXmhfKF/oYKhhaGIoYuhjqGRoZShl6GaoZ2hoKGjoaah -qaGsoa+hsqG1obihu6G+ocGhxKHHocqhzaHQodOh1qHZodyh36HioeWh6KHroe6h8aH0ofeh+qH9ogCi -A6IGogmiDKIPohKiFaIYohuiHqIhoiSiJ6Iqoi2iMKIzojaiOaI8oj+iQqJFokiiS6JOolGiVKJXolqi -XaJgomOiZqJpomyib6JyonWieKJ7on6igaKEooeiiqKNopCik6KWopminKKfoqKipaKooquirqKxorSi -t6K6or2iwKLDosaiyaLMos+i0qLVotii26LeouGi5KLnouqi7aLwovOi9qL5ovyi/6MCowWjCKMLow6j -EaMUoxejL6NOo12jdKOPo6KjsKPNpASkFqQqpDikfaScpKqkuaTSpOGk96UQpSSlMqV7pY2ln6WtpcKl -3aYBpgymGqZFplOmcqaWpqKmtKbRpvKnAKcXpymnP6dMp1+ndKeIp5ynsKfLp92n9agWqC6oRqhOqGKo -fKieqLGov6jXqOWo/qkUqS+pOalHqV+paqmDqZGprqnJqf2qFaooqjqqRqpjqnmqkqqnqrmqy6rfqv+r -Fqstq0erWatsq4arlauzq9Kr3KvurAisIawvrEKsXqx0rIGsj6yirL2s6qz4rQetFa0krTatRK1XrXSt -ia2ircit263nrfOuB64fri2uRq5ernuulK61rsSu2K7xrwivHa8pr0SvV690r4Kvka+pr7uv1q/8sAmw -H7A1sEqwZbB3sIywrbDCsNGw37D2sQixILEvsUSxUrFzsYaxt7HDsc+x6LIAsg+yJ7Izsj+yUbJgsnKy -hLKgsrWywrLOsuCy77MCsxizNbNOs1yzcrOOs5yzvbPas/i0CrQgtDK0TbRjtHy0jrSWtMW01LTxtQC1 -HbU4tUq1WLVmtYS1mrWotc+15rYBtgq2DLYNtha2GLYZtiK2JLhsuG+4crh1uHi4e7h9uH+4griFuIe4 -ibiMuI+4kriVuJe4mbicuJ+4obijuKW4qLiruK64sbizuLa4ubi8uL+4wrjFuMi4y7jNuNC407jWuNm4 -3LjfuOG45LjmuOm47LjvuPK49Lj2uPm4+7j+uQG5BLkHuQq5DbkPuRK5FbkXuRm5HLkfuSK5JbkouSu5 -LrkxuTS5N7k6uT25QLlCuUW5SLlKuU25ULlSuVW5WLlbuV65YblkuWe5arltuXC5crl1uXi5e7l+uYG5 -hLmHuYq5jbmQuZO5lrmZuZy5n7miuaW5qLmqua25sLmzubW5uLm7ub25wLnDuca5yLnLuc650bnTuda5 -2bnbud254LniueW56Lnrue658bn0ufe5+rn9ugC6A7oFugi6C7oOuhG6E7oWuhm6HLofuiG6JLonuim6 -K7otujC6M7o2ujm6PLo/ukK6RbpHukq6TLpOulG6VLpWuli6W7peumC6Y7pmumm6bLpuunG6dLp3unm6 -fLp/uoK6hbqIuou6jrqQupO6lrqYupu6nrqhuqS6prqpuqy6r7qyurW6t7q6ur26v7rCusW6yLrKus26 -0LrTuta62brcut+64rrluui667ruuvG69Lr3uvq6/Lr/uwK7BbsIuwu7DrsRuxS7F7sauxy7H7siuyW7 -KLsquy27MLsyuzW7OLs7uz27QLtCu0W7SLtKu027ULtSu1W7WLtbu167Ybtju2a7abtsu2+7cbt0u3a7 -ebt8u3+7gruFu4e7iruNu5C7krubu5295b3oveu97r3xvfS99736vf2+AL4Dvga+Cb4Mvg++Er4Vvhi+ -G74eviG+JL4nviq+Lb4wvjO+Nr45vjy+P75CvkW+SL5Lvk6+Ub5Uvle+Wr5dvmC+Y75mvmm+bL5vvnK+ -db54vnu+fr6BvoS+h76Kvo2+kL6Tvpa+mb6cvp++or6lvqi+q76uvrG+tL63vrq+vb7AvsO+xr7Jvsy+ -z77SvtW+2L7bvt6+4b7kvue+6r7tvvC+8772vvm+/L7/vwK/Bb8Ivwu/Dr8RvxS/F78avx2/IL8jvya/ -Kb8svy+/Mr81vzi/O78+v0G/RL9Hv0q/Tb9Qv1O/Vr9Zv1y/X79iv2W/aL9rv26/cb90v3e/er99v4C/ -g7+Gv4m/jL+Pv5K/lb+Yv5u/nr+hv6S/p7+qv62/sL+zv7a/ub+8v7+/wr/Fv8i/y7/Ov9G/1L/Xv9q/ -3b/gv+O/5r/pv+y/77/yv/W/+L/7v/7AAcAEwAfACsANwBDAE8AWwBnAHMAfwCLAJcAowCvALsAxwDTA -N8A6wD3AQMBDwEbAScBMwE/AUsBVwFjAW8BewGHAZMBnwGrAbcBwwHPAdsB5wHzAf8CCwIXAiMCLwI7A -kcCUwJfAmsCdwKDAo8CmwKnArMCvwLLAtcC4wLvAvsDBwMTAx8DKwM3A0MDTwNbA2cDcwN/A4sDlwOjA -68DuwPHA9MD3wPrA/cEAwQPBBsEJwQzBD8ESwRXBGMEbwR7BIcEkwSfBKsEtwTDBM8E2wTnBPME/wULB -RcFIwUvBTcFSwVfBXMFhwWbBaMFtwXDBcsF0wXbBe8F9wX/BhMGJwYvBkMGSwZfBnMGhwaPBqMGrwa7B -scG2wbjBvcHCwcfBycHOwdDB0sHXwdnB3sHhwePB5cHnwezB7sHxwfbB+MH6wfzCAcIDwgbCCMIKwgzC -D8IRwhTCFsIYwhrCHcIgwiXCJ8Iswi7CMMIywjTCNsI4wj3CQMJFwkrCTMJOwlDCUsJUwlbCWMJdwl/C -ZMJpwmzCbsJzwnbCe8J9woLCh8KMwo/ClMKWwp/CocKmwqvCsMK1wrjCu8LAwsPCxcLHwsnCy8LOwtDC -0sLXwtzC4cLmwuvC8ML1wvfC+cL7wv7DAcMGwwvDDcMPwxHDFsMbwx7DIMMiwyXDKsMswy/DMcM0wzbD -OMM6wzzDQcNDw0XDSsNNw0/DVMNZw1zDXsNjw2XDasNsw27DcMNyw3fDesN8w4HDhMOHw4nDjsOTw5jD -msOfw6LDpcOnw6nDrsOww7LDtMO5w77Dw8PFw8fDzMPOw9DD1cPaw9zD3sPgw+LD5cPqw+zD7sPww/XD -98P5w/vD/cQCxATEB8QMxBHEFMQZxBvEHsQhxCbEK8QtxDLENcQ3xDnEPMQ+xEDEQsRHxErET8RSxFfE -XMRhxGTEacRsxG7Ec8R2xHvEgMSFxIfEicSOxJDEksSVxJfEnMSexKPEpsSoxKrErMSuxLHEs8S1xLjE -usS8xL7EwMTDxMjEysTMxNXE18TYxOHE48TkxO3E78TwxPnE/gAAAAAAAAICAAAAAAAAFpoAAAAAAAAA -AAAAAAAAAMUNA - diff --git a/Filters/VLMusicXMLType.reader b/Filters/VLMusicXMLType.reader index a49a54b..b693aa1 100755 --- a/Filters/VLMusicXMLType.reader +++ b/Filters/VLMusicXMLType.reader @@ -219,7 +219,7 @@ class MusicXMLListener @note['pitch'] = VL::NoPitch when 'mode', 'step', 'alter', 'octave', 'duration', 'syllabic', 'text', 'root-step', 'root-alter', 'bass-step', 'bass-alter', 'kind', - 'degree-value', 'degree-alter', 'degree-type' + 'degree-value', 'degree-alter', 'degree-type', 'accidental' @kind = tag when 'tie' @note['tied'] ||= 0 @@ -342,6 +342,13 @@ class MusicXMLListener else @duration = @text.to_i end + when 'accidental' + case @text + when 'sharp' + @note['visual'] = VL::WantSharp + when 'flat' + @note['visual'] = VL::WantFlat + end when 'root-step' @note['pitch'] = PITCH[@text] when 'bass-step' diff --git a/Filters/VLMusicXMLType.writer b/Filters/VLMusicXMLType.writer index 56914d4..defa850 100755 --- a/Filters/VLMusicXMLType.writer +++ b/Filters/VLMusicXMLType.writer @@ -59,7 +59,7 @@ def _part_list end def _attributes(prop) - $USE_FLATS = prop['key'] < 0 + $USE_FLATS = prop['key'] <= 0 $DIVISIONS = prop['divisions'] attr = REXML::Element.new('attributes') attr.add_element newTextElement('divisions', prop['divisions']) @@ -75,7 +75,6 @@ def _attributes(prop) clef.add_element newTextElement('sign', 'G') clef.add_element newTextElement('line', 2) attr.add_element(clef) - return attr end @@ -103,13 +102,13 @@ end STEPS = 'C DbD EbE F GbG AbA BbB ' -def _pitch(name, pitch, prefix="") +def _pitch(name, pitch, preferFlats, prefix="") oct = pitch/12 - 1 stp = 2*(pitch%12) step = STEPS[stp] alt = STEPS[stp+1] == ?b if alt - if $USE_FLATS + if preferFlats alt = -1 else step = step == ?A ? ?G : step-1 @@ -131,9 +130,20 @@ def _pitch(name, pitch, prefix="") return pitch end +def _addAccidental(note, pitch, preferFlats) + stp = 2*(pitch%12) + alt = STEPS[stp+1] == ?b + if alt + note.add_element newTextElement('accidental', + preferFlats ? 'flat' : 'sharp') + end +end + TYPE = %w[whole half quarter eighth 16th 32nd] def _note(pitch, dur, visual, tied) + preferFlats = (visual & VL::WantSharp) == 0 && + ((visual & VL::WantFlat) != 0 || $USE_FLATS) note = REXML::Element.new('note') if pitch == VL::NoPitch note.add_element(REXML::Element.new('rest')) @@ -141,7 +151,7 @@ def _note(pitch, dur, visual, tied) if (tied & VL::InChord) != 0 note.add_element 'chord' end - note.add_element(_pitch('pitch', pitch)) + note.add_element(_pitch('pitch', pitch, preferFlats)) end note.add_element newTextElement('duration', dur) if (tied & VL::TiedWithPrev) != 0 @@ -152,6 +162,9 @@ def _note(pitch, dur, visual, tied) end note.add_element newTextElement('voice', 1) note.add_element newTextElement('type', TYPE[visual & 7]) + if (visual & (VL::WantSharp | VL::WantFlat)) != 0 + _addAccidental(note, pitch, preferFlats) + end return note end @@ -229,7 +242,9 @@ DEGREE = [ [VL::Dim13th+VL::Min13th+VL::Maj13th, VL::Maj13th] ]; -def _chord(pitch, steps, root) +def _chord(pitch, visual, steps, root) + preferFlats = (visual & VL::WantSharp) == 0 && + ((visual & VL::WantFlat) != 0 || $USE_FLATS) # # Pick kind. sus takes precedence # @@ -264,10 +279,10 @@ def _chord(pitch, steps, root) end end harm = REXML::Element.new('harmony') - harm.add_element(_pitch('root', pitch, 'root')) + harm.add_element(_pitch('root', pitch, visual, 'root')) harm.add_element newTextElement('kind', kind) if root != VL::NoPitch - harm.add_element(_pitch('bass', root, 'bass')) + harm.add_element(_pitch('bass', root, visual, 'bass')) end needSteps = steps & ~CHORD[kind] extraSteps= CHORD[kind] & ~steps @@ -390,7 +405,7 @@ def _melody m.add_element(fw) tempAt = chordAt end - m.add_element(_chord(chord['pitch'], chord['steps'], chord['root'])) + m.add_element(_chord(chord['pitch'], chord['visual'], chord['steps'], chord['root'])) end chordAt += (chord['durNum'] * $DIVISIONS * 4) / chord['durDenom'] chordIx += 1 diff --git a/Filters/vl.rb b/Filters/vl.rb index 16224aa..5a13e92 100644 --- a/Filters/vl.rb +++ b/Filters/vl.rb @@ -7,6 +7,8 @@ class VL TiedWithNext = 1 TiedWithPrev = 2 + WantSharp = 0x20 + WantFlat = 0x40 InChord = 4 Unison = 1<<0 diff --git a/Resources/Info.plist b/Resources/Info.plist index fd39ccf..ab347f3 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -44,6 +44,10 @@ CFBundleTypeRole Editor + LSItemContentTypes + + org.aereperennius.vocaleasel-song + LSTypeIsPackage NSDocumentClass @@ -55,6 +59,8 @@ VLMusicXMLType VLLilypondType VLMMAType + VLAIFFType + VLMP3Type NSPersistentStoreTypeKey XML @@ -72,6 +78,10 @@ CFBundleTypeRole Viewer + LSItemContentTypes + + org.lilypond.lilypond-source + LSTypeIsPackage NSDocumentClass @@ -130,6 +140,10 @@ CFBundleTypeRole None + LSItemContentTypes + + public.midi + LSTypeIsPackage NSPersistentStoreTypeKey @@ -148,6 +162,62 @@ VLPDFType CFBundleTypeRole None + LSItemContentTypes + + com.adobe.pdf + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + aiff + + CFBundleTypeMIMETypes + + audio/x-aiff + + CFBundleTypeName + VLAIFFType + CFBundleTypeOSTypes + + AIFC + + CFBundleTypeRole + None + LSItemContentTypes + + public.aifc-audio + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + mp3 + + CFBundleTypeMIMETypes + + audio/mp3 + + CFBundleTypeName + VLMP3Type + CFBundleTypeOSTypes + + MPG3 + + CFBundleTypeRole + None + LSItemContentTypes + + public.mp3 + LSTypeIsPackage NSPersistentStoreTypeKey @@ -171,7 +241,7 @@ CFBundleSignature VçEz CFBundleVersion - 1.0b3 + 1.1b1 NSMainNibFile MainMenu NSPrincipalClass diff --git a/Resources/bck.icns b/Resources/bck.icns new file mode 100644 index 0000000000000000000000000000000000000000..5068b7d7767b8d379d15a7bb868c56e35b7771e0 GIT binary patch literal 38349 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 literal 0 HcmV?d00001 diff --git a/Resources/installLame.scpt b/Resources/installLame.scpt new file mode 100644 index 0000000000000000000000000000000000000000..e65ec13c86dc95ffda9ca126efac59f6cb62ab07 GIT binary patch literal 1070 zcmb_bO>fgc5Pfz+len=Rw>?yxBDfVPZKSG|!i9(rK~<@Tq!JRR#W9kp6Pws=ul)fW z`bRkMANmtGq6%^3Q2IeB{T$vZw9rUJ99U~-XJ*IyX7=qoQE6wn*{arS^%*@K0C`sg z22A7(DzK^NBAP%2dAX2t8+n*Zw6*6JMr;aWg;pLe3ML8+E}~>pHi&}BUAbn z<09@v)Vc^vIno&(>q{9K0D-sTxNwXQMV-k19}ftiqA=Ab8*984qtfcd>x)60sD7tD z)103h0)2Xqd=ww{%k7}w4SOo8sU#VS`6sjZ_Qlr1v2__M96+ghY5!VF%UKwOSr{`z&;Q|`XB#A;_WntV)8&~Hwt`*?mHu-Fmt3J8V3~6?1 zlnFl^85Ps37~4S|GiYKSa~Q+jKcS|tpr)@uVI0OZ9~Bdq3oXt8hl#_j zAcvfMCtStgLP(d}hn5`jRjObui+R`jF#{W{dlOR}4#Nr+`36r8WS>cl%brE^=09wB zgO1V&6DB4!@3L#kuFmE_Kf-;zHKxTl8_bcfD9et;<>m&nWalrv(CPo|6k0c_*)8Uy>tixnr1l1$Rz`?+9#Ouy0AfFM) z2I>RiLZCe+=+;c`VscehVh~^mX2@g6XDDazVMqni1q_J{MGPqnh71M_jtu4uW}9Cz HIWPhMDqt(4 delta 180 zcmdnSv5I3u5F^tGj>(CPo|6k0c_*)8B$0@)-&k5*dmZQWz{592ra)3>l0ze`9iB1OP-I BDRTe- diff --git a/Resources/play.icns b/Resources/play.icns new file mode 100644 index 0000000000000000000000000000000000000000..c5cb79bcedde2cbd63446a867dae8c216bd9bcd1 GIT binary patch literal 43336 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 LRFGZ{x4?e^rDxPm literal 0 HcmV?d00001 diff --git a/Resources/run.icns b/Resources/run.icns deleted file mode 100644 index 931d4e4f61da9e66084578150541f2f9ec030ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2887 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 XE4wjOl=%D~5+DH*AOR9MqXhl}lB7Lf literal 0 HcmV?d00001 diff --git a/Resources/stop.tiff b/Resources/stop.tiff deleted file mode 100644 index 6b4626f98f7cb94f59eedbe7e60dbd28922bc5a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15740 zcmeG@33L-zl3$WfVQgUsa~a%-!@yXFB^%j7Hu4c8XDnOTGIuhxrM4`P)Iw^3?SK*B zKsc6|9hQX+BsL_$WViw(flM+3gd~t*IFdYIVJCxu;RqSRu$u`m$*}cXhviG)9Q(3~ zTCcl*)vsUwS9Nv$QvLo~EgFLmib8$SKT#NzIB?<%kG&C4<^+_vY#Hb{d=Afx4+kj1 zTjoN!kB^Vy6;59-9=AyJmNCzMKAP}XIRg=Jz+H0UIfMM=ft(~SJ+2uQz&{N^FX%DA z3OO==c`PS8fTpaiE%$BAJAO3KKe4n3mxs#`N??|mePhVh0Y9t*&yWAL8=({d^4@ce zbR|XTs%eIHR?~JuA(kSUR4P|W)0HwAk(Qy9%aj=kq#9piCk?YHhNz@WW?Od37r*^| z3Sl;8r%cY!O11WUs@klnb5P}VC3-{MY(thYWqb}_HJ-%$MKz>dRAsg>l*36-PD8dZ zzf6d$Ym`u9r5KW^v07|SWleSp+dv6rjFzMjED19^J7tPiM=&&PnQdkWnK)A{6UpVN zM3sZIQuAoXY$8pZkpe6o#wul5L7|r+K-nqP3}aVHB=hFY6VH>2X@^OYmX(zyk;)`8 znFuIE&RQEo)`)D*VbC8t5c3p&Gn-S)j!A5wtrGJTNt#$HfsXhD+f@OG<1pJ9Gi@Wt zO4`L_r?^~Zqf$CnHa0_Ul!+8$$C9G7G^0Y4X^>`$NTW0}Bf~(Bt*T5<;S)Z&NxN3t zb&sGRwo9uO_eu~dKxnnf0@~oRQZ}ZjAjhLIBW-|g?Y;-89GfMjsB}d-9)O~o0jMOM zn1NUltik}fKvoY9)Cvlg_#YY`&JTZtI_Z&)L+T2tt4A8>5pl@6Lh9;~26{vsvaXQ2 zdZd9K5r?cRq^=%mphv_Z>k6r>M;ho6amczt>gtgOdPMwftqbxyzN`>sgH+Hw$oZhm zydrJb2sY;=V6OoeT*vziBL?q)wpI%<7g9oyJINM8T17}uHUn)m+f3QQ3Vop{lg$wg zEhx>`Pt`q6*ezx!L+C20Z4M-Y z#2#jLhuOx6b)<ar-_W|@@o?cV6BxQBM{iBHYY&!gH;sROHq#0f=TXZ}ajrS<*) zv7RnO!*=3RURrxSh72hBTNzNffwX{+_^BCB2eJH42dpOKbNv40+nLNHm

ZHb21` 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 literal 0 HcmV?d00001 diff --git a/Resources/toend.icns b/Resources/toend.icns new file mode 100644 index 0000000000000000000000000000000000000000..227a8e5adf425b8d509ba51e741826f8f93f12da GIT binary patch literal 37992 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 literal 0 HcmV?d00001 diff --git a/Sources/VLAIFFDocument.h b/Sources/VLAIFFDocument.h new file mode 100644 index 0000000..7ce0477 --- /dev/null +++ b/Sources/VLAIFFDocument.h @@ -0,0 +1,18 @@ +// +// File: VLAIFFDocument.h - Export document in AIFF format +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#import +#import "VLDocument.h" + +@interface VLDocument (AIFF) + +- (NSFileWrapper *)aiffFileWrapperWithError:(NSError **)outError; + +@end diff --git a/Sources/VLAIFFDocument.mm b/Sources/VLAIFFDocument.mm new file mode 100644 index 0000000..f53755c --- /dev/null +++ b/Sources/VLAIFFDocument.mm @@ -0,0 +1,34 @@ +// +// File: VLAIFFDocument.mm - Export document in AIFF format +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#import "VLAIFFDocument.h" +#import "VLSoundOut.h" + +#import + +@implementation VLDocument (AIFF) + +- (NSFileWrapper *)aiffFileWrapperWithError:(NSError **)outError +{ + [self createTmpFileWithExtension:@"mid" ofType:@"VLMIDIType"]; + + NSURL * midiURL = [self fileURLWithExtension:@"mid"]; + NSURL * aiffURL = [self fileURLWithExtension:@"aiff"]; + VLSoundOut *writer = + VLSoundOut::FileWriter((CFURLRef)aiffURL, kAudioFormatLinearPCM); + writer->PlayFile(CFDataRef([NSData dataWithContentsOfURL:midiURL])); + delete writer; + + return [[[NSFileWrapper alloc] + initWithPath:[[self fileURLWithExtension:@"aiff"] path]] + autorelease]; +} + +@end diff --git a/Sources/VLAppController.h b/Sources/VLAppController.h index f61f6a4..29a65b7 100644 --- a/Sources/VLAppController.h +++ b/Sources/VLAppController.h @@ -5,7 +5,7 @@ // // (MN) Matthias Neeracher // -// Copyright © 2005-2007 Matthias Neeracher +// Copyright © 2005-2008 Matthias Neeracher // #import @@ -17,6 +17,7 @@ NSString * toolPath; NSString * appPath; + NSString * lamePath; } - (IBAction) playNewPitch:(id)sender; @@ -25,6 +26,8 @@ - (IBAction) goToHelpURL:(id)sender; - (IBAction) showMirror:(id)sender; +- (BOOL) lameIsInstalled; + @end // Local Variables: diff --git a/Sources/VLAppController.mm b/Sources/VLAppController.mm index 3c223c5..022455d 100644 --- a/Sources/VLAppController.mm +++ b/Sources/VLAppController.mm @@ -65,6 +65,7 @@ if (self = [super init]) { toolPath = nil; appPath = nil; + lamePath = nil; } return self; } @@ -269,6 +270,32 @@ } } +- (BOOL) lameIsInstalled +{ + if (!lamePath) { + lamePath = [self getLineFromCommand:@"bash -l which lame"]; + if (!lamePath) + if ([self promptForSoftwareInstallation:@"Download" + withTitle: @"LAME Not Found!" + explanation: + @"The LAME MP3 encoder is needed to save songs in" + " MP3 format.%@" + script:@"installLame" + url:[NSURL URLWithString:@"http://64.151.81.88/download/thalictrum/lame-3.97.dmg.gz"]] + ) { + [[NSAlert alertWithMessageText:@"Quit and Restart" + defaultButton: @"OK" alternateButton: @"" otherButton: @"" + informativeTextWithFormat: + @"The software you have chosen to install will be " + "available after you restart this application."] + runModal]; + [NSApp terminate:self]; + } + return NO; + } + return YES; +} + - (IBAction) playNewPitch:(id)sender { VLNote note(VLFraction(1,4), [sender intValue]); diff --git a/Sources/VLDocument.h b/Sources/VLDocument.h index a7ef0de..2f0e416 100644 --- a/Sources/VLDocument.h +++ b/Sources/VLDocument.h @@ -51,6 +51,7 @@ enum { VLKeyValueUndo* undo; PDFDocument * printDoc; NSRange previewRange; + float playRate; } - (VLSong *) song; @@ -74,8 +75,8 @@ enum { - (IBAction) play:(id)sender; - (IBAction) stop:(id)sender; - (IBAction) playStop:(id)sender; +- (IBAction) playMusic:(id)sender; - (IBAction) togglePlayElements:(id)sender; -- (IBAction) playStop:(id)sender; - (NSString *) tmpPath; - (NSString *) workPath; diff --git a/Sources/VLDocument.mm b/Sources/VLDocument.mm index 07cbdad..d3e8087 100644 --- a/Sources/VLDocument.mm +++ b/Sources/VLDocument.mm @@ -13,12 +13,15 @@ #import "VLLilypondDocument.h" #import "VLMMADocument.h" #import "VLMIDIDocument.h" +#import "VLAIFFDocument.h" +#import "VLMP3Document.h" #import "VLPDFDocument.h" #import "VLPListDocument.h" #import "VLPDFWindow.h" #import "VLLogWindow.h" #import "VLSheetWindow.h" #import "VLSoundOut.h" +#import "VLMIDIWriter.h" #import @@ -88,6 +91,7 @@ vcsWrapper = nil; repeatVolta = 2; brandNew = true; + playRate = 1.0; observers = [[NSMutableArray alloc] init]; validTmpFiles = [[NSMutableDictionary alloc] initWithCapacity:10]; [self setHasUndoManager:YES]; @@ -402,6 +406,10 @@ return [self mmaFileWrapperWithError:outError]; } else if ([typeName isEqual:@"VLMIDIType"]) { return [self midiFileWrapperWithError:outError]; + } else if ([typeName isEqual:@"VLAIFFType"]) { + return [self aiffFileWrapperWithError:outError]; + } else if ([typeName isEqual:@"VLMP3Type"]) { + return [self mp3FileWrapperWithError:outError]; } else if ([typeName isEqual:@"VLPDFType"]) { return [self pdfFileWrapperWithError:outError]; } else { @@ -488,9 +496,29 @@ - (IBAction) play:(id)sender { [self createTmpFileWithExtension:@"mid" ofType:@"VLMIDIType"]; - VLSoundOut::Instance()->PlayFile( - CFDataRef([NSData dataWithContentsOfURL: - [self fileURLWithExtension:@"mid"]])); + + MusicSequence music; + NewMusicSequence(&music); + + FSRef fsRef; + CFURLGetFSRef((CFURLRef)[self fileURLWithExtension:@"mid"], &fsRef); + + MusicSequenceLoadSMFWithFlags(music, &fsRef, + kMusicSequenceLoadSMF_ChannelsToTracks); + + size_t countIn = 0; + if (playElements & kVLPlayCountIn) + switch ([[self songTime] intValue]) { + case 0x404: + case 0x304: + case 0x608: + countIn = 2; + } + VLMIDIWriter annotate(music, countIn); + annotate.Visit(*song); + + [sheetWin willPlaySequence:music]; + VLSoundOut::Instance()->PlaySequence(music); } - (void) playWithGroove:(NSString *)groove inSections:(NSRange)sections @@ -524,6 +552,42 @@ } } +- (IBAction) playMusic:(id)sender +{ + const float kMaxRate = 8.0f; + const float kMinRate = 0.2f; + const float kUpScale = 1.2f; + const float kDownScale = 0.8f; + bool nowPlaying = VLSoundOut::Instance()->Playing(); + switch (int tag = [sender tag]) { + case 0: // Play + VLSoundOut::Instance()->SetPlayRate(playRate = 1.0f); + if (!nowPlaying) + [self play:sender]; + break; + case 1: // Fwd + case -1: // Rew + if (tag * playRate < 0) + playRate = tag; + else if (fabsf(playRate) >= kMaxRate) + playRate = tag*kDownScale; + else if (fabsf(playRate) <= kMinRate) + playRate = tag*kUpScale; + else if (fabsf(playRate) >= 1.0f) + playRate *= kUpScale; + else + playRate *= kDownScale; + VLSoundOut::Instance()->SetPlayRate(playRate); + break; + case -2: // To Start + VLSoundOut::Instance()->SetTime(0); + break; + case 2: // To End + VLSoundOut::Instance()->SetTime(0x7FFFFFFF); + break; + } +} + - (IBAction) showOutput:(id)sender { [self createTmpFileWithExtension:@"pdf" ofType:@"VLPDFType"]; diff --git a/Sources/VLLayout.cpp b/Sources/VLLayout.cpp index 963be43..b3859df 100644 --- a/Sources/VLLayout.cpp +++ b/Sources/VLLayout.cpp @@ -101,12 +101,13 @@ VLTextLayout::VLTextLayout(VLFontHandler * regular, VLFontHandler * narrow) { } -void VLTextLayout::AddSyllable(const VLSyllable & syll, float x) +void VLTextLayout::AddSyllable(const VLSyllable & syll, float x, bool highlight) { VLLayoutSyll ls; static_cast(ls) = syll; - ls.fX = x; + ls.fX = x; + ls.fHighlight = highlight; fSyllables.push_back(ls); } @@ -130,10 +131,12 @@ void VLTextLayout::DrawLine(float y) float nextX = syll->fX-0.5*nextW; if (syll->fKind & VLSyllable::kHasPrev) - fRegularFont->Draw(nextX-fRegularFont->Width(PRE_DASH), y, PRE_DASH); + fRegularFont->Draw(nextX-fRegularFont->Width(PRE_DASH), y, PRE_DASH, + false); while (syll != end) { std::string text = syll->fText; + bool hl = syll->fHighlight; VLSyllIter next = syll+1; float curW = nextW; float curX = nextX; @@ -147,8 +150,8 @@ void VLTextLayout::DrawLine(float y) // Plenty of space, draw dashes // float dashSpace = 0.5*(nextX-curX-curW-kDashW); - fRegularFont->Draw(curX, y, text.c_str()); - fRegularFont->Draw(curX+curW+dashSpace, y, "-"); + fRegularFont->Draw(curX, y, text.c_str(), hl); + fRegularFont->Draw(curX+curW+dashSpace, y, "-", hl); goto nextText; } else { @@ -167,12 +170,12 @@ void VLTextLayout::DrawLine(float y) // // Enough space, draw regular // - fRegularFont->Draw(curX, y, text.c_str()); + fRegularFont->Draw(curX, y, text.c_str(), hl); } else { // // Tight space, draw narrow & adjust // - fNarrowFont->Draw(curX, y, text.c_str()); + fNarrowFont->Draw(curX, y, text.c_str(), syll->fHighlight); text += NARROW_SPACE; nextX = std::max(nextX, curX+fNarrowFont->Width(text.c_str())); } @@ -184,7 +187,7 @@ void VLTextLayout::DrawLine(float y) // if ((end-1)->fKind & VLSyllable::kHasNext) text += POST_DASH; - fRegularFont->Draw(curX, y, text.c_str()); + fRegularFont->Draw(curX, y, text.c_str(), hl); nextText: syll = next; } diff --git a/Sources/VLLayout.h b/Sources/VLLayout.h index 4394463..0f851c9 100644 --- a/Sources/VLLayout.h +++ b/Sources/VLLayout.h @@ -45,20 +45,22 @@ public: class VLFontHandler { public: - virtual void Draw(float x, float y, const char * utf8Text) = 0; + virtual void Draw(float x, float y, + const char * utf8Text, bool highlight) = 0; virtual float Width(const char * utf8Text) = 0; virtual ~VLFontHandler(); }; struct VLLayoutSyll : public VLSyllable { float fX; + bool fHighlight; }; class VLTextLayout { public: VLTextLayout(VLFontHandler * regular, VLFontHandler * narrow); - void AddSyllable(const VLSyllable & syll, float x); + void AddSyllable(const VLSyllable & syll, float x, bool highlight); void DrawLine(float y); private: VLFontHandler * fRegularFont; diff --git a/Sources/VLLilypondWriter.cpp b/Sources/VLLilypondWriter.cpp index 465b764..2a3ac28 100644 --- a/Sources/VLLilypondWriter.cpp +++ b/Sources/VLLilypondWriter.cpp @@ -224,9 +224,17 @@ static std::string EscapeSyllable(std::string syll) return '"'+syll+'"'; } +static bool PreferSharps(bool globalSharps, int noteAccidentals) +{ + return (noteAccidentals & VLNote::kAccidentals) + ? (noteAccidentals & VLNote::kWantSharp) + : globalSharps; +} + void VLLilypondWriter::VisitNote(VLLyricsNote & n) { - std::string nm = LilypondPitchName(n.fPitch, fUseSharps); + std::string nm = + LilypondPitchName(n.fPitch, PreferSharps(fUseSharps, n.fVisual)); if (n.fPitch != VLNote::kNoPitch) { int ref = VLNote::kMiddleC-VLNote::kOctave; for (int ticks = (n.fPitch-ref)/VLNote::kOctave; ticks>0; --ticks) @@ -248,7 +256,8 @@ void VLLilypondWriter::VisitNote(VLLyricsNote & n) sprintf(duration, "%s\\times 2/3 { %s%d%s }", space, nm.c_str(), kValue[n.fVisual & VLNote::kNoteHead], tie); else - sprintf(duration, "%s%s%d%s", space, nm.c_str(), kValue[n.fVisual], tie); + sprintf(duration, "%s%s%d%s", + space, nm.c_str(), kValue[n.fVisual & VLNote::kNoteHead], tie); fAccum += duration; fPrevNote= n; @@ -271,7 +280,8 @@ static const char * kLilypondStepNames[] = { void VLLilypondWriter::VisitChord(VLChord & c) { - std::string name = LilypondPitchName(c.fPitch, fUseSharps); + std::string name = + LilypondPitchName(c.fPitch, PreferSharps(fUseSharps, c.fVisual)); char duration[16]; if (c.fDuration.fNum == 1 && !(c.fDuration.fDenom & (c.fDuration.fDenom-1))) // Power of two sprintf(duration, "%d", c.fDuration.fDenom); diff --git a/Sources/VLMIDIDocument.mm b/Sources/VLMIDIDocument.mm index b2baa24..e86f510 100644 --- a/Sources/VLMIDIDocument.mm +++ b/Sources/VLMIDIDocument.mm @@ -9,6 +9,7 @@ // #import "VLMIDIDocument.h" +#import "VLMIDIWriter.h" @implementation VLDocument (MIDI) diff --git a/Sources/VLMIDIWriter.cpp b/Sources/VLMIDIWriter.cpp new file mode 100644 index 0000000..70df48c --- /dev/null +++ b/Sources/VLMIDIWriter.cpp @@ -0,0 +1,69 @@ +// +// File: VLMIDIWriter.cpp +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#include "VLMIDIWriter.h" +#include + +struct VLMetaEvent : MIDIMetaEvent { + char fPadding[32]; + + VLMetaEvent(const char * label) + { + metaEventType = 3; + dataLength = strlen(label); + memcpy(data, label, dataLength); + } +}; + +void VLMIDIWriter::Visit(VLSong & song) +{ + MusicSequenceNewTrack(fMusic, &fTrack); + VLMetaEvent meta("VocalEasel"); + MusicTrackNewMetaEvent(fTrack, 0.0, &meta); + + VisitMeasures(song, true); +} + +void VLMIDIWriter::VisitMeasure(size_t m, VLProperties & p, VLMeasure & meas) +{ + fTime = p.fTime; + fMeasure = m; + + if (!m) + fChordTime = fNoteTime = fCountIn*fTime.fNum; + + fAt = 0; + VisitChords(meas); + + fAt = 0; + VisitNotes(meas, p, false); +} + +void VLMIDIWriter::VisitNote(VLLyricsNote & n) +{ + if (n.fPitch != VLNote::kNoPitch && !(n.fTied & VLNote::kTiedWithPrev)) { + VLMIDIUserEvent event = {8, n.fPitch, fMeasure, fAt}; + MusicTrackNewUserEvent(fTrack, fNoteTime, + reinterpret_cast(&event)); + } + fAt += n.fDuration; + fNoteTime += n.fDuration * (float)fTime.fDenom; +} + +void VLMIDIWriter::VisitChord(VLChord & c) +{ + if (c.fPitch != VLNote::kNoPitch) { + VLMIDIUserEvent event = {8, 0, fMeasure, fAt}; + MusicTrackNewUserEvent(fTrack, fChordTime, + reinterpret_cast(&event)); + } + fAt += c.fDuration; + fChordTime += c.fDuration * (float)fTime.fDenom; +} diff --git a/Sources/VLMIDIWriter.h b/Sources/VLMIDIWriter.h new file mode 100644 index 0000000..f37a563 --- /dev/null +++ b/Sources/VLMIDIWriter.h @@ -0,0 +1,44 @@ +// +// File: VLMIDIWriter.h +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#include "VLModel.h" +#include +#include + +struct VLMIDIUserEvent { + uint32_t fLength; + int8_t fPitch; // 0 -> Chord + int16_t fMeasure; + VLFract fAt; +}; + +class VLMIDIWriter: public VLSongVisitor { +public: + VLMIDIWriter(MusicSequence music, size_t countIn) + : fMusic(music), fCountIn(countIn) {} + + virtual void Visit(VLSong & song); + virtual void VisitMeasure(size_t m, VLProperties & p, VLMeasure & meas); + virtual void VisitNote(VLLyricsNote & n); + virtual void VisitChord(VLChord & c); +private: + MusicSequence fMusic; + size_t fCountIn; + MusicTrack fTrack; + size_t fMeasure; + MusicTimeStamp fChordTime; + MusicTimeStamp fNoteTime; + VLFraction fAt; + VLFraction fTime; +}; + +// Local Variables: +// mode:C++ +// End: diff --git a/Sources/VLMMAWriter.cpp b/Sources/VLMMAWriter.cpp index 16291f8..2b98bc4 100644 --- a/Sources/VLMMAWriter.cpp +++ b/Sources/VLMMAWriter.cpp @@ -1,5 +1,5 @@ // -// File: VLMMAWriter.h +// File: VLMMAWriter.cpp // // Author(s): // diff --git a/Sources/VLMP3Document.h b/Sources/VLMP3Document.h new file mode 100644 index 0000000..8e4f83f --- /dev/null +++ b/Sources/VLMP3Document.h @@ -0,0 +1,18 @@ +// +// File: VLMP3Document.h - Export document in MP3 format +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#import +#import "VLDocument.h" + +@interface VLDocument (MP3) + +- (NSFileWrapper *)mp3FileWrapperWithError:(NSError **)outError; + +@end diff --git a/Sources/VLMP3Document.mm b/Sources/VLMP3Document.mm new file mode 100644 index 0000000..3f3a383 --- /dev/null +++ b/Sources/VLMP3Document.mm @@ -0,0 +1,69 @@ +// +// File: VLMP3Document.mm - Export document in MP3 format +// +// Author(s): +// +// (MN) Matthias Neeracher +// +// Copyright © 2008 Matthias Neeracher +// + +#import "VLMP3Document.h" + +@implementation VLDocument (MP3) + +- (NSFileWrapper *)mp3FileWrapperWithError:(NSError **)outError +{ + if (![[NSApp delegate] lameIsInstalled]) { + if (outError) + *outError = [NSError errorWithDomain:NSPOSIXErrorDomain + code:ENOEXEC userInfo:nil]; + return nil; + } + NSBundle * mainBundle = [NSBundle mainBundle]; + + [self createTmpFileWithExtension:@"aiff" ofType:@"VLAIFFType"]; + + NSURL * aiffURL = [self fileURLWithExtension:@"aiff"]; + NSURL * mp3URL = [self fileURLWithExtension:@"mp3"]; + NSString * launch = + [mainBundle pathForResource:@"lameWrapper" ofType:@"" + inDirectory:@"bin"]; + NSArray * args = [NSArray arrayWithObjects: @"--quiet", @"-h", [aiffURL path], [mp3URL path], nil]; + NSTask * task = [self taskWithLaunchPath:launch arguments:args]; + + [[NSNotificationCenter defaultCenter] + addObserver:self selector:@selector(lameDone:) + name:NSTaskDidTerminateNotification object:task]; + + [sheetWin startAnimation]; + [task launch]; + [task waitUntilExit]; + [sheetWin stopAnimation]; + int status = [task terminationStatus]; + if (!status) { + return [[[NSFileWrapper alloc] + initWithPath:[[self fileURLWithExtension:@"mp3"] path]] + autorelease]; + } else { + if (outError) + *outError = [NSError errorWithDomain:NSCocoaErrorDomain + code:NSPersistentStoreSaveError + userInfo:nil]; + + return nil; + } +} + +- (void)lameDone:(NSNotification *)notification { + [[NSNotificationCenter defaultCenter] removeObserver: self + name:NSTaskDidTerminateNotification object:[notification object]]; + int status = [[notification object] terminationStatus]; + if (!status) { + ; + } else { + NSBeep(); + } +} + +@end diff --git a/Sources/VLModel.cpp b/Sources/VLModel.cpp index 94ed7c4..860e466 100644 --- a/Sources/VLModel.cpp +++ b/Sources/VLModel.cpp @@ -5,7 +5,7 @@ // // (MN) Matthias Neeracher // -// Copyright © 2005-2007 Matthias Neeracher +// Copyright © 2005-2008 Matthias Neeracher // #include "VLModel.h" @@ -104,15 +104,19 @@ VLNote::VLNote(std::string name) name.erase(0, 1); // // Look for sharp / flat - // + // + fVisual = 0; if (name.size()) if (name[0] == '#') { ++fPitch; + fVisual |= kWantSharp; name.erase(0); } else if (name[0] == 'b') { --fPitch; + fVisual |= kWantFlat; name.erase(0, 1); } + AdjustAccidentals(); if (name == "") return; @@ -127,14 +131,14 @@ VLNote::VLNote(VLFraction dur, int pitch) void VLNote::Name(std::string & name, bool useSharps) const { - name = PitchName(fPitch, useSharps); + name = PitchName(fPitch, useSharps && !(fVisual & kWantFlat)); } void VLNote::MakeRepresentable() { if (fDuration > 1) fDuration = 1; - fVisual = kWhole; + fVisual = kWhole | (fVisual & kAccidentals); VLFraction part(1,1); VLFraction triplet(2,3); // @@ -159,6 +163,26 @@ void VLNote::MakeRepresentable() abort(); } +void VLNote::AdjustAccidentals() +{ + // + // Don't store accidental preferences for whole notes: + // There is no way to represent these in MusicXML, so saving and + // reloading would change behavior. + // + enum { + kC = 1<<0, + kD = 1<<2, + kE = 1<<4, + kF = 1<<5, + kG = 1<<7, + kA = 1<<9, + kB = 1<<11 + }; + if ((1 << (fPitch % 12)) & (kC | kD | kE | kF | kG | kA | kB)) + fVisual &= ~kAccidentals; +} + void VLNote::AlignToGrid(VLFraction at, VLFraction grid) { if (at+fDuration > grid) { @@ -232,11 +256,14 @@ VLChord::VLChord(std::string name) if (name.size()) if (name[0] == '#') { ++fPitch; + fVisual |= kWantSharp; name.erase(0, 1); } else if (name[0] == 'b') { --fPitch; + fVisual |= kWantFlat; name.erase(0, 1); } + AdjustAccidentals(); // // Root // @@ -300,7 +327,7 @@ static const char * kStepNames[] = { void VLChord::Name(std::string & base, std::string & ext, std::string & root, bool useSharps) const { - base = PitchName(fPitch, useSharps); + base = PitchName(fPitch, useSharps && !(fVisual & kWantFlat)); ext = ""; root = ""; @@ -372,7 +399,7 @@ void VLChord::Name(std::string & base, std::string & ext, std::string & root, bo // Root // if (fRootPitch != kNoPitch) - root = PitchName(fRootPitch, useSharps); + root = PitchName(fRootPitch, useSharps && !(fVisual & kWantFlat)); } VLMeasure::VLMeasure() @@ -490,7 +517,7 @@ void VLMeasure::DecomposeNotes(const VLProperties & prop, VLNoteList & decompose // // First swing note (4th triplet -> 8th) // - p.fVisual = (p.fVisual+1) & VLNote::kNoteHead; + p.fVisual = (p.fVisual+1) & ~VLNote::kTriplet; } } else if ((p.fDuration == sw12 && ((at+p.fDuration) % grid4 == 0)) || (swing16 && p.fDuration == sw24 && ((at+p.fDuration) % grid8 == 0)) @@ -498,7 +525,7 @@ void VLMeasure::DecomposeNotes(const VLProperties & prop, VLNoteList & decompose // // Second swing note (8th triplet -> 8th) // - p.fVisual &= VLNote::kNoteHead; + p.fVisual &= ~VLNote::kTriplet; } else if ((at % p.fDuration != 0) || (p.fDuration != c.fDuration && 2*p.fDuration != c.fDuration) @@ -507,7 +534,7 @@ void VLMeasure::DecomposeNotes(const VLProperties & prop, VLNoteList & decompose // Get rid of awkward triplets // p.fDuration *= VLFraction(3,4); - p.fVisual = (p.fVisual+1) & VLNote::kNoteHead; + p.fVisual = (p.fVisual+1) & ~VLNote::kTriplet; } } haveDuration: @@ -703,6 +730,8 @@ void VLSong::AddNote(VLLyricsNote note, size_t measure, VLFraction at) // while (measure+1 >= fMeasures.size()) AddMeasure(); + + note.AdjustAccidentals(); VLNoteList::iterator i = fMeasures[measure].fMelody.begin(); VLFraction t(0); @@ -863,6 +892,7 @@ void VLSong::ExtendNote(size_t measure, VLFraction at) // Extend previous note // k->fPitch = i->fPitch; + k->fVisual= i->fVisual; k->fTied = VLNote::kTiedWithPrev; i->fTied |= VLNote::kTiedWithNext; k->fLyrics.clear(); @@ -935,6 +965,7 @@ void VLSong::ChangeKey(int section, int newKey, int newMode, bool transpose) for (; i!=e; ++i) { TransposePinned(i->fPitch, semi); TransposePinned(i->fRootPitch, semi); + i->AdjustAccidentals(); } } for (int pass=0; pass<2 && semi;) { @@ -953,6 +984,7 @@ void VLSong::ChangeKey(int section, int newKey, int newMode, bool transpose) i->fPitch += semi; low = std::min(low, i->fPitch); high = std::max(high, i->fPitch); + i->AdjustAccidentals(); } } if (low < VLNote::kMiddleC-6 && high < VLNote::kMiddleC+7) diff --git a/Sources/VLModel.h b/Sources/VLModel.h index 2792f8e..c896278 100644 --- a/Sources/VLModel.h +++ b/Sources/VLModel.h @@ -145,12 +145,16 @@ struct VLNote { k32nd = 5, kNoteHead = 0x07, + kWantSharp = 0x20, + kWantFlat = 0x40, + kAccidentals= 0x60, kTriplet = 0x80 }; VLNote(VLFraction dur=0, int pitch=kNoPitch); VLNote(std::string name); void Name(std::string & name, bool useSharps = false) const; void MakeRepresentable(); + void AdjustAccidentals(); void AlignToGrid(VLFraction at, VLFraction grid); }; diff --git a/Sources/VLPListDocument.mm b/Sources/VLPListDocument.mm index 565d20a..72dc519 100644 --- a/Sources/VLPListDocument.mm +++ b/Sources/VLPListDocument.mm @@ -157,6 +157,7 @@ void VLPlistVisitor::VisitChord(VLChord & c) [NSNumber numberWithInt:c.fDuration.fNum], @"durNum", [NSNumber numberWithInt:c.fDuration.fDenom], @"durDenom", [NSNumber numberWithInt:c.fPitch], @"pitch", + [NSNumber numberWithInt:c.fVisual], @"visual", [NSNumber numberWithInt:c.fSteps], @"steps", [NSNumber numberWithInt:c.fRootPitch], @"root", nil]; @@ -230,8 +231,10 @@ void VLPlistVisitor::VisitChord(VLChord & c) VLFraction([[ndict objectForKey:@"durNum"] intValue], [[ndict objectForKey:@"durDenom"] intValue], true); - note.fPitch = [[ndict objectForKey:@"pitch"] intValue]; - note.fTied = 0; + note.fPitch = [[ndict objectForKey:@"pitch"] intValue]; + note.fVisual |= [[ndict objectForKey:@"visual"] intValue] + & VLNote::kAccidentals; + note.fTied = 0; if ([[ndict objectForKey:@"tied"] intValue] & VLNote::kTiedWithPrev) { if (at != 0) { diff --git a/Sources/VLSheetView.h b/Sources/VLSheetView.h index 29db3e0..41d9f40 100644 --- a/Sources/VLSheetView.h +++ b/Sources/VLSheetView.h @@ -9,6 +9,7 @@ // #import +#import #import "VLModel.h" #import "VLLayout.h" @@ -83,6 +84,11 @@ enum VLRecalc { size_t fVolta; size_t fVoltaOK; VLLayout * fLayout; + int fHighlightMeasure; + VLFract fHighlightAt; + size_t fHighlightStanza; + bool fHighlightNow; + bool fHighlightOne; IBOutlet id fFieldEditor; IBOutlet id fRepeatSheet; @@ -109,10 +115,10 @@ enum VLRecalc { - (VLSong *) song; - (NSImage *) musicElement:(VLMusicElement)elt; -- (int) stepInSection:(int)section withPitch:(int)pitch; +- (int) stepInSection:(int)section withPitch:(int)pitch visual:(int)visual; - (float) systemY:(int)system; -- (float) noteYInSection:(int)section withPitch:(int)pitch accidental:(VLMusicElement*)accidental; -- (float) noteYInMeasure:(int)measure withPitch:(int)pitch accidental:(VLMusicElement*)accidental; +- (float) noteYInSection:(int)section withPitch:(int)pitch visual:(int)visual accidental:(VLMusicElement*)accidental; +- (float) noteYInMeasure:(int)measure withPitch:(int)pitch visual:(int)visual accidental:(VLMusicElement*)accidental; - (float) noteXInMeasure:(int)measure at:(VLFraction)at; - (void) scrollMeasureToVisible:(int)measure; @@ -131,6 +137,8 @@ enum VLRecalc { - (void) setGroove:(NSString *)groove; - (void) playWithGroove:(NSString *)groove; +- (NSColor *)textBackgroundColorForSystem:(int)system; + @end // Local Variables: diff --git a/Sources/VLSheetView.mm b/Sources/VLSheetView.mm index 78acd6b..e640dbc 100644 --- a/Sources/VLSheetView.mm +++ b/Sources/VLSheetView.mm @@ -97,6 +97,7 @@ static float sFlatPos[] = { fNumBotLedgers = 2; fNumStanzas = 2; fLastMeasures = 0; + fHighlightOne = false; } return self; } @@ -138,7 +139,7 @@ static float sFlatPos[] = { return kSystemBaseline+b.origin.y+b.size.height-(system+1)*kSystemH; } -int8_t sSemi2Pitch[2][12] = {{ +int8_t sSemi2Pitch[4][12] = {{ // C Db D Eb E F Gb G Ab A Bb B 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, },{ @@ -151,7 +152,7 @@ int8_t sSemi2Pitch[2][12] = {{ #define N kMusicNatural, #define _ kMusicNothing, -VLMusicElement sSemi2Accidental[12][12] = { +VLMusicElement sSemi2Accidental[13][12] = { // C DbD EbE F GbG AbA BbB {N _ N _ N _ _ N _ N _ N}, // Gb major - 6 flats {_ _ N _ N _ _ N _ N _ N}, // Db major - 5 flats @@ -166,6 +167,7 @@ VLMusicElement sSemi2Accidental[12][12] = { {N _ _ S _ N _ N _ _ S _}, // A major - 3 sharps {N _ N _ _ N _ N _ _ S _}, // E major - 4 sharps {N _ N _ _ N _ N _ N _ _}, // B major - 5 sharps + {N _ N _ N N _ N _ N _ _}, // F# major - 6 sharps }; #undef S @@ -173,33 +175,46 @@ VLMusicElement sSemi2Accidental[12][12] = { #undef N #undef _ -- (int) stepInSection:(int)section withPitch:(int)pitch +- (int) stepInSection:(int)section withPitch:(int)pitch visual:(int)visual { int semi = pitch % 12; int key = [self song]->fProperties[section].fKey; - bool useSharps = key > 0; + bool useSharps = (visual & VLNote::kAccidentals) + ? (visual & VLNote::kWantSharp) : (key > 0); return sSemi2Pitch[useSharps][semi]; } -- (float) noteYInSection:(int)section - withPitch:(int)pitch accidental:(VLMusicElement*)accidental +- (float) noteYInSection:(int)section withPitch:(int)pitch + visual:(int)visual accidental:(VLMusicElement*)accidental { int semi = pitch % 12; int octave = (pitch / 12) - 5; int key = [self song]->fProperties[section].fKey; - *accidental = sSemi2Accidental[key+6][semi]; + switch (*accidental = sSemi2Accidental[key+6][semi]) { + case kMusicSharp: + if (visual & VLNote::kWantFlat) + *accidental = kMusicFlat; + break; + case kMusicFlat: + if (visual & VLNote::kWantSharp) + *accidental = kMusicSharp; + break; + } return (octave*3.5f - + [self stepInSection:section withPitch:pitch]*0.5f-1.0f)*kLineH; + + [self stepInSection:section withPitch:pitch visual:visual]*0.5f + - 1.0f + )* kLineH; } -- (float) noteYInMeasure:(int)measure withPitch:(int)pitch accidental:(VLMusicElement*)accidental +- (float) noteYInMeasure:(int)measure withPitch:(int)pitch + visual:(int)visual accidental:(VLMusicElement*)accidental { return [self systemY:fLayout->SystemForMeasure(measure)] + [self noteYInSection:[self song]->fMeasures[measure].fPropIdx - withPitch:pitch accidental:accidental]; + withPitch:pitch visual:visual accidental:accidental]; } - (float) noteXInMeasure:(int)measure at:(VLFraction)at @@ -492,20 +507,24 @@ const char * sBreak[3] = {"", "\xE2\xA4\xBE", "\xE2\x8E\x98"}; withAttributes: sBreakFont]; } -- (void)drawBackgroundForSystem:(int)system +- (NSColor *)notesBackgroundColorForSystem:(int)system +{ + NSArray * colors = [NSColor controlAlternatingRowBackgroundColors]; + + return [colors objectAtIndex:0]; +} + +- (NSColor *)textBackgroundColorForSystem:(int)system { const VLSong * song = [self song]; - const float kSystemY = [self systemY:system]; - const float kLineW = (*fLayout)[system].SystemWidth(); const bool kAltColors = song->fMeasures[fLayout->FirstMeasure(system)].fPropIdx & 1; NSArray * colors = [NSColor controlAlternatingRowBackgroundColors]; - NSColor * bgColor= [colors objectAtIndex:0]; - NSColor * fgColor= [colors objectAtIndex:1]; + NSColor * color= [colors objectAtIndex:1]; if (kAltColors) { float hue, saturation, brightness, alpha; - [[fgColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getHue:&hue saturation:&saturation + [[color colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; if (saturation) // Color @@ -513,17 +532,25 @@ const char * sBreak[3] = {"", "\xE2\xA4\xBE", "\xE2\x8E\x98"}; else // Black & white brightness -= 0.05f; - fgColor = [NSColor colorWithCalibratedHue:hue saturation:saturation - brightness:brightness alpha:alpha]; + color = [NSColor colorWithCalibratedHue:hue saturation:saturation + brightness:brightness alpha:alpha]; } + return color; +} + +- (void)drawBackgroundForSystem:(int)system +{ + const float kSystemY = [self systemY:system]; + const float kLineW = (*fLayout)[system].SystemWidth(); + [NSGraphicsContext saveGraphicsState]; - [fgColor setFill]; + [[self textBackgroundColorForSystem:system] setFill]; [NSBezierPath fillRect: NSMakeRect(kLineX, kSystemY-kSystemBaseline, kLineW, fNumStanzas*kLyricsH)]; [NSBezierPath fillRect: NSMakeRect(kLineX, kSystemY+kChordY, kLineW, kChordH)]; - [bgColor setFill]; + [[self notesBackgroundColorForSystem:system] setFill]; [NSBezierPath fillRect: NSMakeRect(kLineX, kSystemY-kSystemBaseline+fNumStanzas*kLyricsH, kLineW, kSystemBaseline+kChordY-fNumStanzas*kLyricsH)]; @@ -731,8 +758,10 @@ static int8_t sSharpAcc[] = { fCursorAccidental = kMusicFlatCursor; // G# -> Gb fCursorActualPitch = fCursorPitch-1; break; - default: case NSCommandKeyMask: + fCursorAccidental = kMusicSharpCursor; + // Fall through + default: fCursorActualPitch = fCursorPitch+1; break; // G# -> G# case NSAlternateKeyMask|NSCommandKeyMask: @@ -745,8 +774,10 @@ static int8_t sSharpAcc[] = { } else { if (prop.fKey <= -sFlatAcc[fCursorPitch % 12]) { // Flat in Key switch ([event modifierFlags] & (NSAlternateKeyMask|NSCommandKeyMask)) { - default: case NSAlternateKeyMask: + fCursorAccidental = kMusicFlatCursor; + // Fall through + default: fCursorActualPitch = fCursorPitch-1; break; // Gb -> Gb case NSCommandKeyMask: @@ -978,6 +1009,8 @@ static int8_t sSharpAcc[] = { break; default: [editable autorelease]; + fHighlightStanza = 0xFFFFFFFF; + fHighlightOne = false; editable = nil; } [self setEditTarget:editable]; diff --git a/Sources/VLSheetViewLyrics.h b/Sources/VLSheetViewLyrics.h index a902057..0a9a465 100644 --- a/Sources/VLSheetViewLyrics.h +++ b/Sources/VLSheetViewLyrics.h @@ -39,6 +39,7 @@ - (void) editLyrics; - (void) drawLyricsForSystem:(int)system stanza:(size_t)stanza; - (void) highlightLyricsInStanza:(size_t)stanza measure:(int)measure at:(VLFraction)at; +- (void) highlightTextInStanza:(size_t)stanza measure:(int)measure at:(VLFraction)at one:(BOOL)one; @end diff --git a/Sources/VLSheetViewLyrics.mm b/Sources/VLSheetViewLyrics.mm index c92ba84..3002328 100644 --- a/Sources/VLSheetViewLyrics.mm +++ b/Sources/VLSheetViewLyrics.mm @@ -36,6 +36,7 @@ VLFraction At = fAt; fSong->FindWord(fStanza, fMeasure, At); fAt = At; + [fView highlightTextInStanza:fStanza measure:fMeasure at:fAt one:NO]; [fView setNeedsDisplay: YES]; @@ -78,6 +79,7 @@ } fNextMeas = fMeasure; fNextAt = fAt; + [fView highlightTextInStanza:fStanza measure:fMeasure at:fAt]; [fView scrollMeasureToVisible:fMeasure]; } @@ -92,12 +94,15 @@ fAt = at; fNextMeas = fMeasure; fNextAt = fAt; + [fView highlightTextInStanza:fStanza measure:fMeasure at:fAt]; [fView scrollMeasureToVisible:fMeasure]; } - (void) highlightCursor { - [fView highlightLyricsInStanza:fStanza measure:fMeasure at:fAt]; + std::string word = fSong->GetWord(fStanza, fMeasure, fAt); + if (!word.size()) + [fView highlightLyricsInStanza:fStanza measure:fMeasure at:fAt]; } @end @@ -106,7 +111,7 @@ class VLCocoaFontHandler : public VLFontHandler { public: VLCocoaFontHandler(NSString * name, float size); - virtual void Draw(float x, float y, const char * utf8Text); + virtual void Draw(float x, float y, const char * utf8Text, bool highlight); virtual float Width(const char * utf8Text); private: NSDictionary * fTextAttr; @@ -121,10 +126,20 @@ VLCocoaFontHandler::VLCocoaFontHandler(NSString * name, float size) font, NSFontAttributeName, nil]; } -void VLCocoaFontHandler::Draw(float x, float y, const char * utf8Text) +static NSColor * sHighlightColor; + +void VLCocoaFontHandler::Draw(float x, float y, + const char * utf8Text, bool highlight) { - NSString * t = [NSString stringWithUTF8String:utf8Text]; - [t drawAtPoint:NSMakePoint(x,y) withAttributes:fTextAttr]; + NSDictionary * attr = fTextAttr; + if (highlight) { + NSMutableDictionary * aa = + [NSMutableDictionary dictionaryWithDictionary:attr]; + [aa setValue:sHighlightColor forKey:NSBackgroundColorAttributeName]; + attr = aa; + } + NSString * t = [NSString stringWithUTF8String:utf8Text]; + [t drawAtPoint:NSMakePoint(x,y) withAttributes:attr]; } float VLCocoaFontHandler::Width(const char * utf8Text) @@ -171,14 +186,28 @@ float VLCocoaFontHandler::Width(const char * utf8Text) ) { ; } else { + if (!fHighlightNow) { + fHighlightNow = stanza == fHighlightStanza + && measIdx == fHighlightMeasure + && at == fHighlightAt; + if (fHighlightNow && !sHighlightColor) + sHighlightColor = + [[self textBackgroundColorForSystem:system] + shadowWithLevel:0.2]; + } + text.AddSyllable(note->fLyrics[stanza-1], - [self noteXInMeasure:measIdx at:at]); + [self noteXInMeasure:measIdx at:at], + fHighlightNow); + fHighlightNow = fHighlightNow && !fHighlightOne && + note->fLyrics[stanza-1].fKind & VLSyllable::kHasNext; } at += note->fDuration; } } text.DrawLine(kSystemY+kLyricsY-stanza*kLyricsH); + sHighlightColor = nil; } - (void) editLyrics @@ -196,6 +225,21 @@ float VLCocoaFontHandler::Width(const char * utf8Text) - (void) highlightLyricsInStanza:(size_t)stanza measure:(int)measure at:(VLFraction)at { + const float kSystemY = [self systemY:fLayout->SystemForMeasure(measure)]; + NSRect r = + NSMakeRect([self noteXInMeasure:measure at:at]-kNoteW*0.5f, + kSystemY+kLyricsY-stanza*kLyricsH, kNoteW, kLyricsH); + [[NSColor colorWithCalibratedWhite:0.8f alpha:1.0f] setFill]; + NSRectFillUsingOperation(r, NSCompositePlusDarker); +} + +- (void) highlightTextInStanza:(size_t)stanza measure:(int)measure at:(VLFraction)at one:(BOOL)one +{ + fHighlightStanza = stanza; + fHighlightMeasure= measure; + fHighlightAt = at; + fHighlightNow = false; + fHighlightOne = one; } @end diff --git a/Sources/VLSheetViewNotes.h b/Sources/VLSheetViewNotes.h index ed2e9f9..a06bcc3 100644 --- a/Sources/VLSheetViewNotes.h +++ b/Sources/VLSheetViewNotes.h @@ -15,6 +15,7 @@ - (void) drawNotesForSystem:(int)system; - (void) addNoteAtCursor; - (void) startKeyboardCursor; +- (void) drawNoteCursor:(int)pitch inMeasure:(size_t)measure at:(VLFract)at; @end diff --git a/Sources/VLSheetViewNotes.mm b/Sources/VLSheetViewNotes.mm index 1d5cd2c..23c1a9b 100644 --- a/Sources/VLSheetViewNotes.mm +++ b/Sources/VLSheetViewNotes.mm @@ -5,7 +5,7 @@ // // (MN) Matthias Neeracher // -// Copyright © 2005-2007 Matthias Neeracher +// Copyright © 2005-2008 Matthias Neeracher // #import "VLSheetView.h" @@ -22,7 +22,14 @@ { if (fCursorMeasure > -1) { VLNote newNote(1, fClickMode==' ' ? fCursorActualPitch : VLNote::kNoPitch); - + switch (fCursorAccidental) { + case kMusicFlatCursor: + newNote.fVisual |= VLNote::kWantFlat; + break; + case kMusicSharpCursor: + newNote.fVisual |= VLNote::kWantSharp; + break; + } [[self document] willChangeSong]; if (fCursorAccidental == kMusicExtendCursor) [self song]->ExtendNote(fCursorMeasure, fCursorAt); @@ -49,11 +56,14 @@ } } -- (void) drawLedgerLinesInSection:(int)section withPitch:(int)pitch at:(NSPoint)p +- (void) drawLedgerLinesInSection:(int)section withPitch:(int)pitch visual:(int)visual at:(NSPoint)p { p.x += kLedgerX; int octave = (pitch / 12) - 5; - int step = (octave*7+[self stepInSection:section withPitch:pitch]-2)/2; + int step = (octave*7 + + [self stepInSection:section withPitch:pitch visual:visual] + - 2 + ) / 2; for (int i=0; i-- > step; ) { NSPoint p0 = p; @@ -71,71 +81,96 @@ } } -- (void) drawNoteCursor +- (void) drawNoteCursor:(int)pitch inMeasure:(size_t)measure at:(VLFract)at + accidental:(VLMusicElement)accidental + mode:(char)mode { int cursorX; int cursorY; int cursorSect; - VLMusicElement accidental; + int cursorVisual = 0; + VLMusicElement acc; VLMusicElement cursorElt; - cursorX = [self noteXInMeasure:fCursorMeasure at:fCursorAt]; - if (fCursorAccidental == kMusicExtendCursor) { + cursorX = [self noteXInMeasure:measure at:at]; + if (accidental == kMusicExtendCursor) { cursorY = - [self noteYInMeasure:fCursorMeasure - withPitch:fCursorPitch - accidental:&accidental]; - cursorElt = fCursorAccidental; + [self noteYInMeasure:measure + withPitch:pitch + visual:0 + accidental:&acc]; + cursorElt = accidental; } else - switch (fClickMode) { + switch (mode) { default: + switch (accidental) { + case kMusicSharp: + cursorVisual = VLNote::kWantSharp; + break; + case kMusicFlat: + cursorVisual = VLNote::kWantFlat; + break; + } cursorY = - [self noteYInMeasure:fCursorMeasure - withPitch:fCursorPitch accidental:&accidental] - kNoteY; - cursorSect = [self song]->fMeasures[fCursorMeasure].fPropIdx; - [self drawLedgerLinesInSection:cursorSect withPitch:fCursorPitch - at:NSMakePoint(cursorX, - [self systemY:fLayout->SystemForMeasure(fCursorMeasure)])]; + [self noteYInMeasure:measure withPitch:pitch + visual:cursorVisual accidental:&acc] - kNoteY; + cursorSect = [self song]->fMeasures[measure].fPropIdx; + [self drawLedgerLinesInSection:cursorSect withPitch:pitch + visual:cursorVisual at:NSMakePoint(cursorX, + [self systemY:fLayout->SystemForMeasure(measure)])]; cursorElt = kMusicNoteCursor; break; case 'r': - cursorY = [self noteYInMeasure:fCursorMeasure - withPitch:65 accidental:&accidental]; + cursorY = [self noteYInMeasure:measure + withPitch:65 visual:0 accidental:&acc]; cursorElt = kMusicRestCursor; break; case 'k': - cursorY = [self noteYInMeasure:fCursorMeasure - withPitch:fCursorPitch accidental:&accidental]; + cursorY = [self noteYInMeasure:measure + withPitch:pitch visual:0 + accidental:&acc]; cursorElt = kMusicKillCursor; break; } - NSPoint at = NSMakePoint(cursorX-kNoteX, cursorY); + NSPoint xy = NSMakePoint(cursorX-kNoteX, cursorY); [[self musicElement:cursorElt] - compositeToPoint:at + compositeToPoint:xy operation: NSCompositeSourceOver]; - if (fCursorAccidental && fCursorAccidental != kMusicExtendCursor) { - at.y += kNoteY; - switch (cursorElt= fCursorAccidental) { + if (accidental && accidental != kMusicExtendCursor) { + xy.y += kNoteY; + switch (cursorElt= accidental) { case kMusicFlatCursor: - at.x += kFlatW; - at.y += kFlatY; + xy.x += kFlatW; + xy.y += kFlatY; break; case kMusicSharpCursor: - at.x += kSharpW; - at.y += kSharpY; + xy.x += kSharpW; + xy.y += kSharpY; break; default: - at.x += kNaturalW; - at.y += kNaturalY; + xy.x += kNaturalW; + xy.y += kNaturalY; break; } [[self musicElement:cursorElt] - compositeToPoint:at + compositeToPoint:xy operation: NSCompositeSourceOver]; } } +- (void) drawNoteCursor:(int)pitch inMeasure:(size_t)measure at:(VLFract)at +{ + [self drawNoteCursor:pitch inMeasure:measure at:at + accidental:kMusicNothing mode:' ']; +} + +- (void) drawNoteCursor +{ + [self drawNoteCursor:fCursorPitch inMeasure:fCursorMeasure at:fCursorAt + accidental:kMusicNothing mode:' ']; +} + - (void) drawNote:(int)visual at:(NSPoint)p accidental:(VLMusicElement)accidental tied:(BOOL)tied { @@ -304,16 +339,20 @@ int pitch = note->fPitch; if (pitch != VLNote::kNoPitch) { [self drawLedgerLinesInSection:measure.fPropIdx withPitch:pitch - at:NSMakePoint([self noteXInMeasure:measIdx at:at], kSystemY)]; + visual:note->fVisual + at:NSMakePoint([self noteXInMeasure:measIdx at:at], + kSystemY)]; VLMusicElement accidental; NSPoint pos = NSMakePoint([self noteXInMeasure:measIdx at:at], kSystemY+[self noteYInSection:measure.fPropIdx withPitch:pitch + visual:note->fVisual accidental:&accidental]); VLMusicElement acc = accidental; int step= [self stepInSection:measure.fPropIdx - withPitch:pitch]; + withPitch:pitch + visual:note->fVisual]; if (acc == accidentals[step]) acc = kMusicNothing; // Don't repeat accidentals else if (acc == kMusicNothing) @@ -331,7 +370,7 @@ NSPoint pos = NSMakePoint([self noteXInMeasure:measIdx at:at], kSystemY+[self noteYInSection:measure.fPropIdx - withPitch:65 + withPitch:65 visual:0 accidental:&accidental]); [self drawRest:note->fVisual & VLNote::kNoteHead at: pos]; } diff --git a/Sources/VLSheetViewSelection.h b/Sources/VLSheetViewSelection.h index ac18e5d..d606202 100644 --- a/Sources/VLSheetViewSelection.h +++ b/Sources/VLSheetViewSelection.h @@ -8,6 +8,8 @@ // Copyright © 2006-2007 Matthias Neeracher // +#import "VLMIDIWriter.h" + @interface VLSheetView (Selection) - (void)editSelection; @@ -33,6 +35,8 @@ - (void)updateMenus; +- (void) willPlaySequence:(MusicSequence)music; + @end // Local Variables: diff --git a/Sources/VLSheetViewSelection.mm b/Sources/VLSheetViewSelection.mm index 7d1a424..8845b84 100644 --- a/Sources/VLSheetViewSelection.mm +++ b/Sources/VLSheetViewSelection.mm @@ -9,9 +9,67 @@ // #import "VLSheetView.h" +#import "VLSheetViewNotes.h" #import "VLSheetViewSelection.h" +#import "VLSheetViewNotes.h" +#import "VLSheetViewChords.h" +#import "VLSheetViewLyrics.h" +#import "VLSheetWindow.h" #import "VLDocument.h" +@interface VLPlaybackEditable : VLEditable { + VLSheetView * fView; + size_t fStanza; + size_t fNoteMeasure; + VLFract fNoteAt; + int fNotePitch; + size_t fChordMeasure; + VLFract fChordAt; +} + +- (VLPlaybackEditable *)initWithView:(VLSheetView *)view; +- (void) userEvent:(VLMIDIUserEvent *)event; +- (void) highlightCursor; + +@end + +@implementation VLPlaybackEditable + +- (VLPlaybackEditable *)initWithView:(VLSheetView *)view +{ + fView = view; + fStanza = 1; + fNoteMeasure = 0x80000000; + fChordMeasure = 0x80000000; + + return self; +} + +- (void) userEvent:(VLMIDIUserEvent *)event +{ + if (event->fPitch) { + fNotePitch = event->fPitch; + fNoteMeasure = event->fMeasure; + fNoteAt = event->fAt; + [fView highlightTextInStanza:fStanza measure:fNoteMeasure at:fNoteAt one:YES]; + } else { + fChordMeasure = event->fMeasure; + fChordAt = event->fAt; + } + [fView scrollMeasureToVisible:event->fMeasure]; + [fView setNeedsDisplay:YES]; +} + +- (void) highlightCursor +{ + if (fNoteMeasure != 0x80000000) + [fView drawNoteCursor:fNotePitch inMeasure:fNoteMeasure at:fNoteAt]; + if (fChordMeasure != 0x80000000) + [fView highlightChordInMeasure:fChordMeasure at:fChordAt]; +} + +@end + @interface NSMenuItem (VLSetStateToOff) - (void) VLSetStateToOff; @end @@ -30,6 +88,16 @@ // static VLSong sPasteboard; +extern "C" void +VLSequenceCallback( + void * inClientData, + MusicSequence inSequence, MusicTrack inTrack, + MusicTimeStamp inEventTime, const MusicEventUserData *inEventData, + MusicTimeStamp inStartSliceBeat, MusicTimeStamp inEndSliceBeat) +{ + [(id)inClientData userEvent:(VLMIDIUserEvent *)inEventData]; +} + @implementation VLSheetView (Selection) - (void)editSelection @@ -442,4 +510,12 @@ inline int TimeTag(const VLProperties & prop) [self updateGrooveMenu]; } +- (void) willPlaySequence:(MusicSequence)music +{ + VLEditable * e = + [[VLPlaybackEditable alloc] initWithView:self]; + [self setEditTarget:e]; + MusicSequenceSetUserCallback(music, VLSequenceCallback, e); +} + @end diff --git a/Sources/VLSheetWindow.h b/Sources/VLSheetWindow.h index beb3223..a2f3f97 100644 --- a/Sources/VLSheetWindow.h +++ b/Sources/VLSheetWindow.h @@ -5,10 +5,11 @@ // // (MN) Matthias Neeracher // -// Copyright © 2005-2007 Matthias Neeracher +// Copyright © 2005-2008 Matthias Neeracher // #import +#import @interface VLEditable : NSObject { @@ -30,6 +31,10 @@ IBOutlet id logToolItem; IBOutlet id playToolItem; IBOutlet id stopToolItem; + IBOutlet id fwdToolItem; + IBOutlet id bckToolItem; + IBOutlet id tobegToolItem; + IBOutlet id toendToolItem; IBOutlet id zoomInToolItem; IBOutlet id zoomOutToolItem; IBOutlet id progressToolItem; @@ -46,5 +51,6 @@ - (void) setEditTarget:(VLEditable *)editable; - (void) startAnimation; - (void) stopAnimation; +- (void) willPlaySequence:(MusicSequence)music; @end diff --git a/Sources/VLSheetWindow.mm b/Sources/VLSheetWindow.mm index 33b3894..1f648cb 100644 --- a/Sources/VLSheetWindow.mm +++ b/Sources/VLSheetWindow.mm @@ -49,6 +49,10 @@ static NSString* sOutputToolbarItemIdentifier = @"Output Toolbar Item Identifie static NSString* sLogToolbarItemIdentifier = @"Log Toolbar Item Identifier"; static NSString* sPlayToolbarItemIdentifier = @"Play Toolbar Item Identifier"; static NSString* sStopToolbarItemIdentifier = @"Stop Toolbar Item Identifier"; +static NSString* sFwdToolbarItemIdentifier = @"Fwd Toolbar Item Identifier"; +static NSString* sBckToolbarItemIdentifier = @"Rew Toolbar Item Identifier"; +static NSString* sToBegToolbarItemIdentifier = @"Begin Toolbar Item Identifier"; +static NSString* sToEndToolbarItemIdentifier = @"End Toolbar Item Identifier"; static NSString* sZoomInToolbarItemIdentifier = @"Zoom In Toolbar Item Identifier"; static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identifier"; static NSString* sProgressToolbarItemIdentifier = @"Progress Toolbar Item Identifier"; @@ -96,6 +100,14 @@ static NSString* sDisplayToolbarItemIdentifier = @"Display Toolbar Item Identifi prototype = playToolItem; else if ([itemIdent isEqual: sStopToolbarItemIdentifier]) prototype = stopToolItem; + else if ([itemIdent isEqual: sFwdToolbarItemIdentifier]) + prototype = fwdToolItem; + else if ([itemIdent isEqual: sBckToolbarItemIdentifier]) + prototype = bckToolItem; + else if ([itemIdent isEqual: sToBegToolbarItemIdentifier]) + prototype = tobegToolItem; + else if ([itemIdent isEqual: sToEndToolbarItemIdentifier]) + prototype = toendToolItem; else if ([itemIdent isEqual: sZoomInToolbarItemIdentifier]) prototype = zoomInToolItem; else if ([itemIdent isEqual: sZoomOutToolbarItemIdentifier]) @@ -112,6 +124,7 @@ static NSString* sDisplayToolbarItemIdentifier = @"Display Toolbar Item Identifi [toolbarItem setImage: [prototype image]]; [toolbarItem setTarget: [prototype target]]; [toolbarItem setAction: [prototype action]]; + [toolbarItem setTag: [prototype tag]]; } else if ([itemIdent isEqual: sProgressToolbarItemIdentifier]) { toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease]; @@ -126,8 +139,12 @@ static NSString* sDisplayToolbarItemIdentifier = @"Display Toolbar Item Identifi return [NSArray arrayWithObjects: sOutputToolbarItemIdentifier, NSToolbarSeparatorItemIdentifier, + sToBegToolbarItemIdentifier, + sBckToolbarItemIdentifier, sPlayToolbarItemIdentifier, sStopToolbarItemIdentifier, + sFwdToolbarItemIdentifier, + sToEndToolbarItemIdentifier, NSToolbarSeparatorItemIdentifier, sZoomInToolbarItemIdentifier, sZoomOutToolbarItemIdentifier, @@ -140,8 +157,12 @@ static NSString* sDisplayToolbarItemIdentifier = @"Display Toolbar Item Identifi - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects: + sToBegToolbarItemIdentifier, + sBckToolbarItemIdentifier, sPlayToolbarItemIdentifier, sStopToolbarItemIdentifier, + sFwdToolbarItemIdentifier, + sToEndToolbarItemIdentifier, sZoomInToolbarItemIdentifier, sZoomOutToolbarItemIdentifier, sOutputToolbarItemIdentifier, @@ -179,4 +200,9 @@ static NSString* sDisplayToolbarItemIdentifier = @"Display Toolbar Item Identifi [sheetView mouseMoved:event]; } +- (void) willPlaySequence:(MusicSequence)music +{ + [sheetView willPlaySequence:music]; +} + @end diff --git a/Sources/VLSoundOut.cpp b/Sources/VLSoundOut.cpp index 918736e..e0d43c1 100644 --- a/Sources/VLSoundOut.cpp +++ b/Sources/VLSoundOut.cpp @@ -11,7 +11,6 @@ #include "VLSoundOut.h" #include -#include #include "CAAudioFileFormats.h" #include "AUOutputBL.h" @@ -27,9 +26,11 @@ public: virtual void PlayNote(const VLNote & note); virtual void PlayChord(const VLChord & chord); - virtual void PlayFile(CFDataRef file); + virtual void PlaySequence(MusicSequence music); virtual void Stop(); virtual bool Playing(); + virtual void SetPlayRate(float rate); + virtual void SetTime(MusicTimeStamp time); virtual ~VLAUSoundOut(); protected: @@ -37,14 +38,15 @@ protected: void InitSoundOutput(bool fileOutput); virtual void SetupOutput(AUNode outputNode); - virtual void PlaySequence(MusicSequence music); MusicTimeStamp SequenceLength(MusicSequence music); AUGraph fGraph; MusicPlayer fPlayer; private: MusicSequence fMusic; + MusicTimeStamp fMusicLength; bool fRunning; + bool fForward; void Play(const int8_t * note, size_t numNotes = 1); }; @@ -95,12 +97,22 @@ VLSoundOut * VLSoundOut::FileWriter(CFURLRef file, OSType dataFormat) return new VLAUFileSoundOut(file, dataFormat); } +void VLSoundOut::PlayFile(CFDataRef file) +{ + MusicSequence music; + + NewMusicSequence(&music); + MusicSequenceLoadSMFDataWithFlags(music, file, + kMusicSequenceLoadSMF_ChannelsToTracks); + PlaySequence(music); +} + VLSoundOut::~VLSoundOut() { } VLAUSoundOut::VLAUSoundOut() - : fRunning(false), fMusic(0) + : fMusic(0), fRunning(false), fForward(true) { InitSoundOutput(false); } @@ -179,7 +191,8 @@ void VLAUSoundOut::PlaySequence(MusicSequence music) { Stop(); - fMusic = music; + fMusic = music; + fMusicLength = SequenceLength(music); R(MusicSequenceSetAUGraph(fMusic, fGraph)); R(MusicPlayerSetSequence(fPlayer, fMusic)); @@ -188,6 +201,25 @@ void VLAUSoundOut::PlaySequence(MusicSequence music) fRunning = true; } +void VLAUSoundOut::SetPlayRate(float rate) +{ + if ((rate < 0) != fForward) { + fForward = !fForward; + + MusicTimeStamp rightNow; + MusicPlayerGetTime(fPlayer, &rightNow); + MusicSequenceReverse(fMusic); + MusicPlayerSetTime(fPlayer, fMusicLength - rightNow); + } + MusicPlayerSetPlayRateScalar(fPlayer, fabsf(rate)); +} + +void VLAUSoundOut::SetTime(MusicTimeStamp time) +{ + SetPlayRate(1.0f); + MusicPlayerSetTime(fPlayer, time); +} + void VLAUSoundOut::Stop() { MusicPlayerStop(fPlayer); @@ -240,16 +272,6 @@ void VLAUSoundOut::Play(const int8_t * note, size_t numNotes) PlaySequence(music); } -void VLAUSoundOut::PlayFile(CFDataRef file) -{ - MusicSequence music; - - NewMusicSequence(&music); - MusicSequenceLoadSMFDataWithFlags(music, file, - kMusicSequenceLoadSMF_ChannelsToTracks); - PlaySequence(music); -} - MusicTimeStamp VLAUSoundOut::SequenceLength(MusicSequence music) { UInt32 ntracks; diff --git a/Sources/VLSoundOut.h b/Sources/VLSoundOut.h index 07df0ac..02039ce 100644 --- a/Sources/VLSoundOut.h +++ b/Sources/VLSoundOut.h @@ -5,11 +5,12 @@ // // (MN) Matthias Neeracher // -// Copyright © 2005-2007 Matthias Neeracher +// Copyright © 2005-2008 Matthias Neeracher // #include "VLModel.h" #import +#include class VLSoundEvent { protected: @@ -36,9 +37,12 @@ public: virtual void PlayNote(const VLNote & note) = 0; virtual void PlayChord(const VLChord & chord) = 0; - virtual void PlayFile(CFDataRef file) = 0; + void PlayFile(CFDataRef file); + virtual void PlaySequence(MusicSequence music) = 0; virtual void Stop() = 0; virtual bool Playing() = 0; + virtual void SetPlayRate(float rate) = 0; + virtual void SetTime(MusicTimeStamp time) = 0; virtual ~VLSoundOut(); }; diff --git a/Sources/VLXMLDocument.mm b/Sources/VLXMLDocument.mm index 96b4616..276c65f 100644 --- a/Sources/VLXMLDocument.mm +++ b/Sources/VLXMLDocument.mm @@ -5,7 +5,7 @@ // // (MN) Matthias Neeracher // -// Copyright © 2006-2007 Matthias Neeracher +// Copyright © 2006-2008 Matthias Neeracher // #import "VLXMLDocument.h" diff --git a/Tools/lameWrapper b/Tools/lameWrapper new file mode 100755 index 0000000..ee29539 --- /dev/null +++ b/Tools/lameWrapper @@ -0,0 +1,3 @@ +#!/bin/bash -l + +exec lame $* diff --git a/Tools/lilyWrapper b/Tools/lilyWrapper index 8284470..0b7c07a 100755 --- a/Tools/lilyWrapper +++ b/Tools/lilyWrapper @@ -1,8 +1,7 @@ #!/bin/bash -l export PATH=`dirname $1`:$PATH -echo PATH=$PATH -$* +exec $* diff --git a/VocalEasel.xcodeproj/project.pbxproj b/VocalEasel.xcodeproj/project.pbxproj index 1faebf2..bf6c5d7 100644 --- a/VocalEasel.xcodeproj/project.pbxproj +++ b/VocalEasel.xcodeproj/project.pbxproj @@ -29,7 +29,6 @@ 95009B830B0EDCD800EB33A4 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95009B820B0EDCD800EB33A4 /* CoreFoundation.framework */; }; 95049CF30BDC32EB0015EE6E /* installLilypond.scpt in Resources */ = {isa = PBXBuildFile; fileRef = 95049CF20BDC32CD0015EE6E /* installLilypond.scpt */; }; 95049D020BDC436A0015EE6E /* installPython.scpt in Resources */ = {isa = PBXBuildFile; fileRef = 95049D010BDC43510015EE6E /* installPython.scpt */; }; - 950795E10B4A34D9008911A6 /* stop.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 950795E00B4A34D9008911A6 /* stop.tiff */; }; 95140E3C0C944F7F00966576 /* VLLilypondType.reader in Copy Filters */ = {isa = PBXBuildFile; fileRef = 95140E3B0C944F7F00966576 /* VLLilypondType.reader */; }; 9524DAFB0BE569C50002AC03 /* Help in Resources */ = {isa = PBXBuildFile; fileRef = 9524DAF70BE569C50002AC03 /* Help */; }; 9524DB390BE5CA070002AC03 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9524DB380BE5CA070002AC03 /* Carbon.framework */; }; @@ -42,6 +41,9 @@ 952CBBB6095FD37300434E43 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; }; 952DCD78096BBB11001C2316 /* VLSheetViewChords.mm in Sources */ = {isa = PBXBuildFile; fileRef = 952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */; }; 9530A7020BD9E16700635FEC /* display.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 9530A7010BD9E16700635FEC /* display.tiff */; }; + 9531F3510DE2B4CD004F78C2 /* VLAIFFDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9531F34E0DE2B4CD004F78C2 /* VLAIFFDocument.mm */; }; + 9531F3520DE2B4CD004F78C2 /* VLMP3Document.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9531F3500DE2B4CD004F78C2 /* VLMP3Document.mm */; }; + 9531F3670DE2B872004F78C2 /* lameWrapper in Copy Tools */ = {isa = PBXBuildFile; fileRef = 9531F3660DE2B872004F78C2 /* lameWrapper */; }; 953722670AE9F0E100B6E483 /* VLLilypondDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953722660AE9F0E100B6E483 /* VLLilypondDocument.mm */; }; 9545C5C30C092F4600251547 /* VLMMAWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9545C5C10C092F4600251547 /* VLMMAWriter.cpp */; }; 95498DBD0AE3812F006B5F81 /* VLSoundSched.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95498DBC0AE3812F006B5F81 /* VLSoundSched.mm */; }; @@ -65,6 +67,14 @@ 959408AD096922EA007CCCF8 /* TVLEdit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 959408AC096922EA007CCCF8 /* TVLEdit.cpp */; }; 959408AE096922F7007CCCF8 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; }; 9599ED9D0B731CC500A6A2F7 /* VLGrooveController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */; }; + 959A3A130DE64BA300EF207B /* play.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A110DE64BA300EF207B /* play.icns */; }; + 959A3A140DE64BA300EF207B /* stop.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A120DE64BA300EF207B /* stop.icns */; }; + 959A3A260DE78BCD00EF207B /* bck.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A220DE78BCD00EF207B /* bck.icns */; }; + 959A3A270DE78BCD00EF207B /* fwd.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A230DE78BCD00EF207B /* fwd.icns */; }; + 959A3A280DE78BCD00EF207B /* tobeg.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A240DE78BCD00EF207B /* tobeg.icns */; }; + 959A3A290DE78BCD00EF207B /* toend.icns in Resources */ = {isa = PBXBuildFile; fileRef = 959A3A250DE78BCD00EF207B /* toend.icns */; }; + 959A3A6E0DE8CB5B00EF207B /* VLMIDIWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 959A3A6C0DE8CB5B00EF207B /* VLMIDIWriter.cpp */; }; + 959B77C20DE3139F004432E0 /* installLame.scpt in Resources */ = {isa = PBXBuildFile; fileRef = 958139C20DE2FBE4003C00B4 /* installLame.scpt */; }; 95A1C37C0AF1D4370076597D /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95A1C37B0AF1D4370076597D /* Quartz.framework */; }; 95A1C3860AF2ACE20076597D /* VLSheetWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */; }; 95A55C540BD5E5770068A203 /* VLPDFDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A55C530BD5E5770068A203 /* VLPDFDocument.mm */; }; @@ -99,7 +109,6 @@ 95FC66C40AF0A4D4003D9C11 /* music.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66BD0AF0A4D4003D9C11 /* music.tiff */; }; 95FC66C50AF0A4D5003D9C11 /* nextpage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66BE0AF0A4D4003D9C11 /* nextpage.tiff */; }; 95FC66C60AF0A4D5003D9C11 /* prevpage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66BF0AF0A4D4003D9C11 /* prevpage.tiff */; }; - 95FC66C70AF0A4D5003D9C11 /* run.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66C00AF0A4D4003D9C11 /* run.icns */; }; 95FC66C80AF0A4D5003D9C11 /* zoomin.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66C10AF0A4D4003D9C11 /* zoomin.tiff */; }; 95FC66C90AF0A4D5003D9C11 /* zoomout.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 95FC66C20AF0A4D4003D9C11 /* zoomout.tiff */; }; 95FC66CE0AF0A591003D9C11 /* VLPDFView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95FC66CC0AF0A591003D9C11 /* VLPDFView.mm */; }; @@ -125,6 +134,7 @@ dstPath = bin; dstSubfolderSpec = 7; files = ( + 9531F3670DE2B872004F78C2 /* lameWrapper in Copy Tools */, 95D0C2FC0B785D020061080E /* rebuildGrooves in Copy Tools */, 95C462830B045CB700649F92 /* lilyWrapper in Copy Tools */, 95C462000B04472E00649F92 /* mmaWrapper in Copy Tools */, @@ -184,7 +194,6 @@ 95009B820B0EDCD800EB33A4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 95049CF20BDC32CD0015EE6E /* installLilypond.scpt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.scpt; name = installLilypond.scpt; path = Resources/installLilypond.scpt; sourceTree = ""; }; 95049D010BDC43510015EE6E /* installPython.scpt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.scpt; name = installPython.scpt; path = Resources/installPython.scpt; sourceTree = ""; }; - 950795E00B4A34D9008911A6 /* stop.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = stop.tiff; path = Resources/stop.tiff; sourceTree = ""; }; 95140E3B0C944F7F00966576 /* VLLilypondType.reader */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = VLLilypondType.reader; sourceTree = ""; }; 9524DAF70BE569C50002AC03 /* Help */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Help; path = Resources/Help; sourceTree = ""; }; 9524DB380BE5CA070002AC03 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; @@ -198,6 +207,11 @@ 952DCD76096BBB11001C2316 /* VLSheetViewChords.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLSheetViewChords.h; path = Sources/VLSheetViewChords.h; sourceTree = ""; }; 952DCD77096BBB11001C2316 /* VLSheetViewChords.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLSheetViewChords.mm; path = Sources/VLSheetViewChords.mm; sourceTree = ""; }; 9530A7010BD9E16700635FEC /* display.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = display.tiff; path = Resources/display.tiff; sourceTree = ""; }; + 9531F34D0DE2B4CD004F78C2 /* VLAIFFDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLAIFFDocument.h; path = Sources/VLAIFFDocument.h; sourceTree = ""; }; + 9531F34E0DE2B4CD004F78C2 /* VLAIFFDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLAIFFDocument.mm; path = Sources/VLAIFFDocument.mm; sourceTree = ""; }; + 9531F34F0DE2B4CD004F78C2 /* VLMP3Document.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLMP3Document.h; path = Sources/VLMP3Document.h; sourceTree = ""; }; + 9531F3500DE2B4CD004F78C2 /* VLMP3Document.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLMP3Document.mm; path = Sources/VLMP3Document.mm; sourceTree = ""; }; + 9531F3660DE2B872004F78C2 /* lameWrapper */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = lameWrapper; path = Tools/lameWrapper; sourceTree = ""; }; 953722650AE9F0E100B6E483 /* VLLilypondDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLLilypondDocument.h; path = Sources/VLLilypondDocument.h; sourceTree = ""; }; 953722660AE9F0E100B6E483 /* VLLilypondDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLLilypondDocument.mm; path = Sources/VLLilypondDocument.mm; sourceTree = ""; }; 9545C5C10C092F4600251547 /* VLMMAWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = VLMMAWriter.cpp; path = Sources/VLMMAWriter.cpp; sourceTree = ""; }; @@ -222,6 +236,7 @@ 95784D860BFAD795009ABEA4 /* VLMirrorWindow.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLMirrorWindow.mm; path = Sources/VLMirrorWindow.mm; sourceTree = ""; }; 95795CE40C88B25D00E4A21F /* vl.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = vl.rb; sourceTree = ""; }; 95795CE50C88B25D00E4A21F /* VLMusicXMLType.reader */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = VLMusicXMLType.reader; sourceTree = ""; }; + 958139C20DE2FBE4003C00B4 /* installLame.scpt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.scpt; name = installLame.scpt; path = Resources/installLame.scpt; sourceTree = ""; }; 9588363A0C6F9C7D004B4162 /* VLPListDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLPListDocument.h; path = Sources/VLPListDocument.h; sourceTree = ""; }; 9588363B0C6F9C7D004B4162 /* VLPListDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLPListDocument.mm; path = Sources/VLPListDocument.mm; sourceTree = ""; }; 9588365A0C6FABBA004B4162 /* VLDebugFlags.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VLDebugFlags.cpp; path = Sources/VLDebugFlags.cpp; sourceTree = ""; }; @@ -232,6 +247,14 @@ 959408AC096922EA007CCCF8 /* TVLEdit.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = TVLEdit.cpp; path = Tests/TVLEdit.cpp; sourceTree = ""; }; 9599ED9A0B731CC500A6A2F7 /* VLGrooveController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLGrooveController.h; path = Sources/VLGrooveController.h; sourceTree = ""; }; 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLGrooveController.mm; path = Sources/VLGrooveController.mm; sourceTree = ""; }; + 959A3A110DE64BA300EF207B /* play.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = play.icns; path = Resources/play.icns; sourceTree = ""; }; + 959A3A120DE64BA300EF207B /* stop.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = stop.icns; path = Resources/stop.icns; sourceTree = ""; }; + 959A3A220DE78BCD00EF207B /* bck.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = bck.icns; path = Resources/bck.icns; sourceTree = ""; }; + 959A3A230DE78BCD00EF207B /* fwd.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = fwd.icns; path = Resources/fwd.icns; sourceTree = ""; }; + 959A3A240DE78BCD00EF207B /* tobeg.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = tobeg.icns; path = Resources/tobeg.icns; sourceTree = ""; }; + 959A3A250DE78BCD00EF207B /* toend.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = toend.icns; path = Resources/toend.icns; sourceTree = ""; }; + 959A3A6C0DE8CB5B00EF207B /* VLMIDIWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VLMIDIWriter.cpp; path = Sources/VLMIDIWriter.cpp; sourceTree = ""; }; + 959A3A6D0DE8CB5B00EF207B /* VLMIDIWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLMIDIWriter.h; path = Sources/VLMIDIWriter.h; sourceTree = ""; }; 95A1C37B0AF1D4370076597D /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; 95A1C3840AF2ACE20076597D /* VLSheetWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = VLSheetWindow.h; path = Sources/VLSheetWindow.h; sourceTree = ""; }; 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLSheetWindow.mm; path = Sources/VLSheetWindow.mm; sourceTree = ""; }; @@ -274,7 +297,6 @@ 95FC66BD0AF0A4D4003D9C11 /* music.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = music.tiff; path = Resources/music.tiff; sourceTree = ""; }; 95FC66BE0AF0A4D4003D9C11 /* nextpage.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = nextpage.tiff; path = Resources/nextpage.tiff; sourceTree = ""; }; 95FC66BF0AF0A4D4003D9C11 /* prevpage.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = prevpage.tiff; path = Resources/prevpage.tiff; sourceTree = ""; }; - 95FC66C00AF0A4D4003D9C11 /* run.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = run.icns; path = Resources/run.icns; sourceTree = ""; }; 95FC66C10AF0A4D4003D9C11 /* zoomin.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = zoomin.tiff; path = Resources/zoomin.tiff; sourceTree = ""; }; 95FC66C20AF0A4D4003D9C11 /* zoomout.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = zoomout.tiff; path = Resources/zoomout.tiff; sourceTree = ""; }; 95FC66CC0AF0A591003D9C11 /* VLPDFView.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLPDFView.mm; path = Sources/VLPDFView.mm; sourceTree = ""; }; @@ -384,8 +406,14 @@ 2A37F4ABFDCFA73011CA2CEA /* Classes */ = { isa = PBXGroup; children = ( - 95D059780D1E6B0D00E28FAE /* VLLayout.cpp */, 95D059790D1E6B0D00E28FAE /* VLLayout.h */, + 95D059780D1E6B0D00E28FAE /* VLLayout.cpp */, + 959A3A6D0DE8CB5B00EF207B /* VLMIDIWriter.h */, + 959A3A6C0DE8CB5B00EF207B /* VLMIDIWriter.cpp */, + 9531F34D0DE2B4CD004F78C2 /* VLAIFFDocument.h */, + 9531F34E0DE2B4CD004F78C2 /* VLAIFFDocument.mm */, + 9531F34F0DE2B4CD004F78C2 /* VLMP3Document.h */, + 9531F3500DE2B4CD004F78C2 /* VLMP3Document.mm */, 9588365A0C6FABBA004B4162 /* VLDebugFlags.cpp */, 9588365B0C6FABBA004B4162 /* VLDebugFlags.h */, 9588363A0C6F9C7D004B4162 /* VLPListDocument.h */, @@ -457,6 +485,10 @@ 2A37F4B8FDCFA73011CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 959A3A220DE78BCD00EF207B /* bck.icns */, + 959A3A230DE78BCD00EF207B /* fwd.icns */, + 959A3A240DE78BCD00EF207B /* tobeg.icns */, + 959A3A250DE78BCD00EF207B /* toend.icns */, 9524DAF70BE569C50002AC03 /* Help */, 95003B3F0D4B9A5D00C9849C /* MainMenu.xib */, 95003B410D4B9A5D00C9849C /* VLDocument.xib */, @@ -465,14 +497,15 @@ 95003B470D4B9A5D00C9849C /* VLMirrorWindow.xib */, 95003B490D4B9A5D00C9849C /* VLPDFWindow.xib */, 95049CF20BDC32CD0015EE6E /* installLilypond.scpt */, + 958139C20DE2FBE4003C00B4 /* installLame.scpt */, 95049D010BDC43510015EE6E /* installPython.scpt */, 95FC66BC0AF0A4D4003D9C11 /* console.icns */, 9530A7010BD9E16700635FEC /* display.tiff */, + 959A3A110DE64BA300EF207B /* play.icns */, + 959A3A120DE64BA300EF207B /* stop.icns */, 95FC66BD0AF0A4D4003D9C11 /* music.tiff */, - 950795E00B4A34D9008911A6 /* stop.tiff */, 95FC66BE0AF0A4D4003D9C11 /* nextpage.tiff */, 95FC66BF0AF0A4D4003D9C11 /* prevpage.tiff */, - 95FC66C00AF0A4D4003D9C11 /* run.icns */, 95FC66C10AF0A4D4003D9C11 /* zoomin.tiff */, 95FC66C20AF0A4D4003D9C11 /* zoomout.tiff */, 95E04DCA0AEB4D9B006F30A0 /* Templates */, @@ -529,6 +562,7 @@ 95C4627A0B045C8E00649F92 /* lilyWrapper */, 95C461FF0B04472900649F92 /* mmaWrapper */, 95C461D50B04406300649F92 /* mma.py */, + 9531F3660DE2B872004F78C2 /* lameWrapper */, 95D0C2FB0B785D020061080E /* rebuildGrooves */, ); name = Tools; @@ -673,6 +707,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 959B77C20DE3139F004432E0 /* installLame.scpt in Resources */, 95049D020BDC436A0015EE6E /* installPython.scpt in Resources */, 95049CF30BDC32EB0015EE6E /* installLilypond.scpt in Resources */, 8D15AC2C0486D014006FF6A4 /* Credits.rtf in Resources */, @@ -685,10 +720,8 @@ 95FC66C40AF0A4D4003D9C11 /* music.tiff in Resources */, 95FC66C50AF0A4D5003D9C11 /* nextpage.tiff in Resources */, 95FC66C60AF0A4D5003D9C11 /* prevpage.tiff in Resources */, - 95FC66C70AF0A4D5003D9C11 /* run.icns in Resources */, 95FC66C80AF0A4D5003D9C11 /* zoomin.tiff in Resources */, 95FC66C90AF0A4D5003D9C11 /* zoomout.tiff in Resources */, - 950795E10B4A34D9008911A6 /* stop.tiff in Resources */, 9530A7020BD9E16700635FEC /* display.tiff in Resources */, 9524DAFB0BE569C50002AC03 /* Help in Resources */, 95003B4B0D4B9A5D00C9849C /* MainMenu.xib in Resources */, @@ -697,6 +730,12 @@ 95003B4E0D4B9A5D00C9849C /* VLLogWindow.xib in Resources */, 95003B4F0D4B9A5D00C9849C /* VLMirrorWindow.xib in Resources */, 95003B500D4B9A5D00C9849C /* VLPDFWindow.xib in Resources */, + 959A3A130DE64BA300EF207B /* play.icns in Resources */, + 959A3A140DE64BA300EF207B /* stop.icns in Resources */, + 959A3A260DE78BCD00EF207B /* bck.icns in Resources */, + 959A3A270DE78BCD00EF207B /* fwd.icns in Resources */, + 959A3A280DE78BCD00EF207B /* tobeg.icns in Resources */, + 959A3A290DE78BCD00EF207B /* toend.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -756,6 +795,9 @@ 9588363C0C6F9C7D004B4162 /* VLPListDocument.mm in Sources */, 9588365C0C6FABBA004B4162 /* VLDebugFlags.cpp in Sources */, 95D0597A0D1E6B0D00E28FAE /* VLLayout.cpp in Sources */, + 9531F3510DE2B4CD004F78C2 /* VLAIFFDocument.mm in Sources */, + 9531F3520DE2B4CD004F78C2 /* VLMP3Document.mm in Sources */, + 959A3A6E0DE8CB5B00EF207B /* VLMIDIWriter.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };