2
0
Эх сурвалжийг харах

Merge branch 'navbuttons'

Martijn Laan 1 жил өмнө
parent
commit
3d73537b52

+ 1 - 1
ISHelp/isetup.xml

@@ -3194,7 +3194,7 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
   <td>Extend rectangular selection to end of line.</td><td>Alt+Shift+End</td>
 </tr>
 <tr>
-  <td>Complete word.</td><td>Ctrl+Space or Alt+Right</td>
+  <td>Complete word.</td><td>Ctrl+Space or Alt+Right (latter only if the Delphi key map is not active)</td>
 </tr>
 <tr>
   <td>Fillup complete word.</td><td>Tab or Enter or Space (for ISPP directives) or \ (for constants) or : (for constants and section parameters) or ] (for sections) or = (for section directives).</td>

+ 1004 - 23
Projects/Src/CompForm.dfm

@@ -202,16 +202,36 @@ object CompileForm: TCompileForm
       ShowHint = True
       TabOrder = 0
       Transparent = True
-      object NewMainFileButton: TToolButton
+      object BackNavButton: TToolButton
         Left = 0
         Top = 0
+        ImageIndex = 54
+        ImageName = 'button-arrow-left'
+        OnClick = BackNavButtonClick
+      end
+      object ForwardNavButton: TToolButton
+        Left = 23
+        Top = 0
+        ImageIndex = 55
+        ImageName = 'button-arrow-right'
+        OnClick = ForwardNavButtonClick
+      end
+      object ToolButton1: TToolButton
+        Left = 46
+        Top = 0
+        Width = 8
+        Style = tbsSeparator
+      end
+      object NewMainFileButton: TToolButton
+        Left = 54
+        Top = 0
         Hint = 'New Main Script (Ctrl+N)'
         ImageIndex = 0
         ImageName = 'document-new'
         OnClick = FNewMainFileClick
       end
       object OpenMainFileButton: TToolButton
-        Left = 23
+        Left = 77
         Top = 0
         Hint = 'Open Main Script (Ctrl+O)'
         ImageIndex = 1
@@ -219,29 +239,28 @@ object CompileForm: TCompileForm
         OnClick = FOpenMainFileClick
       end
       object SaveButton: TToolButton
-        Left = 46
+        Left = 100
         Top = 0
         Hint = 'Save (Ctrl+S)'
         ImageIndex = 2
         ImageName = 'save-filled'
         OnClick = FSaveClick
       end
-      object ToolButton4: TToolButton
-        Left = 69
+      object ToolButton2: TToolButton
+        Left = 123
         Top = 0
         Width = 8
-        Caption = 'ToolButton4'
         Style = tbsSeparator
       end
       object CompileButton: TToolButton
-        Left = 77
+        Left = 131
         Top = 0
         ImageIndex = 3
         ImageName = 'build'
         OnClick = BCompileClick
       end
       object StopCompileButton: TToolButton
-        Left = 100
+        Left = 154
         Top = 0
         Hint = 'Stop Compile (Esc)'
         Enabled = False
@@ -249,22 +268,21 @@ object CompileForm: TCompileForm
         ImageName = 'build-cancel-2'
         OnClick = BStopCompileClick
       end
-      object ToolButton7: TToolButton
-        Left = 123
+      object ToolButton3: TToolButton
+        Left = 177
         Top = 0
         Width = 8
-        Caption = 'ToolButton7'
         Style = tbsSeparator
       end
       object RunButton: TToolButton
-        Left = 131
+        Left = 185
         Top = 0
         ImageIndex = 5
         ImageName = 'debug-start-filled'
         OnClick = RRunClick
       end
       object PauseButton: TToolButton
-        Left = 154
+        Left = 208
         Top = 0
         Hint = 'Pause'
         Enabled = False
@@ -273,22 +291,21 @@ object CompileForm: TCompileForm
         OnClick = RPauseClick
       end
       object TerminateButton: TToolButton
-        Left = 177
+        Left = 231
         Top = 0
         Enabled = False
         ImageIndex = 10
         ImageName = 'debug-stop-filled'
         OnClick = RTerminateClick
       end
-      object ToolButton10: TToolButton
-        Left = 200
+      object ToolButton4: TToolButton
+        Left = 254
         Top = 0
         Width = 8
-        Caption = 'ToolButton10'
         Style = tbsSeparator
       end
       object TargetSetupButton: TToolButton
-        Left = 208
+        Left = 262
         Top = 0
         Hint = 'Target Setup (Ctrl+Q)'
         Grouped = True
@@ -298,7 +315,7 @@ object CompileForm: TCompileForm
         OnClick = RTargetClick
       end
       object TargetUninstallButton: TToolButton
-        Left = 231
+        Left = 285
         Top = 0
         Hint = 'Target Uninstall (Ctrl+W)'
         Grouped = True
@@ -307,15 +324,14 @@ object CompileForm: TCompileForm
         Style = tbsCheck
         OnClick = RTargetClick
       end
-      object ToolButton13: TToolButton
-        Left = 254
+      object ToolButton5: TToolButton
+        Left = 308
         Top = 0
         Width = 8
-        Caption = 'ToolButton13'
         Style = tbsSeparator
       end
       object HelpButton: TToolButton
-        Left = 262
+        Left = 316
         Top = 0
         Hint = 'Help (F1)'
         ImageIndex = 9
@@ -560,6 +576,11 @@ object CompileForm: TCompileForm
           OnClick = VReopenTabsClick
         end
       end
+      object NavPopupMenu: TMenuItem
+        Caption = 'NavPopupMenu'
+        Visible = False
+        OnClick = NavPopupMenuClick
+      end
       object N20: TMenuItem
         Caption = '-'
       end
@@ -10258,6 +10279,479 @@ object CompileForm: TCompileForm
               977A7C0F70E3F488B811818F9CC13DB917804E44AB48D35CCAF1DD40F3C83DD7
               9FFF033122C8F1A1BE8FE40000000049454E44AE426082}
           end>
+      end
+      item
+        Name = 'button-arrow-left'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              610000000473424954080808087C086488000002B549444154388D75935B4893
+              6118C77FEFF77D6B473797A76821AB640466662EF066415D54244105C930EC00
+              5D4617215D4644A0E56537114174B0C62E828A282A092BC862B54C4A120AD319
+              5A5B9B6B6D1EBEEF7BBBF0D049FFB7EFF3FF3DFFF7E17904B3720577E2DD7144
+              551DEE30887D40108117491A8881EC34A726229987178CECB30848098000F036
+              1EC5136A0E0091864A776D4B5D19415F115EBB46BAA0131BF9C1D5F8377A86B2
+              BD403817BF37908C9E9A81B836EEC47FA62750D5F162AC333E6AE8BA6E2C245D
+              D78DCEF8A851D5F162CCDFDE13F06C3904805A71F89CAA586C0F4E6FF5AF0AAF
+              2B430801C09DFE14D386A4DCB56426AA10ACAD7052EEB438BA3E6642B6CA9A8B
+              B95777A5A23A3CE1864A776D534DE9DC38B8F53E457B77029B45E15F35D594D2
+              50E9AE15166BD859BF0305686EA9FBDDF9767F8AB34F125CDE1BA0AAC4FE1F40
+              08414B5D1940B36D651D1A100CFA8AE663B77727B8B288794E415F110882AAB3
+              180D21BC5EBBC697EC24C7EF0D326D4AB1FDD2BB058D1645D07FAC5E7AED1A20
+              BC001A5266D205BD64B9DB4ADB363F1D4F13F24A5380D54B174F902EE8206506
+              295180586C2407C0AEEA125A433E0E4407F8F47D6251C06C7DCC9CCCA348C9F5
+              6BF1AFC8D9CDDA5D5DCAB1908FFDD10F0B42A4945C8B7F45C2F589C1372872BA
+              10793E94ED8DF625E78BF65497D2BA6905F929E33F40B42FC9F3A16C2FA611F9
+              F9FA3EAAD4A74C7BA0E171F7E078B8DC697154973B1042B0A6CC31BF44739DA3
+              7D494E3CFA9C34258DD9A737BEE5DF3E449D1C7E8756B222A55554DDEEFA9809
+              BD4CE49639972814DB34AC9AC2F7BCCE93C1714E760D73F9F558AF2969CC0FF4
+              0CA46EB68169CE1C1342C1B3F9009ECD0755C5620D030B5C239DD23422D96711
+              23FDE03CE8D333D63FFFA77A2A706DD88ED5BF1ED5553CFB2C310B39263FBF25
+              17BF8F9E1CFE6B26BF00021233F6A69C84BF0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000140000001408060000008D891D
+              0D0000000473424954080808087C086488000003A349444154388D8DD45D4C5B
+              7518C7F1EFFF9CD3D24329E5A5BC25C36E834331D3805B98514C164046F4C298
+              A960621096917835133546135DD411E38D926546E3CD9245B9909832E322CCB8
+              C42D1991395FA280324933904A606B69D9FA4ADBF3F7A2ACB2149CBFEBF37CCE
+              F33CE7E411DC8EA2E23CD08BB3FD30C2626D14887EA003810114220901D3C098
+              94F2B499880443E73E2272F94B36470008AB4E65FFFBE8BBF73A410C21445F73
+              B55D74D49760B86CD82D2AA1789AA99528E35743F8D79251E038C8A1C8AFE7CD
+              C0C8DB6066364045A56AE0247ADD3E37926FEACA7563B0D3CD83B50EB64AC694
+              78A703BC77D1CFCD44FA2CD013F9653C1918790700D5D9D687A3E5092770F161
+              77B131DCED6157996D4B0C4011823D55760E1AA59CF7853D9164C6B0D618DE54
+              7091D4B20FC5D9761824437565BAF1C993F5D8AD6AAE38BA9EE1C5B33EE64389
+              3C7877998D53870C6C16A51BE82D7DEC28282A8AD0AC1E21C4F3839DEE3CEC88
+              778EDFAFC7D02DCA96DD7A2A0A79617F0DC071B5B85CD31B5B518410FD4DD576
+              65F3CE62EB190646E70844530C777BA82AB26EBB82BEBD951468CA3D02F1A85E
+              DF82027474D497E461D72329867B3C543BB6C7009C368D961D0E800E4BA51B0D
+              211A0C57F623C45259ECB7E518EF1E74B3104EB2104E6E090960FFC65486CBC6
+              A5859B068A860614DA2DD9DD8DCE04F9C11F1100AF8C5DFBCFCE0A54C1CC4BFB
+              2440B65E160A4043CA50289E76013CD75421E757138C4C053875C8C87570B784
+              E2699084A59428C0F4F44A343B8610E28DB65AD97DBF8B81D139AEF86FFD2F70
+              A37E0A3383028C8D5F0D9131650E7DB3AD563E7D9F8B23DEBBA30BA10453CB31
+              018CAFAFF850A494A717D79251EF4C20F79010421C6BAF954F6DA0B727D82A27
+              BF5FC29472524AF963FC8F09D4E2477AE28AA52075C51FE9EC324A29D5B51C7A
+              6057B12CB2AAA27567311635FFE7FE7A769513134B19E0D954D0EF0F8D7D886A
+              266E51786FEB64322D1FF8D617F6B4BA8B71D92D39B4A9A6685BECD5F16BA4A5
+              7C0DE417373E7F8B74701175FDEF59B48A9DD25A5D772692CC18DE99E09E8C09
+              8D153A362D1F9A0F2518FCEE2F4E4C2C65D2A67C1D180A5FF88CC8E533D92600
+              50545CCF1CC3DEDC8510A217182CD094DA961D8EBC7B38BD1C13A69493C0CB12
+              26D72E7C4AF8DCC7FFEE7FF3DBEDCD5D943C7E14CD51AE09213A8176A00191BB
+              D853642FF64FA9A09FD5AF3E20F1E7E41D13DC0102A059D01B1E42AF6FC152E1
+              065545209048646A9DD48D05E2B39748F87E0669E695FF0300247A332C3364A9
+              0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F80000000473424954080808087C086488000004ED4944415448898D954B6CD4
+              5518C57FDFFF3FCF76A6F445A130531E2DC5A2246206DB080B15051B2CB16058
+              1137088815171AC48D2C48D00416122389E20B134820620C14F1410235685091
+              87886550668A121ED3A19D0E9D4E673A8FCF453BEDB4A5C4B3FA6EEECDF9EE39
+              F7DC7B853C88BD80E2A52FE16E588918A6534456004D800FC103D880088A1F68
+              53D503C0E54CAC9BEEA3BB88FF7E9CB1905C61AD9849C50B3BB096794D44D602
+              5B4564DA149755174C73E19964C3661A44FAD3F8C3712EDD8ECB40269B015A81
+              CDAA1AE8BBF01D770E6D874C6A74036BC52CA6AE7F1FC3555622B01F58D65055
+              444B4325F55EB71AC238DC89A7E5E0C5301F9FB94D6F3213035E04BE885FFE91
+              CE7D6F42260D8029F642A66ED88D5932B54484130E8BB178DBD33378EB492F55
+              C50E049021905717DA4C167A5CDAFC60B9FC198ADB6EF40EAC046E5A267BCF1B
+              F642127FFD3CD8A074F9260AE63E668A70C8611A8B3F6CAED1C6DA12CD11E648
+              D319554306EB7C256EBB459E7DA094F6CE7EB91649340A72CAEE9DF74FE2EAAF
+              64A29D18EEFA95006B51966D5D52A58B661429800E01E044A087E67DED12EE4B
+              89E621B7CE668AEE5A3E5BABCB9C16E013411CC54B37006060984E606B435511
+              ABE79733D68A93C1A8B41C0960B718382C864A1E465B66B0EDA92A44643622EB
+              1DB31EC152E6C11091261199D6D250C918F59C08F4B0E948807915057CB26A0E
+              6EBB39FEB4F350EF75E39BEE52601D8688B36E3106D034C565D57AAF7B94F4B6
+              E02079ED64279FAE9AA34576739475F916E56A4057D49502CC03A9B64DADC600
+              7C0BA6B9C81DA088C80F1D5179F97080B9930BD8FB7CAD4E7258C65932769CAB
+              7D1EF75030F09985255810F17826D98665B605A3B41C0990CE2A0F5716B2F76C
+              48C859A73A52E78DAD066CACAF0460844B3C0016C066330D7272F75FE894442A
+              0BC0E7E742F7F53C07A7D560637DE550A20C0041D536D840B5A7A73F5D9E93F8
+              5ED36C367C75955FAEF7B2A371162BEA4A87EF84AA8EBA1FF96355454424121F
+              7E267A403100BF3F1CCFDB8DC907CD35FAA8D7CD966F3B68F577DFE3A1981857
+              46B8FC281840DB1FA1B874C5D3C3444E8BC187CFD5E09BEE66F3B10E8EFABBFF
+              778393C128405C55CFA4A3210C553D3890CE660E5E0C8F8A9CD36AE89EE61A5D
+              E871F3FAB120AD97BB866D9928A67793690EB777C1E00BDB9BE8388F01B403AD
+              1F9D09118AA54645AEC066CA9EE61AF54D77F3C6B7D7E88824F2533A2EA6BB4F
+              DF2292C86415DD994D25E8BFF2334626D68DC2E6DE643AF6DAD74192E9EC28C9
+              4EABC19EE61A763C339359250E65029C0C46E5B3B32141750F703E76EE1B34D9
+              8799BE1BA6F0A127222212B8D13BB0B2BDB35F965417633547CED66A0AB5E5CE
+              FBF92EAFB60618C8EA19604DB62F9A0AEFDB82A69298A950106BB9175B65753B
+              C8AD6B9164E3F1AB3D666DB9533C93ECF7BCAD39F42633F2EE4F3765FBC9EB32
+              44DEA49A8D860F6C2575F36F20F7659A562AD6BC83B36E31028F031F8BC8EC85
+              D35DDA54578ACFE3CE7D991AE94F8B3F1CA72D18E5707B179144263B64CB66D5
+              6CBCEBCBB789FD767458DD880FA68592C657285AB41A1007C20641D60175F7F4
+              4588A3B42AEC043D9FED8B72E7D076FA2F9F1AB36C0C6C55F3296E6CC139633E
+              18A6886A0D223EC083604389007EE0574563D95482D8D96F887EFF01D9F8DD7B
+              EC630258CABC38EB16619B528DE92A1E379FEABA41F2DF4BF45F398D26FB26A2
+              E13FC27E415CEEBDD9360000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000005F1494441545885CD976D4C5B
+              E715C77FF75E5F63F356635E62CC4AC084000911C125F952B650B1540B81A8A4
+              DA46B769DDB47CC9166D95A6464C4AB53559B589549B1669D954459A3A69AD9A
+              B224059AAAEB4B925135AB829612CADC12F316860D0EB18D21B6F1DBB30F061A
+              12B00DF9B2FFB77BEF39CFFF77AF9FE3E71C8914A564E5A2B358D11655A23116
+              21299AE567221625E2711276DE2430DC47D43B9DEAB248C902F4958F935DDF86
+              CE622D9264A515D80354036624D211F80107F0197005C4F9E0D88D49DFD54EFC
+              37DE07213606A06E2A25B7B51D5D494D2DF002122D1579E972FDE66CAA0AF414
+              6669D1AB3281700CE75C089B2BC047E33E866602312144377062C179F3FA9D73
+              BF253431B83E800CEB7E725B8FEA6435AD4396A4C32D5546F9D02E13DB0AD293
+              7D30FEE3F273E6DA14DD36772C26C49F62B1E851EF3BA783BEDEBFA50690FDD5
+              EF90D3F453B324D16331EA6A4E3695B2B33033A9F1FDFAD439CFF31747197107
+              FB85A0D9D7FB9AC373F1D40371CABD1719D6FDE43E75D42C49F436580C95AF7E
+              732BC506DDBACD014C595A9EAECEC3763B601AF7060FA615EFE814D1F0DCC258
+              FFEA009A4DA5143C7B52272B9A0F1A2C86CA3F3FB5059D2A6FC87C495A45A6A9
+              C2C867D37EC3B837D89866B1BE1A1CBD1E897AA69663961DF25ADB51D4B48E32
+              A3BEE6548B0555495C20B3C1484A10AA2271AAC54299515F23CB4A476E6B3BC8
+              5F96B00CF152D395D4D4CA9274B8A3A9840CADB2E682003D9FBB693C33802790
+              1A448656A1A3A90459920E6BF337D766D6ED5F09905DDF0670ACA5CA2827DB70
+              17BF70F3FCC5517ED1F028397A4DC2D87BB5B33093962AA30C1CCB7EBCED4B00
+              3933079DC56A96900E1CDA654AB8C8BB431E7EFEF6282FEE2DE6E9EABC94CD97
+              7468970949920EA8052566D5541607D097D521C94A6B79BE4E4E54E7EFD93D3C
+              F7F608BF6C2CE65B3BF2D76D0EB0AD209DF23C9D2C4952ABBE7C771C405B5409
+              D050BFF99135133F1CF6F2B3EE118E3DF1286D351B335FD2A24FC3A22FB2C668
+              06D8BEAD40BF6AC2E5112F47BA8669DFF315BEBBB3E0A1CC01167DB66B72CC00
+              6824450509736196F681E07F8ECEF2E3B786F9817513DFD89A836B3EB46EC31C
+              BDBAA2A4177DCC92468D03C46F4BE9FAFBFE74E616223CD73342282AA457AE4D
+              F1CAB52936A2EEEF6F1355F7EC2DBD2A83242DDF880308110846622BEA2F2B4D
+              C3EF9B2D1CBE60173F7C6C13CF5A37F6F973F4EA8AEB40380642049601442C0A
+              30E9F0852AEE4FDE53FA087F3C50C64FBA8629CCD2F2BDDA87DF03CEB910C024
+              715FE488C70130687305564D78A2CCC0A996325EBA3CC16BFDAE870658F4190C
+              BB1D7180B0D30E70E5A371DF9A495FDF62E00FCD164E7C30C11B376E3F14C0A2
+              CF95F0943D0E1018EE03C1F9A1197FCCE6F2AF99F864790EBF6B2EE557EFDFA2
+              73606643E636979FA1197F0C381FB0F7C501A2DE6982B7062685A0E74C929DBE
+              6FAB91979B4A79E1BD71CE0DAE1FE2CCB52984A027EC764E2EB5693280EFE3B3
+              00C7BB6CEE58BF733EE122FB2B8D74EC2BE1A54B13299F8600FDCE79BA6CEE18
+              70DC77F5ECF27D0520EC1A43BFFD6B534AA631BFEFBF77771FACCE45ABACDD8C
+              54E4A7F3ED1DF9299F867743517EF4773BEE40F874C43BFD973B6F1E67A90A16
+              0F7E41C83144465DF3256F30DAFCF9ED80695F8511455EBB2949B55B0A470547
+              BA86F9B763BE5F20DA66CEBE18094F8F2C3F5FEE3CA2BEDB88D0424457BEBB7B
+              CCBB707070DA6F68DC6248F82592E96E28CA91AE612E8D78C70462EF6CEFEB9E
+              F98FDF5C11B3A2F559B83580ACCB984B2BAEEE1CF32E34FEC3EE35ED30A5635A
+              E59C48A64F9DF31C3A675F7AF3BD77AFBFEB705F3809AC1C541EE8BD82373F41
+              44C3733A8BF5AF9E60D4D03970E7B1314F502A36A4919FA1DE1FFE806C2E3FBF
+              B93CC1AF3F9C88B9FDE1D302F1CC6CEFEB1EF7858E55A7A4357FE4B4D25A720F
+              B6A3CDDFBCAEC9E88B197F0C41377022323B7DFDCE859709D87AD7044EDCFACA
+              0A9975CD64D7B7A11694164990743614703EE29E9CF45DED64FE5FE710E18584
+              164987D325A985E5E8B7D42D4EC76624598D670B404409BB1D84A7EC04EC7D09
+              67C1FF3BFD0FCA59553B3B9EAA8B0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000280000002808060000008CFEB8
+              6D0000000473424954080808087C08648800000857494441545885DD986B7094
+              D519C77FCFBB9BDDCD663757432E246C6204834814BC102E0D582F412B291D1D
+              471DA5ADAD628915EB1767A8A34E3BA5B53AD38E17666A33F536745474D072F1
+              968E16546E0D3A20159210088440B2B96D92BDE5DD7D9F7E480209249084F44B
+              FF1F76DED9F79CE7FCE679CF39CF4598880C1B8EA9C538F36662CFC8C348F402
+              2080D2FF6385BA30DB9B881EFB16F364DD849619B43966B96694E2B9E636DCC5
+              8B10A73B43A00C28012E0352115C2841C00FD402350A5F59E1EE48E8DBCFE8D9
+              FD0FFA8E1F987C40D78C79A42DADC49133DD2922F7023F1691458061084C4D76
+              68AACB8ED36E10322DFC41137FD01400550D039B81BFA9EAC79186BD747EB46E
+              CCA0E70534DC29A4DFB186A42B161B22AC047E2D22B945E92E5D36339D05BE64
+              664D71E3B41BE7CCED8EC6D87B22C8B62301B61CEAA03D141355FD1A784255AB
+              BB776DA46BEB8B685F7862808EDC6232573C8B3D356BBAC07A11B9B634DFAB8F
+              CCCF615EBE1791B1EF0E33AE6CFAAE9D97779EA4B12B8AAAFE5D5557F5B534F4
+              F8DF78825847D3F8009D052564FDF4CF180E7705C29B19EE04CF33374DE3D619
+              69E3023B5B7D318BBFEC3EC54B3B9B89C5B55E9565F1DEF6DA96575661FA1BC7
+              06E8C82D267BE53A0CA77B0542D59C1C8FEDA58A22B2BD8E09839DAD9A13BD54
+              7E508F3F68B601E5B1EEF66F4EBEFC33E28153E70734DC29E4AC7E8384E4AC0A
+              44DEFD5E61B26DDD0F8B7027D8260D6E508D9D11566CA8A529106D516551F4E4
+              A18653EB1E8458DFB071C356CEB8FB37B8F267CD10E1C339B91E57D51DD3FF27
+              7000A989761617A6B0E550A72712B396D8BC19AF1B0E772C52BB7364C0C419A5
+              A495AF3404D99AE14E2878F3AECB494B4C18D362A1BE3861D31AF1349F4F6989
+              768A3313D9F45D4736E0764E2DFE2474E073AC60E7E931A72DA62E5D85200F89
+              C8B5CFDC346DCC7B2E6CC67970633D0FBC5787A5AAE32204CA0A53B8F7EA4C05
+              7E2936FBECD45B560E7B6F00B8A697E2C899EE049E2CCDF7EAAD33D2C60867E9
+              431BEBF977530F3FB9260B638247FCF14553494DB4DB80A7DD579461CFF40D07
+              4C9A538E88DC2B22B98FCCCF19D3551289593CFC7EBDEC3ADEC373B715727B71
+              FA44D8004871D95931670A222C07294ABABA7C08A0612369D66280FB8BD25D3A
+              2FDF7B4183D198C52FDEAF67C7B16E9E5D5A40C5CC8C09C30DEAEEAB32314444
+              84FB924ABE7F06D031B5187126A68B48D9EDC5E917F45E5FCCA2F283C37C71B4
+              9BB5E505FC68D625170D0790E571707D9E17607942A60FC3D3FF450C67DE4C04
+              29038C85BEE4F3C3C52D7D64D361FE7524C0EF6EF171E795930337A885BE6410
+              992D48BA33AFB81FD09E9107506208CCCA728F3AD98C5BFAE8A606F9EC70407E
+              73B38FBB4A3227150EA0242709E93F17B3ED19F9FD8003C9E665B9C90E1DED1E
+              8BC5551FDBDC20D5F55DF2F48DD3F49EAB261F0EA020CD39F85864247A00B003
+              20A4A6B9EC23C359AABFDAD2201FD775C975791E4D4C3078EFDBB68B86595C98
+              C22549C303C11086341988C2F68123E1728CE2BD2F8E06E4C3DA4E01D8D3D42B
+              7B9A7A2F1A0EE0AD7B2ED7B3014F3308AEC1FFFA919550C4B44634B4E4D254D6
+              2CC9D3B59F37C9BC7CAFAE2DF761BB88946B509949E786D1F020437FD9D00F38
+              109BFCFEA039AAB107AECD266EA1CF6E6B9217BE6CD63FDE5AA836631228CF52
+              DB198636ED2FBFB05BC12E80DAD6A0293DD1987A9D23EFC507AFCF26AEAACF6F
+              3F213643F8C3D202269BF1704764F0B1D60A06FA01CDF6E30035007B9B832C2E
+              4C19D5C0C3F372885BAA7FFAB2590C115D5BEE9B54C8BDCDBD281A05F60F7061
+              8F1E3B00B04355C3DB8E045CE70304A89C9F4B5CD117BE6A169B81FEF6669F4E
+              3449385BDB8E0440D9A968B8AF9F0BC33C59473CD41D06366F39D8412C7EE18C
+              E9D105B95496E6E8DBFBDAE499EA63A21348B3CED6217F8883FEB0001BFA4ED4
+              6145FA6F0B1B4042461E8EDCCB7BC331BD6F5A9A939953468F28832ACDF7AA69
+              29AFD6B44A5724C6E2C214958BF0E473DB9BF84F6B28A4AA3FEFD9F16E387AF4
+              9B3380F16000EFF5CBEA818ABAB648F63D2599D88CF3AF2522327F9A5723318B
+              576B5AA53B1AA7AC207942900D1D119EFAF41896A5EBD48ABFDFFEDE5A74A807
+              E381565C97CE25212DB721108DDF6FB7096349BB444416FA9235685A84FB2C6E
+              284A1D379FA5CAEACD0D3476463A81BB7BBFDE1A0AEEDD7AFAFDE99AC46C6DC4
+              735D450330BDE644EFEC05D392C949BE70DA2F22B2C897AC3714A54E28A3AEDA
+              D3C25BFBDA04586D99D12FFCEBD79CF61E0CA949FA8E1FA07BD74614AD34E35A
+              BFEA837A1ABB2223D91C117222709FD677F2FCF62654F51D45ABBAAAAB88770E
+              AF8D8705E0AEAD2F629E3ADCADAACBFC41B36DC53BB51CE9181BE478555DDFC9
+              639B1A8859BA53551F08D7EDA67BFBFA73C60D2F7AE33142B5BB48BAEAC676C3
+              E9AEEE8EC6976F3ED4E929CE4CC497E63A67F24464A952B5A785273F69A42FAE
+              3B81DB4D7F634FEB6B8FA37DE73AE39CAA5CC33D840E7E89FBCA1B4E89237163
+              24662DD9F45D47767BC8646EAE07D7386BDFA16AE808B37A73036FED6B134B75
+              83AADE69FA8FF6B4BC52C940C8BD302080150A10DCFF4F9C45733B6DDE8CD701
+              F7BE96E0756FEF6B3322A64561BA0B8F63EC1D8783FE10CF6D6BE2A9EA6383A7
+              75B5A26BC2F5BBCDD6D71E1F150E2ED4C0B427905A5E49CA823B119B7D36F034
+              22CB6D82CCCBF7B2D097CCECEC240AD39C9CDDC06CE808537322C8B6A3010EF9
+              C3A2AA41E0AFC0EF2D33EAEFACAEA267FB7AB0464EF3C60638A084AC4B49BD65
+              25EE2BCA1091CB80FB818AFE028751BFB9AA46811DC006E06D8DC73A7ABFF988
+              914EEB45010ECA9EE9C333F707B867959130C5872019C0959CE95127A2F4026D
+              F4F7A8F72B1AEE6BAE25B4FF337A6BB610EFF68F67C9F1010E95E1491FBDCB0F
+              58C1335DFEA117EFFF9DFE0BE66A857FF45ED0B20000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'button-arrow-right'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              610000000473424954080808087C086488000002B749444154388D75935F4893
+              5118C67FE7FB3637B7B939742E9A8885ACC2CCCC05DE2CA88B8824A8A0188656
+              D0657411D5654404594137DD447423658D5D04156154125690C66A999534504C
+              0DB4A6AE3937FF7CDF77BA985AFEE9B93CE73CBF87F73CBC82793902FB70EF3D
+              A9AA366708C4112080C08D640288826C3566A7C3C9E7B7F4D49B304809800070
+              D79FC2156CF003E1BA326775638D8780AF0077BE8989AC46F4C7247762BFE81C
+              4C7503A174AC2D9E885CCC411CDBF7517EA5D35F71AD6BB43536A26B9AA6AF26
+              4DD3F4D6D8885E71AD6BB4BCB9D3EFDA751C00D57BE286AA98ADCF2EED2E5F1F
+              DAE24108B130159F47A6E81A9A6483C7861082CD5E3B2576B3ADBD2F19B49655
+              DD4EBF7F2215D5E60AD59539AB0F5715B35C56B34273C7300FBF8E2D9E1DAE2A
+              A6AECC592DCC9690BD762F0AD0D058B33479411545F9B41CF273F5D5308F7A73
+              1021048D351E8006EBBA1A142010F015AC302F8734770CF3781E12F0158020A0
+              DA0B312184DB9D6F0260D3F5F762CE90FF859D6B1B90B53E075E471E20DC0026
+              A44C4E64B5A262BB99DED3B5ABBAFBC6B33445E29C0D96B2D669213135075226
+              91120588467FA4FF9BDA3F3ECDD1489C33411FFB2B8B00987F1F356632285272
+              EF6EEC2752AE0CEF1F9FA629F28DD3411F072A732D4929B91BFB89847BD3031F
+              51E45C36FC7630D51DE949AC00646675CEEC28E560E5DF8A233D09DE0EA6BA31
+              F4F0D487A7A8529B35F2FD752F3B067E874AEC665B65896DB1D212471E1B3DB6
+              C5E4484F82F32FBE270C497DEAF5FD5F994FCF516786BE602A2A1D33792B1EB5
+              F72583EF86D36BEC790A8556131693C27846E3D5C06F2EB40FD1F261B4DB90D4
+              67E29DF1B10797C13072CB845070ED3C8A6BE73155315B42C02ADB48AB34F470
+              EA4D589F787613B4B99CF5DF99559717C7B63D58CAB7A23A0AE7AF254636CDCC
+              F74FA4634FD112434BFEE90F5397325BF06E71FD0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000140000001408060000008D891D
+              0D0000000473424954080808087C086488000003A449444154388D8D945D4C9B
+              5518C77FCFDBB7AC1F96F2D10233B02AF4057417E2B4A2926836C445A6662171
+              5E1884254BBCDACDA2993746850B36E350173526CBE6E2E788219B1AC7CC9608
+              BA652CB24D0228E870227582500A5B8116DAF778C187D4C2F47FF99CFC7FE739
+              CF39E72F2C49B3E07EB816F7969D8835AD54907AA012C1001C28C2402F705229
+              75D48C4642E153EF10B9708295120049B39353FF3AF6C24D6E906644EACAF29C
+              52E9CFC0F0D8705A2D8467E3F48C4ED336102638159B061A403547BACF98E32D
+              AF809958046A1672771DC45E748F0FC5D745D976A3B1CA4779818BD5943015AD
+              BDE3347504B91E8D7F093C1DB9DC161B6F7915008B7B731DAEC0936EA0E3415F
+              BAF1D18E126ECFB2AD0A03D044D898EBE4512393338393259158C2485B6FB4CE
+              8786991F1944736FDE098AE6A22CBBF1DE763FCE344B0AE4F42F61F6750CA394
+              524BB5C22C1B876B0C6C566D07509BF9D86ED02C68A2A79588C8B38D55BE5561
+              00E9369D8F2F8FD1D41E9495D012AF83E7EE5B0FD06049CFD6EDA5156822527F
+              579E535B6B6600E5052E0ED5F8F9B47B8CA68E6468DDA61CD6E9DA06411EB1FB
+              03684065A53F634DD892EEDF90CEA11A3F9FFC30C6BE1550B74D2790EF02A8B4
+              E6F8D01129363C0B97108925E8FB6B664DA888B02B90CBDBE7FF1411D8FB50BE
+              1211313C36CE0E5D37D07474C0E1B42ECCEE4A6896675A06E43FDB05DEBF38CA
+              F63BB3A5D4EB60C1AF1C02E828150ECFC63D0065B7DEC295E7EF5537031DFE7E
+              84D7BE0BF2C6B6424ABD0E00C2B371504C2AA5D080DEDED1E9FFD31447BAFE81
+              5597642DD717FD3D980934E064DB40988479D3C638D235C2FE6F83345727C386
+              C2517A466604689B1B1D44534A1D1D9E8A4DB7F68DAF093BD63DC6FE8E2007AA
+              0BD9569A95B476F0FC354CA53A95525DB33F9D4333A337424043537B90AB13D1
+              5581E5052EDE7AA288C7FF05FBAA7F82CF7F9C48007BE64341A2BF5EC262466F
+              E0B8A3A2331657779F1E9C2CA9F0A5E3715A938C99761D7FB63D05F642DB55E2
+              4AED05F5D9D8B197898786B1CCFDD18FEEBD4DA5E5151D8FC412466B5F6863C2
+              8452AF1D9BAEA574FB5B384AE337BFF3E6B96B89B8A95E049A27DB3F2472E138
+              B0988768163C4FBD84B36C2B22520B34AED3B58240BE2B250F7B4766C454AA13
+              D8A3A073AAFD03264FBDBBBC61D22376966D25A37A37BA2B5B17912A600B508C
+              2C27760F0B897D713E1464E28B03447FEE4C3A41EAAFD0ADD88B1FC0EE0F60F5
+              FAC0624110140A353FC7FCD810B3FD67890E5E0265A6D8FF06E85F78A3E3CD33
+              C90000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F80000000473424954080808087C086488000004E049444154488995954B4C54
+              6718869FEF9C99016450065011671001AD685D68B092CAA2AD57A25865D19569
+              52EBB5B65DB431EDA62E4CAC6D5DD4DEEFEDC6269A4A22D1C6B4266AE235B5D4
+              D60B6205AA34A803E23817CECC3067E6EB0206010793BEABF7E4FDF3FEDFF7FE
+              DFFF1F6118246B1CF9CBB69057D38018668E88AC06EA816A042FE0020228ADC0
+              4955DD0F5C4B46EE73FFC85EACBF8E311A9226CE49654C7AF1039C853E139197
+              811D225232D9EDD479256EBC135CB84C8340D4A6B5C7E2CA5D4BFA93A9247018
+              D8AEAAED7D7FFEC2BD83BB209918B98173D2748A377D8AE12EF408FC082CAF29
+              1DCFB69A292CF4E5A9213C827B962D072EF5F0ED85BB84E3C908B001F8C9BA76
+              9AEE7D6F43D206C094AC5C8A377F86E929F688703CDB61D4EE5C3A8D779EF351
+              9A9F8D00320886F15C97C902AF5BD7CE2992AB7ECBD515EE6F006E3B26FA2E1A
+              59B9C4FE3E3FB041C1CAD718F7C4D3A60807B34DA3F6ABB5955A37D3A369C3B4
+              699A27158C61DF79590E5935AB8096EEA8DC0CC4EA043995E59B7D2BD6F61BC9
+              603746DEC20680975196EF585CAA8BA68D57001DC470FE7DB35F3634DE906822
+              39427399A27B57966B45618E03F84E90ECFC659B013030CC1C60474DE9785E98
+              5BC4E82886F3A2714ECE7586D872A85D62766A5464063B97942222E5886CCA9E
+              3E1F47A1174344EA45A4645BCD1486759E11ABAB0AF4BD15659CEF0CB1F5503B
+              315B47E80B7D79544F752BB0114324A7AA1603A89FEC76EA425F9E668A65345F
+              33BB5077AF28E36C6788579ADA2496480D6980AEAE2A00980D52E12AAEC000AA
+              E795B83124732C9978C39C22DE5F51C6995B21B636B549CCD621ADDA9B373818
+              549BB91E1C8878BD135C436D367785397D3324A4E352CDCC815913C771EA6648
+              B635B5E9E76B2AC976080FBDC40BE0005C2ED3201D457357443E3E7BFBB16731
+              0A7AAE33CC55BF25F34B7275D04B50750D6CA0FAE041D42E4AB7B8E9A9296C5C
+              503C740F5435230FC76D5E3A7883966E8B4FEA2B985F92AB2222016BE8997800
+              8A01B4B6F658FFA76242719BF58D03E61FD597B3B8327F48BBFED0AB15050338
+              79D96F49AF653F7E4607118E27D9D07883CB772D3E5A55CED24ACF08FD444710
+              C052D50B76D08FA1AA07FAED54F2C0A59E314733CD23FD29D637FECD65BFC5C7
+              F5E52CA9CC1F31DAA1B84D534B2F0CBCB0E1D83F17318016E0F03717FCF82389
+              C78EE9CEE39D72C56FB1775539CB660C543E7CDD67E7EE108825538AEE492562
+              44AF9FC74846EEA3B03D1CB7236FFCDC41DC4E8D19CF9BB553F9E2F90A96CFF0
+              3CA29DE808CA0FCD7E41F56BE062E48FA368BC0FD30EF590FBE4B3011169EF0A
+              F737B474476571453E4EF3D12371BB4CCA3CD919CD5F3FDC4E7F4A2F00EB527D
+              C144CFBEB7D0441C33E1EFC059E4C335A5A205E4CECD40BCEE58DB037366518E
+              7827648D19978848389E940FCFDC965D27FE9541F37AD554B067FF0E12B76F0C
+              440880E964D2BADDE454D522F00CF0AD88942F98EAD6FAAA02AABD79E95FA606
+              A2B6B4F6589CEC08D2D4D24B20964C0DC6B25D3565F536BE4BE4F72343DD3DCC
+              C174E0A97B95F18B5E00241B61B3201B81AA8C072258288715F6805E4CF505B9
+              777017D16BA7462D1B0557E95CF2EBB691336D2E18A6886A2522D58017C18512
+              005A81DF148DA4123122CD4709FEFA25292B94A18E31E028F49153B508D7E40A
+              4C77FE237AA2B78B78E715A2D7CFA1F1BEB16CF80F8BB956EF104DEA62000000
+              0049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000600494441545885CD975D4C5B
+              E71DC67FEF391C63F391810D8E633A02061292C06818C9CDB22615CBD4128842
+              AA6DD976D18B45D332455BA5691193566D4D566D2295AA456AD68B4855AAADD5
+              529A6440BB7E271155D229AC9450EA96180261603E6DC7101FC3B1FDEEC24043
+              83B1C96EF6DCF9BCCF39BFC7EFE7FF15A42835DB86D9558DA9A09C346B01424D
+              5B6A93B12811BF17C37B13BDBF9368603CD5CF2292192CE5DF62DDAE43985DD5
+              0542511B81DD4005E044908124048C029F0257405E080FDE18095E6B2174E33D
+              90F2C10268EB8BB13536612EAADA0E3C8DA061735E86B26BE33AB6D82D6CC836
+              61D11474238677661EF784CE874341FAA6F49894B20D3831E7BDD9357DFE4FCC
+              0FF7AE2D4066F53E6C8DC7CC8A96DEAC0871A4618B5539BCC3C1567B46B20EE3
+              B3891067AE8FD1E6F6C56252FE25168B1E0BFCF37438D8F1B7D402ACFBF68FC8
+              ADFB855308DA5D5673D5C9BA621EDE909514FC557DE29DE5D76FDE62C017EE96
+              92FA60C72BA3FE374FDDE753EFFD9159BD0FDB81634E21E8D8E3CA293FFBBD4D
+              14E698D70C0770649B78A2220FF7A4EE180A840FA61756B6C8A8313337D8BD72
+              80B4F5C5D89F3C6956D4B4F7F7B872CA5F3C508A59531E08BE2893AA50B7D9CA
+              A7E3A19CA140B836DD557D367CAB2B12F58F2D799608798D4DA85A7A7389D552
+              75AAC185A6265D2000DC0947566DD754C1A9061725564B95A2A8CDB6C62650BE
+              5CC20AC4979AB9A86ABB22C491E6BA22324D6AC20FDE2BBF1EA1F64C0FED9FFB
+              56F5659A549AEB8A50843862CADFB83DAB66DF529B0A603B700CCD5AF0C2FEAD
+              B62D4F56AF4F090E60D1146C191ABF796B1097D54C599E25A1D7916D62D01F16
+              5F4CEAF634EB43E7663E7A1D0045C9CAC5ECAA760AC4FEC33B1C29C317F54445
+              1ECFEC2DE4576FDCE2ED3EFFAADEC33B1C0821F66BF622A7E6288907B094D420
+              14B5B12CDFACA4B2CE57D2F72BF3F95D6D214FBD31C0BB9EC421B6DA3328CB33
+              2B4288464BD9CE7800534139C09E5D1BBFF640F0451DAACAE7B78F7E9D5FB60D
+              F0417F20A16F81B367818B926675026CDB6A4F3C7EA9EAC70FDB69DAFD10475B
+              FBB93CB0728805CEB6B45C27006942D540E0DC906D5A6634A212BF6EAC39C463
+              9B72199B31F8F93FFA79F140298F142FEFD9058E53A469F100F1C722C3F2954D
+              C733ADD3F0F267A96D0609F454FB80BCF2D34AB2D3BF5CF7164D012196265BBC
+              454A3D1C892DDBF04B6D16AEFEEC1BAB9FA50974F6E3095EFAF738CFD7BB96C1
+              0174230652EA4B01642C0A30321A9CDF7CAF515305F6ACE5C3928AFEDA1587BF
+              B0BF84DDC5F74F6CEFCC3CC008712E4AC43F0AD0EB9ED0EF33AF55AF744FF0EC
+              E5614E3594F06849CE8A9E054EAFE11B8D0730BC1E802B1F0E05FF27F8DF6F4C
+              72E2FD61FE5CEFE23BA52BC3011638578C314F3C80DEDF09920B7D53A1987B22
+              F440F0969E297EFFDE6D9EAF77F1DDB2DC843EF74488BEA9500CB8A07B3AE301
+              A28171C2B77B46A4A4FDCCF5B1842F27D2F9DE299E7E7788E7EA8A796C536238
+              C099EB634849BBE1F38E2C96690A40F0EA3980E3AD6E5FACDB3B9B323CA04778
+              F6D230CD8F17B1AFDCBAAAB7DB3B4BABDB17038E07AF9D5B7AAE0218138358B6
+              3D32A66659F33BFF7377E7C10A1B2635793162D6147E50994F559292EDEE7C94
+              9FBCEEC1A71BA72381F197A65F3BCEE22A5838F825F3A37D64D6D45F0A84A3F5
+              9F4FEA8EC7375B5195E4FB50B2AAC9884A8EB6F6F3F1E86CB7441E9A3AF74CC4
+              181F586A5FAA3CA2C149E4FC5CC45CB6B36D303077B0773C94535B9A93524F24
+              D2DDF928475BFBB934101894C8BD773A5EF5CF5E7D6D996759E93377BB07C59C
+              39935E58D1321898AB7DC71370543A327064AF7D43FAC43BCBE1F39EC57FBEF7
+              6ED7DBA3BE8B2781E59BEB7DB557F8E6BF905163C6ECAA7ED91F8EE6B4F44C7F
+              73D01F168539E9E4676A49C1EE89107FBC3CCC1F3E188EF942C66989FCE19D8E
+              57FDBE8BCD2BDE92120E727AF1766C079B30E56F5CD3CDE88BA9500C491B7022
+              7267BC6BFAE273E8EE8E8481579F658A4A564D3DEB761D42B3171708487A3794
+              7021E21B19095E6B61F6A3F348636E5544CAC7ADB6A10C4B69CDC2EDD88950B4
+              F8DB1290510CDF28C69807DDD3B9EA5DF0FF4EFF05ED495D6D1F8EC2EE000000
+              0049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000280000002808060000008CFEB8
+              6D0000000473424954080808087C0864880000084D494441545885DD986D7054
+              E515C77FE766B3BBD96C96BC1003211042121AE4C50145406CA0568B56898CDA
+              D6B10A55C7612A9DA1E3873A633BD569A75A5BA7B62AB46AC6D7A1A3A04311B0
+              D4C66A412560834E021A420C06F242B2C96E92CDBEDEDD7BFA21E12524904D42
+              BFF4FFE1CE9D3BCF79CE6F9EE79EE73CE708E39191827D5A198E8239D8720A30
+              D232001040197858A11ECCEE16A2270E63B61F1B979BD373262DE7ECA5B8AFFC
+              2EAEB26B11872B47A01C5800940099084E9420E0051A801A854FAC705F2474F8
+              030207DF2176F2C8A50774CE5E42D68D1BB04F2D7588C85DC03A11B916300C81
+              691EBB663A6D386C0621D3C21B34F1064D0150D530B00B784955FF11693A847F
+              CFE6A4412F0A68B826917DFB23A45FBEC210613DF07311C92FCE76EAEA39D95C
+              53E861EE652E1C3663986D5F34CEA1D6207B8FF7B2FBA88FEE505C54F533E061
+              55ADEA3BB09D9E779F4563E1F101DAF3CBC85DFB24B6CCBC52812D2272D5D2E9
+              19FA93655359323D0391E4FF0E33A1ECFCB29B4DD5ED34F74451D5BFAAEA83B1
+              8EA680F7B58789FB5AC606E898B980BC7BFF8861775520BC9EE34A753F76FD0C
+              6E9A9D3526B0F3158B5B3C7FF014CF55B7114F68A32AAB13FDDD0D1D2F3C88E9
+              6D4E0ED09E5FC694F59B311CAEB508950BA7BA539EAB28664A867DDC60E7ABA6
+              B59F0D3B1AF106CD2E6055BCAFFBF3F64DF793E83D757140C33589A91B5F23D5
+              935781C85BDF2CF2A46CBEB518576ACA25833BAD667F84B5DB1A68E98D76A872
+              6DB4FD68D3A9CD0F403C3664DC10CF3977FE0AE7F4B9B345F8FBC27CB7B3F2F6
+              D2FF091C40669A8D154593D87DD4EF8EC4AD95291939AF1A76573CD2503D3260
+              DAECA564AD5A6F08F26E8E2B75E6EBDFFF065969A96376DC1188916E375492F8
+              59B3D26C94E5A6B1F34BDF14C0E59856F65EE8C8875841FF70C0DC1F3E8E2D63
+              F27A1179E0C99B66B230DF3D66B8F6BE18AB5FFF027F382ECB0B3D4941166639
+              E90E99D49E0A2E16C3F85B8A677267A8B66A28A0B3742993CAEF7288C8DBCB66
+              78DC3F2B2F1857B4BAED86B6074C79B9A6534C4B5936232329C845F96EDEACEB
+              3222712B2F35B7706BB0B60A2BD47B1670D2F5F7E3C82F5D2B2277FFF6C6994C
+              CF748E190E404464459147BB43715EAEE9144B61D90CCFA8764E9B41C4B438D8
+              122853952D5638E08F36D5006060A4903E7705C03DC5D94E5D323D635C70E742
+              3E76FD0CFDC182C9BAA9BA5D9EF9A42D29BB3BAFC8C5101111EE4E5F70DD99EF
+              867D5A19E248CB1691F25BCAB22774109F9954447E7D4321DF9B37599FF9A44D
+              36ED1F1D32CF6DE7EA820C8035A9B98518EEEC81B91C057310A41C3096178EBE
+              1D6380E437AB0AB96D6E8E3EFD719BFCE540FBA836CB0B3D20325F906C474119
+              00365B4E01C00243606E9EEB92019E867C62D54C4DA8F2D4BE564911D107AE9E
+              72C1F10BA6A6236028CCB7E54CFF37806DF0B25992EFB1EB48B792892AC510F9
+              DD8D456A59F0E4DE164931D0FBAE1A19726696E3F46BB191E61E000440C8CC72
+              DA4634AAF78638D2119A28A72C9B91C18193017DFCC3164911D17557E60D1B74
+              0E43960C6661DB604838ED1758BDF7BFEAE1E98FDA261E39E7E80F1FB7727359
+              3693D38766AA330CC299736E005909454C6BC4C9EE597819B7CEC9D18942F942
+              717EBCA391403441E56DA5C3E000C2A71906CA8601C041CF5E6FD01C71628FC3
+              86C731F2F6270D173675FDF6AFA52F92A0F2F65216178C7CD6769D65E8D281F2
+              0BC30AF6003474064D0944E3130219493DE138EBB63648734F84176E2BE16289
+              E02B5FE4F46B83151C487586D97D12A006E0505B7044C3F1AA371267DDB6069A
+              7C119E5F533A6ADA3BD4D68FA251A06E900B237AE208C07E550DEF3DDE7BC9E0
+              FA22717EB4AD8163DD61FEBCA684E533474F027B8FF78252AD683836C08561B6
+              1F2311EA0B03BB76D7FB8827261C0F04A209EE7DEB18F55D6136DF5A4279D1A4
+              516D8E7A43D47BC3026C8BB51EC38AF40F0002840E7F80AABEDC158ACB3BF5DD
+              1382EB8F26B8EFAD06BEE80CB1A9A29895B346870378A9A6034583AAFA46E8F0
+              BFCE7C370002FFD905C21E55FD6CD3FE7662F1918F9CD1148C25B8FFED63D475
+              8478A66216D715672665D7E48BB0E30B1F282FAA95F0F57FB6672860EC441D91
+              A643000F37F74479FED3E1D555328A5B8A85F2A75B66714349565236962A8F56
+              3563262C3FF044F0F33D247ACEFA3F73E5373B9B712FAE68024A6B5AFBE75F33
+              C3C354CFD84A4DA7CDE08E7993B574725AD299A7F2D30EDEA8ED1260A365463F
+              F26E79041DFCFF6070050162278FD077603B8A6E3013DAF8E08E469A7B2223CD
+              79511963B850FEB3D1CF53FB5A50D5AD8A56F6545592F00FDDBD2109B8E7DD67
+              314F7DD5A7AAABBD41B36BEDD6068EFBC60E998CAA1AFDFC746713714BAB55F5
+              BEF0B183F4EDDB326CDCD0A2371127D47080F42BBEDD6D385C557DD1C49A5D47
+              FDEEB2DC340AB3C657A79C2F4B95CA4F3BF8C57BCDC4125A0DDC627A9B039DAF
+              3C84C6862FC6B0AA5CC30142F51FE39AF7AD53624FDB1E895B2B777EE99BD21D
+              325994EFC639813B63932FCCC65D4DBC51DB2596EA3655BDC3F47E1DE8786103
+              8329777440002BD44BB0EE7D1CC58BFC291939AF02AEDA8EE0E2376BBB8C8869
+              5194EDC46D4FBEE350EF0DF1FBBD2DFCB2EA04CDFE881FD8A8E823E1C68366E7
+              2B0F5D100E466B60DA52C95CB58149D7DC81A4D8E6038F22B226459025D33358
+              5EE861FE94748AB21C9CDFC06CF285A9690DB2F7EB5E8E7AC3A2AA41E045E009
+              CB8C7AFD559504F66D01EBE2676E5211979A378BCCEFACC7757939225202DC03
+              540C14385C70CF55350AEC07B6016F6A22EEEBFF7C0F2345EB84004FCB965B88
+              7BD1CDB8E696937A592182E400F338DBA34E43E907BA18E851D7291A8EB53510
+              AAFB80FE9ADD24FABC63713936C07365B8B32FDCE507ACE0D92EFFB907EFFF9D
+              FE0B551D9782FD0EB5BD0000000049454E44AE426082}
+          end>
       end>
     Left = 272
     Top = 48
@@ -10534,6 +11028,16 @@ object CompileForm: TCompileForm
         CollectionIndex = 53
         CollectionName = 'debug-breakpoints-filled-eraser'
         Name = 'debug-breakpoints-filled-eraser'
+      end
+      item
+        CollectionIndex = 54
+        CollectionName = 'button-arrow-left'
+        Name = 'button-arrow-left'
+      end
+      item
+        CollectionIndex = 55
+        CollectionName = 'button-arrow-right'
+        Name = 'button-arrow-right'
       end>
     ImageCollection = LightToolBarImageCollection
     Left = 272
@@ -10811,6 +11315,16 @@ object CompileForm: TCompileForm
         CollectionIndex = 53
         CollectionName = 'debug-breakpoints-filled-eraser'
         Name = 'debug-breakpoints-filled-eraser'
+      end
+      item
+        CollectionIndex = 54
+        CollectionName = 'button-arrow-left'
+        Name = 'button-arrow-left'
+      end
+      item
+        CollectionIndex = 55
+        CollectionName = 'button-arrow-right'
+        Name = 'button-arrow-right'
       end>
     ImageCollection = LightToolBarImageCollection
     Left = 272
@@ -20042,6 +20556,473 @@ object CompileForm: TCompileForm
               21BB01488C494B455128DAB56E292E161E7AECB1FE07655387F5EA9007420000
               000049454E44AE426082}
           end>
+      end
+      item
+        Name = 'button-arrow-left'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              610000000473424954080808087C086488000002B749444154388D7593DF4F53
+              6718C73FEF79FB0B5AB1C7822B1918B44282D660802D217AE295D905899B0B92
+              46BDDB9DDB9566CBDCFE8625BBD0BB6D644B2435590CEAAEF4C2044C6A108D5D
+              E60D5246147FB0B56BEDE1D0F6C07BDE5DB4342AF2DC3EDFEFF7F93EDFF77905
+              8D0A5BA7888E7D2B6564670AC419605808616AAD8BC01CE82B5EAD927E3DF5A3
+              B26F4F80F6001000D1F18BB47DF2451F887424FF6420969B215CC8216B0E2A18
+              C6892528242C56DB7BB3A0534EE6FA7CE1E7AF417BC8B0358E39F64D9FD07AA6
+              EBD1D57D9D7F5E2364AF6028170118CA2564AF107D3A4BA0FA3A6EC70FA6FCDD
+              FD37B45285DAFC2C72F785DFA41108DDEA7A7475DFAEA54CDD1250EA1AC43324
+              FE6AB969B5A5B48CBF5A6E2D7726ADC0FEC19F9CBBBF6B4346A2A9487E61C05C
+              CA6CC641B17B8897873EC350EBBC5BE65286487E61C0F00753AD473EC7004EC7
+              72D36F4C1EE255F253F6DEBD4CC85ED9222080586E1AE074A8EF630C60385CC8
+              356DBF3CB43DB9F96275FCB0DC61E2430853BA0E6E4B94E5A1B368E9134F8E7F
+              FF5EA2501B24AF9FD7D275400813C087D6251508C70295121F3E9CE455F284DE
+              3B7389D0EA3FDB3A508130685D023080392796A807F46C8EF8E39BFC6D7D452D
+              B27B5B81067ECEAB381868260B090BDD689A4FEF137F7C93C5A35F528B746C21
+              6BA090B00026ABF3F7313C772DBDDADE9B2DF68C34419B22CA17DA2250EC1961
+              B5BD37AB3D9576EE4D21F5BAEBB524AD3B76FC40CA5F2DB7864ACBF5A329BF68
+              1ED1E6E462CF08CF0F8FE71162D4BEF5CBBF95D93F90EE62165FC79E82BFBBFF
+              46B93369AD75EC8F1B1B357CAE8350EBA86004FB837E5E1C3E453E712C8B10A3
+              95BFA6E7FFFBF53BF054E37E8441DBE839DA46CF4923104C01EFF98D5CD19E4A
+              DBB72754E9DA0FB0E1D6A96FEE277775121E3949B0EF23E40EB3D1D6786B36B5
+              8507389929365696DECAE47F09E52171DCADA2C70000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000140000001408060000008D891D
+              0D0000000473424954080808087C0864880000039249444154388D8D945D4C5B
+              6518C77FCF7BFA71FA6129836EE3AB43960E361524710321C64C345167B22CEA
+              BC71937803668989E3C25D1ABC7309377A31C32E1613E357F0232E232646834C
+              01A3216CF50223DA1A665D37565A28DDA13D7DBD286320DDF47FFDBEBFF3BCBF
+              E7E42FDC8A32083CD547E0991388D3DD2222BD400F424410AFD63A0544810B5A
+              EB73C595CC427AE434CB631FB03102206E2FA15787315B3A2A40861079C97B23
+              26814414339340152C0A2E1FB9CA30E9BA0759F56ECB0283A087B23F9E2F2E0C
+              0F40D15E032A83ED03EF61B674EE02BE32979391DAE98FF05FFF8D72D122A4C2
+              1D245A8F603BCC2F8117B2139F5B0B6707003002875EC1FFC8D10A60CC7FEDD7
+              C8BDE3EF6066AF9585DD7A92273D4FC55F332CD5B636DB4E33E26A6819C927E3
+              E4E767518143270086CCE5AB915D1367316C6BFDB26DB8F8F3402F96AF7A0BD8
+              BD7C8DC61FCEA08AF9A3C0B1E0F3A7401928E574378B70BC76FAE32DB058773F
+              B98A7A949D2F3BAD9949109AFD1A60D0A80839CCB68328447A3D37E26AA333DB
+              7011EBEAA76006681A7F1BE7CDF41D1554CF8DA18A85B0883CEED9D78D027A02
+              89E85698A782A6EFEE0E0330F2397CD7E7007A9C3B77E300F69899040045C345
+              BCAB8F5C6598BAE90FB1FC212C7FA82C48B4C6B73057F29949B0B4A3398261E0
+              40C4AB0A2577A9F001B2A18800CCEF3F7ED7C9C4CE73FF17031A4095DC7B011C
+              689D2AB84A6BDCF6C7456DDDB39D54E3C3347E7F667D82FF8AEDF2012C022820
+              9AAB6C287D15A4E6D2A7BA323641ACBB9F6CD5EEFF05CC05C3A0B9AC6D1B055C
+              48D7B5A345FE059D24D6DD47B6AAE9AE30CB574DAE322CC068FECA2C4A6B7D6E
+              D5BB2D9B0A77DCF6035273694457C6A74AFF62B0FE8EC0E4DE27D130A9B5FE29
+              37F32DAAB89259000613AD47366D54406A6646F48EE879DC4BC9B2B0C5BA7616
+              1BF6DBC0C97C328E353B85A1573278DA0E4E6AE56C5FAA6D6DF627677158CBEB
+              506F2A8E68BB2C6CFEA117D1A25ED7E84F6E0CBF46E16A0C63351EC5B1B349BB
+              EA9B3FB39D6624D5D8719F1685277D05552C947596687B96E4BEA76D2DEA145A
+              0F6546DF25BBD68BA54D2883AA97DFC2DB7918113906BCA98A8506DFF539DC99
+              04CAB6B0D7FA30170C8B8649E0A4D64C6646CF901E39BD51D5ED783B0F137CEE
+              144630E410912780C7803D88782935F6654A8DFD733E1967F1FD37B8F9CBF8A6
+              176C0202E070E179E051DC7BBB70D5EC06C3583BA6D1AB16F9BF7F2737F30DD6
+              ECD47A4B6FCC3F6594745664DC42F60000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F80000000473424954080808087C086488000004E24944415448898D964B6C54
+              6514C77FE7BBD3E96D67CAB4C5BE5B3A96A6C84334B4081A25054D90454D44DC
+              90AAD12A46E342231A74E1CA9D71E9ABC4A009262A2A9AEA0213151FB5918A05
+              E451532A582AE531D3E9639C99CECCBDC74567DA990A8DFFD5B9F77EF99FEFFC
+              EE39DFBD428EC4F611B8FF79FCED3B11CB532422F7011D409B88D42B78412328
+              83C061453F4439E34C8598F8F0556247BE02943CCF6CE0A96DA6E299B729A80C
+              5A887401AF08D47A12935A1C3E8737368EB8291CAF9F44A08E786983B8C67280
+              1ED01754198EFDF205E17D2F413A999FC053DB4CD5EEFD58818A32E00360AB3F
+              3444E5E0D7F842438AEBB250697B8944827770B5650B8EC78E028F2B7A2071FC
+              5BAEBEF1343869002CB1FD54BDF8019EA57565C0B7C64DDD5977EC0035273EA3
+              301606552423602EB69C24C5A1B35A36D22F89B265DEA4AF7CBB20170BAA6F1C
+              10DB4FE2E40FB3094A1FDC43F1CDED16F08971537736F6EDD5C0E880660DB3A6
+              2A46B3C9722BB19C19098C1E2511689099928A6D203F7A9B6EF92B71AA172732
+              862969DF09D0056CAD3DFEA9FA2F0F2A8066043055BD9AB39B774BBA28209AA3
+              EC3A7152DAD0FF9EDA53973DC0BB60ECC0FDCF0160B03C45C02BFED01065E7FB
+              588862BA668D8C6CE842DC34C649A9E428779D4925A83DF631024D22BACB5EB1
+              11AB328811910E81DACAC1AFC9AB3DB3F3910D8F614F8E12EC7D0B938CFDE765
+              E7CA173A4B717858419EC01829BA750B06E8F02426D5171ACA2B7DAA6A55C6FC
+              2237F6BEA5563296872E17513646554B2F1C055825B0DC5BD78201DA8AC3E7C0
+              75E7B154AF92918D5DD8931709F6BEA9562AFE1F240BAFB3B12F349C2DA8CD94
+              94E341A4DE1B1B9FC752B592918D5DA8B1281E3F4FB8B93D97DC428AB3C6AE43
+              C5E02100E6BC847A000FE0157776281474BCE92E714D0100A1E59B16659E9571
+              52540C1E9AEDA8592F01BC99043AE1787D3764EECAB223FB387FFB2EFEB9A199
+              FAA3FB291DF9756E2654356F3E72AF358328E5F5651F4F001894C144A0366F37
+              C1BEBDEA0B0D33DADAC94443DB422C8B6ACE6BF640C40087E3A5CB246D2F999F
+              DCF40C8D7DDDF842C38CB6753251BFEE7F2798AE5E0D1043B5DF191FC3A8EA47
+              AEB19C48F0F6BC9633E9196DECEB565F68980B6D0FCD2559AC4D1D8FCD44C37A
+              801E85E9993F7EC100A7819EAB2D77932E2ACD6B39CB494A635FB7FAC27F32DA
+              DAC94C49952CD6A6576EDA4ABAD0E7AAEA6B6E2A41FCF71F30CE5408E005C763
+              472FAC7F18D778F24A36195CF547F75318BD92FF35C94553B34642CD9B05D56E
+              6020F6F3413411C5722297286ABD372222C3495FF9F644A05E965C3A8564CE73
+              0071D3D85363D7E75EB346466E7B1435563F68A71B8DA4426F3C85A61258A9BF
+              8728A80A5250B7E2B4206333FECA6DD3B56B2D7BFA9278E3916B4E6B566E4191
+              5C5ED321636B1F1035563FAA1DAA3A19DEFB2CA90B6700B000E227BEA3B06125
+              05554DBF21FC942EF46F9A68DC501EAD6C41AD02314E0AE32411205DE897D8D2
+              26C2CB37F177EB4EA2952B5CE01D543B557572FCFD97891DF972BEFAB9C8F250
+              BA630F25F73C0222B6C093883C01ACBC26172186D2A3AAAF01036E34C2F8BE3D
+              C48F7FB360D9027997AF23B0E345ECE67588B144A159A06DF66C112FAA116050
+              E10868549371A2BD9F3375F075DC7F26AEB18FEBC85319C4BE650BDEFA164C49
+              399259AA99DF92F49511668607489CFC1E8D47AF67C3BFA92D5BA58188768D00
+              00000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000005D6494441545885CD97DB535B
+              D71587BF7D74241D4057040A0804243141C517CC9818123CD38C6F4F49A6A6EE
+              6D2671EDB82F3CF4ADED4C67DCB463BBD3A9FF00F72175282E79C978EA76EC3E
+              B4A969987A9C60E310E2D8AE2F498C40928D012184856EE7EC3E4838868010F8
+              A5BF271DEDBDD6F79BADB575D6121429C5E9450BB463A9DF845AE147A82A2000
+              89340CB20FC7C88CDF2279F312FA74B8D8B488D536682D3B71EC3E8435D05E23
+              14D33EE0DBC02684F00928959040CA30F03930009C4DDD190AC5FBFB485CF93B
+              48637D06545F23E5078EA335B6B502BF02F19A361B56EC13FF458B853027A228
+              7A1AC3642153EA26E9AC21EE0D9074561B48CE01C7D2633787A74F1F21FDE5A7
+              6B3350F67217EE378F698A453B2190DDAEB1AB4AC59D7E4A62A1D50E8C79670D
+              938D3B99F16F3324E20FD2D07F3173E64432FE8F3F1667C0BEF730EEEFFFD287
+              10E7AD73132DFEA13E4AA3A3AB82972AE1AE67ACED0D5236EF0852BE3AFBCF53
+              E199F77FF78D7DA6271F4A3BBBF0BC71D48710FF713CB81178F6E249AC89A935
+              C301CCC918EED1CBA45C3555299BB7CBBAA1F58C914DC7D377869637A0FA1AA9
+              FCE93B9A50D50B8E073702F51FBD836264D7055F9022759CE3C324DD75AE94CD
+              BB4B0B74F4266F0F66F5A9AF7F4A65E143F981E32816EB09EBDC448B7FB007B1
+              4AF566CD25459910D2C03FD883756EA24528A6139E03BF0593BAD880D6B213AD
+              B1AD5520BBFD437D98F474C1A433B5ADDCDEFB36594B6951264C7A1AFF501F02
+              D96DAE7AAEB56CC7FEC506ECBB0F011C718D5D55562BB8999AAD8CB7BD49F5B5
+              B3A8E9445106004AA3A3B8C6AE2AC0913C2F67407178D002ED3E04AF57DCE92F
+              9824E6DBC278DB017CC3EFE30E5E2E1ABEA07CFED7CDBE0D3E736D53CE80F6AD
+              97118A699F168B2885EE79AC7A33632F1EA47AE40CE5A31FAF190E50120BA1CD
+              461401FBB4E61D390396FA4D00AFD8266EAD18385BB591B1ED07A9FEEC2F78EE
+              5D5A177C41F61CE7154BC3A69C01B5C20FB0B12436BE3CFC996682ED6F5175ED
+              AF78BEBAF85470002D360E426C542BEB005085AA82C0674E44BFB139EE0D10EC
+              388CE7EE00CEF00819CDB166A09A9A5B74A5731CE913F9ABA8E6FE8D45A9A267
+              1605EAAA4670FB41A4C92C269B7633D9B47BCD70800D177E2F9FACAD1C473CBE
+              BF2A4840CE1B26B3EDC940533649DD955E463B7E222BEE7E88E78B8175195053
+              738B9E0D931990F3C8FCBA340C90843225EEA6A5C1F60737A91B7C9760FB5B98
+              E7A378BE7CFA1AC894B8411292520740C93E1C03B89E74D52C1BE0B87F9DBACB
+              3D44367731F56CE7531BC873AEE7B92899F15B0003716F60C52047E473FC97FF
+              4464CB77996E78E9A90CE43903792E4AF2E62580B34967B531EFF4AD18E88C7C
+              86FF4A2FE1ADDF63BABE7D5DF079872FD731C1D93C17459F0E93FAE2931092F3
+              938DBB0A26708647A8BDF267C2AD3F205AF7E29A0D4CBEB00B24E7B393A1D042
+              9BA600C42F9C06383AE3DF6624DCF50593B842C3D40EF511D9D245D65CDCDB10
+              721DD28C7F9B011C8DF7F73EFEDE049009DFA5A475EF7D93B3B2F251C5F3DBDD
+              A38328F92A5D4EDA6C04F7571FA1668A7B1BEA260BF73ABBC95A6C27B3D3919E
+              E9533F073DFBB50190A4833728DBB1FFDFBAD5FE6ACA555BE51C1F462C5CD665
+              A4189915D79E94140AC18EC324CA1B46A4E48753A77E96CD866E3F5E7FDC92E9
+              D1FBC84C32AB35779E4BDBBC5D49779DCB1EBE56F02456936EB210EC38CCEC33
+              CDF724724FFC8377A373177A17ED59D494A6EF7E82A295C52DCFB79E49DBBCBB
+              E2355BAB4AA241CCC9D89AE109773DA39DDD3C2A6F189152EE497CFCB770B4EF
+              D7B0E4544D4B0393D72F22F54C5C6B6A3FAD5BEDAE6843C7B6B4AD52581E4D61
+              4EC55705CF3B6BB8BFF93B445ABA8CACC576524A7E34FB414F34DAF7F6B253D2
+              8A9391E585763C3F3E8EB9EAB9DC6424C46B5AAC88C9C8E133409E038E65A723
+              C3D3EFFD86E4A7FF5AD170E1D9D0A452D6B91FFB9E43587C1B6A10EC43AE3E1B
+              661E064373FD7DCC7DF81E329D2C885875385D90B9AE192DF0129686A5D33148
+              435F341D179A05FFEFF43F02A463493FD635AE0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000280000002808060000008CFEB8
+              6D0000000473424954080808087C0864880000083F494441545885DD987B6CD5
+              E519C73FCFEFFCCEA5E7D6FB85B6505AC0016DD16AC5AA489C1BF1124194C519
+              27CAD06936B798998C25DB12FF7233EE0FE7B2641A99894E714AD4B190808638
+              9D523152E926A3504BA12DD5D3734A4FDB73EBB9FD9EFD715AA5B4945EF86BDF
+              BFDEFC7EEFE593E77D9EF779DF47988F0C1B8EA58D386A1A31CB6B30DC7E0004
+              D0F12E56648874B08754773BE9BE8E792D3331E7ACE5AABF01CFF55BC8BBFC26
+              0C97A718580FAC0196231480B840632821A01368035AADF8E858FCF03EA21FBE
+              41AABBFDD203BA1A6EA060CB0EEC4B563905B9177800917502066A618F0FA999
+              8A23D93496E920E3F49371F905111412A8EE055E54D57792273E61F8CDDFCF1A
+              744640C35B48D103BF25AF698321228F00BF16914AE76840F3CFB4E10D9E206F
+              F80C86959932366BBA8817D712295FCD70F595645D3E51D523C02F55F540F4FD
+              5D0CEF7E0A4DC6E70768AFA9A7F4A7CF63162D5A01BC2A22CD9E50A79675ECC7
+              33D83527DF5031185EDC4C70E5CDA4BCA5A8EA2E55FD49BABF3312FAD3236443
+              7D7303742E6FA6F4E72F6238DD9B10F9AB998A7A2BDB7793DFDF3E37A73D4F96
+              612374D97709AEBC0515A30BD58DD9D150E7C0D33F2013E89E1DA0BDA69EF21D
+              AF61B83CF78BC8CEBCA1D3B69A437FC13E36B200B4C98A15D5D2DBF22069976F
+              10E5E6EC48B03DF0E416B267BF9CD2D73689D65348D98E5D98BEC24D22F28A77
+              E0B8ADB6F539CCF4CC7E32573912C3F8BFFC0F91456BDC597BDE66C3E97EDBB9
+              B2251C3BF82658D90B03163FFC0CCEDA2B2E13917DEEF069576DEB7318D9F425
+              859B90998EE31BF82F238BAFF25AA6E3465B7EC94B86CB9D193BFAE1A47EC644
+              C3D9B01E77D306438457CC54D45B73E8C559C3656D0EB276D79C219DD1108B3F
+              7D1981CB0579D277D3FD98952BA6072CDCF20B44E4611169AE6CDF3D6B9FB36C
+              767AAE7B8453D7FD1845F4E22326CB173C4E51F7478AC8CFC4663616DCF5F854
+              4067FD7AEC4B563981DF78429D9ADF3FBB43D432EC7AFADA878915D75172F27D
+              049D5790571CDB8B998AD98027F29A366056D44D06F45C7B0782DC2B2295651D
+              FB677594588649CFB53F9258E90AAA0FBF42C19923F36103C0964E507CF25F88
+              B0199565EE963BCE01346CB89B36006C758E06D433D8353BB8968788965D46F5
+              E157293CD3366FB809159D3A08AA22C27D9EE65BBF01742C6DC470798A44589F
+              7FA6EDA2D6B30C1BBD2D0F122D5F4955DB6B14F67DBA603800FBD8289E5017C0
+              6673D1320C7FC938604D03C07A10C31B3C31339CD8B4F79AED44CA5753F5D9DF
+              28EAFDE492C04DC81B3C81088D02458EA58D3940B37C29C01AD4226FF8CC0507
+              AB18DA77CD0F2552D12095475EA7A8E7D025850370877B003180467B8E0B63FC
+              B2B9DC1E1FD2E96E251370BD6BB7C9E8A246A96CDFADC5A75B2F391C80231ACA
+              3544961979B94BB099FB4081999A3E9DA918DA7BF5FD325A7585B8435D6A6453
+              8497AC5D308C6FE01866323AE99B2D159B58B5702218CC7164975C206B44CA56
+              CA68559300C44B974BBC74F982E100EA3E7846CF0734AC0906F93A2DE50055E3
+              96CD31ED44FE8163547CFEB6061AEF14CFE0175AF5D96B88CE39614C9139363A
+              E59B657332CE13637C8D710B12CAB8FC179CACB4EB7D1043030D774870D5AD5A
+              7DF8559D6FD6984919976FA239386102D38A0C0174665C7EC99A2EB565C6A687
+              FCE23D540C1DA8DF28A852DDB60B61E1963C57495FF944B3D38A867380E9600F
+              401B22C48B6BF10D5CF88958D67900C4D081FADB45D4CA6DF725048C15D5A2AA
+              4985CF33392ECCF1D7D5C7402252BECA35132040D98977513134B8FA36412DAD
+              3AF2BACA1C9FAF1752B47C3508875012C993B9DC6EA4FB3AB0E2A30955DD3B52
+              7D252AC645A681F2E3FB29EDD8AFE1DAEBE5CB2BEE1665E17B3DE65FC45841A5
+              A0EC4EF775A08908307EA336CB6A70D43444D5EEBACF110B913732F56D70BE3C
+              A14E55C3E4EC8A6F4BC6E1C137706C41960CD46F22915F1D57D587A2EFBD9C48
+              76E672BC01103DF8260AFB153D125C793396619B7132001191F2637BB5A4F380
+              0E2D5B2F5FADB96BDE964C7ACB082F690678012B3B146BDDF3F53F1B4076E82B
+              5C2BAFC12CAEEEB69CDEAD6265F10E9EBC3824883778422DD389653AF1078ECA
+              5C4DA840EFDA6DA43CA561D07B621FFF3D1E6F7D6B322040FAAB6E3C37DCDD0D
+              AC88972C6BF4063B7124866709795CFD81A3CC678B0757DC44B86E9D008F59A9
+              D447837F7EF46BFF8373DE24A9EE76221FEC42E15115A3ABB7E541929E92592D
+              2220F3811B5DD448A07E23AAFA862A3B47FEF12CD9B3FD93FA4C0AD991379E22
+              DDDF39AAAA1BD34EDFE0A9758F92F496CE75DD59C3F5AEDD868A714855B78F75
+              1C24F2CECE29FD264743364DE2E88778D6DE76D670790E64ED799B47165FE575
+              8DF4E38C0D5E123025B7ADFD4DF7A086ED10707B3AD01D19FCC3763495B80820
+              A0F11112FFFE2779CDB704C4E57E5B6D8E1B47963457649C3E3C43A7A6AD64CD
+              56496F19BD6BB711AE5B278AEC56D5EFA503DD91E0D3F7624587A61D33ED7962
+              45C3C40FEFC3F9AD96B0CD5FFA1222EE44E192ABC3B5D71996CD81331AC49649
+              CE1A2CE1AF64A07E23FD4DDF27E52909038FA9F2ABB18ED6F4E0B3DB19BF0F4C
+              AB991DDB7450B06507BEEF6C456C6623F084886C462DF184BEC01BECC41DEEC1
+              110D614BC530AC3496CD49C6E527E92B23565C47B47C1563F955A2AA31E005E0
+              77566A2C34B2E78F44DEDD39A5163337C071D92B57907FE7E3E4356D4084E588
+              6C45D924228D9C1768E74A2109FA31CA6EE075CD66866287F630B2676AB42E08
+              704266451D9EEBB7E0BE720366C532048A8106BEA951E781465106C9D5A83F57
+              48A4FB8E113FBC8FD8C1B7C88603735972FEB9D3F097E058DA885996ABF2E752
+              48AECEAF9AF3E34CB087E4C923930EDEFF3BFD0F99616A25F96B0BA300000000
+              49454E44AE426082}
+          end>
+      end
+      item
+        Name = 'button-arrow-right'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              610000000473424954080808087C0864880000029D49444154388D75934D4F13
+              5114869F3BD3D24A47ECD0A22582412B4DD0128CA009D1C6A50B4C5003A45177
+              EED095899FFF41E3C6A512179AEAC220BAD285099AD42026D4E0062936881FC4
+              8E2D0C433F60E6BAA036A2F02EEF3DCF79DF736EAEA0225FAC1F7FDF3555D5B6
+              C5419C05BA8410BA9432078C837CE0940A8985E1DBB6F97208A4038000F00F5C
+              A7EEF8F908888496FDD41148BFC667A4514B16B6C78715086384632C055B5320
+              E356F2E99471F7324807D5171B40EFBB121152BE6E9A78B4A7F1C313BCE63C8A
+              5D46008A5DC66BCEE39F1DA3A6B8103243FBE3EEE6B61169DB46696A0CC5DF77
+              5505123B271E07EB33C9B548152DFB9BC8371DAC46ADCF24D939F1380824EA4E
+              0CAAAA7F078AAAF9E35A76BA43CF24F9578ABDC2F7F693E49A3BAB677A268996
+              9DEE50DC9E78ED91D328C099407A749DF31F79CD7976BFB9C38F682FF9A6CE6A
+              92407A14E08C37721805E8F219E90DF0F54DBEB7F756C7A9D477A95B755C08A1
+              AB650B80C9DE5B42AAAE4D9BCD759E93B5C60CEEE20208A103B890326FD7F802
+              AED212D1A797E4466051DBCEE7D845429323D414F2AC7A3490320FA000E35620
+              BCA96BE90FFCF119FA9771002AF5E34EC14241F2D008C7D8C8BAA4353073F4C2
+              1A3CFB0E000918E118C0C3E2D43B14A7BC9C580AB6A6722DDDFF35B05DDE7530
+              40AEA59BA5606B4A3A76C27A3B8C2A57CACE9668EC9519DA177717176BBDF9B9
+              EA93BA8B8B6C59FC5675CEB574F3F5C04016217ACC17F77E16C69EA3966752B8
+              1A7619EEE6B691C5C6686CB9616F48592DE12A5B087B05DBA361EE68E3DB817E
+              B2E1632984E8294C8E4EFDBA7F031CBB622614EA7A06A9EB1954951A4F1CD8E0
+              37F2403A76C27C3964E79FDC84D5F21AFAF7CC6A7D23BEEE5378228750B7EA95
+              6B89B36C529A7E8F951C66753EB36E4FBF01CB6C1932BD448AD2000000004945
+              4E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000140000001408060000008D891D
+              0D0000000473424954080808087C0864880000039D49444154388D85945D4C9B
+              5518C77FE7BCA57DFB2194499581ED18A383CD029268209B53104DA633E0A2CE
+              1BA78B37C62C21715CC8A5C13B9770E5C526BB6024C6A8C18F68464CFC0859B2
+              B1318364F502377418E085D2525A3EEA4BFBF6785120347CF8BF3C1FBFF3FC9F
+              E7E42FD890D4287CF15D0A5F3E8F2870D40821CE01AD088202E1524AC5813070
+              4D29D5975D4DC6120317591EFA9CAD1200C2E1C2D7D18B5ED35804A20721DE76
+              2D3C108546183D6920332619BB9B54718044F913ACB9F6AD00DDA07A566EFF90
+              8DF57642D65A074A8D473AFBD16B9A0E003FEACB9160D9E81778A2F7D9494A08
+              E281468CBAD35836FD7BE08D959BDF9AB12B9D006885A7DEC373E24C1130E499
+              FF3378F0FA27E82BF33BC2362C39135314CD8CB15456576D15E841BBBF66201D
+              99243D358E2C3C751EA0475F9E0B1EB87905CD32B74112FB6B31426D28501B6B
+              8EE5792A6E5C4266D36780B3DED7BB406A4859E0A81682B7CA46BFDC1106A0A5
+              53C42A4F60D4BE22B642F5A4816FFC27806EADC867D3EB5B900871CEB9302977
+              EB1980277A9F8A1B975938789CD9503EB464620899CD048410CF3B8F1E4702AD
+              85467857583EF45362954F331B6ADF846AE914EEE804406B41E9216CC0613D69
+              0060D91CA4BCFE3DB00ADFBD9F89D49C1400A5E1EF9400E1481A2C3D5A1D44D3
+              B021844B6672BD331F2AE5EF673AC4FF960B44AB9AF1FE33229CC91964AEF72E
+              001B4AC533767709802B3E49EDD71D6A2FD07C550BB3A13602235771266772CE
+              EC6E804500098453C57BD9DC0A6B6636D4867FE42A45D3BF6FAEA7BC0150DC55
+              968504AE25CA1B50626FA7D1AA666643EDF847FAF16E8199EE1252C501010CA6
+              A7C7914AA9BE35D7BE9578A0715758ACE21846A81DFF9D7EBCD3A3797B912327
+              5130AC94BA931AFB15995D4DC6806EA3EE34A6C7B723D013BD47E0761FDEA97C
+              D86279038BFEA72CE0423A3289397E0B4DAD2671D6B70C2B59D0B0545657ED89
+              8C633397F32EDAD656D197E6B6C1A69E7C1325E4070AF5D542EFFB64E61EA0AD
+              4D86B195562AFB63D5DF58057A305ED1F8B8121267621A99CD6CABD6749760D4
+              BF4AE4E84B9612B20BA57A9283975959CFC5DC24A4C6C3EF7C8CABA91D21C459
+              E02399CDF8DDD1091C4903699958EB7998F206848261E082520C27072F9118B8
+              B8F960DE685D4DED785FEB42F3FA6C42881780E780C308E12297D877C925F66F
+              E9C8248B9F7DC8BF7F5CCF73B0FDAFD8EC386B9FC571E418F6FD8740D3D68F29
+              D49A497AF62F5263BF608EDFDA4CE9ADFA0F2F48731A2E2716D4000000004945
+              4E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F80000000473424954080808087C086488000004D04944415448898D965B6C14
+              7514C67F6766763AED6EBBDB62B7D0EE96526A014530025A95104413F4A12602
+              BE10A23180B7F8A0F112F4C127DF888F245E032662BCA3015F8857BC006DA480
+              20D55AA14528C86EB7B4C3EEB4BB33C707B6575BF17BFA92EFE43BFFF3FDCFFC
+              33C204881326FAC0B344566F444CAB5444EE075A81E5229250B04133289DC0B7
+              8ABE8F72CA1F4C31F0FE2B64DBBE0094499EA3C4AA6DA2FAA9D708C51B4C4436
+              032F0BD45ADE652D4B9FC6CEF623411EDF8EE045EBC8C5921218A60FEC057D5E
+              95EEECE1CF49EF7C110A23931B58B54DD43CF72E66B4BA12D80DAC8DA4BA8877
+              EE279CEA528280A92838159269B8834BCD6BF02DC705B628FA9177EC6B2EED78
+              12FC0200A638116A5ED88D35ABAE12F8DA08F22BEB8E7EC49CE39F52924D832A
+              520430C64D7F84B2D41F5AD9DB2E5E65BD3D12AE5A27C8F9D0EC791DE244F04E
+              1CB8DA20F6E036CA6E5A6D021F1B417EE5DC836F6AF4AF0E1D351C352D121003
+              41C734D31F96E85F3FE34593325C5E7D1FC8F776E3D21EEFE48FF8993E8CF2D5
+              1B0136036B6B8F7DA2918B9D0AA0454CE4A9A6D572E68EC72430439334F1F39A
+              6CDFA5CEE0450B781B0C27FAC0330018985629F07224D545E599834C8D6222B7
+              865DDCEA667A5AB68A5AF624CDC87BD41EFD108146117DD459D082196FC01091
+              5681DA78E7FEF1959A01B1DE764D1C790FB7FA7A7A5AB6A0A63D490FA7FEA02C
+              DDAD205B310C29BD790D06D06A7997359CEAD2E96299CA633D6DC5260BE869D9
+              2281311E17AA1A3BFB33C00D02F3EDBA660C607959FA3404C1B4B14CC72B7BDB
+              491CD98D1BBFDA44CDF1B8C2A9EED181961BE555588824EC6CFFD89857AAE6E1
+              D62C9C98D64C1C67F01CEEEC45D2D3B259E71E7A0B090A8C790909000BB02528
+              8C4EA8D9598D7271E1BDD7B88D0950D52BD5CDE46249294BFFA9452F01EC6203
+              1DF0EDF075A32356777DC575BF7F39F61DA8EAB4DCB71C4EAF7C022F9AA0BE6D
+              2765E93F5544246F87475B0F0018289D5EB4F6FF9FB8687EE6CEC7F1A209926D
+              BBA8E83B31A68D795D7D1031806F73B17A293815D7DAD249E6D9CA7A926DBB88
+              F6FD32491F9A7D234016D576BFBF0F43553F080CD3CF34DC3EE36A8EF22054CA
+              993B1F2717ABA7FEF04E2ACE1F9FB4DABEE530905C01B0576168F8B7C318C0AF
+              C0DE4BCD7753288DFDE79A9E5FBA5E72B17A92EDE3279F58F7F7C2B5144AC281
+              AA6E0FF21EB95F0E60F8832980E77DCB71CFAE7888C0B0668C67F6C97DD41F7A
+              8BE8F9E3FFD286E62C9654D35D82EA1B4047F6A73DA8E762FA990B942EBB3723
+              22DD23E1AA755E342115174E22C5F77C228C8247897B695AF3DE5B1F410DB31D
+              7453E066F2A91D4FA0790F337FAE8B504D03A1BA05BF0AD2371C89DF3754BBC4
+              74862E889DCBCC18978848102A958B8B5BA56FC97A51C36C47B555552FA7DF7C
+              9AFCD953009800B9E3DF50925C44A8A6F108C20F8592C8AA81B9B755B9F166D4
+              0C89E1E731FC1104289444243BAB91F4FC559C5BB61137BE20005E477593AA5E
+              EE7FE725B26DFBC6A61B5F4DD322B6611BE5F73C0C228EC063886C05164D7B21
+              421665AFAA6E073A023743FFCE6DE48E7D35A56C0AECF9B710DDF0024ED32D88
+              618A4293C0F2AB6F8BD8A866804E853650574772B83F7EC6E09E5709AE0C4C73
+              8E1960C51B7096AEC14E3463945721C5522DFE9614FEEE65B8BB03EFC47768CE
+              9DC9867F000F9E52E3CECDDE130000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000005CE494441545885CD97CB7353
+              D71DC73FE7EA7525EBE9576CC9B21CC041350FE3C1C14ECC4C181C582599E2D2
+              D74C42A1ACBCE8AE8FE90C4D3340A733FC017441A96BEA6C324C6907D2699BE2
+              8609033198380E01C2A30D962D098C6D599691AFF5B8A70BC924025B969D4DBF
+              2BDDFBFBEA7CBE3A3AF79EF3139428C5558D1A6CC31CD888B1D28F301A010148
+              A4AE9379344A7AEC36DAAD4B64A722A50E8B58CEA036EFC4F9EA012CC1369F50
+              0C7B8057808D08E11560939044CA08F039700138337F77309CE8EF2379F57D90
+              FAEA0218BD8D94EF3B8ADAD8DA02FC0AC4EBEA4C44718C7F811A0F634AC650B2
+              29748399B4CD83E6F291A80EA2B96A7524678123A9D15B4353A70E91FAEFA72B
+              0B50F672179EB78EA88A593D2690DDEED16B4AE5DD7EACF1F07213C69CCBC744
+              E34EA6FD5B7589F89DD4B33F9F3E7D4C4BFCE3F7A50570EC3E88E77BBFF422C4
+              39CBEC78B37FB00F5B6C6459F0D34A7A028CB6BEC9BCBD7A18295F9BF9E7C9C8
+              F47BBF7DC667F8FA85ADA38B8A370F7B11E223E7C39BC1E72F1EC7929C5C311C
+              C0A4C5F18C5C61DEEDAB99B7577759D6B59CD633A944EAEEE0E2018CDE46AA7E
+              72421546E379E7C39BC1C0E513287A6655F00529328B6B6C08CD53EF9EB75777
+              AAC1F65EEDCE40263BF9D55FA92C7C28DF7714C56C3966991D6FF60FF4209659
+              BD0BCA98AC45EB42EAF8077AB0CC8E370BC570AC62DF6FC0602C0CA036EF446D
+              6C6D11C86EFF601F866CAA34B8D9C69DDD6F335DD752D467C8A6F00FF62190DD
+              A69A352D65DBF7160670BC7A00E0907BF49AB29205674C25A9BD7E86B1D6B798
+              F66D29EAB5C546708F5E538043795E2E80E2AC400DB67911BC5179B7BF64F882
+              3CA12B7887DE63AC751F71EFE6A2DEFCF86F98BCEBBCA6BAF5B900EAB75E4628
+              863D6A3CAA94F29C2FA6F2918FA91D3ECDE88BFB89D76E5AD2678D875167A28A
+              803D6AD3F65C00736023C00EFBF8ED55C1175471FF12B59FFD99D16DFB99A9D9
+              B0A4CF91E3EC30376CCC053056FA013658E363DF280040C59717A9B9FE17426D
+              3F66E6B9A6453D6A7C0C84D860ACAA07C0288C4610784DC95881510A858CC5BE
+              E210AEC83069AB8750FB4102974FE018FFA2A09EE348AFC83F8AC6DCDB58D894
+              6CBAC0A8396BB9D7F98B6577CB620A6DDB2F837F7F0743467B722FC711B6856B
+              234840CEE90653C1CF5567A204FF7648AE063CB9F61526D6EDA0FE6A6F011C40
+              37980039477E64A3D4759084D356CFFAAF1B85D43169332B87AFD99E830F9CC4
+              F1F0D633F5B4D50392B094590094CCA351801B9ADBB762D833F0E73B886EEAA2
+              FE4A0FCE073717F5E43937F25C94F4D86D800B89EAE037824F35BC4474F377F0
+              5FF923CEE8E74BFAF29C0B792E8A76EB12C019CD55ABCFB9BCAB8307DA886CF9
+              2EFEABBDB8A29F2DE99B737A7327263893E7A264A722CCFFE793309273138D9D
+              2B86C7EA5F24D2F27DEAAEFE095764B8A877E2854E909CCB4C84C30BC7340520
+              71FE14C0E169FF563DE909940CCF986C4437775137D8873B3C54D49BF40498F6
+              6FD581C389FEDE27F70D00E9C83DAC2DBB1F185C55558F2BD76EF38C0CA0E457
+              6931297A1ACF9797B14D878AFAB20633F73BBAC998EDC73353D19EA9933F836C
+              E6AB002049856E52B67DEFBFB316C76BF3EEBA1AD7D81082E55F038A9E2E5A97
+              4221D47E906479C3B094FC60F2E44F3399F09D27F52747B26CEC0132AD65D4A6
+              8EB3297B7597E6A9773B22D74B9A89A594359809B51F64E6B9A6FB12B92BF1C1
+              1F62B3E77B0B3C0587D2D4BD4F50D4B284796DCBE994BDBA33E1DB52638D8530
+              69F115C3939E00231DDD3C2E6F189652EE4A7EFCD748ACEFD7F0D4AC1A9EFEA2
+              76E322329B4EA8EBDB4E652D0E77ACA17D6BCA5E25CC8F2731CD279605CFB97C
+              3CD8F46DA2CD5D7AC66C3F2E253F9CF9A02716EB7B7BD12E69C9CDC6FC421B15
+              3F3A8AA9664DAE3312E275355E4267E4F4EA20CF02473253D1A1A977DF41FBF4
+              5F4B062EBEDB198C9475ECC5B1EB0066EF3A1F823DC8E57BC3F4A35078B6BF8F
+              D90FDF45A6B4A28892B75B537D136AF025CC0D4F77C720F56C41775CAC17FCBF
+              D3FF000C42605CD2B9C9BB0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000280000002808060000008CFEB8
+              6D0000000473424954080808087C08648800000835494441545885DD985B7095
+              D515C77FEB3BDFB95F724F20E60A048110358A0E2A322D4AA5161487DEC67A1B
+              AD752C9D3AED03CEB49DF1C9EAD887D68E33D5825A5BA12A632D1D5BB4E3B45E
+              0A449B485A2F911812028926E71C727239F7CBB7FA908BC4847042F2D4FFD39E
+              BDD75ADF6FF6B7F75A7B6FE17C64D870D435E1A86DC2ACA8C5F004001040274C
+              ACB12132C15ED2DDED644E759CD7672663E62D57E33578AFDE81FBE24D182E6F
+              09B011B80858815008E2028DA184804EA00D386CC54793F1D68344DF7E917477
+              FBE203BAD65E43E18E5DD86B563B05B905B803910D02066A618F0FA9998E23B9
+              0C96E920EB0C90750504111412A8BE023CADAAAFA58EBDC3F04BBFC81B744E40
+              C35744F11D3FC7DDBCD910917B819F8A48A57374400BFADAF0058FE11EEEC3B0
+              B2337C73A68B78493D63156B18AEBA949CCB2FAA7A147840555F8FBEB18FE1FD
+              8FA0A9F8F901DA6B1B29FBC19398C54B1B80BD22B2CE1BEAD4F28E57F186BBE6
+              B536540C86ABD7115C753D695F19AABA4F55BF9FE9EF1C0B3D7E2FB9D0A9F901
+              3A57ACA3EC474F63383D3722F207331DF555B6EFA7A0BF7D7E8BF60BB20C1BA1
+              95D7115CB50515A30BD56DB9D150E7E0A3DF213BD09D1FA0BDB6918A5D7FC470
+              796F17913DEEA113B6DA96A7B027471680365DB1E27A4EAEBF9B8CCB1F46B93E
+              37126C1F786807B9D39FCEB0B54DA3F51651BE6B1FA6BFE8461179CE37F8B1AD
+              FEF0139899B9D7C97CE5480C13F8F4BF8C2DBDC893B3BBB71B4ECFCBCE55EB23
+              B1432F81953B3B60C9F77E89B3FE92952272D01339E1AA3FFC04462EB3A87093
+              323371FC831F32527D99CF321D5FB215943E6BB83CD9E4076F4FB333261BCEB5
+              1BF1346F364478CE4C477DB52D4F9F175CC655807E9EAFE794331AA2FADFBF47
+              E062411EF26FBA1DB3B2619ACDD40C96DDF7386661F9BD22724F55DB5EBC91DE
+              79C3A5DD85745DFB0039A7577CC1632A79E459672C4CD6E927515C7BB988F167
+              5B517930FEEE5FA7C60D0067E346EC35AB9DC0CFBCA14E2DE89F5FB69F943D31
+              AC057D6D84575E27836BB64ABE33B9E4A35730D3311BF0A0BB7933E692655363
+              3680829B7E88B37AF5ED22726B55DB5E9CF1A1F3021410FF6087669D3E4E376C
+              1245F0853F39A79F6165B16C0EE2652B56A9CA5E2B3E1A497DDC323E8661C3D3
+              BC19E036E7E8807AC35DE70577266465FB7E2DEA39A4A1D55B6470D596BCFC8A
+              7B0E81AA8870AB77DD573F8777D43561B8BCC5226C2CE86B5B50223E13F282A3
+              2F5074E28806D7DC20C10BBF724E1F7B72146FA80B60BBB9743946A07402B076
+              2DC04610C3173CB6087853905CF0DEF314F6BEA3836BBE26C195D79DD3C7173C
+              86084D02C58EBA26004CB3A20EE022D4C23DDCB76880E3904A55DB3E4584C1C6
+              6D226A69D927FF38ABBD27D20B8801DA64AFA87B3309981387CD15F6F890CE76
+              2A590448A96ADDAB2A06036B6F12D4D2B2AE3766B5754443134EB2DC7007DE04
+              3027A2149AE9D9CB59225049B2B06AC19CBE6027B1D2061D68BA59442D2D3DFE
+              D60C235B3A36D1D2A2C9CD604EF8BBE42C55636CE95A061BB72EC6DE99D2E09A
+              AD14F4BD873D159DD66F58930CE29AEC1B07548D5B36C7ACC14A8EBF45E1A9D6
+              BC12EE5CCA3A7CF45EF95D2CBB9BBAC34FCC8003B06C4E267862A89E0108A1AC
+              2B306B605B36892D9B5C209C57FBAEBC4772763775879FC47B7AF6B35FD6E59F
+              6C862767C4B0C686003AB3AE80E44CD7AC8E0B82B37BE8D9B053D2DE32EA8EFC
+              16DF1C8520E5AF986C765AD1C8386026D80BD08608F192FA458673D3B3612729
+              7F05B54776E30BCD5DF662C5F5A86A4AE1FDEC3817C6C4EDEA089018AB58BD68
+              7039BB9B131B76920A2CA1F6C86EFCA173178168C51A105A8044EAF8D171C0CC
+              A90EACF86842555F19A9BA141563EE28F9C0992E7AAEBE8F64A0929A96A7F007
+              3F3EA74F32B0946461A5A0ECCF9CEA401363E38000F1D68300CF645D0119AEBE
+              6C8170CE71B8822A6ADE798AC0E04779F985577C195562AAFA7CBCF56F53FD06
+              40F4D04B28BCAAE8D1E0AAEBB10CDB5903CD09677372E2AAFB48145553FDEE33
+              04063ECCCB2FE52B2752B30E6037566E2876F8C074C074571BA9632DA03C90F6
+              9513CAA3B0CF2AC300819A777F47C167EFE7E5A240FF25DF40C516017D38D672
+              80DC50FFD4F8D454653EEBC67BCD37BB818678E9F2265FB0134762787E7C5696
+              A2DE16758D0DE65D79C20D9B882CDB20C0FD563AFDAFF06F764EAD3F38E3D294
+              EE6E67ECCD7D28EC5431BA4EAEBF9B94B7745E80307E16CCD776746913038DDB
+              50D51755D933F297C7C89DEE9F66336DCB8EBCF80899FECE5155DD9671FAC33D
+              1B7692F295CD1B325FB89357DC898AD1A2AA77253B0E31F6DA9E1976D377432E
+              43E283B7F15E71C369C3E57D3D67776F1FA9BECCE71AE9C7190B2F0A9832FE5B
+              FB9BBF8D1AB616606B66A07B2CFCABBBD074E21C8080C64748FCE79FB8D76D19
+              1097E765B539BE3452B36E49D6E9C73BD433EB4B56BE4AF9CA3979C59D44966D
+              1045F6ABEAD73303DD63C1476FC18ACE7E519B359F58D108F1D683382F5C1FB1
+              05CA9E45C49328AAB93C527F9561D91C38A3416CD954DE60894025838DDBE86F
+              FE16696F6904B85F959F243B0E67C28FDDC5C4796056CDBDA04D07853B76E1BF
+              F636C46636010F8AC876D4126FE8137CC14E3C915E1CD110B6740CC3CA60D99C
+              645D0152FE726225CB8856AC26597081A86A0CD80D3C6CA593A19103BF66ECEF
+              7B66BCC5CC0F7042F6CA060A6EFE31EEE6CD88B00291DB506E149126BEB0D1CE
+              94420AF408CA7EE005CD6587622D0718393073B72E087052E6926578AFDE81E7
+              D2CD984B96235002ACE5F3376A37681425CCF81BF5FB0A89CCA98F88B71E2476
+              E84FE42203F3F9E4F95F838D40298EBA26CCF2F1577E91C9708AEAF83ACE067B
+              491D3F3A2DF1FEDFE97F8A1461FF6AC44F150000000049454E44AE426082}
+          end>
       end>
     Left = 232
     Top = 100

+ 263 - 40
Projects/Src/CompForm.pas

@@ -167,19 +167,22 @@ type
     FSaveEncodingAuto: TMenuItem;
     FSaveEncodingUTF8WithBOM: TMenuItem;
     ToolBar: TToolBar;
+    BackNavButton: TToolButton;
+    ForwardNavButton: TToolButton;
+    ToolButton1: TToolButton;
     NewMainFileButton: TToolButton;
     OpenMainFileButton: TToolButton;
     SaveButton: TToolButton;
-    ToolButton4: TToolButton;
+    ToolButton2: TToolButton;
     CompileButton: TToolButton;
     StopCompileButton: TToolButton;
-    ToolButton7: TToolButton;
+    ToolButton3: TToolButton;
     RunButton: TToolButton;
     PauseButton: TToolButton;
-    ToolButton10: TToolButton;
+    ToolButton4: TToolButton;
     TargetSetupButton: TToolButton;
     TargetUninstallButton: TToolButton;
-    ToolButton13: TToolButton;
+    ToolButton5: TToolButton;
     HelpButton: TToolButton;
     Bevel1: TBevel;
     BuildImageList: TImageList;
@@ -220,6 +223,7 @@ type
     VCloseCurrentTab2: TMenuItem;
     VReopenTab2: TMenuItem;
     VReopenTabs2: TMenuItem;
+    NavPopupMenu: TMenuItem;
     N23: TMenuItem;
     LightMarkersImageCollection: TImageCollection;
     DarkMarkersImageCollection: TImageCollection;
@@ -334,6 +338,9 @@ type
     procedure OutputListKeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
     procedure RMenuClick(Sender: TObject);
+    procedure BackNavButtonClick(Sender: TObject);
+    procedure ForwardNavButtonClick(Sender: TObject);
+    procedure NavPopupMenuClick(Sender: TObject);
   private
     { Private declarations }
     FMemos: TList<TCompScintEdit>;                      { FMemos[0] is the main memo and FMemos[1] the preprocessor output memo - also see MemosTabSet comment above }
@@ -425,6 +432,10 @@ type
     FMenuBitmapsSize: TSize;
     FMenuBitmapsSourceImageCollection: TCustomImageCollection;
     FSynchingZoom: Boolean;
+    FNavStacks: TCompScintEditNavStacks;
+    FCurrentNavItem: TCompScintEditNavItem;
+    FBackNavButtonShortCut, FForwardNavButtonShortCut: TShortCut;
+    FIgnoreTabSetClick: Boolean;
     class procedure AppOnException(Sender: TObject; E: Exception);
     procedure AppOnActivate(Sender: TObject);
     procedure AppOnIdle(Sender: TObject; var Done: Boolean);
@@ -480,7 +491,10 @@ type
     procedure UpdateReopenTabMenu(const Menu: TMenuItem);
     procedure ModifyMRUMainFilesList(const AFilename: String; const AddNewItem: Boolean);
     procedure ModifyMRUParametersList(const AParameter: String; const AddNewItem: Boolean);
-    procedure MoveCaretAndActivateMemo(AMemo: TCompScintFileEdit; const LineNumber: Integer; const AlwaysResetColumn: Boolean);
+    procedure MoveCaretAndActivateMemo(AMemo: TCompScintEdit; const LineNumberOrPosition: Integer;
+      const AlwaysResetColumnEvenIfOnRequestedLineAlready: Boolean;
+      const IsPosition: Boolean = False; const PositionVirtualSpace: Integer = 0);
+    procedure NavItemClick(Sender: TObject);
     procedure NewMainFile;
     procedure NewMainFileUsingWizard;
     procedure OpenFile(AMemo: TCompScintFileEdit; AFilename: String; const MainMemoAddToRecentDocs: Boolean);
@@ -488,6 +502,8 @@ type
     procedure ParseDebugInfo(DebugInfo: Pointer);
     procedure ReadMRUMainFilesList;
     procedure ReadMRUParametersList;
+    procedure RemoveMemoFromNav(const AMemo: TCompScintEdit);
+    procedure RemoveMemoBadLinesFromNav(const AMemo: TCompScintEdit);
     procedure ReopenTabClick(Sender: TObject);
     procedure ReopenTabOrTabs(const HiddenFileIndex: Integer; const Activate: Boolean);
     procedure ResetAllMemosLineState;
@@ -507,7 +523,7 @@ type
     procedure UpdateAllMemosLineMarkers;
     procedure UpdateBevel1Visibility;
     procedure UpdateCaption;
-    procedure UpdateCaretPosPanel;
+    procedure UpdateCaretPosPanelAndBackNavStack;
     procedure UpdateCompileStatusPanels(const AProgress, AProgressMax: Cardinal;
       const ASecondsRemaining: Integer; const ABytesCompressedPerSecond: Cardinal);
     procedure UpdateEditModePanel;
@@ -516,6 +532,7 @@ type
     procedure UpdateMemosTabSetVisibility;
     procedure UpdateMenuBitmapsIfNeeded;
     procedure UpdateModifiedPanel;
+    procedure UpdateNavButtons;
     procedure UpdateNewMainFileButtons;
     procedure UpdateOutputTabSetListsItemHeightAndDebugTimeWidth;
     procedure UpdateRunMenu;
@@ -847,6 +864,13 @@ begin
 
   MemosTabSet.PopupMenu := TCompileFormPopupMenu.Create(Self, MemosTabSetPopupMenu);
 
+  FNavStacks := TCompScintEditNavStacks.Create;
+  FCurrentNavItem.Invalidate;
+  UpdateNavButtons;
+
+  BackNavButton.Style := tbsDropDown;
+  BackNavButton.DropdownMenu := TCompileFormPopupMenu.Create(Self, NavPopupMenu);
+
   PopupMenu := TCompileFormPopupMenu.Create(Self, OutputListPopupMenu);
 
   CompilerOutputList.PopupMenu := PopupMenu;
@@ -955,6 +979,7 @@ begin
   if FDevNames <> 0 then
     GlobalFree(FDevNames);
 
+  FNavStacks.Free;
   FMenuBitmaps.Free;
   FMenuDarkBackgroundBrush.Free;
   FMenuDarkHotOrSelectedBrush.Free;
@@ -1001,12 +1026,18 @@ end;
 procedure TCompileForm.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
-  if ShortCut(Key, Shift) = VK_ESCAPE then begin
+  var AShortCut := ShortCut(Key, Shift);
+  if AShortCut = VK_ESCAPE then begin
     if BStopCompile.Enabled then
-      BStopCompileClick(Self);
-  end
-  else if (Key = VK_F6) and not(ssAlt in Shift) then begin
-    { Toggle focus between panes }
+      BStopCompileClick(Self)
+  end else if AShortCut = FBackNavButtonShortCut then begin
+    if BackNavButton.Enabled then
+      BackNavButtonClick(Self);
+  end else if AShortCut = FForwardNavButtonShortCut then begin
+    if ForwardNavButton.Enabled then
+      ForwardNavButtonClick(Self);
+  end else if (Key = VK_F6) and not(ssAlt in Shift) then begin
+    { Toggle focus between the active memo and the active bottom pane }
     Key := 0;
     if ActiveControl <> FActiveMemo then
       ActiveControl := FActiveMemo
@@ -1122,6 +1153,10 @@ begin
   FIncludedFiles.Clear;
   UpdatePreprocMemos;
   FMainMemo.ClearUndo;
+
+  FNavStacks.Clear;
+  FCurrentNavItem.Invalidate;
+  UpdateNavButtons;
 end;
 
 { Breakpoints are preserved on a per-file basis }
@@ -1311,6 +1346,7 @@ begin
   AMemo.OpeningFile := True;
   try
     AFilename := PathExpand(AFilename);
+    var NameChange := PathCompare(AMemo.Filename, AFilename) <> 0;
 
     Stream := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyNone);
     try
@@ -1320,11 +1356,15 @@ begin
         AMemo.BreakPoints.Clear;
         if DestroyLineState(AMemo) then
           UpdateAllMemoLineMarkers(AMemo);
+        if NameChange then  { Also see below the other case which needs to be done after load }
+          RemoveMemoFromNav(AMemo);
       end;
       GetFileTime(Stream.Handle, nil, nil, @AMemo.FileLastWriteTime);
       AMemo.SaveEncoding := GetStreamSaveEncoding(Stream);
       Stream.Seek(0, soFromBeginning);
       AMemo.Lines.LoadFromStream(Stream, GetEncoding(AMemo.SaveEncoding));
+      if (AMemo <> FMainMemo) and not NameChange then
+        RemoveMemoBadLinesFromNav(AMemo);
     finally
       Stream.Free;
     end;
@@ -2502,8 +2542,15 @@ begin
 
   if MemoWasActiveMemo then begin
     { Select next tab, except when we're already at the end. Avoiding flicker by
-      doing this before hiding old active memo. }
-    VNextTabClick(Self);
+      doing this before hiding old active memo. We do this in a dirty way by
+      clicking two tabs while making sure TabSetClick doesn't see the first
+      'fake' one. }
+    FIgnoreTabSetClick := True;
+    try
+      VNextTabClick(Self);
+    finally
+      FIgnoreTabSetClick := False;
+    end;
     VPreviousTabClick(Self);
     Memo.CancelAutoComplete;
     Memo.Visible := False;
@@ -2716,7 +2763,8 @@ begin
     if FActiveMemo.CaretColumn = 0 then
       Key := 0;
   end
-  else if (Key = VK_RIGHT) and (Shift * [ssShift, ssAlt, ssCtrl] = [ssAlt]) then begin
+  else if ((Key = VK_RIGHT) and (Shift * [ssShift, ssAlt, ssCtrl] = [ssAlt])) and
+           (ShortCut(Key, Shift) <> FForwardNavButtonShortCut) then begin
     InitiateAutoComplete(#0);
     Key := 0;
   end;
@@ -2724,7 +2772,12 @@ end;
 
 procedure TCompileForm.MemoKeyPress(Sender: TObject; var Key: Char);
 begin
-  if (Key = ' ') and (GetKeyState(VK_CONTROL) < 0) then begin
+ { Scintilla inserts char 31 ("Unit Separator", shown as US) when Ctrl+Shift+-
+   is pressed for some reason. But that's our VS-style forward shortcut so filter
+   it (always, people might try it even if it's not the current keymapping). }
+  if Key = Char(31) then
+    Key := #0
+  else if (Key = ' ') and (GetKeyState(VK_CONTROL) < 0) then begin
     InitiateAutoComplete(#0);
     Key := #0;
   end;
@@ -2904,6 +2957,9 @@ end;
 
 procedure TCompileForm.MemosTabSetClick(Sender: TObject);
 begin
+  if FIgnoreTabSetClick then
+    Exit;
+
   var NewActiveMemo := TabIndexToMemo(MemosTabSet.TabIndex, MemosTabSet.Tabs.Count-1);
   if NewActiveMemo <> FActiveMemo then begin
     { Avoiding flicker by showing new before hiding old }
@@ -2916,7 +2972,7 @@ begin
 
     UpdateSaveMenuItemAndButton;
     UpdateRunMenu;
-    UpdateCaretPosPanel;
+    UpdateCaretPosPanelAndBackNavStack;
     UpdateEditModePanel;
     UpdateModifiedPanel;
   end;
@@ -3537,42 +3593,49 @@ begin
   end;
 end;
 
-procedure TCompileForm.MoveCaretAndActivateMemo(AMemo: TCompScintFileEdit; const LineNumber: Integer;
-  const AlwaysResetColumn: Boolean);
+procedure TCompileForm.MoveCaretAndActivateMemo(AMemo: TCompScintEdit; const LineNumberOrPosition: Integer;
+  const AlwaysResetColumnEvenIfOnRequestedLineAlready: Boolean; const IsPosition: Boolean;
+  const PositionVirtualSpace: Integer);
 var
   Pos: Integer;
 begin
   { Reopen tab if needed }
-  var HiddenFileIndex := FHiddenFiles.IndexOf(AMemo.Filename);
-  if HiddenFileIndex <> -1 then begin
-    var SaveFileName := AMemo.Filename;
-    ReopenTabOrTabs(HiddenFileIndex, False);
-    { The above call to ReopenTabOrTabs will currently lead to a call to UpdateIncludedFilesMemos which
-      sets up all the memos. Currently it will keep same memo for the reopened file but in case it no
-      longer does at some point: look it up again }
-    AMemo := nil;
-    for var Memo in FFileMemos do begin
-      if Memo.Used and (PathCompare(Memo.Filename, SaveFilename) = 0) then begin
-        AMemo := Memo;
-        Break;
+  if AMemo is TCompScintFileEdit then begin
+    var FileName := (AMemo as TCompScintFileEdit).Filename;
+    var HiddenFileIndex := FHiddenFiles.IndexOf(Filename);
+    if HiddenFileIndex <> -1 then begin
+      ReopenTabOrTabs(HiddenFileIndex, False);
+      { The above call to ReopenTabOrTabs will currently lead to a call to UpdateIncludedFilesMemos which
+        sets up all the memos. Currently it will keep same memo for the reopened file but in case it no
+        longer does at some point: look it up again }
+      AMemo := nil;
+      for var Memo in FFileMemos do begin
+        if Memo.Used and (PathCompare(Memo.Filename, Filename) = 0) then begin
+          AMemo := Memo;
+          Break;
+        end;
       end;
+      if AMemo = nil then
+        raise Exception.Create('AMemo MIA');
     end;
-    if AMemo = nil then
-      raise Exception.Create('AMemo MIA');
   end;
 
   { Move caret }
-  if AlwaysResetColumn or (AMemo.CaretLine <> LineNumber) then
-    Pos := AMemo.GetPositionFromLine(LineNumber)
+  if IsPosition then
+    Pos := LineNumberOrPosition
+  else if AlwaysResetColumnEvenIfOnRequestedLineAlready or (AMemo.CaretLine <> LineNumberOrPosition) then
+    Pos := AMemo.GetPositionFromLine(LineNumberOrPosition)
   else
-    Pos := AMemo.CaretPosition;
+    Pos := AMemo.CaretPosition; { Not actually moving caret - it's already were we want it}
 
   { If the line isn't in view, scroll so that it's in the center }
   if not AMemo.IsPositionInViewVertically(Pos) then
-    AMemo.TopLine := AMemo.GetVisibleLineFromDocLine(LineNumber) -
+    AMemo.TopLine := AMemo.GetVisibleLineFromDocLine(AMemo.GetLineFromPosition(Pos)) -
       (AMemo.LinesInWindow div 2);
 
   AMemo.CaretPosition := Pos;
+  if IsPosition then
+    AMemo.CaretVirtualSpace := PositionVirtualSpace;
 
   { Activate memo }
   MemosTabSet.TabIndex := MemoToTabIndex(AMemo); { This causes MemosTabSetClick to show the memo }
@@ -3625,10 +3688,137 @@ begin
     StatusBar.Panels[spExtraStatus].Text := '';
 end;
 
-procedure TCompileForm.UpdateCaretPosPanel;
+procedure TCompileForm.RemoveMemoFromNav(const AMemo: TCompScintEdit);
+begin
+  if FNavStacks.RemoveMemo(AMemo) then
+    UpdateNavButtons;
+  if FCurrentNavItem.Memo = AMemo then
+    FCurrentNavItem.Invalidate;
+end;
+
+procedure TCompileForm.RemoveMemoBadLinesFromNav(const AMemo: TCompScintEdit);
+begin
+  if FNavStacks.RemoveMemoBadLines(AMemo) then
+    UpdateNavButtons;
+ { We do NOT update FCurrentNav here so it might point to a line that's
+   deleted until next UpdateCaretPosPanelAndBackStack by UpdateMemoUI }
+end;
+
+procedure TCompileForm.UpdateNavButtons;
+begin
+  ForwardNavButton.Enabled := FNavStacks.Forward.Count > 0;
+  BackNavButton.Enabled := (FNavStacks.Back.Count > 0) or
+                           ForwardNavButton.Enabled; { for the dropdown }
+end;
+
+procedure TCompileForm.BackNavButtonClick(Sender: TObject);
+begin
+  { Delphi does not support BTNS_WHOLEDROPDOWN so we can't be like VS which
+    can have a disabled back nav button with an enabled dropdown. To avoid
+    always showing two dropdowns we keep the back button enabled when we need
+    the dropdown. So we need to check for this. }
+  if FNavStacks.Back.Count = 0 then begin
+    Beep;
+    Exit;
+  end;
+
+  FNavStacks.Forward.Add(FCurrentNavItem);
+  var NewNavItem := FNavStacks.Back.ExtractAt(FNavStacks.Back.Count-1);
+  UpdateNavButtons;
+  FCurrentNavItem := NewNavItem; { Must be done *before* moving }
+  MoveCaretAndActivateMemo(NewNavItem.Memo,
+    NewNavItem.Memo.GetPositionFromLineColumn(NewNavItem.Line, NewNavItem.Column), False, True, NewNavItem.VirtualSpace);
+end;
+
+procedure TCompileForm.ForwardNavButtonClick(Sender: TObject);
+begin
+  FNavStacks.Back.Add(FCurrentNavItem);
+  var NewNavItem := FNavStacks.Forward.ExtractAt(FNavStacks.Forward.Count-1);
+  UpdateNavButtons;
+  FCurrentNavItem := NewNavItem; { Must be done *before* moving }
+  MoveCaretAndActivateMemo(NewNavItem.Memo,
+    NewNavItem.Memo.GetPositionFromLineColumn(NewNavItem.Line, NewNavItem.Column), False, True, NewNavItem.VirtualSpace);
+end;
+
+procedure TCompileForm.NavItemClick(Sender: TObject);
 begin
+  var MenuItem := Sender as TMenuItem;
+  var Clicks := Abs(MenuItem.Tag);
+  if Clicks > 0 then begin
+    var ButtonToClick: TToolButton;
+    if MenuItem.Tag > 0 then
+      ButtonToClick := ForwardNavButton
+    else
+      ButtonToClick := BackNavButton;
+    while Clicks > 0 do begin
+      if not ButtonToClick.Enabled then
+        raise Exception.Create('not ButtonToClick.Enabled');
+      ButtonToClick.Click;
+      Dec(Clicks);
+    end;
+  end;
+end;
+
+procedure TCompileForm.NavPopupMenuClick(Sender: TObject);
+
+  procedure AddNavItemToMenu(const NavItem: TCompScintEditNavItem; const Checked: Boolean;
+    const ClicksNeeded: Integer; const Menu: TMenuItem);
+  begin
+    if NavItem.Line >= NavItem.Memo.Lines.Count then
+      raise Exception.Create('NavItem.Line >= NavItem.Memo.Lines.Count');
+    var LineInfo :=  NavItem.Memo.Lines[NavItem.Line];
+    if LineInfo.Trim = '' then
+      LineInfo := Format('Line %d', [NavItem.Line+1]);
+
+    var Caption: String;
+    if MemosTabSet.Visible then
+      Caption := Format('%s: %s', [MemosTabSet.Tabs[MemoToTabIndex(NavItem.Memo)], LineInfo])
+    else
+      Caption := LineInfo;
+
+    var MenuItem := TMenuItem.Create(Menu);
+    MenuItem.Caption := DoubleAmp(Caption);
+    MenuItem.Checked := Checked;
+    MenuItem.Tag := ClicksNeeded;
+    MenuItem.OnClick := NavItemClick;
+    Menu.Add(MenuItem);
+  end;
+
+begin
+  var Menu := Sender as TMenuItem;
+
+  Menu.Clear;
+
+  { Setup dropdown. The result should end up being just like Visual Studio 2022
+    which means from top to bottom:
+    - Furthest (=oldest) forward item
+    - ...
+    - Closest (=next) forward item
+    - Current position in the active memo, checked
+    - Closest (=next) back item
+    - ...
+    - Furthest (=oldest) back item
+    The Tag parameter should be set to the amount of clicks needed to get to
+    the item, positive for forward and negative for back }
+
+  for var I := 0 to FNavStacks.Forward.Count-1 do
+    AddNavItemToMenu(FNavStacks.Forward[I], False, FNavStacks.Forward.Count-I, Menu);
+  AddNavItemToMenu(FCurrentNavItem, True, 0, Menu);
+  for var I := FNavStacks.Back.Count-1 downto 0 do
+    AddNavItemToMenu(FNavStacks.Back[I], False, -(FNavStacks.Back.Count-I), Menu);
+end;
+
+procedure TCompileForm.UpdateCaretPosPanelAndBackNavStack;
+begin
+  { Update panel }
   StatusBar.Panels[spCaretPos].Text := Format('%4d:%4d', [FActiveMemo.CaretLine + 1,
     FActiveMemo.CaretColumnExpandedForTabs + 1]);
+
+  { Update NavStacks.Back if needed and remember new position }
+  var NewNavItem := TCompScintEditNavItem.Create(FActiveMemo); { This is a record so no need to free }
+  if FCurrentNavItem.Valid and FNavStacks.AddNewBackForJump(FCurrentNavItem, NewNavItem) then
+    UpdateNavButtons;
+  FCurrentNavItem := NewNavItem;
 end;
 
 procedure TCompileForm.UpdateEditModePanel;
@@ -3675,6 +3865,8 @@ procedure TCompileForm.UpdatePreprocMemos;
       end;
       FPreprocessorOutputMemo.Used := True;
     end else begin
+      if FPreprocessorOutputMemo.Used then
+        RemoveMemoFromNav(FPreprocessorOutputMemo);
       FPreprocessorOutputMemo.Used := False;
       FPreprocessorOutputMemo.Visible := False;
     end;
@@ -3730,12 +3922,16 @@ procedure TCompileForm.UpdatePreprocMemos;
       { Hide any remaining memos }
       for I := NextMemoIndex to FFileMemos.Count-1 do begin
         FFileMemos[I].BreakPoints.Clear;
+        if FFileMemos[I].Used then
+          RemoveMemoFromNav(FFileMemos[I]);
         FFileMemos[I].Used := False;
         FFileMemos[I].Visible := False;
       end;
     end else begin
       for I := FirstIncludedFilesMemoIndex to FFileMemos.Count-1 do begin
         FFileMemos[I].BreakPoints.Clear;
+        if FFileMemos[I].Used then
+          RemoveMemoFromNav(FFileMemos[I]);
         FFileMemos[I].Used := False;
         FFileMemos[I].Visible := False;
       end;
@@ -3852,7 +4048,7 @@ procedure TCompileForm.MemoUpdateUI(Sender: TObject);
 begin
   if (Sender = FErrorMemo) and ((FErrorMemo.ErrorLine < 0) or (FErrorMemo.CaretPosition <> FErrorMemo.ErrorCaretPosition)) then
     HideError;
-  UpdateCaretPosPanel;
+  UpdateCaretPosPanelAndBackNavStack;
   UpdatePendingSquiggly;
   UpdateBraceHighlighting;
   if Sender = FActiveMemo then
@@ -4893,6 +5089,27 @@ begin
       ToolButton.Hint := Format('%s (%s)', [RemoveAccelChar(MenuItem.Caption), ShortCutToText(ShortCut)]);
     end;
   end;
+
+  { The Nav buttons have no corresponding menu item and also no ShortCut property
+    so they need special handling }
+
+  case FOptions.KeyMappingType of
+    kmtDelphi:
+      begin
+        FBackNavButtonShortCut := ShortCut(VK_LEFT, [ssAlt]);
+        FForwardNavButtonShortCut := ShortCut(VK_RIGHT, [ssAlt]);
+      end;
+    kmtVisualStudio:
+      begin
+        FBackNavButtonShortCut := ShortCut(VK_OEM_MINUS, [ssCtrl]);
+        FForwardNavButtonShortCut := ShortCut(VK_OEM_MINUS, [ssCtrl, ssShift]);
+      end;
+  else
+    raise Exception.Create('Unknown FOptions.KeyMappingType');
+  end;
+
+  BackNavButton.Hint := Format('Back (%s)', [ShortCutToText(FBackNavButtonShortCut)]);
+  ForwardNavButton.Hint := Format('Forward (%s)', [ShortCutToText(FForwardNavButtonShortCut)]);
 end;
 
 procedure TCompileForm.UpdateTheme;
@@ -6108,6 +6325,8 @@ begin
   end;
   if BreakPointsChanged then
     BuildAndSaveBreakPointLines(Memo);
+
+  FNavStacks.LinesInserted(Memo, FirstLine, Count);
 end;
 
 procedure TCompileForm.MemoLinesDeleted(Memo: TCompScintFileEdit; FirstLine, Count,
@@ -6163,8 +6382,7 @@ begin
         Memo.BreakPoints.Delete(I);
         BreakPointsChanged := True;
       end else begin
-        Line := Line - Count;
-        Memo.BreakPoints[I] := Line;
+        Memo.BreakPoints[I] := Line - Count;
         BreakPointsChanged := True;
       end;
     end;
@@ -6172,6 +6390,11 @@ begin
   if BreakPointsChanged then
     BuildAndSaveBreakPointLines(Memo);
 
+  if FNavStacks.LinesDeleted(Memo, FirstLine, Count) then
+    UpdateNavButtons;
+  { We do NOT update FCurrentNavItem here so it might point to a line that's
+    deleted until next UpdateCaretPosPanelAndBackStack by UpdateMemoUI }
+
   { When lines are deleted, Scintilla insists on moving all of the deleted
     lines' markers to the line on which the deletion started
     (FirstAffectedLine). This is bad for us as e.g. it can result in the line

+ 214 - 0
Projects/Src/CompScintEdit.pas

@@ -76,6 +76,43 @@ type
     property SaveEncoding: TSaveEncoding read FSaveEncoding write FSaveEncoding;
   end;
 
+  TCompScintEditNavItem = record
+    Memo: TCompScintEdit;
+    Line, Column, VirtualSpace: Integer;
+    constructor Create(const AMemo: TCompScintEdit);
+    function EqualMemoAndLine(const ANavItem: TCompScintEditNavItem): Boolean;
+    procedure Invalidate;
+    function Valid: Boolean;
+  end;
+
+  { Not using TStack since it lacks a way the keep a maximum amount of items by discarding the oldest }
+  TCompScintEditNavStack = class(TList<TCompScintEditNavItem>)
+  public
+    function LinesDeleted(const AMemo: TCompScintEdit; const FirstLine, LineCount: Integer): Boolean;
+    procedure LinesInserted(const AMemo: TCompScintEdit; const FirstLine, LineCount: Integer);
+    procedure Optimize;
+    function RemoveMemo(const AMemo: TCompScintEdit): Boolean;
+    function RemoveMemoBadLines(const AMemo: TCompScintEdit): Boolean;
+  end;
+
+  TCompScintEditNavStacks = class
+  private
+    FBackNavStack: TCompScintEditNavStack;
+    FForwardNavStack: TCompScintEditNavStack;
+  public
+    constructor Create;
+    destructor Destroy; override;
+    function AddNewBackForJump(const OldNavItem, NewNavItem: TCompScintEditNavItem): Boolean;
+    procedure Clear;
+    procedure Limit;
+    function LinesDeleted(const AMemo: TCompScintEdit; const FirstLine, LineCount: Integer): Boolean;
+    procedure LinesInserted(const AMemo: TCompScintEdit; const FirstLine, LineCount: Integer);
+    function RemoveMemo(const AMemo: TCompScintEdit): Boolean;
+    function RemoveMemoBadLines(const AMemo: TCompScintEdit): Boolean;
+    property Back: TCompScintEditNavStack read FBackNavStack;
+    property Forward: TCompScintEditNavStack read FForwardNavStack;
+  end;
+
 implementation
 
 uses
@@ -156,4 +193,181 @@ begin
   inherited;
 end;
 
+{ TCompScintEditNavItem }
+
+constructor TCompScintEditNavItem.Create(const AMemo: TCompScintEdit);
+begin
+  Memo := AMemo;
+  Line := AMemo.CaretLine;
+  Column := AMemo.CaretColumn;
+  VirtualSpace := AMemo.CaretVirtualSpace;
+end;
+
+function TCompScintEditNavItem.EqualMemoAndLine(
+  const ANavItem: TCompScintEditNavItem): Boolean;
+begin
+  Result := (Memo = ANavItem.Memo) and (Line = ANavItem.Line);
+end;
+
+procedure TCompScintEditNavItem.Invalidate;
+begin
+  Memo := nil;
+end;
+
+function TCompScintEditNavItem.Valid: Boolean;
+begin
+  Result := (Memo <> nil) and (Line < Memo.Lines.Count); { Line check: see MemoLinesDeleted and RemoveMemoBadLinesFromNav }
+end;
+
+{ TCompScintEditNavStack }
+
+function TCompScintEditNavStack.LinesDeleted(const AMemo: TCompScintEdit;
+  const FirstLine, LineCount: Integer): Boolean;
+begin
+  Result := False;
+  for var I := Count-1 downto 0 do begin
+    var NavItem := Items[I];
+    if NavItem.Memo = AMemo then begin
+      var Line := NavItem.Line;
+      if Line >= FirstLine then begin
+        if Line < FirstLine + LineCount then begin
+          Delete(I);
+          Result := True;
+        end else begin
+          NavItem.Line := Line - LineCount;
+          Items[I] := NavItem;
+        end;
+      end;
+    end;
+  end;
+  if Result then
+    Optimize;
+end;
+
+procedure TCompScintEditNavStack.LinesInserted(const AMemo: TCompScintEdit;
+  const FirstLine, LineCount: Integer);
+begin
+  for var I := 0 to Count-1 do begin
+    var NavItem := Items[I];
+    if NavItem.Memo = AMemo then begin
+      var Line := NavItem.Line;
+      if Line >= FirstLine then begin
+        NavItem.Line := Line + LineCount;
+        Items[I] := NavItem;
+      end;
+    end;
+  end;
+end;
+
+procedure TCompScintEditNavStack.Optimize;
+begin
+  { Turn two entries for the same memo and line which are next to each other
+    into one entry, ignoring column differences (like Visual Studio 2022) }
+  for var I := Count-1 downto 1 do
+    if Items[I].EqualMemoAndLine(Items[I-1]) then
+      Delete(I);
+end;
+
+function TCompScintEditNavStack.RemoveMemo(
+  const AMemo: TCompScintEdit): Boolean;
+begin
+  Result := False;
+  for var I := Count-1 downto 0 do begin
+    if Items[I].Memo = AMemo then begin
+      Delete(I);
+      Result := True;
+    end;
+  end;
+  if Result then
+    Optimize;
+end;
+
+function TCompScintEditNavStack.RemoveMemoBadLines(
+  const AMemo: TCompScintEdit): Boolean;
+begin
+  Result := False;
+  var LastGoodLine := AMemo.Lines.Count-1;
+  for var I := Count-1 downto 0 do begin
+    if (Items[I].Memo = AMemo) and (Items[I].Line > LastGoodLine) then begin
+      Delete(I);
+      Result := True;
+    end;
+  end;
+  if Result then
+    Optimize;
+end;
+
+{ TCompScintEditNavStacks }
+
+constructor TCompScintEditNavStacks.Create;
+begin
+  inherited;
+  FBackNavStack := TCompScintEditNavStack.Create;
+  FForwardNavStack := TCompScintEditNavStack.Create;
+end;
+
+destructor TCompScintEditNavStacks.Destroy;
+begin
+  FForwardNavStack.Free;
+  FBackNavStack.Free;
+  inherited;
+end;
+
+function TCompScintEditNavStacks.AddNewBackForJump(const OldNavItem,
+  NewNavItem: TCompScintEditNavItem): Boolean;
+begin
+  { Want a new item when changing tabs or moving at least 11 lines at once,
+    similar to Visual Studio 2022, see:
+    https://learn.microsoft.com/en-us/archive/blogs/zainnab/navigate-backward-and-navigate-forward
+    Note: not doing the other stuff listed in the article atm }
+  Result := (OldNavItem.Memo <> NewNavItem.Memo) or
+            (Abs(OldNavItem.Line - NewNavItem.Line) >= 11);
+  if Result then begin
+    FBackNavStack.Add(OldNavItem);
+    Limit;
+  end;
+end;
+
+procedure TCompScintEditNavStacks.Clear;
+begin
+  FBackNavStack.Clear;
+  FForwardNavStack.Clear;
+end;
+
+procedure TCompScintEditNavStacks.Limit;
+begin
+  { The dropdown showing both stacks + the current nav item should show at most
+    16 items just like Visual Studio 2022 }
+  if FBackNavStack.Count + FForwardNavStack.Count >= 15 then
+    FBackNavStack.Delete(0);
+end;
+
+function TCompScintEditNavStacks.LinesDeleted(const AMemo: TCompScintEdit;
+  const FirstLine, LineCount: Integer): Boolean;
+begin
+  Result := FBackNavStack.LinesDeleted(AMemo, FirstLine, LineCount);
+  Result := FForwardNavStack.LinesDeleted(AMemo, FirstLine, LineCount) or Result;
+end;
+
+procedure TCompScintEditNavStacks.LinesInserted(const AMemo: TCompScintEdit;
+  const FirstLine, LineCount: Integer);
+begin
+  FBackNavStack.LinesInserted(AMemo, FirstLine, LineCount);
+  FForwardNavStack.LinesInserted(AMemo, FirstLine, LineCount);
+end;
+
+function TCompScintEditNavStacks.RemoveMemo(
+  const AMemo: TCompScintEdit): Boolean;
+begin
+  Result := FBackNavStack.RemoveMemo(AMemo);
+  Result := FForwardNavStack.RemoveMemo(AMemo) or Result;
+end;
+
+function TCompScintEditNavStacks.RemoveMemoBadLines(
+  const AMemo: TCompScintEdit): Boolean;
+begin
+  Result := FBackNavStack.RemoveMemoBadLines(AMemo);
+  Result := FForwardNavStack.RemoveMemoBadLines(AMemo) or Result;
+end;
+
 end.

+ 2 - 4
Projects/Src/NewDisk.pas

@@ -2,13 +2,11 @@ unit NewDisk;
 
 {
   Inno Setup
-  Copyright (C) 1997-2005 Jordan Russell
+  Copyright (C) 1997-2024 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   New Disk form
-
-  $jrsoftware: issrc/Projects/NewDisk.pas,v 1.34 2010/10/22 10:33:26 mlaan Exp $
 }
 
 interface
@@ -55,7 +53,7 @@ begin
       Filename := AFilename;
       SelectDiskLabel.Caption := FmtSetupMessage(msgSelectDiskLabel2, [IntToStr(DiskNumber)]);
       PathEdit.Text := Path;
-      MessageBeep(0);
+      Beep;
       Result := ShowModal = mrOK;
       if Result then
         Path := GetSanitizedPath;

+ 1 - 1
Projects/Src/ScriptFunc_R.pas

@@ -1355,7 +1355,7 @@ begin
   Result := True;
 
   if Proc.Name = 'BEEP' then begin
-    Beep();
+    Beep;
   end else if Proc.Name = 'TRIM' then begin
     Stack.SetString(PStart, Trim(Stack.GetString(PStart-1)));
   end else if Proc.Name = 'TRIMLEFT' then begin

+ 2 - 1
whatsnew.htm

@@ -118,7 +118,8 @@ end;</pre>
 </ul>
 <p><span class="head2">Compiler IDE changes</span></p>
 <ul>
-  <li>Added support for Visual Studio-style shortcuts (like F7 to compile and F5 to run) to the <i>Build</i> and <i>Run</i> menus. Use the <i>Options</i> menu item in the <i>Tools</i> menu to activate.</li>
+  <li>Added toolbar buttons and shortcuts to navigate back (Alt+Left) and forward (Alt+Right). A navigation item is added when changing tabs or moving at least 11 lines at once, similar to Visual Studio 2022.<br />Because of this the shortcut to initiate auto complete is now only Ctrl+Space. To still be able to also use Alt+Right for this activate Visual Studio-style shortcuts, see below.</li>
+  <li>Added support for Visual Studio-style shortcuts (like Ctrl+- to navigate back, F7 to compile and F5 to run) to the <i>Build</i> and <i>Run</i> menus. To activate this use the <i>Options</i> menu item in the <i>Tools</i> menu to set the new <i>Key Map</i> option to <i>Visual Studio</i>.</li>
   <li>Added dark mode support to the title bar on Windows 10 Version 2004 and later.</i>
   <li>Added dark mode support to the main menu bar on all versions of Windows.</i>
   <li>Added dark mode support to the menus on Windows 10 Version 1903 and later up to Windows 11 Version 23H2 which is currently the latest version of Windows 11.</i>