cheat-engine/Cheat Engine/frmStringPointerScanUnit.lfm
Dark Byte 6c72f2a9d5 add lua interface for virtualstringtree, use said component in the .net info window
Also added some new fields to get in the dotnetdatacollector and monodatacollector so you'll need to recompile those
2022-12-07 12:28:52 +01:00

861 lines
25 KiB
Text
Executable file

object frmStringPointerScan: TfrmStringPointerScan
Left = 602
Height = 534
Top = 171
Width = 813
AutoSize = True
Caption = 'Structure spider'
ClientHeight = 514
ClientWidth = 813
Menu = MainMenu1
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '2.2.2.0'
object Panel1: TPanel
Left = 0
Height = 494
Top = 0
Width = 189
Align = alLeft
AutoSize = True
BevelOuter = bvNone
ClientHeight = 494
ClientWidth = 189
TabOrder = 0
object edtStructsize: TEdit
AnchorSideLeft.Control = lblStructsize
AnchorSideTop.Control = lblStructsize
AnchorSideTop.Side = asrBottom
Left = 87
Height = 23
Top = 23
Width = 80
TabOrder = 0
Text = '4096'
end
object lblStructsize: TLabel
AnchorSideLeft.Control = Panel5
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel5
Left = 87
Height = 15
Top = 8
Width = 50
BorderSpacing.Left = 3
Caption = 'Structsize'
ParentColor = False
end
object edtRegExp: TEdit
AnchorSideLeft.Control = lblString
AnchorSideTop.Control = lblString
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 20
Height = 23
Top = 349
Width = 165
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 4
Enabled = False
TabOrder = 9
end
object cbMustBeStart: TCheckBox
AnchorSideLeft.Control = cbRegExp
AnchorSideTop.Control = cbCaseSensitive
AnchorSideTop.Side = asrBottom
Left = 20
Height = 19
Top = 330
Width = 89
Caption = 'Must be start'
Enabled = False
TabOrder = 8
end
object cbCaseSensitive: TCheckBox
AnchorSideLeft.Control = cbRegExp
AnchorSideTop.Control = cbRegExp
AnchorSideTop.Side = asrBottom
Left = 20
Height = 19
Top = 311
Width = 93
Caption = 'Case sensitive'
Enabled = False
TabOrder = 7
end
object cbRegExp: TCheckBox
AnchorSideLeft.Control = rbStringscan
AnchorSideTop.Control = cbReuseStringmap
AnchorSideTop.Side = asrBottom
Left = 20
Height = 19
Top = 292
Width = 165
BorderSpacing.Left = 16
BorderSpacing.Right = 4
Caption = 'Strings must match reg exp'
OnChange = cbRegExpChange
TabOrder = 6
end
object rbStringscan: TRadioButton
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = Panel4
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 254
Width = 78
Caption = 'String scan'
OnChange = rbDatascanChange
TabOrder = 5
end
object rbDatascan: TRadioButton
AnchorSideLeft.Control = rbStringscan
AnchorSideTop.Control = edtRegExp
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 372
Width = 71
Caption = 'Data scan'
OnChange = rbDatascanChange
TabOrder = 10
end
object edtAlignsize: TEdit
AnchorSideLeft.Control = lblAlign
AnchorSideTop.Control = lblAlign
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 20
Height = 23
Top = 406
Width = 165
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 4
Enabled = False
TabOrder = 11
Text = '4'
end
object lblAlign: TLabel
AnchorSideLeft.Control = rbDatascan
AnchorSideTop.Control = rbDatascan
AnchorSideTop.Side = asrBottom
Left = 20
Height = 15
Top = 391
Width = 47
BorderSpacing.Left = 16
Caption = 'Alignsize'
Enabled = False
ParentColor = False
end
object edtPointerStart: TEdit
AnchorSideLeft.Control = cbPointerInRange
AnchorSideTop.Control = cbPointerInRange
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 4
Height = 23
Top = 67
Width = 181
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 4
Enabled = False
TabOrder = 2
end
object cbPointerInRange: TCheckBox
AnchorSideLeft.Control = Panel5
AnchorSideTop.Control = Panel5
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 48
Width = 150
BorderSpacing.Top = 2
Caption = 'Pointer must be in range'
OnChange = cbPointerInRangeChange
TabOrder = 1
end
object lblAnd: TLabel
AnchorSideLeft.Control = cbPointerInRange
AnchorSideTop.Control = edtPointerStart
AnchorSideTop.Side = asrBottom
Left = 4
Height = 15
Top = 90
Width = 20
Caption = 'and'
Enabled = False
ParentColor = False
end
object edtPointerStop: TEdit
AnchorSideLeft.Control = cbPointerInRange
AnchorSideTop.Control = lblAnd
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 4
Height = 23
Top = 105
Width = 181
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 4
Enabled = False
TabOrder = 3
end
object lblString: TLabel
AnchorSideLeft.Control = cbMustBeStart
AnchorSideTop.Control = cbMustBeStart
AnchorSideTop.Side = asrBottom
Left = 20
Height = 15
Top = 349
Width = 34
Caption = 'String:'
Enabled = False
ParentColor = False
end
object Panel4: TPanel
AnchorSideLeft.Control = edtPointerStop
AnchorSideTop.Control = edtPointerStop
AnchorSideTop.Side = asrBottom
Left = 4
Height = 122
Top = 132
Width = 148
AutoSize = True
BorderSpacing.Top = 4
BevelOuter = bvNone
ClientHeight = 122
ClientWidth = 148
TabOrder = 4
object rbDiffDontCare: TRadioButton
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = Panel4
Left = 0
Height = 19
Top = 0
Width = 148
Caption = 'Don''t care for difference'
Checked = True
Enabled = False
OnChange = rbDiffDontCareChange
TabOrder = 0
TabStop = True
end
object rbMustBeDifferent: TRadioButton
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = rbDiffDontCare
AnchorSideTop.Side = asrBottom
Left = 0
Height = 19
Top = 19
Width = 111
Caption = 'Must be different'
Enabled = False
OnChange = rbDiffDontCareChange
TabOrder = 1
end
object rbMustBeSame: TRadioButton
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = rbMustBeDifferent
AnchorSideTop.Side = asrBottom
Left = 0
Height = 19
Top = 38
Width = 114
Caption = 'Must be the same'
Enabled = False
OnChange = rbDiffDontCareChange
TabOrder = 2
end
object comboCompareType: TComboBox
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = lblCompare
AnchorSideTop.Side = asrBottom
Left = 16
Height = 23
Top = 72
Width = 124
BorderSpacing.Left = 16
Enabled = False
ItemHeight = 15
ItemIndex = 3
Items.Strings = (
'String'
'1 Byte'
'2 Bytes'
'4 Bytes'
'8 Bytes'
'Float'
'Double'
'Pointer (hex)'
)
OnChange = comboTypeChange
Style = csDropDownList
TabOrder = 3
Text = '4 Bytes'
end
object lblCompare: TLabel
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = rbMustBeSame
AnchorSideTop.Side = asrBottom
Left = 0
Height = 15
Top = 57
Width = 75
Caption = 'Compare type'
Enabled = False
ParentColor = False
end
object cbMapPointerValues: TCheckBox
AnchorSideLeft.Control = Panel4
AnchorSideTop.Control = comboCompareType
AnchorSideTop.Side = asrBottom
Left = 0
Height = 19
Hint = 'During the scan the values of pointer will be stored in memory for quick lookup when the same address is encountered again'#13#10'If the pointerlist has mostly unique addresses this can cause you to get out of memory errors'#13#10#13#10'Enabled: Fast- Memory gobbler'#13#10'Disabled: Slower- Not too much memory eaten'
Top = 103
Width = 148
BorderSpacing.Top = 8
Caption = 'Store values during scan'
Checked = True
ParentShowHint = False
ShowHint = True
State = cbChecked
TabOrder = 4
end
end
object Panel5: TPanel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
Left = 4
Height = 38
Top = 8
Width = 80
AutoSize = True
BorderSpacing.Left = 4
BorderSpacing.Top = 8
BevelOuter = bvNone
ClientHeight = 38
ClientWidth = 80
TabOrder = 12
object edtMaxLevel: TEdit
AnchorSideLeft.Control = Panel5
AnchorSideTop.Control = lblMaxLevel
AnchorSideTop.Side = asrBottom
Left = 0
Height = 23
Top = 15
Width = 80
TabOrder = 0
Text = '2'
end
object lblMaxLevel: TLabel
AnchorSideLeft.Control = Panel5
AnchorSideTop.Control = Panel5
Left = 0
Height = 15
Top = 0
Width = 53
Caption = 'Max Level'
ParentColor = False
end
end
object Panel8: TPanel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel9
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 26
Top = 468
Width = 189
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
BevelOuter = bvNone
ClientHeight = 26
ClientWidth = 189
TabOrder = 13
object lblInfo: TLabel
Left = 0
Height = 15
Top = 11
Width = 189
Align = alBottom
Caption = 'Info'
ParentColor = False
end
end
object Panel9: TPanel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = edtAlignsize
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 0
Height = 39
Top = 429
Width = 189
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BevelOuter = bvNone
ChildSizing.LeftRightSpacing = 8
ChildSizing.HorizontalSpacing = 8
ChildSizing.EnlargeHorizontal = crsHomogenousSpaceResize
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 39
ClientWidth = 189
TabOrder = 14
object btnNewScan: TButton
AnchorSideLeft.Side = asrCenter
Left = 10
Height = 25
Top = 7
Width = 80
AutoSize = True
BorderSpacing.Top = 7
BorderSpacing.Bottom = 7
Caption = 'New Scan'
Constraints.MinWidth = 80
OnClick = miNewScanClick
TabOrder = 0
Visible = False
end
object btnScan: TButton
AnchorSideLeft.Side = asrCenter
Left = 100
Height = 25
Top = 7
Width = 80
AutoSize = True
BorderSpacing.Left = 7
BorderSpacing.Top = 7
BorderSpacing.Right = 4
BorderSpacing.Bottom = 7
Caption = 'Scan'
Constraints.MinWidth = 80
OnClick = btnScanClick
TabOrder = 1
end
end
object cbReuseStringmap: TCheckBox
AnchorSideLeft.Control = rbStringscan
AnchorSideTop.Control = rbStringscan
AnchorSideTop.Side = asrBottom
Left = 20
Height = 19
Top = 273
Width = 140
BorderSpacing.Left = 16
Caption = 'Use existing stringmap'
Checked = True
OnChange = cbReuseStringmapChange
State = cbChecked
TabOrder = 15
end
end
object Panel2: TPanel
Left = 189
Height = 494
Top = 0
Width = 624
Align = alClient
BevelOuter = bvNone
ClientHeight = 494
ClientWidth = 624
TabOrder = 1
object ListView1: TListView
Left = 0
Height = 358
Top = 136
Width = 624
Align = alClient
Columns = <>
HideSelection = False
OwnerData = True
PopupMenu = pmPointerfile
ReadOnly = True
RowSelect = True
TabOrder = 0
ViewStyle = vsReport
OnCustomDrawItem = ListView1CustomDrawItem
OnData = ListView1Data
OnDblClick = ListView1DblClick
end
object Panel3: TPanel
Left = 0
Height = 136
Top = 0
Width = 624
Align = alTop
AutoSize = True
BevelOuter = bvNone
ClientHeight = 136
ClientWidth = 624
TabOrder = 1
OnClick = Panel3Click
object lblExtra: TLabel
AnchorSideLeft.Control = Panel6
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel6
Left = 133
Height = 15
Top = 8
Width = 90
BorderSpacing.Left = 6
Caption = 'Compare against'
ParentColor = False
end
object edtExtra: TEdit
AnchorSideLeft.Control = lblExtra
AnchorSideTop.Control = lblExtra
AnchorSideTop.Side = asrBottom
Left = 133
Height = 23
Top = 23
Width = 127
OnChange = edtExtraChange
TabOrder = 0
end
object cbHasShadow2: TCheckBox
AnchorSideLeft.Control = lblExtra
AnchorSideTop.Control = edtExtra
AnchorSideTop.Side = asrBottom
Left = 133
Height = 19
Hint = 'Use this if you''re spidering a previously saved memory region that currently resides in a different location.'#13#10'Most commonly used for stacks where stack pointers point to it''s own structure'
Top = 48
Width = 85
BorderSpacing.Top = 2
Caption = 'Has Shadow'
OnChange = cbHasShadowChange
ParentShowHint = False
ShowHint = True
TabOrder = 1
end
object edtShadowAddress2: TEdit
AnchorSideLeft.Control = lblExtra
AnchorSideTop.Control = cbHasShadow2
AnchorSideTop.Side = asrBottom
Left = 133
Height = 23
Top = 67
Width = 127
OnChange = edtBaseChange
TabOrder = 2
Visible = False
end
object lblsize2: TLabel
AnchorSideLeft.Control = lblExtra
AnchorSideTop.Control = edtShadowAddress2
AnchorSideTop.Side = asrBottom
Left = 133
Height = 15
Top = 90
Width = 20
Caption = 'Size'
ParentColor = False
Visible = False
end
object edtShadowSize2: TEdit
AnchorSideLeft.Control = lblExtra
AnchorSideTop.Control = lblsize2
AnchorSideTop.Side = asrBottom
Left = 133
Height = 23
Top = 105
Width = 80
BorderSpacing.Bottom = 8
OnChange = edtBaseChange
TabOrder = 3
Visible = False
end
object Panel6: TPanel
AnchorSideLeft.Control = Panel3
AnchorSideTop.Control = Panel3
Left = 0
Height = 120
Top = 8
Width = 127
AutoSize = True
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
BevelOuter = bvNone
ClientHeight = 120
ClientWidth = 127
TabOrder = 4
object edtShadowSize: TEdit
AnchorSideLeft.Control = lblSize
AnchorSideTop.Control = lblSize
AnchorSideTop.Side = asrBottom
Left = 0
Height = 23
Top = 97
Width = 80
OnChange = edtBaseChange
TabOrder = 0
Visible = False
end
object lblSize: TLabel
AnchorSideLeft.Control = Panel6
AnchorSideTop.Control = edtShadowAddress
AnchorSideTop.Side = asrBottom
Left = 0
Height = 15
Top = 82
Width = 20
Caption = 'Size'
ParentColor = False
Visible = False
end
object edtShadowAddress: TEdit
AnchorSideLeft.Control = cbHasShadow
AnchorSideTop.Control = cbHasShadow
AnchorSideTop.Side = asrBottom
Left = 0
Height = 23
Top = 59
Width = 127
OnChange = edtBaseChange
TabOrder = 1
Visible = False
end
object cbHasShadow: TCheckBox
AnchorSideLeft.Control = Panel6
AnchorSideTop.Control = edtBase
AnchorSideTop.Side = asrBottom
Left = 0
Height = 19
Hint = 'Use this if you''re spidering a previously saved memory region that currently resides in a different location.'#13#10'Most commonly used for stacks where stack pointers point to it''s own structure'
Top = 40
Width = 85
BorderSpacing.Top = 2
Caption = 'Has Shadow'
OnChange = cbHasShadowChange
ParentShowHint = False
ShowHint = True
TabOrder = 2
end
object edtBase: TEdit
AnchorSideLeft.Control = Panel6
AnchorSideTop.Control = lblBaseRegion
AnchorSideTop.Side = asrBottom
Left = 0
Height = 23
Top = 15
Width = 127
OnChange = edtBaseChange
TabOrder = 3
end
object lblBaseRegion: TLabel
AnchorSideLeft.Control = Panel6
AnchorSideTop.Control = Panel6
Left = 0
Height = 15
Top = 0
Width = 61
Caption = 'Base region'
ParentColor = False
end
end
object Panel7: TPanel
AnchorSideLeft.Control = edtExtra
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel3
AnchorSideRight.Control = Panel3
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel3
AnchorSideBottom.Side = asrBottom
Left = 268
Height = 136
Top = 0
Width = 356
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
BorderSpacing.Left = 8
BevelOuter = bvNone
ClientHeight = 136
ClientWidth = 356
TabOrder = 5
object lblvds: TLabel
AnchorSideTop.Control = Panel7
AnchorSideRight.Control = Panel7
AnchorSideRight.Side = asrBottom
Left = 249
Height = 15
Top = 8
Width = 107
Anchors = [akTop, akRight]
BorderSpacing.Top = 8
Caption = 'Variable display type'
ParentColor = False
end
object comboType: TComboBox
AnchorSideTop.Control = lblvds
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel7
AnchorSideRight.Side = asrBottom
Left = 232
Height = 23
Top = 23
Width = 124
Anchors = [akTop, akRight]
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'String'
'1 Byte'
'2 Bytes'
'4 Bytes'
'8 Bytes'
'Float'
'Double'
'Pointer (hex)'
)
OnChange = comboTypeChange
Style = csDropDownList
TabOrder = 0
Text = 'String'
end
end
end
end
object ProgressBar1: TProgressBar
Left = 0
Height = 20
Top = 494
Width = 813
Align = alBottom
Max = 1000
TabOrder = 2
end
object SaveDialog1: TSaveDialog
DefaultExt = '.sptr'
Filter = 'String pointer (*.sptr)|*.sptr'
Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail]
Left = 480
Top = 64
end
object MainMenu1: TMainMenu
Images = spImageList
Left = 197
Top = 168
object MenuItem1: TMenuItem
Caption = 'File'
object MenuItem7: TMenuItem
Caption = 'New Window'
ImageIndex = 0
OnClick = MenuItem7Click
end
object MenuItem4: TMenuItem
Caption = '-'
end
object miNewScan: TMenuItem
Caption = 'New scan'
ImageIndex = 1
OnClick = miNewScanClick
end
object miOpen: TMenuItem
Caption = 'Open'
ImageIndex = 2
OnClick = miOpenClick
end
end
object MenuItem5: TMenuItem
Caption = 'Rescan'
Visible = False
object MenuItem6: TMenuItem
Caption = 'Filter pointerlist'
OnClick = MenuItem6Click
end
end
end
object OpenDialog1: TOpenDialog
DefaultExt = '.sptr'
Filter = 'String pointer (*.sptr)|*.sptr'
Left = 552
Top = 64
end
object statusupdater: TTimer
Enabled = False
Interval = 500
OnTimer = statusupdaterTimer
Left = 464
Top = 208
end
object pmPointerfile: TPopupMenu
Images = spImageList
Left = 400
Top = 112
object miClearCache: TMenuItem
Caption = 'Clear pointer cache'
ImageIndex = 4
OnClick = miClearCacheClick
end
object miFind: TMenuItem
Caption = 'Find...'
ImageIndex = 3
ShortCut = 16454
OnClick = miFindClick
end
object miFindNext: TMenuItem
Caption = 'Find Next'
Enabled = False
ShortCut = 114
OnClick = FindDialog1Find
end
end
object FindDialog1: TFindDialog
Options = [frDown, frHideWholeWord, frHideUpDown, frDisableUpDown, frHideEntireScope, frHidePromptOnReplace]
OnFind = FindDialog1Find
Left = 268
Top = 243
end
object spImageList: TImageList
Left = 430
Top = 307
Bitmap = {
4C7A050000001000000010000000B10300000000000078DADD966B4853611880
AD4565A44951FD8894CA6E14FD48BA43A09949D6BF88022DC14C0B21A421A158
C3CD9C792B0BC5DB9C4BA7194E837029C3164E33EC62D27096B5E5654E4B3092
79DFDBF79EB53AADB39367F387F6C2C377F6BDEFF39DEFBCE7DB9826612B1832
76B293421012520949845BD65173CDEA42891F3BD9849B845C829090671D0D22
B24E6E0040D30D7634CCA06BA8B808CE06BAACFE40BB1567FDEA702BF3C5EF69
06A8BBFA1BA9BF15FA1CD638F2DF3F06B81FF49B827D56E87358F3BFF6CF3E3A
6AAC38EBCFE0FC6A4407C05019E314E892709B938C0C7882FC848102AFB9FADF
8D5ED4EF0C82D773DDC767C43A1BFD6D3EBF7CBCA6E798FA817DB2D5FF0BAC9D
6DDFD5FDCFF7F737DBE7778EA1EBD4AD3F1CEB5767329938F7029D83B7B769F7
BF5B0BC16907D42323234B66EA626DA078EF3374917DED6BE0B438A4626A6A6A
01E6331F560BB2EB9E5228540D27EDFDA0B301777C533D4D7E9AD5948FE32691
A7E9FCA5B038CCEFAF6A8010A385C2FFC5C7E99CCAAA48FB350C06C3D21DF295
948F237EB6E5E83E72E4750F041555BE3D5EA26823BC09CE97B704644B5ED0FD
888CBB12473E13C17A33D0FD63F9F2B6D9F67D73AAC02BAB9A9115190A582614
C2F23411357A5C2F1ADD2894B66D8FE0ABD03FF6E11B2C4EAB81458F7A387136
5B9687FE2E592DF0AA3F7372790F3AA1A6F64920FAABD22B39DFDBF38674606C
6C8CB73335177805CF39FB61F74A73B07F5EE76239BBBCF20EB277A53FFA1BCE
446B492F755CD87E45D842F6BE70B6BEDB52A9345C2010A8FF059FCF7FAA52A9
F6D8FB242798E97F96A8A828A34EA75BE7AC6F369B213434F4E5F0F0B03B9B5F
5F5F0F62B118D2D3D3A951A954FECAF5F5F58148248A63F2474747213131111A
1B1BFF58AFB9B919121212A8FB63FC74FEF2535252A0BFBF9F71EF838383785F
877E6F6F2F141616B23EBF4C2603BD5ECFE82B140AE8EAEA62F5BBBBBBA1BCBC
9CD12F2B2B03A3D1C8EA0F0D0D41717131A3DFDADA4AF59D2DD46A3534353531
FA168B05E2E3E3A9D151607E7A7ADA61FFB55A2D242727C3C4C4C41FDEE4E424
F5FE44E4F78BEDFD61607F85A42E3333134A4B4B212B2B0B929292402291808F
B73794488A587D5B8C8F8F536701475BD4296B618B873BF02F47DF75E6FC6334
D43E06EF456E968AA2C2535CBEBF7462222FE4B4BF7AB979BEFF2FA1F3F50B78
4486815CFF09BCED73388739AC71E4637EF75680A387E0137D0DBCC639CC618D
239F5E675B83698EED19ECEBB9B84C6B70755DF55DD9BFABFD73F5FDB97A7EE6
233F00469623A3
}
end
end