Skip to content

Instantly share code, notes, and snippets.

@u-makino
Created November 9, 2022 23:19
Show Gist options
  • Save u-makino/ca96491a0fd4ca8f61f134033faa412f to your computer and use it in GitHub Desktop.
Save u-makino/ca96491a0fd4ca8f61f134033faa412f to your computer and use it in GitHub Desktop.

注意事項

このチートテーブルおよびLua Scriptを使用するには、
OSないしコンピューターそのものを破壊 しうる、
非常に危険なプログラムを実行する必要があります。

少なくとも、適当に弄ってたらブルスク連発やらOS再インストールやらは日常茶飯事です(n敗)。
実行は 自己責任 にてお願いします。

使用するソフトウェア

PSP用エミュレータ“PPSSPP”と、
Windows用メモリエディタ/デバッガ“Cheat Engine”
を併用します。

後者に関しては、最新版=英語版ということになりますが、 OSやCPUの動作にさえ干渉する非常に不安定なプログラムのため、 英語苦手勢であっても最新版を利用することを強く強く推奨します。 スマホの翻訳アプリでも使いながら利用してください。私はそうしました(英語苦手勢)。

CheatEngine初回起動時のチュートリアルは、最初のほうだけでも真面目にやっておくことを推奨します。

あと、エミュレータで実行可能なFate/EXTRAのゲームデータが必要です。 手持ちのゲームをエミュレータ用に取り出す方法?ググれ。

予備知識

“Cheat Engine”は、起動中の他のWindowsタスクプロセスに対して、
特定のメモリアドレスの値を書き換えたり、
Lua Scriptを使ってマクロを実行したり、
アセンブラコードを表示したりデバッグしたり、
その他なんかすげー色々な事ができる解析用ソフトウェアです。

PSPエミュレータであるPPSSPPもWindows用ソフトには違いないため、 Cheat Engineを使用して、やや強引にチートコードの解析や実行が可能です。

配布しているチートテーブルには、HPや手番、その他調査に必要だった各種パラメータの、 実際の値を格納しているアドレスリストと、それらを監視/改竄しつつ、 キーボードの押下処理を実行するLua Scriptを含んでいます。

なお、PPSSPPにはデフォルトでチート実行機能やメモリデバッガがついていますが、 (2021年時点では)機能的に貧弱で使い物にならなかったので、見なかった事にします。

事前準備

初手でいきなり配布されているチートテーブルを読み込んではいけません。 ましてやLua Scriptを実行してはいけません。最悪OSが破壊されます。マジで。

ダウンロードした直後のチートテーブルは、ほぼ100%動作しません。 何故かというと、Cheat EngineはPPSSPPがエミュレートしている「ゲーム」ではなく、 PPSSPPという「ソフトウェアそのもの」のメモリ開始アドレスしか知らないためです。

つまり、PPSSPPのバージョンが違う、実行しているパソコンが違うなどの理由で、 HPなどの情報が格納されるメモリアドレスがズレると、まったく正常に動作しなくなるという事です。

よって、まず最初に
「『ゲームデータが格納されているアドレス』の基準となるアドレス」
を探して、設定する必要があります。

  • 一応、アセンブラコードの並びから自動検索させるような手法が無いわけでは無いっぽいけど、過ぎた魔術は身を滅ぼすと言いますか…(上手くいかなかったので投げた)

PPSSPP側の準備

  • PPSSPP上でFate/EXTRAを起動し、「デバッグ」→「メモリビューワ」を開きます。
  • PSP上で使用されるメモリ領域の種類ごとにショートカットがあるはずなので、「0x08800000 (User memory)」にジャンプします。
    • PSP上で「ゲームが」使用可能なアドレス領域はこれ以降なので、この先頭のアドレスが基準としては最適です。
      • より厳密にいえば先頭のほうは予備アドレスで、ゲーム側は使用できないので、高度なチートプログラムを実行する場合に変数領域代わりに使ったりできます。
  • 後々目印にするため、08800000の行をすべて「11」や「22」などで埋めます。
    • 「11 45 14 19 19」とかにするとエンディアン変換で混乱します(1敗)
  • 以下、“Cheat Engine側の準備”を完了するまで、ゲームを起動したままにしておきます。
    • 諸々の確認のため、ゲームはある程度進めておくとベターです。鯖はたぶんキャスターがええ。他の鯖で動くか試してないし。

Cheat Engine側の準備

  • Cheat Engineを起動します。
  • 起動直後にチュートリアルが実行されるので、せめてアセンブラコード云々のあたりまでは指示に従ってチュートリアルを行うことを強く強く推奨します。
    • 英語が読めない?スマホの翻訳アプリ使え。
    • 以下、チュートリアルやってりゃ理解できることは説明を省きます。
  • Edit > Settings > Scan Settingsから「MEM_MAPPED」を有効にします
    • これは、検索のし易さや処理負荷軽減のために「あまり有用でないと思われるアドレス領域」がデフォルトで検索対象外になっており、今回探したいゲームデータがそこに含まれているためです。
    • 余裕がある場合はほかの設定項目も確認するべきですが、前述したように下手すりゃOSごとぶっ壊れるような代物なので、変更する場合は必ず設定項目の意味を1つ1つ調べながら行って下さい。
  • PPSSPPのプロセスにフックします。
  • 「Array of byte」「Exact Value」で「11111111111111111111111111111111」など、先ほどPPSSPP側で入力した値で検索します
    • メモリの中身は、厳密には行ごとに区切られたりしてる訳じゃないので、開始位置がズレないようにキッチリ同じ値で検索しましょう
  • PPSSPP側で値を書き換えるなどして値を4つぐらいまで絞り込みます。
  • その中のいずれかが「現在の」ゲームの先頭アドレス(ベースアドレス)なので、メモっておきます。
  • New Scanで「8 Bytes」「Exact Value」で、先ほどメモったアドレスを検索します。
    うまくいけば、 PPSSPPWindows64.exe+XXXXXX 的な、静的アドレス(ソフトウェアを起動し直しても変動しないアドレス)が得られるはずです。その値をメモっておきます。

上記の手順を完了したあと、以下を実行します。

  • 配布中のチートテーブルを開きます
    • 初回実行時のスクリプトは開くたびに1回だけ実行して下さい
      • 中身はLua Script書いたりチートコード調べたりするために、投稿者が適当に書いたりCEフォーラムから拾ってきたりしたやつで、害は無いです。
        • というか害があるかを判断できない人はこんなソフト触っちゃダメなのでは…?
  • Address Listの「BaseAddress」のAddress(Valueではありません)を、先ほど調べた PPSSPPWindows64.exe+XXXXXX に置き換えます。
  • 上手くいけば、「PlayerHP」などのValueに、現在HPなどが表示されるようになっているはずです。
    • Enemy関連などはおかしな値が表示されたままだと思いますが、少なくとも「PlayerHP/MP」「PPT」「Player Status」あたりは、基本的に常に正常な値になっているはずです。

この時点で、HPなどが正常に表示されていない場合、何かしらの異常が発生しているため、 絶対にこの先の手順を実行しないで下さい。

  • 上手くいかなかった場合、その原因は投稿者には特定しようがないので、頑張って!(無責任)
    • Cheat Engineのチュートリアルの中でやったように、現在HPなどを検索してそのアドレスをFind out what writes to this addressして、引っかかったログの中からベースアドレスっぽいものを探していくのも一手です。
      • 一応補足しておくと、Fate/EXTRAは恐らくほぼすべての主要データに「BaseAddress+XXXXXX」という1段階の相対アドレスでアクセス可能なため、割とわかりやすいです。たぶん。
        • ゲームによっては「BaseAddress+XXXXXXに格納されているデータをメモリアドレスとして扱い、そこからさらに+XXXXXX」みたいなことを何度も繰り返して漸く目的のデータにたどり着くようなのもあるらしい。めんどくせえ。
    • バージョン違いによってアドレスがズレるかは未確認ですが、そもそも早期に出荷されたUMD版を直接吸い出した場合を除いてver1.01しか出回ってないと思う。念のために言うと日本語版です。
    • もしかしたら「吸い出し方」によってアドレスがズレる可能性はあるかも。少なくとも投稿者は何種類か吸い出し方を試して全部同じハッシュ値にできたので、色々試してみて下さい。

実行手順

以下は 事前準備 を終わらせ、自分のサーヴァントのHPなどが Cheat Engine上で正常に表示されるようになっていることを前提とします。 そうでない場合、 最悪OSが破壊されます。マジで。

  • PPSSPPの設定で、○ボタンを「C」キー、×ボタンを「X」キー、十字キーを矢印キーに割り当てていることを確認します。
    • 気に入らん場合は自分でLua Script書き換えてくだち
  • PPSSPP上でゲームを進行し、ボス戦までゲームを進めます。
    • 配布中のチートテーブルでは2回戦以降にしか対応していません
    • まあHPチートとか駆使すれば一瞬じゃろ?
  • 配布中のチートテーブルを開き、PPSSPPのプロセスにフックします。
    • Cheat Engine上でPlayerHPとかがちゃんと表示されてるか確認!(しつこい)
  • ボス戦の最中に、おもむろに「Auto battle BOT」を有効化します。
  • うまくいけば、スクリプトウィンドウに「経過ターン,残りHP,最大HP,1手目,2手目,3手目,4手目,5手目,6手目」と表示されます。
    • エラーが出た場合、すみやかにAuto battle BOTのチェックを外し、無効化して下さい。
  • PPSSPPのウィンドウにフォーカスすると、戦闘が自動で開始され、相手の行動パターンがメモされます。

その他細かい設定

ソースコードとかテーブルとかめっちゃ綺麗に整理してるし(当社従来品比)、見ればわかるじゃろ?
大半の設定はAuto battle BOTのスクリプトの上部に纏めてるんで、適宜調整して下さい。

自分で色々弄ってみたくなった場合は、とりあえずCheatEngineの公式wiki読むのがおすすめ。 あとCheat Engineフォーラム。

<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="42">
<CheatEntries>
<CheatEntry>
<ID>134598</ID>
<Description>"# Note"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134767</ID>
<Description>"PPSSPP (Win64) v1.12.3.1007 -- 2022/03/24"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134766</ID>
<Description>"Cheat Engine (x64) SSE4 7.4 -- 2022/01/18"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134769</ID>
<Description>"**Required** : Edit &gt; Settings &gt; Scan Settings &gt; ☑MEM_MAPPED"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134785</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134650</ID>
<Description>"┌-Memory Scan Options───────────┐"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134762</ID>
<Description>"│┃ All 🔽┃│"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134758</ID>
<Description>"│Start┃ [(BaseAddress)]+8800000 ┃│"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134757</ID>
<Description>"│Stop ┃ [(BaseAddress)]+8800000+1800000 ┃│"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134759</ID>
<Description>"│☑Writable ☒Executable │"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134760</ID>
<Description>"│□CopyOnWrite │"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134761</ID>
<Description>"│☑Fast Scan ┃ 4 ┃ 🔘Alignment │"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134764</ID>
<Description>"└─────────────────────┘"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134786</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134587</ID>
<Description>"# Scripts"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134472</ID>
<Description>"* Hide CE scan UI"</Description>
<Color>800080</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>[ENABLE]
{$lua}
function killui()
control_setVisible(wincontrol_getControl(MainForm,3), false)
end
{$asm}
luaCall(killui())
[DISABLE]
{$lua}
function restoreui()
control_setVisible(wincontrol_getControl(MainForm,3), true)
end
{$asm}
luaCall(restoreui())
</AssemblerScript>
</CheatEntry>
<CheatEntry>
<ID>134566</ID>
<Description>"* Auto battle BOT"</Description>
<Options moHideChildren="1"/>
<Color>800080</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{$lua}
if syntaxcheck then return end
if(not MainForm.botTimer) then
MainForm.botTimer = createTimer(MainForm, false)
assert(MainForm.botTimer, 'Timer is not started.')
elseif(MainForm.botTimer.OnTimer) then
MainForm.botTimer.setEnabled(false)
MainForm.botTimer.OnTimer = nil
debug_dump('botTimer: disabled')
debug_dump('mainTicker: removed')
end
{$asm}
[ENABLE]
{$lua}
-- ** Required *****************************
local TARGET_PROCESS = 'PPSSPPWindows64.exe'
local TARGET_GAME_ID = 'NPJH50247' -- or 'Fate/EXTRA', etc.
-- *****************************************
-- ++ Optional ++++++++++++++++++++
local INPUT_KEYBOARD = true -- Please modify to environment
local KEYCODE_ENTER_BTN = 67 -- C:67
local KEYCODE_CANCEL_BTN = 88 -- X:88
local KEYCODE_ARROW_ABG_BTN = 37 -- Left:37 (Up:38 Right:39)
local KEYCODE_RESTART_BTN = nil -- Del:46 (fallback to ENTER_BTN)
local CHECK_TURN_COUNT = true
local SKIP_STATE = false
local REPLACE_PLAYER_HP = false
local REPLACE_ENEMY_HP = true
local SEAL_ENEMY_HAND = nil -- 'abg','skill','all' or nil
local PLAYER_SUICIDE_TURN = 999 -- 0,1,2,... or nil
-- ++++++++++++++++++++++++++++++++
-- == etc =========================
local TICK_INTERVAL = 40
local KEYDOWN_INTERVAL = 40
local KEYUP_INTERVAL = 20
local SCENE_STATE_INITIAL = '1'
local SCENE_STATE_PREPARATION = '3'
local SCENE_STATE_ENABLE = '4'
local SCENE_STATE_TRANSITION = '2'
local SCENE_STATE_PROGRESS = '5'
local SCENE_STATE_CONTINUE = '0'
-- ================================
-- Deprecated ---------------------
local LOG_TYPE = 'hand' -- 'hand' or 'damage'
local TARGET_STAGE_SUFFIX = '' -- (Another)
local SKIP_STATE_AGGRESSIVE = false
local CHECK_AGGRESSIVE = false
-- --------------------------------
local TARGET_STAGE_PREFIX = 'Stage'
local TARGET_STAGE_DESCRIPTIONS = {'TargetStage', 'TargetStage_sub1', 'TargetStage_sub2'}
local TARGET_STAGE_VALIDATOR = {
[1]={Description=TARGET_STAGE_PREFIX..'1'},
[2]={Description=TARGET_STAGE_PREFIX..'2'},
[3]={Description=TARGET_STAGE_PREFIX..'4'},
[4]={Description=TARGET_STAGE_PREFIX..'4(Another)'},
[5]={Description=TARGET_STAGE_PREFIX..'5'},
[6]={Description=TARGET_STAGE_PREFIX..'6'},
[7]={Description=TARGET_STAGE_PREFIX..'7'},
[8]={Description=TARGET_STAGE_PREFIX..'8'},
}
local targetStage = nil
local playerHPActive = nil
local enemyHPActive = nil
local initFlg = true
local lastDamage = nil
local lastPosition = nil
local lastTurn = nil
local lastPrint = nil
local nowPrint = nil
local sealFlg = nil
local playerHPRecord = nil
local playerMaxHPRecord = nil
local turnCountRecord = nil
local handCursorPosition = nil
local sceneStateRecord = nil
local enemyHPRecord = nil
local enemyMaxHPRecord = nil
local enemyHand = nil
local damageLog = nil
-- 初期値セット
local function resetParams()
sealFlg = nil
lastDamage = nil
lastPosition = nil
lastTurn = nil
lastPrint = nil
nowPrint = nil
if(playerHPRecord.Value == '0' or not playerHPActive) then
playerHPRecord.Value = playerMaxHPRecord.Value
end
if(not enemyHPActive) then
enemyHPRecord.Value = enemyMaxHPRecord.Value
end
end
local function checkForeground(detail)
if(not detail) then
return getForegroundProcess() == getOpenedProcessID()
end
local foregroundWindow = getForegroundWindow()
return (getWindowProcessID(foregroundWindow) == getOpenedProcessID()
and string.find(getWindowCaption(foregroundWindow), TARGET_GAME_ID, 1, true))
end
local function checkProcess(detail)
-- プロセス情報が無ければアタッチ
if(getOpenedProcessID() == 0) then
if(not OpenProcess(TARGET_PROCESS)) then
error('Target process is not found. TARGET_PROCESS: ' .. tostring(TARGET_PROCESS))
end
debug_dump('Debug: process attached')
end
-- PPSSPPプロセスが最前面ならBOT実行可能
if(checkForeground(detail)) then
return true
end
-- 最前面でない場合は念のためプロセス確認
if(not getProcessList()[getOpenedProcessID()]) then
detachIfPossible()
debug_dump('Debug: target process lost')
local newProcessID = getProcessIDFromProcessName(TARGET_PROCESS)
if(newProcessID ~= getOpenedProcessID()
and getProcessList()[newProcessID]) then
debug_dump('Debug: retry...')
if(readInteger(process) == nil
and not OpenProcess(newProcessID)) then
error('Target process is not found. TARGET_PROCESS: ' .. tostring(TARGET_PROCESS))
end
end
end
if(not INPUT_KEYBOARD) then
return true
end
return false
end
local function searchStageRecord(parentRecord, stage)
for i=0, (parentRecord.Count or #parentRecord), 1 do
if(parentRecord[i]) then
if parentRecord[i].Description == tostring(TARGET_STAGE_PREFIX .. (tostring(stage) .. TARGET_STAGE_SUFFIX)) or parentRecord[i].Description == (TARGET_STAGE_PREFIX .. (tostring(stage) .. TARGET_STAGE_SUFFIX)) then
return parentRecord[i]
end
end
end
return nil
end
local function getStageRecord(parentRecord, validTargetStage)
local resultRecord = nil
if(targetStage) then
assert(targetStage == validTargetStage, 'invalidate target stage (' .. tostring(validTargetStage) .. ') targetStage: ' .. tostring(targetStage))
resultRecord = searchStageRecord(parentRecord, targetStage)
if(resultRecord ~= nil) then
return resultRecord
end
debug_dump('Debug: Stage changed')
end
for k,v in pairs(TARGET_STAGE_DESCRIPTIONS) do
v = AddressList.getMemoryRecordByDescription(v)
if(v and v.Value) then
resultRecord = searchStageRecord(parentRecord, v.Value)
if(resultRecord ~= nil) then
if(targetStage ~= nil and validTargetStage ~= v.Value) then
error('invalidate target stage (' .. tostring(validTargetStage) .. ') targetStage: ' .. tostring(targetStage))
end
targetStage = v.Value
debug_dump('Debug: Stage: ' .. tostring(targetStage))
return resultRecord
end
end
end
targetStage = nil
return nil
end
-- 敵行動封印
local function sealEnemy()
for i=0, enemyHand.Parent.Parent.Count-1, 1 do
if(SEAL_ENEMY_HAND == 'all') then
sealFlg = true
elseif(SEAL_ENEMY_HAND == 'skill') then
sealFlg = (enemyHand[i].NumericalValue &gt; 19)
elseif(SEAL_ENEMY_HAND == 'abg') then
sealFlg = (enemyHand[i].NumericalValue &lt; 20)
else
error("Can only be used with 'abg','skill','all' or nil. SEAL_ENEMY_HAND: " .. tostring(SEAL_ENEMY_HAND))
end
if(sealFlg) then
enemyHand[i].Value = '0'
end
end
end
-- メインルーチン
local function mainTick()
-- ダメージログ確認
if(LOG_TYPE == 'damage') then
local nowDamage = damageLog.NumericalValue -- math.max(playerDamage.NumericalValue, enemyDamage.NumericalValue, playerPoisonDamage.NumericalValue, enemyPoisonDamage.NumericalValue)
local nowPosition = handCursorPosition.Value
-- GUARD対ATTACKの対応は面倒臭そうなので1桁ダメージ丸ごと無視
-- 後半ボスに使えないなこれだと
local forwardFlg = lastDamage ~= nowDamage or lastPosition ~= nowPosition
if(LOG_TYPE == 'damage' and nowDamage &gt;= 10 and forwardFlg) then
print(turnCountRecord.Value .. ','
.. nowPosition .. ','
.. enemyHPRecord.Value .. ','
.. enemyMaxHPRecord.Value .. ','
.. tostring(nowDamage))
lastDamage = nowDamage
lastPosition = nowPosition
end
end
if(CHECK_AGGRESSIVE) then
nowPrint = enemyMaxHPRecord.Value .. ','
.. enemyHand[0].Value .. ','
.. enemyHand[1].Value .. ','
.. enemyHand[2].Value .. ','
.. enemyHand[3].Value .. ','
.. enemyHand[4].Value .. ','
.. enemyHand[5].Value
if(nowPrint ~= lastPrint) then
lastPrint = nowPrint
print(',,,,,,,,,' .. turnCountRecord.Value .. ','
.. enemyHPRecord.Value .. ','
.. lastPrint)
end
end
local nextHPRecordActive = false
-- コマンド入力待機時に特定の値を取るアドレスをチェックする
if(sceneStateRecord.Value == SCENE_STATE_INITIAL) then
if(turnCountRecord.Value == '0') then
resetParams()
end
elseif(sceneStateRecord.Value == SCENE_STATE_CONTINUE) then
if(lastTurn and turnCountRecord.Value == '0') then
if(KEYCODE_RESTART_BTN) then
keyDown(KEYCODE_RESTART_BTN)
Sleep(KEYDOWN_INTERVAL)
keyUp(KEYCODE_RESTART_BTN)
else
keyDown(KEYCODE_ENTER_BTN)
Sleep(KEYDOWN_INTERVAL)
keyUp(KEYCODE_ENTER_BTN)
end
Sleep(KEYUP_INTERVAL)
if(sceneStateRecord.Value ~= SCENE_STATE_CONTINUE) then
resetParams()
end
end
elseif(sceneStateRecord.Value == SCENE_STATE_TRANSITION
or sceneStateRecord.Value == SCENE_STATE_PROGRESS) then
if(SEAL_ENEMY_HAND and sealFlg == nil) then
sealEnemy()
end
if(SKIP_STATE and SKIP_STATE_AGGRESSIVE) then
local skipProgressFlg = true
local addPosition = 0
lastPosition = handCursorPosition.NumericalValue
if(SEAL_ENEMY_HAND == 'all') then
addPosition = 6 - lastPosition
end
while(skipProgressFlg and addPosition + lastPosition &lt; 5) do
if(SEAL_ENEMY_HAND == 'skill' and enemyHand[addPosition+lastPosition].NumericalValue &gt; 19
and enemyHand[addPosition+lastPosition+1].NumericalValue &gt; 19) then
addPosition = addPosition + 1
elseif(SEAL_ENEMY_HAND == 'abg' and enemyHand[addPosition+lastPosition].NumericalValue &lt; 20
and enemyHand[addPosition+lastPosition+1].NumericalValue &lt; 20) then
addPosition = addPosition + 1
else
skipProgressFlg = false
end
end
if(addPosition+lastPosition &gt; 5) then
handCursorPosition.Value = 7
elseif(addPosition &gt; 0) then
handCursorPosition.Value = addPosition+lastPosition
end
end
nextHPRecordActive = true
end
if(nextHPRecordActive ~= playerHPRecord.Active and not playerHPActive) then
playerHPRecord.Active = nextHPRecordActive
end
if(nextHPRecordActive ~= enemyHPRecord.Active and not enemyHPActive) then
enemyHPRecord.Active = nextHPRecordActive
end
-- 入力待機待ちSTATE以外は終了
if(sceneStateRecord.Value ~= SCENE_STATE_ENABLE) then
if(REPLACE_PLAYER_HP
and (turnCountRecord.NumericalValue &lt; PLAYER_SUICIDE_TURN or not PLAYER_SUICIDE_TURN)
and (playerHPRecord.Value == '0' or not playerHPActive)) then
playerHPRecord.Value = playerMaxHPRecord.NumericalValue
end
return
end
-- 念のためキー入力状況チェック
while(INPUT_KEYBOARD and handCursorPosition.Value ~= '0' and not SKIP_STATE) do
if(not checkForeground(false)) then
break
end
keyDown(KEYCODE_CANCEL_BTN)
Sleep(KEYDOWN_INTERVAL)
keyUp(KEYCODE_CANCEL_BTN)
Sleep(KEYUP_INTERVAL)
end
-- 敵HP調整
-- この場合HP1%刻みで各10ターン
if(REPLACE_ENEMY_HP and not enemyHPActive) then
enemyHPRecord.Value = math.ceil(100 - ((turnCountRecord.Value) / 10)) / 100 * enemyMaxHPRecord.Value
end
-- 敵行動メモ
if(LOG_TYPE == 'hand' and (lastTurn ~= turnCountRecord.Value or not CHECK_TURN_COUNT)) then
lastTurn = turnCountRecord.Value
lastPrint = enemyMaxHPRecord.Value .. ','
.. enemyHand[0].Value .. ','
.. enemyHand[1].Value .. ','
.. enemyHand[2].Value .. ','
.. enemyHand[3].Value .. ','
.. enemyHand[4].Value .. ','
.. enemyHand[5].Value
print(turnCountRecord.Value .. ','
.. enemyHPRecord.Value .. ','
.. lastPrint)
end
-- しのせんこく
if(PLAYER_SUICIDE_TURN and turnCountRecord.NumericalValue &gt;= PLAYER_SUICIDE_TURN) then
playerHPRecord.Value = '0'
end
-- 敵行動封印フラグ初期化
if(SEAL_ENEMY_HAND) then
sealFlg = nil
end
-- プレイヤー手番入力スキップ(初期値0 = WAIT)
if(SKIP_STATE and sceneStateRecord.Value == SCENE_STATE_ENABLE) then
if(handCursorPosition.NumericalValue &lt; 6) then
handCursorPosition.Value = '6'
end
end
-- コマンド入力
if(INPUT_KEYBOARD) then
keyDown(KEYCODE_ARROW_ABG_BTN)
Sleep(KEYDOWN_INTERVAL)
while sceneStateRecord.Value == SCENE_STATE_ENABLE do
if(not checkForeground(false)) then
break
end
keyDown(KEYCODE_ENTER_BTN)
Sleep(KEYDOWN_INTERVAL)
keyUp(KEYCODE_ENTER_BTN)
Sleep(KEYUP_INTERVAL)
end
keyUp(KEYCODE_ARROW_ABG_BTN)
end
end
local function mainTickExec(timer)
-- プロセスの状態確認
if(not checkProcess(TICK_INTERVAL ~= timer.Interval)) then
playerHPRecord.Active = playerHPActive
enemyHPRecord.Active = enemyHPActive
timer.Interval = math.min(TICK_INTERVAL * 8, timer.Interval + math.floor(timer.Interval / 2))
return
end
timer.Interval = TICK_INTERVAL
local result, err, traceback = MainForm.callFunction(mainTick)
if(not result) then
if(not MainForm.USE_DEBUG_LOG) then
print(string.rep('#', 64) .. "\n" .. var_export(err) .. "\n" .. string.rep('*', 32) .. "\n" .. var_export(traceback) .. "\n" .. string.rep('#', 64))
end
timer.setEnabled(false)
timer.OnTimer = nil
memrec.Active = false
-- timer.destroy()
playerHPRecord.Active = playerHPActive
enemyHPRecord.Active = enemyHPActive
print('Ticker was terminated, please restart CE')
end
end
function startAutoBattleBotTimer()
if syntaxcheck then return end
if checkProcess(false) then
print("Can't identify target process. TARGET_PROCESS: " .. tostring(TARGET_PROCESS))
return
end
targetStage = nil
if getStageRecord(TARGET_STAGE_VALIDATOR) == nil or targetStage == nil then
print('Target stage is not found, please battle start TARGET_GAME_ID: ' .. tostring(TARGET_GAME_ID))
return
end
validTargetStage = targetStage
assert(not MainForm.botTimer.Enabled,'Ticker has crashed, please restart CE')
playerHPRecord = AddressList.getMemoryRecordByDescription('PlayerHP')
playerMaxHPRecord = AddressList.getMemoryRecordByDescription('PlayerMaxHP')
turnCountRecord = getStageRecord(AddressList.getMemoryRecordByDescription('TurnCount'), validTargetStage)
handCursorPosition = getStageRecord(AddressList.getMemoryRecordByDescription('HandCursorPosition'), validTargetStage)
sceneStateRecord = getStageRecord(AddressList.getMemoryRecordByDescription('SceneState'), validTargetStage)
enemyHPRecord = getStageRecord(AddressList.getMemoryRecordByDescription('EnemyHP'), validTargetStage)
enemyMaxHPRecord = getStageRecord(AddressList.getMemoryRecordByDescription('EnemyMaxHP'), validTargetStage)
damageLog = AddressList.getMemoryRecordByDescription('DamageLog')
enemyHand = getStageRecord(AddressList.getMemoryRecordByDescription('EnemyHand'), validTargetStage).Child
if(initFlg) then
initFlg = false
MainForm.botTimer.Interval = TICK_INTERVAL * 3
MainForm.botTimer.OnTimer = mainTickExec
debug_dump('mainTicker: created')
debug_dump('Interval: ' .. tostring(MainForm.botTimer.Interval))
if(LOG_TYPE == 'hand') then
print('経過ターン,残りHP,最大HP,1手目,2手目,3手目,4手目,5手目,6手目')
elseif(LOG_TYPE == 'damage') then
print('経過ターン,手番,残りHP,最大HP,ダメージ')
else
error("Can only be used with 'hand' or 'damage'. LOG_TYPE: " .. tostring(LOG_TYPE))
end
end
assert(MainForm.botTimer.OnTimer, 'Ticker has crashed, please restart CE')
playerHPActive = playerHPRecord.Active and playerHPRecord.Value ~= '0'
enemyHPActive = enemyHPRecord.Active and enemyHPRecord.Value ~= '0'
playerHPRecord.Active = true
enemyHPRecord.Active = true
resetParams()
MainForm.botTimer.setEnabled(true)
debug_dump('botTimer: enable')
end
{$asm}
luaCall(startAutoBattleBotTimer())
[DISABLE]
{$lua}
function stopAutoBattleBotTimer()
if syntaxcheck then return end
if MainForm.botTimer.Enabled == false then return end
MainForm.botTimer.setEnabled(false)
debug_dump('botTimer: disabled')
end
{$asm}
luaCall(stopAutoBattleBotTimer())
</AssemblerScript>
<CheatEntries>
<CheatEntry>
<ID>134822</ID>
<Description>"TargetStage"</Description>
<Options moHideChildren="1"/>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4293C</Offset>
</Offsets>
<CheatEntries>
<CheatEntry>
<ID>134823</ID>
<Description>"TargetStage_sub1"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A500CC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134824</ID>
<Description>"TargetStage_sub2"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A506C4</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134601</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134592</ID>
<Description>"# Addless List"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>7</ID>
<Description>"BaseAddress"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<Color>404080</Color>
<VariableType>8 Bytes</VariableType>
<Address>PPSSPPWindows64.exe+DDF468</Address>
<CheatEntries>
<CheatEntry>
<ID>134475</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>6</ID>
<Description>"PlayerMaxHP"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>FF0000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A43360</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>5</ID>
<Description>"PlayerHP"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>FF0000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A43368</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134673</ID>
<Description>"PlayerMaxMP"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>FF0000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A43364</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134693</ID>
<Description>"PlayerMP"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>FF0000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4336C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134701</ID>
<Description>"EnemyMaxHP"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>3</ID>
<Description>"Stage2"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>80+95F42D0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134695</ID>
<Description>"Stage4(Another)"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>961E3E0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134989</ID>
<Description>"Stage4"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>80+95EB9E0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134799</ID>
<Description>"Stage5"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95DF150</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134742</ID>
<Description>"Stage6"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96CAD60</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134773</ID>
<Description>"Stage7"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>962B530</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134798</ID>
<Description>"Stage8"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>97FECD0</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134702</ID>
<Description>"EnemyHP"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134703</ID>
<Description>"Stage2"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95F42D0+88</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134704</ID>
<Description>"Stage4(Another)"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>961E448</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134990</ID>
<Description>"Stage4"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>88+95EB9E0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134800</ID>
<Description>"Stage5"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95DF158</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134741</ID>
<Description>"Stage6"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96CAD68</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134774</ID>
<Description>"Stage7"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>962B538</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134797</ID>
<Description>"Stage8"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>97FECD8</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134707</ID>
<Description>"HandCursorPosition"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134672</ID>
<Description>"Stage2"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>961836C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134711</ID>
<Description>"Stage4(Another)"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A2BC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134991</ID>
<Description>"Stage4"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9605DBC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134801</ID>
<Description>"Stage5"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95F76DC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134750</ID>
<Description>"Stage6"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF9BC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134775</ID>
<Description>"Stage7"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96452AC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134796</ID>
<Description>"Stage8"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>982A06C</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134708</ID>
<Description>"SceneState"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134567</ID>
<Description>"Stage2"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9618124</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134712</ID>
<Description>"Stage4(Another)"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A074</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134992</ID>
<Description>"Stage4"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85B74</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134802</ID>
<Description>"Stage5"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95F7494</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134748</ID>
<Description>"Stage6"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF774</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134776</ID>
<Description>"Stage7"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9645064</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134795</ID>
<Description>"Stage8"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9829E24</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134705</ID>
<Description>"TurnCount"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134614</ID>
<Description>"Stage2"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9618130</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134710</ID>
<Description>"Stage4(Another)"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A080</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134993</ID>
<Description>"Stage4"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9605B80</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134803</ID>
<Description>"Stage5"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95F74A0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134744</ID>
<Description>"Stage6"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF780</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134777</ID>
<Description>"Stage7"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9645070</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134794</ID>
<Description>"Stage8"</Description>
<ShowAsSigned>1</ShowAsSigned>
<Color>408000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9829E30</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134608</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134607</ID>
<Description>"EnemyHand"</Description>
<Color>000000</Color>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134709</ID>
<Description>"Stage2"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134540</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CA8+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134541</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CAC+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134542</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB0+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134543</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB4+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134544</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB8+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134545</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CBC+1A5F2E78258-1a5f2e65ca8</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134982</ID>
<Description>"Stage4(Another)"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134983</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1A8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134984</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1AC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134985</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1B0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134986</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1B4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134987</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1B8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134988</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>963A1BC</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134715</ID>
<Description>"Stage4"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134716</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CA8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134717</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CAC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134718</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134719</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134720</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CB8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134721</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000-2BAED180000+2BAEDF85CBC</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134804</ID>
<Description>"Stage5"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134805</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95F75C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134806</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>4+95F75C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134807</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8+95F75C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134808</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>C+95F75C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134809</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>10+95F75C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134810</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>14+95F75C8</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134734</ID>
<Description>"Stage6"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134735</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8A8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134736</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8AC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134737</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8B0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134738</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8B4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134739</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8B8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134740</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>96DF8BC</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134778</ID>
<Description>"Stage7"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134779</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9645198</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134780</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>4+9645198</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134781</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8+9645198</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134782</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>C+9645198</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134783</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>10+9645198</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134784</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>14+9645198</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134787</ID>
<Description>"Stage8"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134788</ID>
<Description>"1st"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9829F58</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134789</ID>
<Description>"2nd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>4+9829F58</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134790</ID>
<Description>"3rd"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8+9829F58</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134791</ID>
<Description>"4th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>C+9829F58</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134792</ID>
<Description>"5th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>10+9829F58</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134793</ID>
<Description>"6th"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>293DE7</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>14+9829F58</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134605</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134606</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134589</ID>
<Description>"# etc."</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134723</ID>
<Description>"PPT"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>AA0000</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1408A4294C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134666</ID>
<Description>"* Player Status"</Description>
<Color>000000</Color>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134692</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134687</ID>
<Description>"残りSP"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1B3806031B0-1B3803C0000+8800000</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134690</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134653</ID>
<Description>"筋力 - 実値"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432EC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134654</ID>
<Description>"耐久"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432F0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134655</ID>
<Description>"敏捷"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432F4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134656</ID>
<Description>"魔力"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432F8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134657</ID>
<Description>"幸運"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432FC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134664</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134639</ID>
<Description>"筋力 - 使用済みSP1"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8800000+24FCAC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134643</ID>
<Description>"耐久"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4FCB0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134644</ID>
<Description>"敏捷"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4FCB4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134645</ID>
<Description>"魔力"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4FCB8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134647</ID>
<Description>"幸運"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4FCBC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134665</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>134659</ID>
<Description>"筋力 - 使用済みSP2"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4298C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134660</ID>
<Description>"耐久"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A42990</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134661</ID>
<Description>"敏捷"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A42994</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134662</ID>
<Description>"魔力"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A42998</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134663</ID>
<Description>"幸運"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4299C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134680</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134683</ID>
<Description>"* Damage"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134674</ID>
<Description>"DamageLog"</Description>
<ShowAsSigned>0</ShowAsSigned>
<Color>400080</Color>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>89769C4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134691</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134765</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134527</ID>
<Description>"# Discarded addresses"</Description>
<Options moHideChildren="1"/>
<Color>808080</Color>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134730</ID>
<Description>"レベル(表示のみ)"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1408A431A4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134731</ID>
<Description>"次レベル必要経験値"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1408A431D0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134733</ID>
<Description>"タマモさんイベントフラグ"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A4FD1C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134726</ID>
<Description>"タマモさん好感度"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1408A5014C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134818</ID>
<Description>"マスターMaxMP"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A431C4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134819</ID>
<Description>"マスターMP"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A431C8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134816</ID>
<Description>"Equip Slot1"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>8 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A431B4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134817</ID>
<Description>"Equip Slot2"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>8 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A431BC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134732</ID>
<Description>"レアエネミー討伐数"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A5010C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134725</ID>
<Description>"4回戦ハンティング相手側撃破数"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>1408A50138</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134722</ID>
<Description>"Stage2PlayerHands"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Array of byte</VariableType>
<ByteLength>48</ByteLength>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>0961814C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134768</ID>
<Description>""</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>135003</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8AF5E3C</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135004</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8AF5E50</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135005</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8B292A0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135008</ID>
<Description>"No description"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95AD700</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135009</ID>
<Description>"No description"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>95AD714</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135010</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9FFE800</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135022</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>973B078</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135023</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>970B1A0</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135024</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>983a14c</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135025</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9887790</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135026</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9ffe7c8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135028</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>8 Bytes</VariableType>
<Address>PPSSPPWindows64.exe+DE45C8</Address>
</CheatEntry>
<CheatEntry>
<ID>135029</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<VariableType>Array of byte</VariableType>
<ByteLength>8</ByteLength>
<Address>PPSSPPWindows64.exe+D959D7</Address>
</CheatEntry>
<CheatEntry>
<ID>135034</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<VariableType>Array of byte</VariableType>
<ByteLength>8</ByteLength>
<Address>PPSSPPWindows64.exe+D959D7</Address>
</CheatEntry>
<CheatEntry>
<ID>135035</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A41778</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135037</ID>
<Description>"No description"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A500C4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135039</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8BE75D4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135042</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<VariableType>4 Bytes</VariableType>
<Address>24218E3809C</Address>
</CheatEntry>
<CheatEntry>
<ID>135045</ID>
<Description>"No description"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A500C4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135046</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<VariableType>4 Bytes</VariableType>
<Address>24218E37EE0</Address>
</CheatEntry>
<CheatEntry>
<ID>135047</ID>
<Description>"No description"</Description>
<ShowAsHex>1</ShowAsHex>
<VariableType>4 Bytes</VariableType>
<Address>24218E383E0</Address>
</CheatEntry>
<CheatEntry>
<ID>135048</ID>
<Description>"No description"</Description>
<VariableType>String</VariableType>
<Length>3</Length>
<Unicode>0</Unicode>
<CodePage>0</CodePage>
<ZeroTerminate>1</ZeroTerminate>
<Address>1DD87FC8EAA</Address>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134616</ID>
<Description>"# Discarded scripts"</Description>
<Options moHideChildren="1"/>
<Color>808080</Color>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>134637</ID>
<Description>"* Auto Assemble script"</Description>
<Color>800080</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{ Game : PPSSPPWindows64.exe
Version:
Date : 2021-08-15
Author : udon
This script does blah blah blah
}
define(address,"PPSSPPWindows64.exe"+22BEF2B)
define(bytes,89 B4 3B 88 00 00 00)
[ENABLE]
assert(address,bytes)
alloc(newmem,$1000,"PPSSPPWindows64.exe"+22BEF2B)
label(code)
label(return)
newmem:
code:
// mov [rbx+rdi+00000088],esi
nop
nop
nop
nop
jmp return
address:
jmp newmem
nop 2
return:
[DISABLE]
address:
db bytes
// mov [rbx+rdi+00000088],esi
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: 7FF7939710D5
7FF7939710A9: 49 B8 01 00 00 00 00 00 00 00 - mov r8,0000000000000001
7FF7939710B3: E8 B8 38 6D 02 - call PPSSPPWindows64.exe.text+413970
7FF7939710B8: E8 EA EF FF 00 - call 7FF7949700A7
7FF7939710BD: 48 81 C4 50 01 00 00 - add rsp,00000150
7FF7939710C4: 5F - pop rdi
7FF7939710C5: 5F - pop rdi
7FF7939710C6: 5F - pop rdi
7FF7939710C7: 5F - pop rdi
7FF7939710C8: 83 3D 31 B3 03 03 01 - cmp dword ptr [PPSSPPWindows64.exe.data+6400],01
7FF7939710CF: 0F 8F 07 00 00 00 - jg 7FF7939710DC
// ---------- INJECTING HERE ----------
7FF7939710D5: 89 B4 3B 88 00 00 00 - mov [rbx+rdi+00000088],esi
// ---------- DONE INJECTING ----------
7FF7939710DC: 83 3D 1D B3 03 03 01 - cmp dword ptr [PPSSPPWindows64.exe.data+6400],01
7FF7939710E3: 7E 1D - jle 7FF793971102
7FF7939710E5: 41 C7 86 44 03 00 00 50 F0 81 08 - mov [r14+00000344],0881F050
7FF7939710F0: 41 83 AE 60 03 00 00 02 - sub dword ptr [r14+00000360],02
7FF7939710F8: E8 E3 38 6D 02 - call PPSSPPWindows64.exe.text+4139E0
7FF7939710FD: E9 34 F0 FF FF - jmp 7FF793970136
7FF793971102: 41 83 AE 60 03 00 00 02 - sub dword ptr [r14+00000360],02
7FF79397110A: E9 35 00 00 00 - jmp 7FF793971144
7FF79397110F: CC - int 3
7FF793971110: CC - int 3
}
</AssemblerScript>
</CheatEntry>
<CheatEntry>
<ID>134638</ID>
<Description>"* Win 10 bug workaround (avoids "???" on value change)"</Description>
<Color>800080</Color>
<VariableType>Auto Assembler Script</VariableType>
<AssemblerScript>{$lua}
function bugworkaround()
openProcess([[cheatengine-x86_64-SSE4-AVX2.exe]])
reinitializeSymbolhandler()
autoAssemble([[
alloc(NewVirtualProtectEx,256)
alloc(OriginalVirtualProtectEx, 8)
registersymbol(NewVirtualProtectEx)
registersymbol(OriginalVirtualProtectEx)
label(notself)
NewVirtualProtectEx:
cmp ecx,ffffffff
jne short notself
call [OriginalVirtualProtectEx]
ret
notself:
xor rax,rax
ret
]])
s=generateAPIHookScript("VirtualProtectEx", "NewVirtualProtectEx", "OriginalVirtualProtectEx")
--stupid bug in generateAPIHookScript forgets the alloc originalcall0
s=[[alloc(originalcall0, 64, VirtualProtectEx)
]]..s
autoAssemble(s)
end
{$asm}
luaCall(bugworkaround())
[ENABLE]
[DISABLE]
</AssemblerScript>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>134981</ID>
<Description>"--------------------------------"</Description>
<GroupHeader>1</GroupHeader>
</CheatEntry>
<CheatEntry>
<ID>135001</ID>
<Description>"# 幸運ステが関わってるアドレス探し隊"</Description>
<Options moHideChildren="1"/>
<GroupHeader>1</GroupHeader>
<Address>0</Address>
<CheatEntries>
<CheatEntry>
<ID>134994</ID>
<Description>"自鯖ステータスの実数値かなこれ"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8A432E8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134995</ID>
<Description>"ブラおじのステータスこのへん"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>961E3D4</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134996</ID>
<Description>"たぶん関係ない乱数か描画系"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>8BEA1F8</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134997</ID>
<Description>"各付着効果の状態ビットフラグ"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9640DDC</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134998</ID>
<Description>"運バフ絡みの何か このバフでは使って無さそう"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9640e04</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>134999</ID>
<Description>"運バフ残りターン(コードキャスト使用時に2が入る)"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>9641374</Offset>
</Offsets>
</CheatEntry>
<CheatEntry>
<ID>135000</ID>
<Description>"運バフ効果値"</Description>
<ShowAsSigned>1</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>(BaseAddress)</Address>
<Offsets>
<Offset>964162C</Offset>
</Offsets>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
<UserdefinedSymbols>
<SymbolEntry>
<Name>randomvalue</Name>
<Address>28A890F0000</Address>
</SymbolEntry>
</UserdefinedSymbols>
<Structures StructVersion="2">
<Structure Name="unnamed structure" AutoFill="0" AutoCreate="1" DefaultHex="0" AutoDestroy="0" DoNotSaveLocal="0" RLECompression="1" AutoCreateStructsize="4096">
<Elements>
<Element Offset="0" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000000" DisplayMethod="unsigned integer"/>
<Element Offset="2" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000002" DisplayMethod="hexadecimal"/>
<Element Offset="18" Vartype="String" Bytesize="8" OffsetHex="00000012" DisplayMethod="unsigned integer"/>
<Element Offset="26" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000001A" DisplayMethod="hexadecimal"/>
<Element Offset="38" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000026" DisplayMethod="unsigned integer"/>
<Element Offset="42" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000002A" DisplayMethod="hexadecimal"/>
<Element Offset="50" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00000032" DisplayMethod="unsigned integer"/>
<Element Offset="55" Vartype="String" Bytesize="4" OffsetHex="00000037" DisplayMethod="unsigned integer"/>
<Element Offset="59" Vartype="Byte" Bytesize="1" OffsetHex="0000003B" DisplayMethod="unsigned integer"/>
<Element Offset="60" Vartype="String" Bytesize="4" OffsetHex="0000003C" DisplayMethod="unsigned integer"/>
<Element Offset="64" Vartype="Byte" Bytesize="1" OffsetHex="00000040" DisplayMethod="unsigned integer"/>
<Element Offset="65" Vartype="String" Bytesize="4" OffsetHex="00000041" DisplayMethod="unsigned integer"/>
<Element Offset="69" Vartype="Byte" Bytesize="1" OffsetHex="00000045" DisplayMethod="unsigned integer"/>
<Element Offset="70" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000046" DisplayMethod="hexadecimal"/>
<Element Offset="74" Vartype="String" Bytesize="5" OffsetHex="0000004A" DisplayMethod="unsigned integer"/>
<Element Offset="79" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000004F" DisplayMethod="unsigned integer"/>
<Element Offset="82" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00000052" DisplayMethod="hexadecimal"/>
<Element Offset="110" Vartype="Float" Bytesize="4" OffsetHex="0000006E" DisplayMethod="unsigned integer"/>
<Element Offset="114" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000072" DisplayMethod="hexadecimal"/>
<Element Offset="118" Vartype="Float" Bytesize="4" OffsetHex="00000076" DisplayMethod="unsigned integer"/>
<Element Offset="122" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000007A" DisplayMethod="hexadecimal"/>
<Element Offset="138" Vartype="Float" Bytesize="4" OffsetHex="0000008A" DisplayMethod="unsigned integer"/>
<Element Offset="142" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000008E" DisplayMethod="hexadecimal"/>
<Element Offset="146" Vartype="Float" Bytesize="4" OffsetHex="00000092" DisplayMethod="unsigned integer"/>
<Element Offset="150" Vartype="4 Bytes" Bytesize="4" RLECount="19" OffsetHex="00000096" DisplayMethod="hexadecimal"/>
<Element Offset="226" Vartype="4 Bytes" Bytesize="4" OffsetHex="000000E2" DisplayMethod="unsigned integer"/>
<Element Offset="230" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000000E6" DisplayMethod="hexadecimal"/>
<Element Offset="238" Vartype="Double" Bytesize="8" OffsetHex="000000EE" DisplayMethod="unsigned integer"/>
<Element Offset="246" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000000F6" DisplayMethod="hexadecimal"/>
<Element Offset="282" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000011A" DisplayMethod="unsigned integer"/>
<Element Offset="286" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000011E" DisplayMethod="hexadecimal"/>
<Element Offset="294" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000126" DisplayMethod="unsigned integer"/>
<Element Offset="302" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000012E" DisplayMethod="hexadecimal"/>
<Element Offset="306" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000132" DisplayMethod="unsigned integer"/>
<Element Offset="310" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00000136" DisplayMethod="hexadecimal"/>
<Element Offset="346" Vartype="Double" Bytesize="8" OffsetHex="0000015A" DisplayMethod="unsigned integer"/>
<Element Offset="354" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000162" DisplayMethod="hexadecimal"/>
<Element Offset="378" Vartype="Float" Bytesize="4" OffsetHex="0000017A" DisplayMethod="unsigned integer"/>
<Element Offset="382" Vartype="Byte" Bytesize="1" OffsetHex="0000017E" DisplayMethod="unsigned integer"/>
<Element Offset="383" Vartype="String" Bytesize="5" OffsetHex="0000017F" DisplayMethod="unsigned integer"/>
<Element Offset="388" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000184" DisplayMethod="unsigned integer"/>
<Element Offset="390" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000186" DisplayMethod="hexadecimal"/>
<Element Offset="394" Vartype="Double" Bytesize="8" OffsetHex="0000018A" DisplayMethod="unsigned integer"/>
<Element Offset="402" Vartype="Float" Bytesize="4" OffsetHex="00000192" DisplayMethod="unsigned integer"/>
<Element Offset="406" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000196" DisplayMethod="hexadecimal"/>
<Element Offset="430" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000001AE" DisplayMethod="unsigned integer"/>
<Element Offset="434" Vartype="Float" Bytesize="4" OffsetHex="000001B2" DisplayMethod="unsigned integer"/>
<Element Offset="438" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000001B6" DisplayMethod="hexadecimal"/>
<Element Offset="474" Vartype="String" Bytesize="4" OffsetHex="000001DA" DisplayMethod="unsigned integer"/>
<Element Offset="478" Vartype="Byte" Bytesize="1" OffsetHex="000001DE" DisplayMethod="unsigned integer"/>
<Element Offset="479" Vartype="String" Bytesize="4" OffsetHex="000001DF" DisplayMethod="unsigned integer"/>
<Element Offset="483" Vartype="Byte" Bytesize="1" OffsetHex="000001E3" DisplayMethod="unsigned integer"/>
<Element Offset="484" Vartype="String" Bytesize="4" OffsetHex="000001E4" DisplayMethod="unsigned integer"/>
<Element Offset="488" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="000001E8" DisplayMethod="unsigned integer"/>
<Element Offset="490" Vartype="String" Bytesize="7" OffsetHex="000001EA" DisplayMethod="unsigned integer"/>
<Element Offset="497" Vartype="Byte" Bytesize="1" OffsetHex="000001F1" DisplayMethod="unsigned integer"/>
<Element Offset="498" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000001F2" DisplayMethod="hexadecimal"/>
<Element Offset="506" Vartype="4 Bytes" Bytesize="4" OffsetHex="000001FA" DisplayMethod="unsigned integer"/>
<Element Offset="510" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="000001FE" DisplayMethod="unsigned integer"/>
<Element Offset="518" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000206" DisplayMethod="hexadecimal"/>
<Element Offset="522" Vartype="Double" Bytesize="8" OffsetHex="0000020A" DisplayMethod="unsigned integer"/>
<Element Offset="530" Vartype="Float" Bytesize="4" OffsetHex="00000212" DisplayMethod="unsigned integer"/>
<Element Offset="534" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00000216" DisplayMethod="hexadecimal"/>
<Element Offset="578" Vartype="Float" Bytesize="4" OffsetHex="00000242" DisplayMethod="unsigned integer"/>
<Element Offset="582" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000246" DisplayMethod="hexadecimal"/>
<Element Offset="606" Vartype="Double" Bytesize="8" OffsetHex="0000025E" DisplayMethod="unsigned integer"/>
<Element Offset="614" Vartype="Float" Bytesize="4" OffsetHex="00000266" DisplayMethod="unsigned integer"/>
<Element Offset="618" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000026A" DisplayMethod="unsigned integer"/>
<Element Offset="622" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000026E" DisplayMethod="hexadecimal"/>
<Element Offset="630" Vartype="Float" Bytesize="4" OffsetHex="00000276" DisplayMethod="unsigned integer"/>
<Element Offset="634" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000027A" DisplayMethod="hexadecimal"/>
<Element Offset="638" Vartype="Float" Bytesize="4" OffsetHex="0000027E" DisplayMethod="unsigned integer"/>
<Element Offset="642" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000282" DisplayMethod="hexadecimal"/>
<Element Offset="646" Vartype="Float" Bytesize="4" OffsetHex="00000286" DisplayMethod="unsigned integer"/>
<Element Offset="650" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000028A" DisplayMethod="hexadecimal"/>
<Element Offset="658" Vartype="Float" Bytesize="4" OffsetHex="00000292" DisplayMethod="unsigned integer"/>
<Element Offset="662" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000296" DisplayMethod="hexadecimal"/>
<Element Offset="666" Vartype="Float" Bytesize="4" OffsetHex="0000029A" DisplayMethod="unsigned integer"/>
<Element Offset="670" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000029E" DisplayMethod="unsigned integer"/>
<Element Offset="674" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002A2" DisplayMethod="hexadecimal"/>
<Element Offset="678" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002A6" DisplayMethod="unsigned integer"/>
<Element Offset="682" Vartype="Float" Bytesize="4" OffsetHex="000002AA" DisplayMethod="unsigned integer"/>
<Element Offset="686" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000002AE" DisplayMethod="hexadecimal"/>
<Element Offset="710" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002C6" DisplayMethod="unsigned integer"/>
<Element Offset="714" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000002CA" DisplayMethod="hexadecimal"/>
<Element Offset="722" Vartype="Byte" Bytesize="1" OffsetHex="000002D2" DisplayMethod="unsigned integer"/>
<Element Offset="723" Vartype="String" Bytesize="10" OffsetHex="000002D3" DisplayMethod="unsigned integer"/>
<Element Offset="733" Vartype="Byte" Bytesize="1" OffsetHex="000002DD" DisplayMethod="unsigned integer"/>
<Element Offset="734" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="000002DE" DisplayMethod="hexadecimal"/>
<Element Offset="762" Vartype="Float" Bytesize="4" OffsetHex="000002FA" DisplayMethod="unsigned integer"/>
<Element Offset="766" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000002FE" DisplayMethod="hexadecimal"/>
<Element Offset="774" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000306" DisplayMethod="unsigned integer"/>
<Element Offset="782" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000030E" DisplayMethod="hexadecimal"/>
<Element Offset="786" Vartype="Float" Bytesize="4" OffsetHex="00000312" DisplayMethod="unsigned integer"/>
<Element Offset="790" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000316" DisplayMethod="hexadecimal"/>
<Element Offset="798" Vartype="Byte" Bytesize="1" OffsetHex="0000031E" DisplayMethod="unsigned integer"/>
<Element Offset="799" Vartype="String" Bytesize="4" OffsetHex="0000031F" DisplayMethod="unsigned integer"/>
<Element Offset="803" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000323" DisplayMethod="unsigned integer"/>
<Element Offset="806" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000326" DisplayMethod="hexadecimal"/>
<Element Offset="822" Vartype="Float" Bytesize="4" OffsetHex="00000336" DisplayMethod="unsigned integer"/>
<Element Offset="826" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="0000033A" DisplayMethod="hexadecimal"/>
<Element Offset="854" Vartype="Float" Bytesize="4" OffsetHex="00000356" DisplayMethod="unsigned integer"/>
<Element Offset="858" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000035A" DisplayMethod="unsigned integer"/>
<Element Offset="862" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="0000035E" DisplayMethod="hexadecimal"/>
<Element Offset="882" Vartype="Double" Bytesize="8" OffsetHex="00000372" DisplayMethod="unsigned integer"/>
<Element Offset="890" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000037A" DisplayMethod="unsigned integer"/>
<Element Offset="894" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000037E" DisplayMethod="hexadecimal"/>
<Element Offset="906" Vartype="Float" Bytesize="4" OffsetHex="0000038A" DisplayMethod="unsigned integer"/>
<Element Offset="910" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000038E" DisplayMethod="hexadecimal"/>
<Element Offset="918" Vartype="Float" Bytesize="4" OffsetHex="00000396" DisplayMethod="unsigned integer"/>
<Element Offset="922" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000039A" DisplayMethod="unsigned integer"/>
<Element Offset="926" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000039E" DisplayMethod="hexadecimal"/>
<Element Offset="958" Vartype="4 Bytes" Bytesize="4" OffsetHex="000003BE" DisplayMethod="unsigned integer"/>
<Element Offset="962" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000003C2" DisplayMethod="hexadecimal"/>
<Element Offset="974" Vartype="Float" Bytesize="4" OffsetHex="000003CE" DisplayMethod="unsigned integer"/>
<Element Offset="978" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000003D2" DisplayMethod="hexadecimal"/>
<Element Offset="998" Vartype="Float" Bytesize="4" OffsetHex="000003E6" DisplayMethod="unsigned integer"/>
<Element Offset="1002" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000003EA" DisplayMethod="hexadecimal"/>
<Element Offset="1014" Vartype="Byte" Bytesize="1" OffsetHex="000003F6" DisplayMethod="unsigned integer"/>
<Element Offset="1015" Vartype="String" Bytesize="4" OffsetHex="000003F7" DisplayMethod="unsigned integer"/>
<Element Offset="1019" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000003FB" DisplayMethod="unsigned integer"/>
<Element Offset="1022" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000003FE" DisplayMethod="hexadecimal"/>
<Element Offset="1030" Vartype="String" Bytesize="7" OffsetHex="00000406" DisplayMethod="unsigned integer"/>
<Element Offset="1037" Vartype="Byte" Bytesize="1" OffsetHex="0000040D" DisplayMethod="unsigned integer"/>
<Element Offset="1038" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="0000040E" DisplayMethod="hexadecimal"/>
<Element Offset="1058" Vartype="String" Bytesize="4" OffsetHex="00000422" DisplayMethod="unsigned integer"/>
<Element Offset="1062" Vartype="Byte" Bytesize="1" OffsetHex="00000426" DisplayMethod="unsigned integer"/>
<Element Offset="1063" Vartype="String" Bytesize="4" OffsetHex="00000427" DisplayMethod="unsigned integer"/>
<Element Offset="1067" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="0000042B" DisplayMethod="unsigned integer"/>
<Element Offset="1069" Vartype="String" Bytesize="7" OffsetHex="0000042D" DisplayMethod="unsigned integer"/>
<Element Offset="1076" Vartype="Byte" Bytesize="1" OffsetHex="00000434" DisplayMethod="unsigned integer"/>
<Element Offset="1077" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000435" DisplayMethod="unsigned integer"/>
<Element Offset="1079" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000437" DisplayMethod="unsigned integer"/>
<Element Offset="1082" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000043A" DisplayMethod="hexadecimal"/>
<Element Offset="1094" Vartype="Byte" Bytesize="1" OffsetHex="00000446" DisplayMethod="unsigned integer"/>
<Element Offset="1095" Vartype="String" Bytesize="6" OffsetHex="00000447" DisplayMethod="unsigned integer"/>
<Element Offset="1101" Vartype="Byte" Bytesize="1" OffsetHex="0000044D" DisplayMethod="unsigned integer"/>
<Element Offset="1102" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000044E" DisplayMethod="hexadecimal"/>
<Element Offset="1110" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000456" DisplayMethod="unsigned integer"/>
<Element Offset="1113" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000459" DisplayMethod="unsigned integer"/>
<Element Offset="1115" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000045B" DisplayMethod="unsigned integer"/>
<Element Offset="1118" Vartype="Float" Bytesize="4" OffsetHex="0000045E" DisplayMethod="unsigned integer"/>
<Element Offset="1122" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00000462" DisplayMethod="hexadecimal"/>
<Element Offset="1150" Vartype="Double" Bytesize="8" OffsetHex="0000047E" DisplayMethod="unsigned integer"/>
<Element Offset="1158" Vartype="Float" Bytesize="4" OffsetHex="00000486" DisplayMethod="unsigned integer"/>
<Element Offset="1162" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000048A" DisplayMethod="hexadecimal"/>
<Element Offset="1174" Vartype="Float" Bytesize="4" OffsetHex="00000496" DisplayMethod="unsigned integer"/>
<Element Offset="1178" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="0000049A" DisplayMethod="hexadecimal"/>
<Element Offset="1206" Vartype="Float" Bytesize="4" OffsetHex="000004B6" DisplayMethod="unsigned integer"/>
<Element Offset="1210" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000004BA" DisplayMethod="hexadecimal"/>
<Element Offset="1218" Vartype="Float" Bytesize="4" OffsetHex="000004C2" DisplayMethod="unsigned integer"/>
<Element Offset="1222" Vartype="4 Bytes" Bytesize="4" RLECount="19" OffsetHex="000004C6" DisplayMethod="hexadecimal"/>
<Element Offset="1298" Vartype="Double" Bytesize="8" OffsetHex="00000512" DisplayMethod="unsigned integer"/>
<Element Offset="1306" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000051A" DisplayMethod="hexadecimal"/>
<Element Offset="1342" Vartype="Float" Bytesize="4" OffsetHex="0000053E" DisplayMethod="unsigned integer"/>
<Element Offset="1346" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000542" DisplayMethod="hexadecimal"/>
<Element Offset="1366" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000556" DisplayMethod="unsigned integer"/>
<Element Offset="1370" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000055A" DisplayMethod="hexadecimal"/>
<Element Offset="1382" Vartype="Float" Bytesize="4" OffsetHex="00000566" DisplayMethod="unsigned integer"/>
<Element Offset="1386" Vartype="4 Bytes" Bytesize="4" RLECount="15" OffsetHex="0000056A" DisplayMethod="hexadecimal"/>
<Element Offset="1446" Vartype="Byte" Bytesize="1" OffsetHex="000005A6" DisplayMethod="unsigned integer"/>
<Element Offset="1447" Vartype="String" Bytesize="8" OffsetHex="000005A7" DisplayMethod="unsigned integer"/>
<Element Offset="1455" Vartype="Byte" Bytesize="1" OffsetHex="000005AF" DisplayMethod="unsigned integer"/>
<Element Offset="1456" Vartype="2 Bytes" Bytesize="2" OffsetHex="000005B0" DisplayMethod="unsigned integer"/>
<Element Offset="1458" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000005B2" DisplayMethod="hexadecimal"/>
<Element Offset="1478" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="000005C6" DisplayMethod="unsigned integer"/>
<Element Offset="1490" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005D2" DisplayMethod="unsigned integer"/>
<Element Offset="1494" Vartype="Float" Bytesize="4" OffsetHex="000005D6" DisplayMethod="unsigned integer"/>
<Element Offset="1498" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005DA" DisplayMethod="hexadecimal"/>
<Element Offset="1502" Vartype="Float" Bytesize="4" OffsetHex="000005DE" DisplayMethod="unsigned integer"/>
<Element Offset="1506" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000005E2" DisplayMethod="hexadecimal"/>
<Element Offset="1518" Vartype="Float" Bytesize="4" OffsetHex="000005EE" DisplayMethod="unsigned integer"/>
<Element Offset="1522" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005F2" DisplayMethod="hexadecimal"/>
<Element Offset="1526" Vartype="Float" Bytesize="4" OffsetHex="000005F6" DisplayMethod="unsigned integer"/>
<Element Offset="1530" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005FA" DisplayMethod="hexadecimal"/>
<Element Offset="1534" Vartype="Float" Bytesize="4" OffsetHex="000005FE" DisplayMethod="unsigned integer"/>
<Element Offset="1538" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000602" DisplayMethod="hexadecimal"/>
<Element Offset="1550" Vartype="Float" Bytesize="4" OffsetHex="0000060E" DisplayMethod="unsigned integer"/>
<Element Offset="1554" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000612" DisplayMethod="hexadecimal"/>
<Element Offset="1566" Vartype="Float" Bytesize="4" OffsetHex="0000061E" DisplayMethod="unsigned integer"/>
<Element Offset="1570" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000622" DisplayMethod="hexadecimal"/>
<Element Offset="1574" Vartype="Float" Bytesize="4" OffsetHex="00000626" DisplayMethod="unsigned integer"/>
<Element Offset="1578" Vartype="4 Bytes" Bytesize="4" RLECount="13" OffsetHex="0000062A" DisplayMethod="hexadecimal"/>
<Element Offset="1630" Vartype="Double" Bytesize="8" OffsetHex="0000065E" DisplayMethod="unsigned integer"/>
<Element Offset="1638" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000666" DisplayMethod="hexadecimal"/>
<Element Offset="1646" Vartype="Float" Bytesize="4" OffsetHex="0000066E" DisplayMethod="unsigned integer"/>
<Element Offset="1650" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000672" DisplayMethod="hexadecimal"/>
<Element Offset="1670" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000686" DisplayMethod="unsigned integer"/>
<Element Offset="1674" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000068A" DisplayMethod="hexadecimal"/>
<Element Offset="1710" Vartype="Float" Bytesize="4" OffsetHex="000006AE" DisplayMethod="unsigned integer"/>
<Element Offset="1714" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000006B2" DisplayMethod="hexadecimal"/>
<Element Offset="1722" Vartype="Float" Bytesize="4" OffsetHex="000006BA" DisplayMethod="unsigned integer"/>
<Element Offset="1726" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000006BE" DisplayMethod="hexadecimal"/>
<Element Offset="1734" Vartype="Byte" Bytesize="1" RLECount="8" OffsetHex="000006C6" DisplayMethod="unsigned integer"/>
<Element Offset="1742" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000006CE" DisplayMethod="hexadecimal"/>
<Element Offset="1766" Vartype="Float" Bytesize="4" OffsetHex="000006E6" DisplayMethod="unsigned integer"/>
<Element Offset="1770" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000006EA" DisplayMethod="hexadecimal"/>
<Element Offset="1806" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000070E" DisplayMethod="unsigned integer"/>
<Element Offset="1810" Vartype="Float" Bytesize="4" OffsetHex="00000712" DisplayMethod="unsigned integer"/>
<Element Offset="1814" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000716" DisplayMethod="hexadecimal"/>
<Element Offset="1826" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000722" DisplayMethod="unsigned integer"/>
<Element Offset="1830" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000726" DisplayMethod="hexadecimal"/>
<Element Offset="1838" Vartype="Byte" Bytesize="1" OffsetHex="0000072E" DisplayMethod="unsigned integer"/>
<Element Offset="1839" Vartype="String" Bytesize="8" OffsetHex="0000072F" DisplayMethod="unsigned integer"/>
<Element Offset="1847" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000737" DisplayMethod="unsigned integer"/>
<Element Offset="1850" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="0000073A" DisplayMethod="hexadecimal"/>
<Element Offset="1906" Vartype="Double" Bytesize="8" OffsetHex="00000772" DisplayMethod="unsigned integer"/>
<Element Offset="1914" Vartype="Float" Bytesize="4" OffsetHex="0000077A" DisplayMethod="unsigned integer"/>
<Element Offset="1918" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000077E" DisplayMethod="hexadecimal"/>
<Element Offset="1922" Vartype="String" Bytesize="4" OffsetHex="00000782" DisplayMethod="unsigned integer"/>
<Element Offset="1926" Vartype="Byte" Bytesize="1" OffsetHex="00000786" DisplayMethod="unsigned integer"/>
<Element Offset="1927" Vartype="String" Bytesize="4" OffsetHex="00000787" DisplayMethod="unsigned integer"/>
<Element Offset="1931" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000078B" DisplayMethod="unsigned integer"/>
<Element Offset="1934" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000078E" DisplayMethod="hexadecimal"/>
<Element Offset="1938" Vartype="Float" Bytesize="4" OffsetHex="00000792" DisplayMethod="unsigned integer"/>
<Element Offset="1942" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000796" DisplayMethod="hexadecimal"/>
<Element Offset="1962" Vartype="4 Bytes" Bytesize="4" OffsetHex="000007AA" DisplayMethod="unsigned integer"/>
<Element Offset="1966" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000007AE" DisplayMethod="hexadecimal"/>
<Element Offset="1990" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000007C6" DisplayMethod="unsigned integer"/>
<Element Offset="1994" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000007CA" DisplayMethod="hexadecimal"/>
<Element Offset="2002" Vartype="4 Bytes" Bytesize="4" OffsetHex="000007D2" DisplayMethod="unsigned integer"/>
<Element Offset="2006" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000007D6" DisplayMethod="hexadecimal"/>
<Element Offset="2014" Vartype="String" Bytesize="4" OffsetHex="000007DE" DisplayMethod="unsigned integer"/>
<Element Offset="2018" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000007E2" DisplayMethod="hexadecimal"/>
<Element Offset="2038" Vartype="Byte" Bytesize="1" OffsetHex="000007F6" DisplayMethod="unsigned integer"/>
<Element Offset="2039" Vartype="String" Bytesize="12" OffsetHex="000007F7" DisplayMethod="unsigned integer"/>
<Element Offset="2051" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000803" DisplayMethod="unsigned integer"/>
<Element Offset="2054" Vartype="Float" Bytesize="4" OffsetHex="00000806" DisplayMethod="unsigned integer"/>
<Element Offset="2058" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000080A" DisplayMethod="hexadecimal"/>
<Element Offset="2094" Vartype="Float" Bytesize="4" OffsetHex="0000082E" DisplayMethod="unsigned integer"/>
<Element Offset="2098" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000832" DisplayMethod="hexadecimal"/>
<Element Offset="2110" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000083E" DisplayMethod="unsigned integer"/>
<Element Offset="2114" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000842" DisplayMethod="hexadecimal"/>
<Element Offset="2118" Vartype="Byte" Bytesize="1" OffsetHex="00000846" DisplayMethod="unsigned integer"/>
<Element Offset="2119" Vartype="String" Bytesize="4" OffsetHex="00000847" DisplayMethod="unsigned integer"/>
<Element Offset="2123" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000084B" DisplayMethod="unsigned integer"/>
<Element Offset="2126" Vartype="Float" Bytesize="4" OffsetHex="0000084E" DisplayMethod="unsigned integer"/>
<Element Offset="2130" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000852" DisplayMethod="hexadecimal"/>
<Element Offset="2150" Vartype="Float" Bytesize="4" OffsetHex="00000866" DisplayMethod="unsigned integer"/>
<Element Offset="2154" Vartype="Double" Bytesize="8" OffsetHex="0000086A" DisplayMethod="unsigned integer"/>
<Element Offset="2162" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000872" DisplayMethod="hexadecimal"/>
<Element Offset="2182" Vartype="Float" Bytesize="4" OffsetHex="00000886" DisplayMethod="unsigned integer"/>
<Element Offset="2186" Vartype="Double" Bytesize="8" OffsetHex="0000088A" DisplayMethod="unsigned integer"/>
<Element Offset="2194" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000892" DisplayMethod="hexadecimal"/>
<Element Offset="2214" Vartype="Float" Bytesize="4" OffsetHex="000008A6" DisplayMethod="unsigned integer"/>
<Element Offset="2218" Vartype="Double" Bytesize="8" OffsetHex="000008AA" DisplayMethod="unsigned integer"/>
<Element Offset="2226" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000008B2" DisplayMethod="hexadecimal"/>
<Element Offset="2238" Vartype="Double" Bytesize="8" OffsetHex="000008BE" DisplayMethod="unsigned integer"/>
<Element Offset="2246" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000008C6" DisplayMethod="unsigned integer"/>
<Element Offset="2250" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000008CA" DisplayMethod="hexadecimal"/>
<Element Offset="2274" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="000008E2" DisplayMethod="unsigned integer"/>
<Element Offset="2282" Vartype="4 Bytes" Bytesize="4" OffsetHex="000008EA" DisplayMethod="hexadecimal"/>
<Element Offset="2286" Vartype="Byte" Bytesize="1" RLECount="8" OffsetHex="000008EE" DisplayMethod="unsigned integer"/>
<Element Offset="2294" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000008F6" DisplayMethod="hexadecimal"/>
<Element Offset="2302" Vartype="String" Bytesize="4" OffsetHex="000008FE" DisplayMethod="unsigned integer"/>
<Element Offset="2306" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000902" DisplayMethod="hexadecimal"/>
<Element Offset="2310" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000906" DisplayMethod="unsigned integer"/>
<Element Offset="2314" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000090A" DisplayMethod="hexadecimal"/>
<Element Offset="2318" Vartype="Float" Bytesize="4" OffsetHex="0000090E" DisplayMethod="unsigned integer"/>
<Element Offset="2322" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000912" DisplayMethod="hexadecimal"/>
<Element Offset="2326" Vartype="Float" Bytesize="4" OffsetHex="00000916" DisplayMethod="unsigned integer"/>
<Element Offset="2330" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000091A" DisplayMethod="hexadecimal"/>
<Element Offset="2338" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000922" DisplayMethod="unsigned integer"/>
<Element Offset="2342" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000926" DisplayMethod="hexadecimal"/>
<Element Offset="2346" Vartype="Byte" Bytesize="1" RLECount="6" OffsetHex="0000092A" DisplayMethod="unsigned integer"/>
<Element Offset="2352" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000930" DisplayMethod="unsigned integer"/>
<Element Offset="2354" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000932" DisplayMethod="hexadecimal"/>
<Element Offset="2358" Vartype="Byte" Bytesize="1" OffsetHex="00000936" DisplayMethod="unsigned integer"/>
<Element Offset="2359" Vartype="String" Bytesize="4" OffsetHex="00000937" DisplayMethod="unsigned integer"/>
<Element Offset="2363" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="0000093B" DisplayMethod="unsigned integer"/>
<Element Offset="2365" Vartype="2 Bytes" Bytesize="2" OffsetHex="0000093D" DisplayMethod="unsigned integer"/>
<Element Offset="2367" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000093F" DisplayMethod="unsigned integer"/>
<Element Offset="2370" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000942" DisplayMethod="unsigned integer"/>
<Element Offset="2374" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000946" DisplayMethod="hexadecimal"/>
<Element Offset="2378" Vartype="Float" Bytesize="4" OffsetHex="0000094A" DisplayMethod="unsigned integer"/>
<Element Offset="2382" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000094E" DisplayMethod="hexadecimal"/>
<Element Offset="2386" Vartype="Float" Bytesize="4" OffsetHex="00000952" DisplayMethod="unsigned integer"/>
<Element Offset="2390" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000956" DisplayMethod="hexadecimal"/>
<Element Offset="2394" Vartype="Float" Bytesize="4" OffsetHex="0000095A" DisplayMethod="unsigned integer"/>
<Element Offset="2398" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000095E" DisplayMethod="hexadecimal"/>
<Element Offset="2414" Vartype="Float" Bytesize="4" OffsetHex="0000096E" DisplayMethod="unsigned integer"/>
<Element Offset="2418" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000972" DisplayMethod="hexadecimal"/>
<Element Offset="2442" Vartype="Float" Bytesize="4" OffsetHex="0000098A" DisplayMethod="unsigned integer"/>
<Element Offset="2446" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000098E" DisplayMethod="hexadecimal"/>
<Element Offset="2450" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000992" DisplayMethod="unsigned integer"/>
<Element Offset="2454" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000996" DisplayMethod="hexadecimal"/>
<Element Offset="2458" Vartype="Float" Bytesize="4" OffsetHex="0000099A" DisplayMethod="unsigned integer"/>
<Element Offset="2462" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000099E" DisplayMethod="hexadecimal"/>
<Element Offset="2494" Vartype="Byte" Bytesize="1" OffsetHex="000009BE" DisplayMethod="unsigned integer"/>
<Element Offset="2495" Vartype="String" Bytesize="12" OffsetHex="000009BF" DisplayMethod="unsigned integer"/>
<Element Offset="2507" Vartype="Byte" Bytesize="1" OffsetHex="000009CB" DisplayMethod="unsigned integer"/>
<Element Offset="2508" Vartype="2 Bytes" Bytesize="2" OffsetHex="000009CC" DisplayMethod="unsigned integer"/>
<Element Offset="2510" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000009CE" DisplayMethod="hexadecimal"/>
<Element Offset="2542" Vartype="Float" Bytesize="4" OffsetHex="000009EE" DisplayMethod="unsigned integer"/>
<Element Offset="2546" Vartype="Double" Bytesize="8" OffsetHex="000009F2" DisplayMethod="unsigned integer"/>
<Element Offset="2554" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000009FA" DisplayMethod="hexadecimal"/>
<Element Offset="2562" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000A02" DisplayMethod="unsigned integer"/>
<Element Offset="2574" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A0E" DisplayMethod="hexadecimal"/>
<Element Offset="2594" Vartype="Float" Bytesize="4" OffsetHex="00000A22" DisplayMethod="unsigned integer"/>
<Element Offset="2598" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A26" DisplayMethod="hexadecimal"/>
<Element Offset="2618" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A3A" DisplayMethod="unsigned integer"/>
<Element Offset="2622" Vartype="4 Bytes" Bytesize="4" RLECount="13" OffsetHex="00000A3E" DisplayMethod="hexadecimal"/>
<Element Offset="2674" Vartype="Double" Bytesize="8" OffsetHex="00000A72" DisplayMethod="unsigned integer"/>
<Element Offset="2682" Vartype="Float" Bytesize="4" OffsetHex="00000A7A" DisplayMethod="unsigned integer"/>
<Element Offset="2686" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A7E" DisplayMethod="hexadecimal"/>
<Element Offset="2690" Vartype="String" Bytesize="4" OffsetHex="00000A82" DisplayMethod="unsigned integer"/>
<Element Offset="2694" Vartype="Byte" Bytesize="1" OffsetHex="00000A86" DisplayMethod="unsigned integer"/>
<Element Offset="2695" Vartype="String" Bytesize="4" OffsetHex="00000A87" DisplayMethod="unsigned integer"/>
<Element Offset="2699" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000A8B" DisplayMethod="unsigned integer"/>
<Element Offset="2702" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A8E" DisplayMethod="hexadecimal"/>
<Element Offset="2706" Vartype="Float" Bytesize="4" OffsetHex="00000A92" DisplayMethod="unsigned integer"/>
<Element Offset="2710" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A96" DisplayMethod="hexadecimal"/>
<Element Offset="2730" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000AAA" DisplayMethod="unsigned integer"/>
<Element Offset="2734" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000AAE" DisplayMethod="hexadecimal"/>
<Element Offset="2758" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00000AC6" DisplayMethod="unsigned integer"/>
<Element Offset="2762" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000ACA" DisplayMethod="hexadecimal"/>
<Element Offset="2770" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000AD2" DisplayMethod="unsigned integer"/>
<Element Offset="2774" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000AD6" DisplayMethod="hexadecimal"/>
<Element Offset="2782" Vartype="String" Bytesize="4" OffsetHex="00000ADE" DisplayMethod="unsigned integer"/>
<Element Offset="2786" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00000AE2" DisplayMethod="hexadecimal"/>
<Element Offset="2830" Vartype="Float" Bytesize="4" OffsetHex="00000B0E" DisplayMethod="unsigned integer"/>
<Element Offset="2834" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000B12" DisplayMethod="hexadecimal"/>
<Element Offset="2842" Vartype="Float" Bytesize="4" OffsetHex="00000B1A" DisplayMethod="unsigned integer"/>
<Element Offset="2846" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B1E" DisplayMethod="unsigned integer"/>
<Element Offset="2850" Vartype="Float" Bytesize="4" OffsetHex="00000B22" DisplayMethod="unsigned integer"/>
<Element Offset="2854" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000B26" DisplayMethod="hexadecimal"/>
<Element Offset="2870" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000B36" DisplayMethod="unsigned integer"/>
<Element Offset="2882" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000B42" DisplayMethod="hexadecimal"/>
<Element Offset="2890" Vartype="Float" Bytesize="4" OffsetHex="00000B4A" DisplayMethod="unsigned integer"/>
<Element Offset="2894" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B4E" DisplayMethod="hexadecimal"/>
<Element Offset="2898" Vartype="Float" Bytesize="4" OffsetHex="00000B52" DisplayMethod="unsigned integer"/>
<Element Offset="2902" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000B56" DisplayMethod="hexadecimal"/>
<Element Offset="2934" Vartype="Float" Bytesize="4" OffsetHex="00000B76" DisplayMethod="unsigned integer"/>
<Element Offset="2938" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B7A" DisplayMethod="hexadecimal"/>
<Element Offset="2942" Vartype="Float" Bytesize="4" OffsetHex="00000B7E" DisplayMethod="unsigned integer"/>
<Element Offset="2946" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000B82" DisplayMethod="hexadecimal"/>
<Element Offset="2978" Vartype="Float" Bytesize="4" OffsetHex="00000BA2" DisplayMethod="unsigned integer"/>
<Element Offset="2982" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000BA6" DisplayMethod="hexadecimal"/>
<Element Offset="2986" Vartype="Float" Bytesize="4" OffsetHex="00000BAA" DisplayMethod="unsigned integer"/>
<Element Offset="2990" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000BAE" DisplayMethod="hexadecimal"/>
<Element Offset="3022" Vartype="Float" Bytesize="4" OffsetHex="00000BCE" DisplayMethod="unsigned integer"/>
<Element Offset="3026" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000BD2" DisplayMethod="hexadecimal"/>
<Element Offset="3030" Vartype="Float" Bytesize="4" OffsetHex="00000BD6" DisplayMethod="unsigned integer"/>
<Element Offset="3034" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000BDA" DisplayMethod="hexadecimal"/>
<Element Offset="3058" Vartype="Double" Bytesize="8" OffsetHex="00000BF2" DisplayMethod="unsigned integer"/>
<Element Offset="3066" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000BFA" DisplayMethod="hexadecimal"/>
<Element Offset="3090" Vartype="Float" Bytesize="4" OffsetHex="00000C12" DisplayMethod="unsigned integer"/>
<Element Offset="3094" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000C16" DisplayMethod="hexadecimal"/>
<Element Offset="3106" Vartype="Float" Bytesize="4" OffsetHex="00000C22" DisplayMethod="unsigned integer"/>
<Element Offset="3110" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000C26" DisplayMethod="hexadecimal"/>
<Element Offset="3122" Vartype="Float" Bytesize="4" OffsetHex="00000C32" DisplayMethod="unsigned integer"/>
<Element Offset="3126" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C36" DisplayMethod="hexadecimal"/>
<Element Offset="3134" Vartype="Float" Bytesize="4" OffsetHex="00000C3E" DisplayMethod="unsigned integer"/>
<Element Offset="3138" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C42" DisplayMethod="hexadecimal"/>
<Element Offset="3146" Vartype="Float" Bytesize="4" OffsetHex="00000C4A" DisplayMethod="unsigned integer"/>
<Element Offset="3150" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000C4E" DisplayMethod="hexadecimal"/>
<Element Offset="3170" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000C62" DisplayMethod="unsigned integer"/>
<Element Offset="3178" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C6A" DisplayMethod="hexadecimal"/>
<Element Offset="3186" Vartype="Double" Bytesize="8" OffsetHex="00000C72" DisplayMethod="unsigned integer"/>
<Element Offset="3194" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C7A" DisplayMethod="unsigned integer"/>
<Element Offset="3198" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C7E" DisplayMethod="hexadecimal"/>
<Element Offset="3202" Vartype="String" Bytesize="4" OffsetHex="00000C82" DisplayMethod="unsigned integer"/>
<Element Offset="3206" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C86" DisplayMethod="hexadecimal"/>
<Element Offset="3210" Vartype="Float" Bytesize="4" OffsetHex="00000C8A" DisplayMethod="unsigned integer"/>
<Element Offset="3214" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000C8E" DisplayMethod="hexadecimal"/>
<Element Offset="3246" Vartype="String" Bytesize="7" OffsetHex="00000CAE" DisplayMethod="unsigned integer"/>
<Element Offset="3253" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00000CB5" DisplayMethod="unsigned integer"/>
<Element Offset="3258" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000CBA" DisplayMethod="hexadecimal"/>
<Element Offset="3266" Vartype="Float" Bytesize="4" OffsetHex="00000CC2" DisplayMethod="unsigned integer"/>
<Element Offset="3270" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000CC6" DisplayMethod="hexadecimal"/>
<Element Offset="3274" Vartype="String" Bytesize="4" OffsetHex="00000CCA" DisplayMethod="unsigned integer"/>
<Element Offset="3278" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="00000CCE" DisplayMethod="hexadecimal"/>
<Element Offset="3334" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D06" DisplayMethod="unsigned integer"/>
<Element Offset="3338" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000D0A" DisplayMethod="hexadecimal"/>
<Element Offset="3346" Vartype="Float" Bytesize="4" OffsetHex="00000D12" DisplayMethod="unsigned integer"/>
<Element Offset="3350" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000D16" DisplayMethod="hexadecimal"/>
<Element Offset="3362" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000D22" DisplayMethod="unsigned integer"/>
<Element Offset="3374" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D2E" DisplayMethod="hexadecimal"/>
<Element Offset="3378" Vartype="Float" Bytesize="4" OffsetHex="00000D32" DisplayMethod="unsigned integer"/>
<Element Offset="3382" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000D36" DisplayMethod="hexadecimal"/>
<Element Offset="3398" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D46" DisplayMethod="unsigned integer"/>
<Element Offset="3402" Vartype="Float" Bytesize="4" OffsetHex="00000D4A" DisplayMethod="unsigned integer"/>
<Element Offset="3406" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000D4E" DisplayMethod="hexadecimal"/>
<Element Offset="3438" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000D6E" DisplayMethod="unsigned integer"/>
<Element Offset="3446" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000D76" DisplayMethod="hexadecimal"/>
<Element Offset="3478" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00000D96" DisplayMethod="unsigned integer"/>
<Element Offset="3482" Vartype="Float" Bytesize="4" OffsetHex="00000D9A" DisplayMethod="unsigned integer"/>
<Element Offset="3486" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00000D9E" DisplayMethod="hexadecimal"/>
<Element Offset="3526" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000DC6" DisplayMethod="unsigned integer"/>
<Element Offset="3530" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000DCA" DisplayMethod="hexadecimal"/>
<Element Offset="3562" Vartype="Double" Bytesize="8" OffsetHex="00000DEA" DisplayMethod="unsigned integer"/>
<Element Offset="3570" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="00000DF2" DisplayMethod="hexadecimal"/>
<Element Offset="3626" Vartype="String" Bytesize="4" OffsetHex="00000E2A" DisplayMethod="unsigned integer"/>
<Element Offset="3630" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000E2E" DisplayMethod="hexadecimal"/>
<Element Offset="3638" Vartype="Float" Bytesize="4" OffsetHex="00000E36" DisplayMethod="unsigned integer"/>
<Element Offset="3642" Vartype="String" Bytesize="7" OffsetHex="00000E3A" DisplayMethod="unsigned integer"/>
<Element Offset="3649" Vartype="Byte" Bytesize="1" OffsetHex="00000E41" DisplayMethod="unsigned integer"/>
<Element Offset="3650" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00000E42" DisplayMethod="hexadecimal"/>
<Element Offset="3686" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E66" DisplayMethod="unsigned integer"/>
<Element Offset="3690" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000E6A" DisplayMethod="hexadecimal"/>
<Element Offset="3698" Vartype="Byte" Bytesize="1" OffsetHex="00000E72" DisplayMethod="unsigned integer"/>
<Element Offset="3699" Vartype="String" Bytesize="10" OffsetHex="00000E73" DisplayMethod="unsigned integer"/>
<Element Offset="3709" Vartype="Byte" Bytesize="1" OffsetHex="00000E7D" DisplayMethod="unsigned integer"/>
<Element Offset="3710" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E7E" DisplayMethod="hexadecimal"/>
<Element Offset="3714" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E82" DisplayMethod="unsigned integer"/>
<Element Offset="3718" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000E86" DisplayMethod="hexadecimal"/>
<Element Offset="3738" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000E9A" DisplayMethod="unsigned integer"/>
<Element Offset="3750" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EA6" DisplayMethod="unsigned integer"/>
<Element Offset="3754" Vartype="Float" Bytesize="4" OffsetHex="00000EAA" DisplayMethod="unsigned integer"/>
<Element Offset="3758" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000EAE" DisplayMethod="hexadecimal"/>
<Element Offset="3774" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EBE" DisplayMethod="unsigned integer"/>
<Element Offset="3778" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000EC2" DisplayMethod="hexadecimal"/>
<Element Offset="3798" Vartype="Float" Bytesize="4" OffsetHex="00000ED6" DisplayMethod="unsigned integer"/>
<Element Offset="3802" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EDA" DisplayMethod="hexadecimal"/>
<Element Offset="3806" Vartype="Float" Bytesize="4" OffsetHex="00000EDE" DisplayMethod="unsigned integer"/>
<Element Offset="3810" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000EE2" DisplayMethod="hexadecimal"/>
<Element Offset="3822" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000EEE" DisplayMethod="unsigned integer"/>
<Element Offset="3830" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EF6" DisplayMethod="unsigned integer"/>
<Element Offset="3834" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000EFA" DisplayMethod="hexadecimal"/>
<Element Offset="3846" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F06" DisplayMethod="unsigned integer"/>
<Element Offset="3850" Vartype="Float" Bytesize="4" OffsetHex="00000F0A" DisplayMethod="unsigned integer"/>
<Element Offset="3854" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000F0E" DisplayMethod="hexadecimal"/>
<Element Offset="3866" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000F1A" DisplayMethod="unsigned integer"/>
<Element Offset="3878" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F26" DisplayMethod="hexadecimal"/>
<Element Offset="3882" Vartype="Float" Bytesize="4" OffsetHex="00000F2A" DisplayMethod="unsigned integer"/>
<Element Offset="3886" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000F2E" DisplayMethod="hexadecimal"/>
<Element Offset="3894" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F36" DisplayMethod="unsigned integer"/>
<Element Offset="3898" Vartype="Float" Bytesize="4" OffsetHex="00000F3A" DisplayMethod="unsigned integer"/>
<Element Offset="3902" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00000F3E" DisplayMethod="hexadecimal"/>
<Element Offset="3942" Vartype="Float" Bytesize="4" OffsetHex="00000F66" DisplayMethod="unsigned integer"/>
<Element Offset="3946" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F6A" DisplayMethod="hexadecimal"/>
<Element Offset="3950" Vartype="Float" Bytesize="4" OffsetHex="00000F6E" DisplayMethod="unsigned integer"/>
<Element Offset="3954" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F72" DisplayMethod="hexadecimal"/>
<Element Offset="3958" Vartype="Double" Bytesize="8" OffsetHex="00000F76" DisplayMethod="unsigned integer"/>
<Element Offset="3966" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000F7E" DisplayMethod="hexadecimal"/>
<Element Offset="3998" Vartype="Float" Bytesize="4" OffsetHex="00000F9E" DisplayMethod="unsigned integer"/>
<Element Offset="4002" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000FA2" DisplayMethod="hexadecimal"/>
<Element Offset="4018" Vartype="Float" Bytesize="4" OffsetHex="00000FB2" DisplayMethod="unsigned integer"/>
<Element Offset="4022" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000FB6" DisplayMethod="unsigned integer"/>
<Element Offset="4026" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000FBA" DisplayMethod="hexadecimal"/>
<Element Offset="4038" Vartype="String" Bytesize="4" OffsetHex="00000FC6" DisplayMethod="unsigned integer"/>
<Element Offset="4042" Vartype="Byte" Bytesize="1" OffsetHex="00000FCA" DisplayMethod="unsigned integer"/>
<Element Offset="4043" Vartype="String" Bytesize="4" OffsetHex="00000FCB" DisplayMethod="unsigned integer"/>
<Element Offset="4047" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000FCF" DisplayMethod="unsigned integer"/>
<Element Offset="4049" Vartype="String" Bytesize="7" OffsetHex="00000FD1" DisplayMethod="unsigned integer"/>
<Element Offset="4056" Vartype="Byte" Bytesize="1" OffsetHex="00000FD8" DisplayMethod="unsigned integer"/>
<Element Offset="4057" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000FD9" DisplayMethod="unsigned integer"/>
<Element Offset="4059" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000FDB" DisplayMethod="unsigned integer"/>
<Element Offset="4062" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000FDE" DisplayMethod="hexadecimal"/>
<Element Offset="4094" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000FFE" DisplayMethod="unsigned integer"/>
</Elements>
</Structure>
<Structure Name="unnamed structure 2" AutoFill="0" AutoCreate="1" DefaultHex="0" AutoDestroy="0" DoNotSaveLocal="0" RLECompression="1" AutoCreateStructsize="4096">
<Elements>
<Element Offset="0" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000000" DisplayMethod="unsigned integer"/>
<Element Offset="2" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000002" DisplayMethod="hexadecimal"/>
<Element Offset="18" Vartype="String" Bytesize="8" OffsetHex="00000012" DisplayMethod="unsigned integer"/>
<Element Offset="26" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000001A" DisplayMethod="hexadecimal"/>
<Element Offset="38" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000026" DisplayMethod="unsigned integer"/>
<Element Offset="42" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000002A" DisplayMethod="hexadecimal"/>
<Element Offset="50" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00000032" DisplayMethod="unsigned integer"/>
<Element Offset="55" Vartype="String" Bytesize="4" OffsetHex="00000037" DisplayMethod="unsigned integer"/>
<Element Offset="59" Vartype="Byte" Bytesize="1" OffsetHex="0000003B" DisplayMethod="unsigned integer"/>
<Element Offset="60" Vartype="String" Bytesize="4" OffsetHex="0000003C" DisplayMethod="unsigned integer"/>
<Element Offset="64" Vartype="Byte" Bytesize="1" OffsetHex="00000040" DisplayMethod="unsigned integer"/>
<Element Offset="65" Vartype="String" Bytesize="4" OffsetHex="00000041" DisplayMethod="unsigned integer"/>
<Element Offset="69" Vartype="Byte" Bytesize="1" OffsetHex="00000045" DisplayMethod="unsigned integer"/>
<Element Offset="70" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000046" DisplayMethod="hexadecimal"/>
<Element Offset="74" Vartype="String" Bytesize="5" OffsetHex="0000004A" DisplayMethod="unsigned integer"/>
<Element Offset="79" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000004F" DisplayMethod="unsigned integer"/>
<Element Offset="82" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00000052" DisplayMethod="hexadecimal"/>
<Element Offset="110" Vartype="Float" Bytesize="4" OffsetHex="0000006E" DisplayMethod="unsigned integer"/>
<Element Offset="114" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000072" DisplayMethod="hexadecimal"/>
<Element Offset="118" Vartype="Float" Bytesize="4" OffsetHex="00000076" DisplayMethod="unsigned integer"/>
<Element Offset="122" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000007A" DisplayMethod="hexadecimal"/>
<Element Offset="138" Vartype="Float" Bytesize="4" OffsetHex="0000008A" DisplayMethod="unsigned integer"/>
<Element Offset="142" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000008E" DisplayMethod="hexadecimal"/>
<Element Offset="146" Vartype="Float" Bytesize="4" OffsetHex="00000092" DisplayMethod="unsigned integer"/>
<Element Offset="150" Vartype="4 Bytes" Bytesize="4" RLECount="19" OffsetHex="00000096" DisplayMethod="hexadecimal"/>
<Element Offset="226" Vartype="4 Bytes" Bytesize="4" OffsetHex="000000E2" DisplayMethod="unsigned integer"/>
<Element Offset="230" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000000E6" DisplayMethod="hexadecimal"/>
<Element Offset="238" Vartype="Double" Bytesize="8" OffsetHex="000000EE" DisplayMethod="unsigned integer"/>
<Element Offset="246" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000000F6" DisplayMethod="hexadecimal"/>
<Element Offset="282" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000011A" DisplayMethod="unsigned integer"/>
<Element Offset="286" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000011E" DisplayMethod="hexadecimal"/>
<Element Offset="294" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000126" DisplayMethod="unsigned integer"/>
<Element Offset="302" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000012E" DisplayMethod="hexadecimal"/>
<Element Offset="306" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000132" DisplayMethod="unsigned integer"/>
<Element Offset="310" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00000136" DisplayMethod="hexadecimal"/>
<Element Offset="346" Vartype="Double" Bytesize="8" OffsetHex="0000015A" DisplayMethod="unsigned integer"/>
<Element Offset="354" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000162" DisplayMethod="hexadecimal"/>
<Element Offset="378" Vartype="Float" Bytesize="4" OffsetHex="0000017A" DisplayMethod="unsigned integer"/>
<Element Offset="382" Vartype="Byte" Bytesize="1" OffsetHex="0000017E" DisplayMethod="unsigned integer"/>
<Element Offset="383" Vartype="String" Bytesize="5" OffsetHex="0000017F" DisplayMethod="unsigned integer"/>
<Element Offset="388" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000184" DisplayMethod="unsigned integer"/>
<Element Offset="390" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000186" DisplayMethod="hexadecimal"/>
<Element Offset="394" Vartype="Double" Bytesize="8" OffsetHex="0000018A" DisplayMethod="unsigned integer"/>
<Element Offset="402" Vartype="Float" Bytesize="4" OffsetHex="00000192" DisplayMethod="unsigned integer"/>
<Element Offset="406" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000196" DisplayMethod="hexadecimal"/>
<Element Offset="430" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000001AE" DisplayMethod="unsigned integer"/>
<Element Offset="434" Vartype="Float" Bytesize="4" OffsetHex="000001B2" DisplayMethod="unsigned integer"/>
<Element Offset="438" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000001B6" DisplayMethod="hexadecimal"/>
<Element Offset="474" Vartype="String" Bytesize="4" OffsetHex="000001DA" DisplayMethod="unsigned integer"/>
<Element Offset="478" Vartype="Byte" Bytesize="1" OffsetHex="000001DE" DisplayMethod="unsigned integer"/>
<Element Offset="479" Vartype="String" Bytesize="4" OffsetHex="000001DF" DisplayMethod="unsigned integer"/>
<Element Offset="483" Vartype="Byte" Bytesize="1" OffsetHex="000001E3" DisplayMethod="unsigned integer"/>
<Element Offset="484" Vartype="String" Bytesize="4" OffsetHex="000001E4" DisplayMethod="unsigned integer"/>
<Element Offset="488" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="000001E8" DisplayMethod="unsigned integer"/>
<Element Offset="490" Vartype="String" Bytesize="7" OffsetHex="000001EA" DisplayMethod="unsigned integer"/>
<Element Offset="497" Vartype="Byte" Bytesize="1" OffsetHex="000001F1" DisplayMethod="unsigned integer"/>
<Element Offset="498" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000001F2" DisplayMethod="hexadecimal"/>
<Element Offset="506" Vartype="4 Bytes" Bytesize="4" OffsetHex="000001FA" DisplayMethod="unsigned integer"/>
<Element Offset="510" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="000001FE" DisplayMethod="unsigned integer"/>
<Element Offset="518" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000206" DisplayMethod="hexadecimal"/>
<Element Offset="522" Vartype="Double" Bytesize="8" OffsetHex="0000020A" DisplayMethod="unsigned integer"/>
<Element Offset="530" Vartype="Float" Bytesize="4" OffsetHex="00000212" DisplayMethod="unsigned integer"/>
<Element Offset="534" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00000216" DisplayMethod="hexadecimal"/>
<Element Offset="578" Vartype="Float" Bytesize="4" OffsetHex="00000242" DisplayMethod="unsigned integer"/>
<Element Offset="582" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000246" DisplayMethod="hexadecimal"/>
<Element Offset="606" Vartype="Double" Bytesize="8" OffsetHex="0000025E" DisplayMethod="unsigned integer"/>
<Element Offset="614" Vartype="Float" Bytesize="4" OffsetHex="00000266" DisplayMethod="unsigned integer"/>
<Element Offset="618" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000026A" DisplayMethod="unsigned integer"/>
<Element Offset="622" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000026E" DisplayMethod="hexadecimal"/>
<Element Offset="630" Vartype="Float" Bytesize="4" OffsetHex="00000276" DisplayMethod="unsigned integer"/>
<Element Offset="634" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000027A" DisplayMethod="hexadecimal"/>
<Element Offset="638" Vartype="Float" Bytesize="4" OffsetHex="0000027E" DisplayMethod="unsigned integer"/>
<Element Offset="642" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000282" DisplayMethod="hexadecimal"/>
<Element Offset="646" Vartype="Float" Bytesize="4" OffsetHex="00000286" DisplayMethod="unsigned integer"/>
<Element Offset="650" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000028A" DisplayMethod="hexadecimal"/>
<Element Offset="658" Vartype="Float" Bytesize="4" OffsetHex="00000292" DisplayMethod="unsigned integer"/>
<Element Offset="662" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000296" DisplayMethod="hexadecimal"/>
<Element Offset="666" Vartype="Float" Bytesize="4" OffsetHex="0000029A" DisplayMethod="unsigned integer"/>
<Element Offset="670" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000029E" DisplayMethod="unsigned integer"/>
<Element Offset="674" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002A2" DisplayMethod="hexadecimal"/>
<Element Offset="678" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002A6" DisplayMethod="unsigned integer"/>
<Element Offset="682" Vartype="Float" Bytesize="4" OffsetHex="000002AA" DisplayMethod="unsigned integer"/>
<Element Offset="686" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000002AE" DisplayMethod="hexadecimal"/>
<Element Offset="710" Vartype="4 Bytes" Bytesize="4" OffsetHex="000002C6" DisplayMethod="unsigned integer"/>
<Element Offset="714" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000002CA" DisplayMethod="hexadecimal"/>
<Element Offset="722" Vartype="Byte" Bytesize="1" OffsetHex="000002D2" DisplayMethod="unsigned integer"/>
<Element Offset="723" Vartype="String" Bytesize="10" OffsetHex="000002D3" DisplayMethod="unsigned integer"/>
<Element Offset="733" Vartype="Byte" Bytesize="1" OffsetHex="000002DD" DisplayMethod="unsigned integer"/>
<Element Offset="734" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="000002DE" DisplayMethod="hexadecimal"/>
<Element Offset="762" Vartype="Float" Bytesize="4" OffsetHex="000002FA" DisplayMethod="unsigned integer"/>
<Element Offset="766" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000002FE" DisplayMethod="hexadecimal"/>
<Element Offset="774" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000306" DisplayMethod="unsigned integer"/>
<Element Offset="782" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000030E" DisplayMethod="hexadecimal"/>
<Element Offset="786" Vartype="Float" Bytesize="4" OffsetHex="00000312" DisplayMethod="unsigned integer"/>
<Element Offset="790" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000316" DisplayMethod="hexadecimal"/>
<Element Offset="798" Vartype="Byte" Bytesize="1" OffsetHex="0000031E" DisplayMethod="unsigned integer"/>
<Element Offset="799" Vartype="String" Bytesize="4" OffsetHex="0000031F" DisplayMethod="unsigned integer"/>
<Element Offset="803" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000323" DisplayMethod="unsigned integer"/>
<Element Offset="806" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000326" DisplayMethod="hexadecimal"/>
<Element Offset="822" Vartype="Float" Bytesize="4" OffsetHex="00000336" DisplayMethod="unsigned integer"/>
<Element Offset="826" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="0000033A" DisplayMethod="hexadecimal"/>
<Element Offset="854" Vartype="Float" Bytesize="4" OffsetHex="00000356" DisplayMethod="unsigned integer"/>
<Element Offset="858" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000035A" DisplayMethod="unsigned integer"/>
<Element Offset="862" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="0000035E" DisplayMethod="hexadecimal"/>
<Element Offset="882" Vartype="Double" Bytesize="8" OffsetHex="00000372" DisplayMethod="unsigned integer"/>
<Element Offset="890" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000037A" DisplayMethod="unsigned integer"/>
<Element Offset="894" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000037E" DisplayMethod="hexadecimal"/>
<Element Offset="906" Vartype="Float" Bytesize="4" OffsetHex="0000038A" DisplayMethod="unsigned integer"/>
<Element Offset="910" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000038E" DisplayMethod="hexadecimal"/>
<Element Offset="918" Vartype="Float" Bytesize="4" OffsetHex="00000396" DisplayMethod="unsigned integer"/>
<Element Offset="922" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000039A" DisplayMethod="unsigned integer"/>
<Element Offset="926" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000039E" DisplayMethod="hexadecimal"/>
<Element Offset="958" Vartype="4 Bytes" Bytesize="4" OffsetHex="000003BE" DisplayMethod="unsigned integer"/>
<Element Offset="962" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000003C2" DisplayMethod="hexadecimal"/>
<Element Offset="974" Vartype="Float" Bytesize="4" OffsetHex="000003CE" DisplayMethod="unsigned integer"/>
<Element Offset="978" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000003D2" DisplayMethod="hexadecimal"/>
<Element Offset="998" Vartype="Float" Bytesize="4" OffsetHex="000003E6" DisplayMethod="unsigned integer"/>
<Element Offset="1002" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000003EA" DisplayMethod="hexadecimal"/>
<Element Offset="1014" Vartype="Byte" Bytesize="1" OffsetHex="000003F6" DisplayMethod="unsigned integer"/>
<Element Offset="1015" Vartype="String" Bytesize="4" OffsetHex="000003F7" DisplayMethod="unsigned integer"/>
<Element Offset="1019" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000003FB" DisplayMethod="unsigned integer"/>
<Element Offset="1022" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000003FE" DisplayMethod="hexadecimal"/>
<Element Offset="1030" Vartype="String" Bytesize="7" OffsetHex="00000406" DisplayMethod="unsigned integer"/>
<Element Offset="1037" Vartype="Byte" Bytesize="1" OffsetHex="0000040D" DisplayMethod="unsigned integer"/>
<Element Offset="1038" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="0000040E" DisplayMethod="hexadecimal"/>
<Element Offset="1058" Vartype="String" Bytesize="4" OffsetHex="00000422" DisplayMethod="unsigned integer"/>
<Element Offset="1062" Vartype="Byte" Bytesize="1" OffsetHex="00000426" DisplayMethod="unsigned integer"/>
<Element Offset="1063" Vartype="String" Bytesize="4" OffsetHex="00000427" DisplayMethod="unsigned integer"/>
<Element Offset="1067" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="0000042B" DisplayMethod="unsigned integer"/>
<Element Offset="1069" Vartype="String" Bytesize="7" OffsetHex="0000042D" DisplayMethod="unsigned integer"/>
<Element Offset="1076" Vartype="Byte" Bytesize="1" OffsetHex="00000434" DisplayMethod="unsigned integer"/>
<Element Offset="1077" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000435" DisplayMethod="unsigned integer"/>
<Element Offset="1079" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000437" DisplayMethod="unsigned integer"/>
<Element Offset="1082" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000043A" DisplayMethod="hexadecimal"/>
<Element Offset="1094" Vartype="Byte" Bytesize="1" OffsetHex="00000446" DisplayMethod="unsigned integer"/>
<Element Offset="1095" Vartype="String" Bytesize="6" OffsetHex="00000447" DisplayMethod="unsigned integer"/>
<Element Offset="1101" Vartype="Byte" Bytesize="1" OffsetHex="0000044D" DisplayMethod="unsigned integer"/>
<Element Offset="1102" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000044E" DisplayMethod="hexadecimal"/>
<Element Offset="1110" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000456" DisplayMethod="unsigned integer"/>
<Element Offset="1113" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000459" DisplayMethod="unsigned integer"/>
<Element Offset="1115" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000045B" DisplayMethod="unsigned integer"/>
<Element Offset="1118" Vartype="Float" Bytesize="4" OffsetHex="0000045E" DisplayMethod="unsigned integer"/>
<Element Offset="1122" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00000462" DisplayMethod="hexadecimal"/>
<Element Offset="1150" Vartype="Double" Bytesize="8" OffsetHex="0000047E" DisplayMethod="unsigned integer"/>
<Element Offset="1158" Vartype="Float" Bytesize="4" OffsetHex="00000486" DisplayMethod="unsigned integer"/>
<Element Offset="1162" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000048A" DisplayMethod="hexadecimal"/>
<Element Offset="1174" Vartype="Float" Bytesize="4" OffsetHex="00000496" DisplayMethod="unsigned integer"/>
<Element Offset="1178" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="0000049A" DisplayMethod="hexadecimal"/>
<Element Offset="1206" Vartype="Float" Bytesize="4" OffsetHex="000004B6" DisplayMethod="unsigned integer"/>
<Element Offset="1210" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000004BA" DisplayMethod="hexadecimal"/>
<Element Offset="1218" Vartype="Float" Bytesize="4" OffsetHex="000004C2" DisplayMethod="unsigned integer"/>
<Element Offset="1222" Vartype="4 Bytes" Bytesize="4" RLECount="19" OffsetHex="000004C6" DisplayMethod="hexadecimal"/>
<Element Offset="1298" Vartype="Double" Bytesize="8" OffsetHex="00000512" DisplayMethod="unsigned integer"/>
<Element Offset="1306" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000051A" DisplayMethod="hexadecimal"/>
<Element Offset="1342" Vartype="Float" Bytesize="4" OffsetHex="0000053E" DisplayMethod="unsigned integer"/>
<Element Offset="1346" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000542" DisplayMethod="hexadecimal"/>
<Element Offset="1366" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000556" DisplayMethod="unsigned integer"/>
<Element Offset="1370" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000055A" DisplayMethod="hexadecimal"/>
<Element Offset="1382" Vartype="Float" Bytesize="4" OffsetHex="00000566" DisplayMethod="unsigned integer"/>
<Element Offset="1386" Vartype="4 Bytes" Bytesize="4" RLECount="15" OffsetHex="0000056A" DisplayMethod="hexadecimal"/>
<Element Offset="1446" Vartype="Byte" Bytesize="1" OffsetHex="000005A6" DisplayMethod="unsigned integer"/>
<Element Offset="1447" Vartype="String" Bytesize="8" OffsetHex="000005A7" DisplayMethod="unsigned integer"/>
<Element Offset="1455" Vartype="Byte" Bytesize="1" OffsetHex="000005AF" DisplayMethod="unsigned integer"/>
<Element Offset="1456" Vartype="2 Bytes" Bytesize="2" OffsetHex="000005B0" DisplayMethod="unsigned integer"/>
<Element Offset="1458" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000005B2" DisplayMethod="hexadecimal"/>
<Element Offset="1478" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="000005C6" DisplayMethod="unsigned integer"/>
<Element Offset="1490" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005D2" DisplayMethod="unsigned integer"/>
<Element Offset="1494" Vartype="Float" Bytesize="4" OffsetHex="000005D6" DisplayMethod="unsigned integer"/>
<Element Offset="1498" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005DA" DisplayMethod="hexadecimal"/>
<Element Offset="1502" Vartype="Float" Bytesize="4" OffsetHex="000005DE" DisplayMethod="unsigned integer"/>
<Element Offset="1506" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000005E2" DisplayMethod="hexadecimal"/>
<Element Offset="1518" Vartype="Float" Bytesize="4" OffsetHex="000005EE" DisplayMethod="unsigned integer"/>
<Element Offset="1522" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005F2" DisplayMethod="hexadecimal"/>
<Element Offset="1526" Vartype="Float" Bytesize="4" OffsetHex="000005F6" DisplayMethod="unsigned integer"/>
<Element Offset="1530" Vartype="4 Bytes" Bytesize="4" OffsetHex="000005FA" DisplayMethod="hexadecimal"/>
<Element Offset="1534" Vartype="Float" Bytesize="4" OffsetHex="000005FE" DisplayMethod="unsigned integer"/>
<Element Offset="1538" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000602" DisplayMethod="hexadecimal"/>
<Element Offset="1550" Vartype="Float" Bytesize="4" OffsetHex="0000060E" DisplayMethod="unsigned integer"/>
<Element Offset="1554" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000612" DisplayMethod="hexadecimal"/>
<Element Offset="1566" Vartype="Float" Bytesize="4" OffsetHex="0000061E" DisplayMethod="unsigned integer"/>
<Element Offset="1570" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000622" DisplayMethod="hexadecimal"/>
<Element Offset="1574" Vartype="Float" Bytesize="4" OffsetHex="00000626" DisplayMethod="unsigned integer"/>
<Element Offset="1578" Vartype="4 Bytes" Bytesize="4" RLECount="13" OffsetHex="0000062A" DisplayMethod="hexadecimal"/>
<Element Offset="1630" Vartype="Double" Bytesize="8" OffsetHex="0000065E" DisplayMethod="unsigned integer"/>
<Element Offset="1638" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000666" DisplayMethod="hexadecimal"/>
<Element Offset="1646" Vartype="Float" Bytesize="4" OffsetHex="0000066E" DisplayMethod="unsigned integer"/>
<Element Offset="1650" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000672" DisplayMethod="hexadecimal"/>
<Element Offset="1670" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000686" DisplayMethod="unsigned integer"/>
<Element Offset="1674" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000068A" DisplayMethod="hexadecimal"/>
<Element Offset="1710" Vartype="Float" Bytesize="4" OffsetHex="000006AE" DisplayMethod="unsigned integer"/>
<Element Offset="1714" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000006B2" DisplayMethod="hexadecimal"/>
<Element Offset="1722" Vartype="Float" Bytesize="4" OffsetHex="000006BA" DisplayMethod="unsigned integer"/>
<Element Offset="1726" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000006BE" DisplayMethod="hexadecimal"/>
<Element Offset="1734" Vartype="Byte" Bytesize="1" RLECount="8" OffsetHex="000006C6" DisplayMethod="unsigned integer"/>
<Element Offset="1742" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000006CE" DisplayMethod="hexadecimal"/>
<Element Offset="1766" Vartype="Float" Bytesize="4" OffsetHex="000006E6" DisplayMethod="unsigned integer"/>
<Element Offset="1770" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000006EA" DisplayMethod="hexadecimal"/>
<Element Offset="1806" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000070E" DisplayMethod="unsigned integer"/>
<Element Offset="1810" Vartype="Float" Bytesize="4" OffsetHex="00000712" DisplayMethod="unsigned integer"/>
<Element Offset="1814" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000716" DisplayMethod="hexadecimal"/>
<Element Offset="1826" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000722" DisplayMethod="unsigned integer"/>
<Element Offset="1830" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000726" DisplayMethod="hexadecimal"/>
<Element Offset="1838" Vartype="Byte" Bytesize="1" OffsetHex="0000072E" DisplayMethod="unsigned integer"/>
<Element Offset="1839" Vartype="String" Bytesize="8" OffsetHex="0000072F" DisplayMethod="unsigned integer"/>
<Element Offset="1847" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000737" DisplayMethod="unsigned integer"/>
<Element Offset="1850" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="0000073A" DisplayMethod="hexadecimal"/>
<Element Offset="1906" Vartype="Double" Bytesize="8" OffsetHex="00000772" DisplayMethod="unsigned integer"/>
<Element Offset="1914" Vartype="Float" Bytesize="4" OffsetHex="0000077A" DisplayMethod="unsigned integer"/>
<Element Offset="1918" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000077E" DisplayMethod="hexadecimal"/>
<Element Offset="1922" Vartype="String" Bytesize="4" OffsetHex="00000782" DisplayMethod="unsigned integer"/>
<Element Offset="1926" Vartype="Byte" Bytesize="1" OffsetHex="00000786" DisplayMethod="unsigned integer"/>
<Element Offset="1927" Vartype="String" Bytesize="4" OffsetHex="00000787" DisplayMethod="unsigned integer"/>
<Element Offset="1931" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000078B" DisplayMethod="unsigned integer"/>
<Element Offset="1934" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000078E" DisplayMethod="hexadecimal"/>
<Element Offset="1938" Vartype="Float" Bytesize="4" OffsetHex="00000792" DisplayMethod="unsigned integer"/>
<Element Offset="1942" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000796" DisplayMethod="hexadecimal"/>
<Element Offset="1962" Vartype="4 Bytes" Bytesize="4" OffsetHex="000007AA" DisplayMethod="unsigned integer"/>
<Element Offset="1966" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000007AE" DisplayMethod="hexadecimal"/>
<Element Offset="1990" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000007C6" DisplayMethod="unsigned integer"/>
<Element Offset="1994" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000007CA" DisplayMethod="hexadecimal"/>
<Element Offset="2002" Vartype="4 Bytes" Bytesize="4" OffsetHex="000007D2" DisplayMethod="unsigned integer"/>
<Element Offset="2006" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000007D6" DisplayMethod="hexadecimal"/>
<Element Offset="2014" Vartype="String" Bytesize="4" OffsetHex="000007DE" DisplayMethod="unsigned integer"/>
<Element Offset="2018" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000007E2" DisplayMethod="hexadecimal"/>
<Element Offset="2038" Vartype="Byte" Bytesize="1" OffsetHex="000007F6" DisplayMethod="unsigned integer"/>
<Element Offset="2039" Vartype="String" Bytesize="12" OffsetHex="000007F7" DisplayMethod="unsigned integer"/>
<Element Offset="2051" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000803" DisplayMethod="unsigned integer"/>
<Element Offset="2054" Vartype="Float" Bytesize="4" OffsetHex="00000806" DisplayMethod="unsigned integer"/>
<Element Offset="2058" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000080A" DisplayMethod="hexadecimal"/>
<Element Offset="2094" Vartype="Float" Bytesize="4" OffsetHex="0000082E" DisplayMethod="unsigned integer"/>
<Element Offset="2098" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000832" DisplayMethod="hexadecimal"/>
<Element Offset="2110" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000083E" DisplayMethod="unsigned integer"/>
<Element Offset="2114" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000842" DisplayMethod="hexadecimal"/>
<Element Offset="2118" Vartype="Byte" Bytesize="1" OffsetHex="00000846" DisplayMethod="unsigned integer"/>
<Element Offset="2119" Vartype="String" Bytesize="4" OffsetHex="00000847" DisplayMethod="unsigned integer"/>
<Element Offset="2123" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000084B" DisplayMethod="unsigned integer"/>
<Element Offset="2126" Vartype="Float" Bytesize="4" OffsetHex="0000084E" DisplayMethod="unsigned integer"/>
<Element Offset="2130" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000852" DisplayMethod="hexadecimal"/>
<Element Offset="2150" Vartype="Float" Bytesize="4" OffsetHex="00000866" DisplayMethod="unsigned integer"/>
<Element Offset="2154" Vartype="Double" Bytesize="8" OffsetHex="0000086A" DisplayMethod="unsigned integer"/>
<Element Offset="2162" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000872" DisplayMethod="hexadecimal"/>
<Element Offset="2182" Vartype="Float" Bytesize="4" OffsetHex="00000886" DisplayMethod="unsigned integer"/>
<Element Offset="2186" Vartype="Double" Bytesize="8" OffsetHex="0000088A" DisplayMethod="unsigned integer"/>
<Element Offset="2194" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000892" DisplayMethod="hexadecimal"/>
<Element Offset="2214" Vartype="Float" Bytesize="4" OffsetHex="000008A6" DisplayMethod="unsigned integer"/>
<Element Offset="2218" Vartype="Double" Bytesize="8" OffsetHex="000008AA" DisplayMethod="unsigned integer"/>
<Element Offset="2226" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000008B2" DisplayMethod="hexadecimal"/>
<Element Offset="2238" Vartype="Double" Bytesize="8" OffsetHex="000008BE" DisplayMethod="unsigned integer"/>
<Element Offset="2246" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="000008C6" DisplayMethod="unsigned integer"/>
<Element Offset="2250" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000008CA" DisplayMethod="hexadecimal"/>
<Element Offset="2274" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="000008E2" DisplayMethod="unsigned integer"/>
<Element Offset="2282" Vartype="4 Bytes" Bytesize="4" OffsetHex="000008EA" DisplayMethod="hexadecimal"/>
<Element Offset="2286" Vartype="Byte" Bytesize="1" RLECount="8" OffsetHex="000008EE" DisplayMethod="unsigned integer"/>
<Element Offset="2294" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000008F6" DisplayMethod="hexadecimal"/>
<Element Offset="2302" Vartype="String" Bytesize="4" OffsetHex="000008FE" DisplayMethod="unsigned integer"/>
<Element Offset="2306" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000902" DisplayMethod="hexadecimal"/>
<Element Offset="2310" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000906" DisplayMethod="unsigned integer"/>
<Element Offset="2314" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000090A" DisplayMethod="hexadecimal"/>
<Element Offset="2318" Vartype="Float" Bytesize="4" OffsetHex="0000090E" DisplayMethod="unsigned integer"/>
<Element Offset="2322" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000912" DisplayMethod="hexadecimal"/>
<Element Offset="2326" Vartype="Float" Bytesize="4" OffsetHex="00000916" DisplayMethod="unsigned integer"/>
<Element Offset="2330" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000091A" DisplayMethod="hexadecimal"/>
<Element Offset="2338" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000922" DisplayMethod="unsigned integer"/>
<Element Offset="2342" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000926" DisplayMethod="hexadecimal"/>
<Element Offset="2346" Vartype="Byte" Bytesize="1" RLECount="6" OffsetHex="0000092A" DisplayMethod="unsigned integer"/>
<Element Offset="2352" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000930" DisplayMethod="unsigned integer"/>
<Element Offset="2354" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000932" DisplayMethod="hexadecimal"/>
<Element Offset="2358" Vartype="Byte" Bytesize="1" OffsetHex="00000936" DisplayMethod="unsigned integer"/>
<Element Offset="2359" Vartype="String" Bytesize="4" OffsetHex="00000937" DisplayMethod="unsigned integer"/>
<Element Offset="2363" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="0000093B" DisplayMethod="unsigned integer"/>
<Element Offset="2365" Vartype="2 Bytes" Bytesize="2" OffsetHex="0000093D" DisplayMethod="unsigned integer"/>
<Element Offset="2367" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000093F" DisplayMethod="unsigned integer"/>
<Element Offset="2370" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000942" DisplayMethod="unsigned integer"/>
<Element Offset="2374" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000946" DisplayMethod="hexadecimal"/>
<Element Offset="2378" Vartype="Float" Bytesize="4" OffsetHex="0000094A" DisplayMethod="unsigned integer"/>
<Element Offset="2382" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000094E" DisplayMethod="hexadecimal"/>
<Element Offset="2386" Vartype="Float" Bytesize="4" OffsetHex="00000952" DisplayMethod="unsigned integer"/>
<Element Offset="2390" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000956" DisplayMethod="hexadecimal"/>
<Element Offset="2394" Vartype="Float" Bytesize="4" OffsetHex="0000095A" DisplayMethod="unsigned integer"/>
<Element Offset="2398" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000095E" DisplayMethod="hexadecimal"/>
<Element Offset="2414" Vartype="Float" Bytesize="4" OffsetHex="0000096E" DisplayMethod="unsigned integer"/>
<Element Offset="2418" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000972" DisplayMethod="hexadecimal"/>
<Element Offset="2442" Vartype="Float" Bytesize="4" OffsetHex="0000098A" DisplayMethod="unsigned integer"/>
<Element Offset="2446" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000098E" DisplayMethod="hexadecimal"/>
<Element Offset="2450" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000992" DisplayMethod="unsigned integer"/>
<Element Offset="2454" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000996" DisplayMethod="hexadecimal"/>
<Element Offset="2458" Vartype="Float" Bytesize="4" OffsetHex="0000099A" DisplayMethod="unsigned integer"/>
<Element Offset="2462" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000099E" DisplayMethod="hexadecimal"/>
<Element Offset="2494" Vartype="Byte" Bytesize="1" OffsetHex="000009BE" DisplayMethod="unsigned integer"/>
<Element Offset="2495" Vartype="String" Bytesize="12" OffsetHex="000009BF" DisplayMethod="unsigned integer"/>
<Element Offset="2507" Vartype="Byte" Bytesize="1" OffsetHex="000009CB" DisplayMethod="unsigned integer"/>
<Element Offset="2508" Vartype="2 Bytes" Bytesize="2" OffsetHex="000009CC" DisplayMethod="unsigned integer"/>
<Element Offset="2510" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000009CE" DisplayMethod="hexadecimal"/>
<Element Offset="2542" Vartype="Float" Bytesize="4" OffsetHex="000009EE" DisplayMethod="unsigned integer"/>
<Element Offset="2546" Vartype="Double" Bytesize="8" OffsetHex="000009F2" DisplayMethod="unsigned integer"/>
<Element Offset="2554" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000009FA" DisplayMethod="hexadecimal"/>
<Element Offset="2562" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000A02" DisplayMethod="unsigned integer"/>
<Element Offset="2574" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A0E" DisplayMethod="hexadecimal"/>
<Element Offset="2594" Vartype="Float" Bytesize="4" OffsetHex="00000A22" DisplayMethod="unsigned integer"/>
<Element Offset="2598" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A26" DisplayMethod="hexadecimal"/>
<Element Offset="2618" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A3A" DisplayMethod="unsigned integer"/>
<Element Offset="2622" Vartype="4 Bytes" Bytesize="4" RLECount="13" OffsetHex="00000A3E" DisplayMethod="hexadecimal"/>
<Element Offset="2674" Vartype="Double" Bytesize="8" OffsetHex="00000A72" DisplayMethod="unsigned integer"/>
<Element Offset="2682" Vartype="Float" Bytesize="4" OffsetHex="00000A7A" DisplayMethod="unsigned integer"/>
<Element Offset="2686" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A7E" DisplayMethod="hexadecimal"/>
<Element Offset="2690" Vartype="String" Bytesize="4" OffsetHex="00000A82" DisplayMethod="unsigned integer"/>
<Element Offset="2694" Vartype="Byte" Bytesize="1" OffsetHex="00000A86" DisplayMethod="unsigned integer"/>
<Element Offset="2695" Vartype="String" Bytesize="4" OffsetHex="00000A87" DisplayMethod="unsigned integer"/>
<Element Offset="2699" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000A8B" DisplayMethod="unsigned integer"/>
<Element Offset="2702" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000A8E" DisplayMethod="hexadecimal"/>
<Element Offset="2706" Vartype="Float" Bytesize="4" OffsetHex="00000A92" DisplayMethod="unsigned integer"/>
<Element Offset="2710" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000A96" DisplayMethod="hexadecimal"/>
<Element Offset="2730" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000AAA" DisplayMethod="unsigned integer"/>
<Element Offset="2734" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000AAE" DisplayMethod="hexadecimal"/>
<Element Offset="2758" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00000AC6" DisplayMethod="unsigned integer"/>
<Element Offset="2762" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000ACA" DisplayMethod="hexadecimal"/>
<Element Offset="2770" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000AD2" DisplayMethod="unsigned integer"/>
<Element Offset="2774" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000AD6" DisplayMethod="hexadecimal"/>
<Element Offset="2782" Vartype="String" Bytesize="4" OffsetHex="00000ADE" DisplayMethod="unsigned integer"/>
<Element Offset="2786" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00000AE2" DisplayMethod="hexadecimal"/>
<Element Offset="2830" Vartype="Float" Bytesize="4" OffsetHex="00000B0E" DisplayMethod="unsigned integer"/>
<Element Offset="2834" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000B12" DisplayMethod="hexadecimal"/>
<Element Offset="2842" Vartype="Float" Bytesize="4" OffsetHex="00000B1A" DisplayMethod="unsigned integer"/>
<Element Offset="2846" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B1E" DisplayMethod="unsigned integer"/>
<Element Offset="2850" Vartype="Float" Bytesize="4" OffsetHex="00000B22" DisplayMethod="unsigned integer"/>
<Element Offset="2854" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000B26" DisplayMethod="hexadecimal"/>
<Element Offset="2870" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000B36" DisplayMethod="unsigned integer"/>
<Element Offset="2882" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000B42" DisplayMethod="hexadecimal"/>
<Element Offset="2890" Vartype="Float" Bytesize="4" OffsetHex="00000B4A" DisplayMethod="unsigned integer"/>
<Element Offset="2894" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B4E" DisplayMethod="hexadecimal"/>
<Element Offset="2898" Vartype="Float" Bytesize="4" OffsetHex="00000B52" DisplayMethod="unsigned integer"/>
<Element Offset="2902" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000B56" DisplayMethod="hexadecimal"/>
<Element Offset="2934" Vartype="Float" Bytesize="4" OffsetHex="00000B76" DisplayMethod="unsigned integer"/>
<Element Offset="2938" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000B7A" DisplayMethod="hexadecimal"/>
<Element Offset="2942" Vartype="Float" Bytesize="4" OffsetHex="00000B7E" DisplayMethod="unsigned integer"/>
<Element Offset="2946" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000B82" DisplayMethod="hexadecimal"/>
<Element Offset="2978" Vartype="Float" Bytesize="4" OffsetHex="00000BA2" DisplayMethod="unsigned integer"/>
<Element Offset="2982" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000BA6" DisplayMethod="hexadecimal"/>
<Element Offset="2986" Vartype="Float" Bytesize="4" OffsetHex="00000BAA" DisplayMethod="unsigned integer"/>
<Element Offset="2990" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000BAE" DisplayMethod="hexadecimal"/>
<Element Offset="3022" Vartype="Float" Bytesize="4" OffsetHex="00000BCE" DisplayMethod="unsigned integer"/>
<Element Offset="3026" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000BD2" DisplayMethod="hexadecimal"/>
<Element Offset="3030" Vartype="Float" Bytesize="4" OffsetHex="00000BD6" DisplayMethod="unsigned integer"/>
<Element Offset="3034" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000BDA" DisplayMethod="hexadecimal"/>
<Element Offset="3058" Vartype="Double" Bytesize="8" OffsetHex="00000BF2" DisplayMethod="unsigned integer"/>
<Element Offset="3066" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00000BFA" DisplayMethod="hexadecimal"/>
<Element Offset="3090" Vartype="Float" Bytesize="4" OffsetHex="00000C12" DisplayMethod="unsigned integer"/>
<Element Offset="3094" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000C16" DisplayMethod="hexadecimal"/>
<Element Offset="3106" Vartype="Float" Bytesize="4" OffsetHex="00000C22" DisplayMethod="unsigned integer"/>
<Element Offset="3110" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000C26" DisplayMethod="hexadecimal"/>
<Element Offset="3122" Vartype="Float" Bytesize="4" OffsetHex="00000C32" DisplayMethod="unsigned integer"/>
<Element Offset="3126" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C36" DisplayMethod="hexadecimal"/>
<Element Offset="3134" Vartype="Float" Bytesize="4" OffsetHex="00000C3E" DisplayMethod="unsigned integer"/>
<Element Offset="3138" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C42" DisplayMethod="hexadecimal"/>
<Element Offset="3146" Vartype="Float" Bytesize="4" OffsetHex="00000C4A" DisplayMethod="unsigned integer"/>
<Element Offset="3150" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000C4E" DisplayMethod="hexadecimal"/>
<Element Offset="3170" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000C62" DisplayMethod="unsigned integer"/>
<Element Offset="3178" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000C6A" DisplayMethod="hexadecimal"/>
<Element Offset="3186" Vartype="Double" Bytesize="8" OffsetHex="00000C72" DisplayMethod="unsigned integer"/>
<Element Offset="3194" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C7A" DisplayMethod="unsigned integer"/>
<Element Offset="3198" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C7E" DisplayMethod="hexadecimal"/>
<Element Offset="3202" Vartype="String" Bytesize="4" OffsetHex="00000C82" DisplayMethod="unsigned integer"/>
<Element Offset="3206" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000C86" DisplayMethod="hexadecimal"/>
<Element Offset="3210" Vartype="Float" Bytesize="4" OffsetHex="00000C8A" DisplayMethod="unsigned integer"/>
<Element Offset="3214" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000C8E" DisplayMethod="hexadecimal"/>
<Element Offset="3246" Vartype="String" Bytesize="7" OffsetHex="00000CAE" DisplayMethod="unsigned integer"/>
<Element Offset="3253" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00000CB5" DisplayMethod="unsigned integer"/>
<Element Offset="3258" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000CBA" DisplayMethod="hexadecimal"/>
<Element Offset="3266" Vartype="Float" Bytesize="4" OffsetHex="00000CC2" DisplayMethod="unsigned integer"/>
<Element Offset="3270" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000CC6" DisplayMethod="hexadecimal"/>
<Element Offset="3274" Vartype="String" Bytesize="4" OffsetHex="00000CCA" DisplayMethod="unsigned integer"/>
<Element Offset="3278" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="00000CCE" DisplayMethod="hexadecimal"/>
<Element Offset="3334" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D06" DisplayMethod="unsigned integer"/>
<Element Offset="3338" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000D0A" DisplayMethod="hexadecimal"/>
<Element Offset="3346" Vartype="Float" Bytesize="4" OffsetHex="00000D12" DisplayMethod="unsigned integer"/>
<Element Offset="3350" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000D16" DisplayMethod="hexadecimal"/>
<Element Offset="3362" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000D22" DisplayMethod="unsigned integer"/>
<Element Offset="3374" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D2E" DisplayMethod="hexadecimal"/>
<Element Offset="3378" Vartype="Float" Bytesize="4" OffsetHex="00000D32" DisplayMethod="unsigned integer"/>
<Element Offset="3382" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000D36" DisplayMethod="hexadecimal"/>
<Element Offset="3398" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000D46" DisplayMethod="unsigned integer"/>
<Element Offset="3402" Vartype="Float" Bytesize="4" OffsetHex="00000D4A" DisplayMethod="unsigned integer"/>
<Element Offset="3406" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000D4E" DisplayMethod="hexadecimal"/>
<Element Offset="3438" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000D6E" DisplayMethod="unsigned integer"/>
<Element Offset="3446" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000D76" DisplayMethod="hexadecimal"/>
<Element Offset="3478" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00000D96" DisplayMethod="unsigned integer"/>
<Element Offset="3482" Vartype="Float" Bytesize="4" OffsetHex="00000D9A" DisplayMethod="unsigned integer"/>
<Element Offset="3486" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00000D9E" DisplayMethod="hexadecimal"/>
<Element Offset="3526" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000DC6" DisplayMethod="unsigned integer"/>
<Element Offset="3530" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000DCA" DisplayMethod="hexadecimal"/>
<Element Offset="3562" Vartype="Double" Bytesize="8" OffsetHex="00000DEA" DisplayMethod="unsigned integer"/>
<Element Offset="3570" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="00000DF2" DisplayMethod="hexadecimal"/>
<Element Offset="3626" Vartype="String" Bytesize="4" OffsetHex="00000E2A" DisplayMethod="unsigned integer"/>
<Element Offset="3630" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000E2E" DisplayMethod="hexadecimal"/>
<Element Offset="3638" Vartype="Float" Bytesize="4" OffsetHex="00000E36" DisplayMethod="unsigned integer"/>
<Element Offset="3642" Vartype="String" Bytesize="7" OffsetHex="00000E3A" DisplayMethod="unsigned integer"/>
<Element Offset="3649" Vartype="Byte" Bytesize="1" OffsetHex="00000E41" DisplayMethod="unsigned integer"/>
<Element Offset="3650" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00000E42" DisplayMethod="hexadecimal"/>
<Element Offset="3686" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E66" DisplayMethod="unsigned integer"/>
<Element Offset="3690" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000E6A" DisplayMethod="hexadecimal"/>
<Element Offset="3698" Vartype="Byte" Bytesize="1" OffsetHex="00000E72" DisplayMethod="unsigned integer"/>
<Element Offset="3699" Vartype="String" Bytesize="10" OffsetHex="00000E73" DisplayMethod="unsigned integer"/>
<Element Offset="3709" Vartype="Byte" Bytesize="1" OffsetHex="00000E7D" DisplayMethod="unsigned integer"/>
<Element Offset="3710" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E7E" DisplayMethod="hexadecimal"/>
<Element Offset="3714" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000E82" DisplayMethod="unsigned integer"/>
<Element Offset="3718" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000E86" DisplayMethod="hexadecimal"/>
<Element Offset="3738" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000E9A" DisplayMethod="unsigned integer"/>
<Element Offset="3750" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EA6" DisplayMethod="unsigned integer"/>
<Element Offset="3754" Vartype="Float" Bytesize="4" OffsetHex="00000EAA" DisplayMethod="unsigned integer"/>
<Element Offset="3758" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000EAE" DisplayMethod="hexadecimal"/>
<Element Offset="3774" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EBE" DisplayMethod="unsigned integer"/>
<Element Offset="3778" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00000EC2" DisplayMethod="hexadecimal"/>
<Element Offset="3798" Vartype="Float" Bytesize="4" OffsetHex="00000ED6" DisplayMethod="unsigned integer"/>
<Element Offset="3802" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EDA" DisplayMethod="hexadecimal"/>
<Element Offset="3806" Vartype="Float" Bytesize="4" OffsetHex="00000EDE" DisplayMethod="unsigned integer"/>
<Element Offset="3810" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000EE2" DisplayMethod="hexadecimal"/>
<Element Offset="3822" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00000EEE" DisplayMethod="unsigned integer"/>
<Element Offset="3830" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000EF6" DisplayMethod="unsigned integer"/>
<Element Offset="3834" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000EFA" DisplayMethod="hexadecimal"/>
<Element Offset="3846" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F06" DisplayMethod="unsigned integer"/>
<Element Offset="3850" Vartype="Float" Bytesize="4" OffsetHex="00000F0A" DisplayMethod="unsigned integer"/>
<Element Offset="3854" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000F0E" DisplayMethod="hexadecimal"/>
<Element Offset="3866" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00000F1A" DisplayMethod="unsigned integer"/>
<Element Offset="3878" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F26" DisplayMethod="hexadecimal"/>
<Element Offset="3882" Vartype="Float" Bytesize="4" OffsetHex="00000F2A" DisplayMethod="unsigned integer"/>
<Element Offset="3886" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00000F2E" DisplayMethod="hexadecimal"/>
<Element Offset="3894" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F36" DisplayMethod="unsigned integer"/>
<Element Offset="3898" Vartype="Float" Bytesize="4" OffsetHex="00000F3A" DisplayMethod="unsigned integer"/>
<Element Offset="3902" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00000F3E" DisplayMethod="hexadecimal"/>
<Element Offset="3942" Vartype="Float" Bytesize="4" OffsetHex="00000F66" DisplayMethod="unsigned integer"/>
<Element Offset="3946" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F6A" DisplayMethod="hexadecimal"/>
<Element Offset="3950" Vartype="Float" Bytesize="4" OffsetHex="00000F6E" DisplayMethod="unsigned integer"/>
<Element Offset="3954" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000F72" DisplayMethod="hexadecimal"/>
<Element Offset="3958" Vartype="Double" Bytesize="8" OffsetHex="00000F76" DisplayMethod="unsigned integer"/>
<Element Offset="3966" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000F7E" DisplayMethod="hexadecimal"/>
<Element Offset="3998" Vartype="Float" Bytesize="4" OffsetHex="00000F9E" DisplayMethod="unsigned integer"/>
<Element Offset="4002" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00000FA2" DisplayMethod="hexadecimal"/>
<Element Offset="4018" Vartype="Float" Bytesize="4" OffsetHex="00000FB2" DisplayMethod="unsigned integer"/>
<Element Offset="4022" Vartype="4 Bytes" Bytesize="4" OffsetHex="00000FB6" DisplayMethod="unsigned integer"/>
<Element Offset="4026" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00000FBA" DisplayMethod="hexadecimal"/>
<Element Offset="4038" Vartype="String" Bytesize="4" OffsetHex="00000FC6" DisplayMethod="unsigned integer"/>
<Element Offset="4042" Vartype="Byte" Bytesize="1" OffsetHex="00000FCA" DisplayMethod="unsigned integer"/>
<Element Offset="4043" Vartype="String" Bytesize="4" OffsetHex="00000FCB" DisplayMethod="unsigned integer"/>
<Element Offset="4047" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00000FCF" DisplayMethod="unsigned integer"/>
<Element Offset="4049" Vartype="String" Bytesize="7" OffsetHex="00000FD1" DisplayMethod="unsigned integer"/>
<Element Offset="4056" Vartype="Byte" Bytesize="1" OffsetHex="00000FD8" DisplayMethod="unsigned integer"/>
<Element Offset="4057" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000FD9" DisplayMethod="unsigned integer"/>
<Element Offset="4059" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00000FDB" DisplayMethod="unsigned integer"/>
<Element Offset="4062" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00000FDE" DisplayMethod="hexadecimal"/>
<Element Offset="4094" Vartype="2 Bytes" Bytesize="2" OffsetHex="00000FFE" DisplayMethod="unsigned integer"/>
<Element Offset="4096" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001000" DisplayMethod="unsigned integer"/>
<Element Offset="4098" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001002" DisplayMethod="hexadecimal"/>
<Element Offset="4102" Vartype="Double" Bytesize="8" OffsetHex="00001006" DisplayMethod="unsigned integer"/>
<Element Offset="4110" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000100E" DisplayMethod="hexadecimal"/>
<Element Offset="4142" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000102E" DisplayMethod="unsigned integer"/>
<Element Offset="4146" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00001032" DisplayMethod="hexadecimal"/>
<Element Offset="4162" Vartype="Float" Bytesize="4" OffsetHex="00001042" DisplayMethod="unsigned integer"/>
<Element Offset="4166" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001046" DisplayMethod="unsigned integer"/>
<Element Offset="4170" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000104A" DisplayMethod="hexadecimal"/>
<Element Offset="4182" Vartype="Float" Bytesize="4" OffsetHex="00001056" DisplayMethod="unsigned integer"/>
<Element Offset="4186" Vartype="4 Bytes" Bytesize="4" RLECount="17" OffsetHex="0000105A" DisplayMethod="hexadecimal"/>
<Element Offset="4254" Vartype="Float" Bytesize="4" OffsetHex="0000109E" DisplayMethod="unsigned integer"/>
<Element Offset="4258" Vartype="4 Bytes" Bytesize="4" RLECount="20" OffsetHex="000010A2" DisplayMethod="hexadecimal"/>
<Element Offset="4338" Vartype="String" Bytesize="5" OffsetHex="000010F2" DisplayMethod="unsigned integer"/>
<Element Offset="4343" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000010F7" DisplayMethod="unsigned integer"/>
<Element Offset="4346" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000010FA" DisplayMethod="hexadecimal"/>
<Element Offset="4378" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="0000111A" DisplayMethod="unsigned integer"/>
<Element Offset="4390" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001126" DisplayMethod="hexadecimal"/>
<Element Offset="4394" Vartype="Double" Bytesize="8" OffsetHex="0000112A" DisplayMethod="unsigned integer"/>
<Element Offset="4402" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001132" DisplayMethod="hexadecimal"/>
<Element Offset="4406" Vartype="Byte" Bytesize="1" OffsetHex="00001136" DisplayMethod="unsigned integer"/>
<Element Offset="4407" Vartype="String" Bytesize="4" OffsetHex="00001137" DisplayMethod="unsigned integer"/>
<Element Offset="4411" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000113B" DisplayMethod="unsigned integer"/>
<Element Offset="4414" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="0000113E" DisplayMethod="hexadecimal"/>
<Element Offset="4438" Vartype="Byte" Bytesize="1" OffsetHex="00001156" DisplayMethod="unsigned integer"/>
<Element Offset="4439" Vartype="String" Bytesize="4" OffsetHex="00001157" DisplayMethod="unsigned integer"/>
<Element Offset="4443" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000115B" DisplayMethod="unsigned integer"/>
<Element Offset="4446" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="0000115E" DisplayMethod="hexadecimal"/>
<Element Offset="4470" Vartype="Float" Bytesize="4" OffsetHex="00001176" DisplayMethod="unsigned integer"/>
<Element Offset="4474" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000117A" DisplayMethod="hexadecimal"/>
<Element Offset="4486" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001186" DisplayMethod="unsigned integer"/>
<Element Offset="4490" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000118A" DisplayMethod="hexadecimal"/>
<Element Offset="4502" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001196" DisplayMethod="unsigned integer"/>
<Element Offset="4505" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001199" DisplayMethod="unsigned integer"/>
<Element Offset="4507" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000119B" DisplayMethod="unsigned integer"/>
<Element Offset="4510" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="0000119E" DisplayMethod="hexadecimal"/>
<Element Offset="4550" Vartype="String" Bytesize="4" OffsetHex="000011C6" DisplayMethod="unsigned integer"/>
<Element Offset="4554" Vartype="Byte" Bytesize="1" OffsetHex="000011CA" DisplayMethod="unsigned integer"/>
<Element Offset="4555" Vartype="String" Bytesize="4" OffsetHex="000011CB" DisplayMethod="unsigned integer"/>
<Element Offset="4559" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="000011CF" DisplayMethod="unsigned integer"/>
<Element Offset="4561" Vartype="String" Bytesize="4" OffsetHex="000011D1" DisplayMethod="unsigned integer"/>
<Element Offset="4565" Vartype="Byte" Bytesize="1" OffsetHex="000011D5" DisplayMethod="unsigned integer"/>
<Element Offset="4566" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="000011D6" DisplayMethod="hexadecimal"/>
<Element Offset="4582" Vartype="4 Bytes" Bytesize="4" OffsetHex="000011E6" DisplayMethod="unsigned integer"/>
<Element Offset="4586" Vartype="4 Bytes" Bytesize="4" RLECount="15" OffsetHex="000011EA" DisplayMethod="hexadecimal"/>
<Element Offset="4646" Vartype="Double" Bytesize="8" OffsetHex="00001226" DisplayMethod="unsigned integer"/>
<Element Offset="4654" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000122E" DisplayMethod="hexadecimal"/>
<Element Offset="4686" Vartype="String" Bytesize="4" OffsetHex="0000124E" DisplayMethod="unsigned integer"/>
<Element Offset="4690" Vartype="Byte" Bytesize="1" OffsetHex="00001252" DisplayMethod="unsigned integer"/>
<Element Offset="4691" Vartype="String" Bytesize="4" OffsetHex="00001253" DisplayMethod="unsigned integer"/>
<Element Offset="4695" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001257" DisplayMethod="unsigned integer"/>
<Element Offset="4698" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="0000125A" DisplayMethod="hexadecimal"/>
<Element Offset="4742" Vartype="Double" Bytesize="8" OffsetHex="00001286" DisplayMethod="unsigned integer"/>
<Element Offset="4750" Vartype="Float" Bytesize="4" OffsetHex="0000128E" DisplayMethod="unsigned integer"/>
<Element Offset="4754" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00001292" DisplayMethod="hexadecimal"/>
<Element Offset="4786" Vartype="Double" Bytesize="8" OffsetHex="000012B2" DisplayMethod="unsigned integer"/>
<Element Offset="4794" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="000012BA" DisplayMethod="hexadecimal"/>
<Element Offset="4822" Vartype="String" Bytesize="4" OffsetHex="000012D6" DisplayMethod="unsigned integer"/>
<Element Offset="4826" Vartype="Byte" Bytesize="1" OffsetHex="000012DA" DisplayMethod="unsigned integer"/>
<Element Offset="4827" Vartype="String" Bytesize="4" OffsetHex="000012DB" DisplayMethod="unsigned integer"/>
<Element Offset="4831" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000012DF" DisplayMethod="unsigned integer"/>
<Element Offset="4834" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="000012E2" DisplayMethod="hexadecimal"/>
<Element Offset="4870" Vartype="String" Bytesize="4" OffsetHex="00001306" DisplayMethod="unsigned integer"/>
<Element Offset="4874" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="0000130A" DisplayMethod="hexadecimal"/>
<Element Offset="4882" Vartype="Double" Bytesize="8" OffsetHex="00001312" DisplayMethod="unsigned integer"/>
<Element Offset="4890" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000131A" DisplayMethod="hexadecimal"/>
<Element Offset="4894" Vartype="Double" Bytesize="8" OffsetHex="0000131E" DisplayMethod="unsigned integer"/>
<Element Offset="4902" Vartype="Float" Bytesize="4" OffsetHex="00001326" DisplayMethod="unsigned integer"/>
<Element Offset="4906" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000132A" DisplayMethod="hexadecimal"/>
<Element Offset="4910" Vartype="String" Bytesize="4" OffsetHex="0000132E" DisplayMethod="unsigned integer"/>
<Element Offset="4914" Vartype="Float" Bytesize="4" OffsetHex="00001332" DisplayMethod="unsigned integer"/>
<Element Offset="4918" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001336" DisplayMethod="unsigned integer"/>
<Element Offset="4922" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000133A" DisplayMethod="hexadecimal"/>
<Element Offset="4958" Vartype="Byte" Bytesize="1" OffsetHex="0000135E" DisplayMethod="unsigned integer"/>
<Element Offset="4959" Vartype="String" Bytesize="4" OffsetHex="0000135F" DisplayMethod="unsigned integer"/>
<Element Offset="4963" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001363" DisplayMethod="unsigned integer"/>
<Element Offset="4966" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001366" DisplayMethod="hexadecimal"/>
<Element Offset="4974" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="0000136E" DisplayMethod="unsigned integer"/>
<Element Offset="4978" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001372" DisplayMethod="hexadecimal"/>
<Element Offset="4986" Vartype="Float" Bytesize="4" OffsetHex="0000137A" DisplayMethod="unsigned integer"/>
<Element Offset="4990" Vartype="4 Bytes" Bytesize="4" RLECount="18" OffsetHex="0000137E" DisplayMethod="hexadecimal"/>
<Element Offset="5062" Vartype="String" Bytesize="4" OffsetHex="000013C6" DisplayMethod="unsigned integer"/>
<Element Offset="5066" Vartype="Byte" Bytesize="1" OffsetHex="000013CA" DisplayMethod="unsigned integer"/>
<Element Offset="5067" Vartype="String" Bytesize="4" OffsetHex="000013CB" DisplayMethod="unsigned integer"/>
<Element Offset="5071" Vartype="Byte" Bytesize="1" OffsetHex="000013CF" DisplayMethod="unsigned integer"/>
<Element Offset="5072" Vartype="String" Bytesize="4" OffsetHex="000013D0" DisplayMethod="unsigned integer"/>
<Element Offset="5076" Vartype="Byte" Bytesize="1" OffsetHex="000013D4" DisplayMethod="unsigned integer"/>
<Element Offset="5077" Vartype="String" Bytesize="4" OffsetHex="000013D5" DisplayMethod="unsigned integer"/>
<Element Offset="5081" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="000013D9" DisplayMethod="unsigned integer"/>
<Element Offset="5086" Vartype="4 Bytes" Bytesize="4" RLECount="17" OffsetHex="000013DE" DisplayMethod="hexadecimal"/>
<Element Offset="5154" Vartype="Float" Bytesize="4" RLECount="4" OffsetHex="00001422" DisplayMethod="unsigned integer"/>
<Element Offset="5170" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001432" DisplayMethod="hexadecimal"/>
<Element Offset="5178" Vartype="Float" Bytesize="4" OffsetHex="0000143A" DisplayMethod="unsigned integer"/>
<Element Offset="5182" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000143E" DisplayMethod="hexadecimal"/>
<Element Offset="5186" Vartype="Float" Bytesize="4" OffsetHex="00001442" DisplayMethod="unsigned integer"/>
<Element Offset="5190" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00001446" DisplayMethod="hexadecimal"/>
<Element Offset="5218" Vartype="Float" Bytesize="4" OffsetHex="00001462" DisplayMethod="unsigned integer"/>
<Element Offset="5222" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001466" DisplayMethod="hexadecimal"/>
<Element Offset="5226" Vartype="Float" Bytesize="4" OffsetHex="0000146A" DisplayMethod="unsigned integer"/>
<Element Offset="5230" Vartype="4 Bytes" Bytesize="4" RLECount="17" OffsetHex="0000146E" DisplayMethod="hexadecimal"/>
<Element Offset="5298" Vartype="Float" Bytesize="4" OffsetHex="000014B2" DisplayMethod="unsigned integer"/>
<Element Offset="5302" Vartype="4 Bytes" Bytesize="4" OffsetHex="000014B6" DisplayMethod="unsigned integer"/>
<Element Offset="5306" Vartype="Float" Bytesize="4" OffsetHex="000014BA" DisplayMethod="unsigned integer"/>
<Element Offset="5310" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000014BE" DisplayMethod="hexadecimal"/>
<Element Offset="5318" Vartype="4 Bytes" Bytesize="4" OffsetHex="000014C6" DisplayMethod="unsigned integer"/>
<Element Offset="5322" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000014CA" DisplayMethod="hexadecimal"/>
<Element Offset="5330" Vartype="4 Bytes" Bytesize="4" OffsetHex="000014D2" DisplayMethod="unsigned integer"/>
<Element Offset="5334" Vartype="Float" Bytesize="4" OffsetHex="000014D6" DisplayMethod="unsigned integer"/>
<Element Offset="5338" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000014DA" DisplayMethod="hexadecimal"/>
<Element Offset="5346" Vartype="Float" Bytesize="4" OffsetHex="000014E2" DisplayMethod="unsigned integer"/>
<Element Offset="5350" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000014E6" DisplayMethod="hexadecimal"/>
<Element Offset="5382" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001506" DisplayMethod="unsigned integer"/>
<Element Offset="5386" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000150A" DisplayMethod="hexadecimal"/>
<Element Offset="5402" Vartype="Float" Bytesize="4" OffsetHex="0000151A" DisplayMethod="unsigned integer"/>
<Element Offset="5406" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000151E" DisplayMethod="hexadecimal"/>
<Element Offset="5418" Vartype="Float" Bytesize="4" OffsetHex="0000152A" DisplayMethod="unsigned integer"/>
<Element Offset="5422" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="0000152E" DisplayMethod="hexadecimal"/>
<Element Offset="5438" Vartype="Double" Bytesize="8" OffsetHex="0000153E" DisplayMethod="unsigned integer"/>
<Element Offset="5446" Vartype="Float" Bytesize="4" RLECount="3" OffsetHex="00001546" DisplayMethod="unsigned integer"/>
<Element Offset="5458" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001552" DisplayMethod="unsigned integer"/>
<Element Offset="5462" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001556" DisplayMethod="hexadecimal"/>
<Element Offset="5466" Vartype="Float" Bytesize="4" OffsetHex="0000155A" DisplayMethod="unsigned integer"/>
<Element Offset="5470" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="0000155E" DisplayMethod="hexadecimal"/>
<Element Offset="5502" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000157E" DisplayMethod="unsigned integer"/>
<Element Offset="5506" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001582" DisplayMethod="hexadecimal"/>
<Element Offset="5514" Vartype="String" Bytesize="4" OffsetHex="0000158A" DisplayMethod="unsigned integer"/>
<Element Offset="5518" Vartype="Byte" Bytesize="1" OffsetHex="0000158E" DisplayMethod="unsigned integer"/>
<Element Offset="5519" Vartype="String" Bytesize="4" OffsetHex="0000158F" DisplayMethod="unsigned integer"/>
<Element Offset="5523" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001593" DisplayMethod="unsigned integer"/>
<Element Offset="5526" Vartype="Float" Bytesize="4" OffsetHex="00001596" DisplayMethod="unsigned integer"/>
<Element Offset="5530" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000159A" DisplayMethod="unsigned integer"/>
<Element Offset="5534" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000159E" DisplayMethod="hexadecimal"/>
<Element Offset="5546" Vartype="Double" Bytesize="8" OffsetHex="000015AA" DisplayMethod="unsigned integer"/>
<Element Offset="5554" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000015B2" DisplayMethod="hexadecimal"/>
<Element Offset="5586" Vartype="Float" Bytesize="4" OffsetHex="000015D2" DisplayMethod="unsigned integer"/>
<Element Offset="5590" Vartype="Double" Bytesize="8" OffsetHex="000015D6" DisplayMethod="unsigned integer"/>
<Element Offset="5598" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="000015DE" DisplayMethod="hexadecimal"/>
<Element Offset="5614" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000015EE" DisplayMethod="unsigned integer"/>
<Element Offset="5617" Vartype="2 Bytes" Bytesize="2" OffsetHex="000015F1" DisplayMethod="unsigned integer"/>
<Element Offset="5619" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000015F3" DisplayMethod="unsigned integer"/>
<Element Offset="5622" Vartype="Double" Bytesize="8" OffsetHex="000015F6" DisplayMethod="unsigned integer"/>
<Element Offset="5630" Vartype="4 Bytes" Bytesize="4" OffsetHex="000015FE" DisplayMethod="hexadecimal"/>
<Element Offset="5634" Vartype="String" Bytesize="4" OffsetHex="00001602" DisplayMethod="unsigned integer"/>
<Element Offset="5638" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001606" DisplayMethod="unsigned integer"/>
<Element Offset="5642" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000160A" DisplayMethod="hexadecimal"/>
<Element Offset="5654" Vartype="String" Bytesize="5" OffsetHex="00001616" DisplayMethod="unsigned integer"/>
<Element Offset="5659" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000161B" DisplayMethod="unsigned integer"/>
<Element Offset="5662" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000161E" DisplayMethod="hexadecimal"/>
<Element Offset="5666" Vartype="Byte" Bytesize="1" OffsetHex="00001622" DisplayMethod="unsigned integer"/>
<Element Offset="5667" Vartype="String" Bytesize="4" OffsetHex="00001623" DisplayMethod="unsigned integer"/>
<Element Offset="5671" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001627" DisplayMethod="unsigned integer"/>
<Element Offset="5673" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001629" DisplayMethod="unsigned integer"/>
<Element Offset="5675" Vartype="Byte" Bytesize="1" OffsetHex="0000162B" DisplayMethod="unsigned integer"/>
<Element Offset="5676" Vartype="2 Bytes" Bytesize="2" OffsetHex="0000162C" DisplayMethod="unsigned integer"/>
<Element Offset="5678" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="0000162E" DisplayMethod="hexadecimal"/>
<Element Offset="5714" Vartype="Double" Bytesize="8" OffsetHex="00001652" DisplayMethod="unsigned integer"/>
<Element Offset="5722" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000165A" DisplayMethod="hexadecimal"/>
<Element Offset="5734" Vartype="Double" Bytesize="8" OffsetHex="00001666" DisplayMethod="unsigned integer"/>
<Element Offset="5742" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="0000166E" DisplayMethod="hexadecimal"/>
<Element Offset="5754" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000167A" DisplayMethod="unsigned integer"/>
<Element Offset="5758" Vartype="Float" Bytesize="4" OffsetHex="0000167E" DisplayMethod="unsigned integer"/>
<Element Offset="5762" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001682" DisplayMethod="hexadecimal"/>
<Element Offset="5770" Vartype="Float" Bytesize="4" OffsetHex="0000168A" DisplayMethod="unsigned integer"/>
<Element Offset="5774" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="0000168E" DisplayMethod="hexadecimal"/>
<Element Offset="5794" Vartype="4 Bytes" Bytesize="4" OffsetHex="000016A2" DisplayMethod="unsigned integer"/>
<Element Offset="5798" Vartype="4 Bytes" Bytesize="4" RLECount="14" OffsetHex="000016A6" DisplayMethod="hexadecimal"/>
<Element Offset="5854" Vartype="Byte" Bytesize="1" RLECount="8" OffsetHex="000016DE" DisplayMethod="unsigned integer"/>
<Element Offset="5862" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="000016E6" DisplayMethod="hexadecimal"/>
<Element Offset="5882" Vartype="Byte" Bytesize="1" OffsetHex="000016FA" DisplayMethod="unsigned integer"/>
<Element Offset="5883" Vartype="String" Bytesize="4" OffsetHex="000016FB" DisplayMethod="unsigned integer"/>
<Element Offset="5887" Vartype="Byte" Bytesize="1" OffsetHex="000016FF" DisplayMethod="unsigned integer"/>
<Element Offset="5888" Vartype="String" Bytesize="4" OffsetHex="00001700" DisplayMethod="unsigned integer"/>
<Element Offset="5892" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001704" DisplayMethod="unsigned integer"/>
<Element Offset="5894" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00001706" DisplayMethod="hexadecimal"/>
<Element Offset="5934" Vartype="Float" Bytesize="4" OffsetHex="0000172E" DisplayMethod="unsigned integer"/>
<Element Offset="5938" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00001732" DisplayMethod="hexadecimal"/>
<Element Offset="5982" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000175E" DisplayMethod="unsigned integer"/>
<Element Offset="5986" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00001762" DisplayMethod="hexadecimal"/>
<Element Offset="6030" Vartype="String" Bytesize="4" OffsetHex="0000178E" DisplayMethod="unsigned integer"/>
<Element Offset="6034" Vartype="Float" Bytesize="4" OffsetHex="00001792" DisplayMethod="unsigned integer"/>
<Element Offset="6038" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001796" DisplayMethod="hexadecimal"/>
<Element Offset="6046" Vartype="Float" Bytesize="4" OffsetHex="0000179E" DisplayMethod="unsigned integer"/>
<Element Offset="6050" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017A2" DisplayMethod="hexadecimal"/>
<Element Offset="6054" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017A6" DisplayMethod="unsigned integer"/>
<Element Offset="6058" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="000017AA" DisplayMethod="hexadecimal"/>
<Element Offset="6102" Vartype="Double" Bytesize="8" OffsetHex="000017D6" DisplayMethod="unsigned integer"/>
<Element Offset="6110" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017DE" DisplayMethod="hexadecimal"/>
<Element Offset="6114" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017E2" DisplayMethod="unsigned integer"/>
<Element Offset="6118" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017E6" DisplayMethod="hexadecimal"/>
<Element Offset="6122" Vartype="Float" Bytesize="4" OffsetHex="000017EA" DisplayMethod="unsigned integer"/>
<Element Offset="6126" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017EE" DisplayMethod="hexadecimal"/>
<Element Offset="6130" Vartype="4 Bytes" Bytesize="4" OffsetHex="000017F2" DisplayMethod="unsigned integer"/>
<Element Offset="6134" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000017F6" DisplayMethod="hexadecimal"/>
<Element Offset="6146" Vartype="String" Bytesize="5" OffsetHex="00001802" DisplayMethod="unsigned integer"/>
<Element Offset="6151" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001807" DisplayMethod="unsigned integer"/>
<Element Offset="6153" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001809" DisplayMethod="unsigned integer"/>
<Element Offset="6155" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="0000180B" DisplayMethod="unsigned integer"/>
<Element Offset="6158" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000180E" DisplayMethod="hexadecimal"/>
<Element Offset="6162" Vartype="String" Bytesize="4" OffsetHex="00001812" DisplayMethod="unsigned integer"/>
<Element Offset="6166" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001816" DisplayMethod="hexadecimal"/>
<Element Offset="6178" Vartype="Float" Bytesize="4" OffsetHex="00001822" DisplayMethod="unsigned integer"/>
<Element Offset="6182" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001826" DisplayMethod="hexadecimal"/>
<Element Offset="6190" Vartype="Float" Bytesize="4" OffsetHex="0000182E" DisplayMethod="unsigned integer"/>
<Element Offset="6194" Vartype="4 Bytes" Bytesize="4" RLECount="12" OffsetHex="00001832" DisplayMethod="hexadecimal"/>
<Element Offset="6242" Vartype="Float" Bytesize="4" OffsetHex="00001862" DisplayMethod="unsigned integer"/>
<Element Offset="6246" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001866" DisplayMethod="hexadecimal"/>
<Element Offset="6258" Vartype="Float" Bytesize="4" OffsetHex="00001872" DisplayMethod="unsigned integer"/>
<Element Offset="6262" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001876" DisplayMethod="hexadecimal"/>
<Element Offset="6274" Vartype="Float" Bytesize="4" OffsetHex="00001882" DisplayMethod="unsigned integer"/>
<Element Offset="6278" Vartype="Double" Bytesize="8" OffsetHex="00001886" DisplayMethod="unsigned integer"/>
<Element Offset="6286" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000188E" DisplayMethod="hexadecimal"/>
<Element Offset="6290" Vartype="Float" Bytesize="4" OffsetHex="00001892" DisplayMethod="unsigned integer"/>
<Element Offset="6294" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001896" DisplayMethod="hexadecimal"/>
<Element Offset="6314" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="000018AA" DisplayMethod="unsigned integer"/>
<Element Offset="6322" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000018B2" DisplayMethod="hexadecimal"/>
<Element Offset="6346" Vartype="Float" Bytesize="4" OffsetHex="000018CA" DisplayMethod="unsigned integer"/>
<Element Offset="6350" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="000018CE" DisplayMethod="hexadecimal"/>
<Element Offset="6390" Vartype="Float" Bytesize="4" OffsetHex="000018F6" DisplayMethod="unsigned integer"/>
<Element Offset="6394" Vartype="4 Bytes" Bytesize="4" OffsetHex="000018FA" DisplayMethod="hexadecimal"/>
<Element Offset="6398" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="000018FE" DisplayMethod="unsigned integer"/>
<Element Offset="6406" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00001906" DisplayMethod="hexadecimal"/>
<Element Offset="6450" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00001932" DisplayMethod="unsigned integer"/>
<Element Offset="6458" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000193A" DisplayMethod="hexadecimal"/>
<Element Offset="6462" Vartype="Float" Bytesize="4" OffsetHex="0000193E" DisplayMethod="unsigned integer"/>
<Element Offset="6466" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00001942" DisplayMethod="hexadecimal"/>
<Element Offset="6494" Vartype="Float" Bytesize="4" OffsetHex="0000195E" DisplayMethod="unsigned integer"/>
<Element Offset="6498" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001962" DisplayMethod="hexadecimal"/>
<Element Offset="6518" Vartype="Float" Bytesize="4" OffsetHex="00001976" DisplayMethod="unsigned integer"/>
<Element Offset="6522" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000197A" DisplayMethod="hexadecimal"/>
<Element Offset="6526" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000197E" DisplayMethod="unsigned integer"/>
<Element Offset="6530" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001982" DisplayMethod="hexadecimal"/>
<Element Offset="6534" Vartype="Float" Bytesize="4" OffsetHex="00001986" DisplayMethod="unsigned integer"/>
<Element Offset="6538" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000198A" DisplayMethod="hexadecimal"/>
<Element Offset="6542" Vartype="4 Bytes" Bytesize="4" OffsetHex="0000198E" DisplayMethod="unsigned integer"/>
<Element Offset="6546" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001992" DisplayMethod="hexadecimal"/>
<Element Offset="6554" Vartype="String" Bytesize="5" OffsetHex="0000199A" DisplayMethod="unsigned integer"/>
<Element Offset="6559" Vartype="Byte" Bytesize="1" OffsetHex="0000199F" DisplayMethod="unsigned integer"/>
<Element Offset="6560" Vartype="2 Bytes" Bytesize="2" OffsetHex="000019A0" DisplayMethod="unsigned integer"/>
<Element Offset="6562" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000019A2" DisplayMethod="hexadecimal"/>
<Element Offset="6586" Vartype="Float" Bytesize="4" OffsetHex="000019BA" DisplayMethod="unsigned integer"/>
<Element Offset="6590" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="000019BE" DisplayMethod="hexadecimal"/>
<Element Offset="6622" Vartype="Float" Bytesize="4" OffsetHex="000019DE" DisplayMethod="unsigned integer"/>
<Element Offset="6626" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="000019E2" DisplayMethod="hexadecimal"/>
<Element Offset="6638" Vartype="Byte" Bytesize="1" OffsetHex="000019EE" DisplayMethod="unsigned integer"/>
<Element Offset="6639" Vartype="String" Bytesize="4" OffsetHex="000019EF" DisplayMethod="unsigned integer"/>
<Element Offset="6643" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="000019F3" DisplayMethod="unsigned integer"/>
<Element Offset="6646" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="000019F6" DisplayMethod="hexadecimal"/>
<Element Offset="6670" Vartype="String" Bytesize="6" OffsetHex="00001A0E" DisplayMethod="unsigned integer"/>
<Element Offset="6676" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001A14" DisplayMethod="unsigned integer"/>
<Element Offset="6678" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00001A16" DisplayMethod="hexadecimal"/>
<Element Offset="6710" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001A36" DisplayMethod="unsigned integer"/>
<Element Offset="6714" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001A3A" DisplayMethod="hexadecimal"/>
<Element Offset="6722" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001A42" DisplayMethod="unsigned integer"/>
<Element Offset="6726" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00001A46" DisplayMethod="hexadecimal"/>
<Element Offset="6766" Vartype="Float" Bytesize="4" OffsetHex="00001A6E" DisplayMethod="unsigned integer"/>
<Element Offset="6770" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001A72" DisplayMethod="hexadecimal"/>
<Element Offset="6774" Vartype="Float" Bytesize="4" OffsetHex="00001A76" DisplayMethod="unsigned integer"/>
<Element Offset="6778" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00001A7A" DisplayMethod="hexadecimal"/>
<Element Offset="6794" Vartype="String" Bytesize="4" OffsetHex="00001A8A" DisplayMethod="unsigned integer"/>
<Element Offset="6798" Vartype="Double" Bytesize="8" OffsetHex="00001A8E" DisplayMethod="unsigned integer"/>
<Element Offset="6806" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001A96" DisplayMethod="hexadecimal"/>
<Element Offset="6810" Vartype="Float" Bytesize="4" OffsetHex="00001A9A" DisplayMethod="unsigned integer"/>
<Element Offset="6814" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001A9E" DisplayMethod="hexadecimal"/>
<Element Offset="6834" Vartype="Float" Bytesize="4" OffsetHex="00001AB2" DisplayMethod="unsigned integer"/>
<Element Offset="6838" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001AB6" DisplayMethod="unsigned integer"/>
<Element Offset="6842" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001ABA" DisplayMethod="hexadecimal"/>
<Element Offset="6846" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001ABE" DisplayMethod="unsigned integer"/>
<Element Offset="6850" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001AC2" DisplayMethod="hexadecimal"/>
<Element Offset="6854" Vartype="Float" Bytesize="4" OffsetHex="00001AC6" DisplayMethod="unsigned integer"/>
<Element Offset="6858" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001ACA" DisplayMethod="hexadecimal"/>
<Element Offset="6878" Vartype="String" Bytesize="4" OffsetHex="00001ADE" DisplayMethod="unsigned integer"/>
<Element Offset="6882" Vartype="Byte" Bytesize="1" OffsetHex="00001AE2" DisplayMethod="unsigned integer"/>
<Element Offset="6883" Vartype="String" Bytesize="4" OffsetHex="00001AE3" DisplayMethod="unsigned integer"/>
<Element Offset="6887" Vartype="Byte" Bytesize="1" OffsetHex="00001AE7" DisplayMethod="unsigned integer"/>
<Element Offset="6888" Vartype="String" Bytesize="4" OffsetHex="00001AE8" DisplayMethod="unsigned integer"/>
<Element Offset="6892" Vartype="Byte" Bytesize="1" OffsetHex="00001AEC" DisplayMethod="unsigned integer"/>
<Element Offset="6893" Vartype="String" Bytesize="4" OffsetHex="00001AED" DisplayMethod="unsigned integer"/>
<Element Offset="6897" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00001AF1" DisplayMethod="unsigned integer"/>
<Element Offset="6902" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001AF6" DisplayMethod="hexadecimal"/>
<Element Offset="6906" Vartype="Float" Bytesize="4" OffsetHex="00001AFA" DisplayMethod="unsigned integer"/>
<Element Offset="6910" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00001AFE" DisplayMethod="hexadecimal"/>
<Element Offset="6946" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001B22" DisplayMethod="unsigned integer"/>
<Element Offset="6950" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001B26" DisplayMethod="hexadecimal"/>
<Element Offset="6962" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001B32" DisplayMethod="unsigned integer"/>
<Element Offset="6965" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001B35" DisplayMethod="unsigned integer"/>
<Element Offset="6967" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001B37" DisplayMethod="unsigned integer"/>
<Element Offset="6970" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001B3A" DisplayMethod="hexadecimal"/>
<Element Offset="6974" Vartype="Float" Bytesize="4" OffsetHex="00001B3E" DisplayMethod="unsigned integer"/>
<Element Offset="6978" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001B42" DisplayMethod="hexadecimal"/>
<Element Offset="6990" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001B4E" DisplayMethod="unsigned integer"/>
<Element Offset="6994" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00001B52" DisplayMethod="hexadecimal"/>
<Element Offset="7010" Vartype="String" Bytesize="4" OffsetHex="00001B62" DisplayMethod="unsigned integer"/>
<Element Offset="7014" Vartype="Double" Bytesize="8" OffsetHex="00001B66" DisplayMethod="unsigned integer"/>
<Element Offset="7022" Vartype="4 Bytes" Bytesize="4" RLECount="11" OffsetHex="00001B6E" DisplayMethod="hexadecimal"/>
<Element Offset="7066" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001B9A" DisplayMethod="unsigned integer"/>
<Element Offset="7070" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00001B9E" DisplayMethod="hexadecimal"/>
<Element Offset="7086" Vartype="Float" Bytesize="4" OffsetHex="00001BAE" DisplayMethod="unsigned integer"/>
<Element Offset="7090" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001BB2" DisplayMethod="hexadecimal"/>
<Element Offset="7098" Vartype="String" Bytesize="4" OffsetHex="00001BBA" DisplayMethod="unsigned integer"/>
<Element Offset="7102" Vartype="Double" Bytesize="8" OffsetHex="00001BBE" DisplayMethod="unsigned integer"/>
<Element Offset="7110" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00001BC6" DisplayMethod="hexadecimal"/>
<Element Offset="7150" Vartype="Float" Bytesize="4" OffsetHex="00001BEE" DisplayMethod="unsigned integer"/>
<Element Offset="7154" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001BF2" DisplayMethod="unsigned integer"/>
<Element Offset="7158" Vartype="Double" Bytesize="8" OffsetHex="00001BF6" DisplayMethod="unsigned integer"/>
<Element Offset="7166" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001BFE" DisplayMethod="hexadecimal"/>
<Element Offset="7178" Vartype="Float" Bytesize="4" OffsetHex="00001C0A" DisplayMethod="unsigned integer"/>
<Element Offset="7182" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001C0E" DisplayMethod="unsigned integer"/>
<Element Offset="7186" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001C12" DisplayMethod="hexadecimal"/>
<Element Offset="7198" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00001C1E" DisplayMethod="unsigned integer"/>
<Element Offset="7206" Vartype="4 Bytes" Bytesize="4" RLECount="10" OffsetHex="00001C26" DisplayMethod="hexadecimal"/>
<Element Offset="7246" Vartype="String" Bytesize="6" OffsetHex="00001C4E" DisplayMethod="unsigned integer"/>
<Element Offset="7252" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001C54" DisplayMethod="unsigned integer"/>
<Element Offset="7254" Vartype="Float" Bytesize="4" OffsetHex="00001C56" DisplayMethod="unsigned integer"/>
<Element Offset="7258" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001C5A" DisplayMethod="hexadecimal"/>
<Element Offset="7262" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001C5E" DisplayMethod="unsigned integer"/>
<Element Offset="7266" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001C62" DisplayMethod="hexadecimal"/>
<Element Offset="7286" Vartype="Float" Bytesize="4" OffsetHex="00001C76" DisplayMethod="unsigned integer"/>
<Element Offset="7290" Vartype="String" Bytesize="7" OffsetHex="00001C7A" DisplayMethod="unsigned integer"/>
<Element Offset="7297" Vartype="Byte" Bytesize="1" OffsetHex="00001C81" DisplayMethod="unsigned integer"/>
<Element Offset="7298" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001C82" DisplayMethod="hexadecimal"/>
<Element Offset="7302" Vartype="Float" Bytesize="4" OffsetHex="00001C86" DisplayMethod="unsigned integer"/>
<Element Offset="7306" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001C8A" DisplayMethod="hexadecimal"/>
<Element Offset="7326" Vartype="Byte" Bytesize="1" OffsetHex="00001C9E" DisplayMethod="unsigned integer"/>
<Element Offset="7327" Vartype="String" Bytesize="4" OffsetHex="00001C9F" DisplayMethod="unsigned integer"/>
<Element Offset="7331" Vartype="Byte" Bytesize="1" OffsetHex="00001CA3" DisplayMethod="unsigned integer"/>
<Element Offset="7332" Vartype="String" Bytesize="4" OffsetHex="00001CA4" DisplayMethod="unsigned integer"/>
<Element Offset="7336" Vartype="Byte" Bytesize="1" OffsetHex="00001CA8" DisplayMethod="unsigned integer"/>
<Element Offset="7337" Vartype="String" Bytesize="4" OffsetHex="00001CA9" DisplayMethod="unsigned integer"/>
<Element Offset="7341" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00001CAD" DisplayMethod="unsigned integer"/>
<Element Offset="7346" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001CB2" DisplayMethod="hexadecimal"/>
<Element Offset="7366" Vartype="Float" Bytesize="4" OffsetHex="00001CC6" DisplayMethod="unsigned integer"/>
<Element Offset="7370" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001CCA" DisplayMethod="hexadecimal"/>
<Element Offset="7374" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001CCE" DisplayMethod="unsigned integer"/>
<Element Offset="7377" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001CD1" DisplayMethod="unsigned integer"/>
<Element Offset="7379" Vartype="Byte" Bytesize="1" OffsetHex="00001CD3" DisplayMethod="unsigned integer"/>
<Element Offset="7380" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001CD4" DisplayMethod="unsigned integer"/>
<Element Offset="7382" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001CD6" DisplayMethod="hexadecimal"/>
<Element Offset="7390" Vartype="Float" Bytesize="4" OffsetHex="00001CDE" DisplayMethod="unsigned integer"/>
<Element Offset="7394" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001CE2" DisplayMethod="hexadecimal"/>
<Element Offset="7402" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001CEA" DisplayMethod="unsigned integer"/>
<Element Offset="7406" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001CEE" DisplayMethod="hexadecimal"/>
<Element Offset="7410" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001CF2" DisplayMethod="unsigned integer"/>
<Element Offset="7412" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001CF4" DisplayMethod="unsigned integer"/>
<Element Offset="7414" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001CF6" DisplayMethod="hexadecimal"/>
<Element Offset="7434" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001D0A" DisplayMethod="unsigned integer"/>
<Element Offset="7438" Vartype="Float" Bytesize="4" OffsetHex="00001D0E" DisplayMethod="unsigned integer"/>
<Element Offset="7442" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00001D12" DisplayMethod="hexadecimal"/>
<Element Offset="7466" Vartype="Float" Bytesize="4" OffsetHex="00001D2A" DisplayMethod="unsigned integer"/>
<Element Offset="7470" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00001D2E" DisplayMethod="hexadecimal"/>
<Element Offset="7494" Vartype="Double" Bytesize="8" OffsetHex="00001D46" DisplayMethod="unsigned integer"/>
<Element Offset="7502" Vartype="4 Bytes" Bytesize="4" RLECount="4" OffsetHex="00001D4E" DisplayMethod="hexadecimal"/>
<Element Offset="7518" Vartype="Byte" Bytesize="1" RLECount="5" OffsetHex="00001D5E" DisplayMethod="unsigned integer"/>
<Element Offset="7523" Vartype="String" Bytesize="4" OffsetHex="00001D63" DisplayMethod="unsigned integer"/>
<Element Offset="7527" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001D67" DisplayMethod="unsigned integer"/>
<Element Offset="7530" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00001D6A" DisplayMethod="hexadecimal"/>
<Element Offset="7558" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001D86" DisplayMethod="unsigned integer"/>
<Element Offset="7562" Vartype="4 Bytes" Bytesize="4" RLECount="7" OffsetHex="00001D8A" DisplayMethod="hexadecimal"/>
<Element Offset="7590" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001DA6" DisplayMethod="unsigned integer"/>
<Element Offset="7598" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001DAE" DisplayMethod="hexadecimal"/>
<Element Offset="7618" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001DC2" DisplayMethod="unsigned integer"/>
<Element Offset="7622" Vartype="4 Bytes" Bytesize="4" RLECount="8" OffsetHex="00001DC6" DisplayMethod="hexadecimal"/>
<Element Offset="7654" Vartype="Byte" Bytesize="1" OffsetHex="00001DE6" DisplayMethod="unsigned integer"/>
<Element Offset="7655" Vartype="String" Bytesize="4" OffsetHex="00001DE7" DisplayMethod="unsigned integer"/>
<Element Offset="7659" Vartype="Byte" Bytesize="1" OffsetHex="00001DEB" DisplayMethod="unsigned integer"/>
<Element Offset="7660" Vartype="String" Bytesize="4" OffsetHex="00001DEC" DisplayMethod="unsigned integer"/>
<Element Offset="7664" Vartype="Byte" Bytesize="1" OffsetHex="00001DF0" DisplayMethod="unsigned integer"/>
<Element Offset="7665" Vartype="String" Bytesize="4" OffsetHex="00001DF1" DisplayMethod="unsigned integer"/>
<Element Offset="7669" Vartype="Byte" Bytesize="1" OffsetHex="00001DF5" DisplayMethod="unsigned integer"/>
<Element Offset="7670" Vartype="Float" Bytesize="4" OffsetHex="00001DF6" DisplayMethod="unsigned integer"/>
<Element Offset="7674" Vartype="4 Bytes" Bytesize="4" RLECount="12" OffsetHex="00001DFA" DisplayMethod="hexadecimal"/>
<Element Offset="7722" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001E2A" DisplayMethod="unsigned integer"/>
<Element Offset="7726" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001E2E" DisplayMethod="hexadecimal"/>
<Element Offset="7738" Vartype="Float" Bytesize="4" OffsetHex="00001E3A" DisplayMethod="unsigned integer"/>
<Element Offset="7742" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001E3E" DisplayMethod="hexadecimal"/>
<Element Offset="7750" Vartype="String" Bytesize="5" OffsetHex="00001E46" DisplayMethod="unsigned integer"/>
<Element Offset="7755" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001E4B" DisplayMethod="unsigned integer"/>
<Element Offset="7758" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001E4E" DisplayMethod="hexadecimal"/>
<Element Offset="7770" Vartype="String" Bytesize="4" OffsetHex="00001E5A" DisplayMethod="unsigned integer"/>
<Element Offset="7774" Vartype="Byte" Bytesize="1" OffsetHex="00001E5E" DisplayMethod="unsigned integer"/>
<Element Offset="7775" Vartype="String" Bytesize="4" OffsetHex="00001E5F" DisplayMethod="unsigned integer"/>
<Element Offset="7779" Vartype="Byte" Bytesize="1" RLECount="3" OffsetHex="00001E63" DisplayMethod="unsigned integer"/>
<Element Offset="7782" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001E66" DisplayMethod="hexadecimal"/>
<Element Offset="7802" Vartype="Double" Bytesize="8" OffsetHex="00001E7A" DisplayMethod="unsigned integer"/>
<Element Offset="7810" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00001E82" DisplayMethod="hexadecimal"/>
<Element Offset="7846" Vartype="Float" Bytesize="4" OffsetHex="00001EA6" DisplayMethod="unsigned integer"/>
<Element Offset="7850" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001EAA" DisplayMethod="hexadecimal"/>
<Element Offset="7854" Vartype="Byte" Bytesize="1" OffsetHex="00001EAE" DisplayMethod="unsigned integer"/>
<Element Offset="7855" Vartype="String" Bytesize="4" OffsetHex="00001EAF" DisplayMethod="unsigned integer"/>
<Element Offset="7859" Vartype="Byte" Bytesize="1" OffsetHex="00001EB3" DisplayMethod="unsigned integer"/>
<Element Offset="7860" Vartype="String" Bytesize="4" OffsetHex="00001EB4" DisplayMethod="unsigned integer"/>
<Element Offset="7864" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001EB8" DisplayMethod="unsigned integer"/>
<Element Offset="7866" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001EBA" DisplayMethod="hexadecimal"/>
<Element Offset="7878" Vartype="Float" Bytesize="4" OffsetHex="00001EC6" DisplayMethod="unsigned integer"/>
<Element Offset="7882" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001ECA" DisplayMethod="unsigned integer"/>
<Element Offset="7886" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001ECE" DisplayMethod="hexadecimal"/>
<Element Offset="7898" Vartype="Float" Bytesize="4" OffsetHex="00001EDA" DisplayMethod="unsigned integer"/>
<Element Offset="7902" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001EDE" DisplayMethod="hexadecimal"/>
<Element Offset="7914" Vartype="Float" Bytesize="4" RLECount="2" OffsetHex="00001EEA" DisplayMethod="unsigned integer"/>
<Element Offset="7922" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001EF2" DisplayMethod="hexadecimal"/>
<Element Offset="7930" Vartype="Float" Bytesize="4" OffsetHex="00001EFA" DisplayMethod="unsigned integer"/>
<Element Offset="7934" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001EFE" DisplayMethod="hexadecimal"/>
<Element Offset="7938" Vartype="Byte" Bytesize="1" OffsetHex="00001F02" DisplayMethod="unsigned integer"/>
<Element Offset="7939" Vartype="String" Bytesize="4" OffsetHex="00001F03" DisplayMethod="unsigned integer"/>
<Element Offset="7943" Vartype="Byte" Bytesize="1" OffsetHex="00001F07" DisplayMethod="unsigned integer"/>
<Element Offset="7944" Vartype="String" Bytesize="4" OffsetHex="00001F08" DisplayMethod="unsigned integer"/>
<Element Offset="7948" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001F0C" DisplayMethod="unsigned integer"/>
<Element Offset="7950" Vartype="4 Bytes" Bytesize="4" RLECount="5" OffsetHex="00001F0E" DisplayMethod="hexadecimal"/>
<Element Offset="7970" Vartype="Float" Bytesize="4" OffsetHex="00001F22" DisplayMethod="unsigned integer"/>
<Element Offset="7974" Vartype="4 Bytes" Bytesize="4" RLECount="3" OffsetHex="00001F26" DisplayMethod="hexadecimal"/>
<Element Offset="7986" Vartype="Byte" Bytesize="1" RLECount="4" OffsetHex="00001F32" DisplayMethod="unsigned integer"/>
<Element Offset="7990" Vartype="4 Bytes" Bytesize="4" RLECount="9" OffsetHex="00001F36" DisplayMethod="hexadecimal"/>
<Element Offset="8026" Vartype="Byte" Bytesize="1" RLECount="2" OffsetHex="00001F5A" DisplayMethod="unsigned integer"/>
<Element Offset="8028" Vartype="2 Bytes" Bytesize="2" OffsetHex="00001F5C" DisplayMethod="unsigned integer"/>
<Element Offset="8030" Vartype="4 Bytes" Bytesize="4" RLECount="6" OffsetHex="00001F5E" DisplayMethod="hexadecimal"/>
<Element Offset="8054" Vartype="Float" Bytesize="4" OffsetHex="00001F76" DisplayMethod="unsigned integer"/>
<Element Offset="8058" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001F7A" DisplayMethod="hexadecimal"/>
<Element Offset="8062" Vartype="Float" Bytesize="4" OffsetHex="00001F7E" DisplayMethod="unsigned integer"/>
<Element Offset="8066" Vartype="4 Bytes" Bytesize="4" RLECount="15" OffsetHex="00001F82" DisplayMethod="hexadecimal"/>
<Element Offset="8126" Vartype="Double" Bytesize="8" OffsetHex="00001FBE" DisplayMethod="unsigned integer"/>
<Element Offset="8134" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001FC6" DisplayMethod="hexadecimal"/>
<Element Offset="8142" Vartype="Double" Bytesize="8" OffsetHex="00001FCE" DisplayMethod="unsigned integer"/>
<Element Offset="8150" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001FD6" DisplayMethod="hexadecimal"/>
<Element Offset="8158" Vartype="Float" Bytesize="4" OffsetHex="00001FDE" DisplayMethod="unsigned integer"/>
<Element Offset="8162" Vartype="4 Bytes" Bytesize="4" OffsetHex="00001FE2" DisplayMethod="hexadecimal"/>
<Element Offset="8166" Vartype="Float" Bytesize="4" OffsetHex="00001FE6" DisplayMethod="unsigned integer"/>
<Element Offset="8170" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001FEA" DisplayMethod="hexadecimal"/>
<Element Offset="8178" Vartype="Byte" Bytesize="1" OffsetHex="00001FF2" DisplayMethod="unsigned integer"/>
<Element Offset="8179" Vartype="String" Bytesize="4" OffsetHex="00001FF3" DisplayMethod="unsigned integer"/>
<Element Offset="8183" Vartype="Byte" Bytesize="1" OffsetHex="00001FF7" DisplayMethod="unsigned integer"/>
<Element Offset="8184" Vartype="4 Bytes" Bytesize="4" RLECount="2" OffsetHex="00001FF8" DisplayMethod="hexadecimal"/>
</Elements>
</Structure>
</Structures>
<Comments>7FF7463A55B2:
7FF7463A55AA - 41 8B 76 94 - mov esi,[r14-6C]
7FF7463A55AE - 41 8B 7E 90 - mov edi,[r14-70]
7FF7463A55B2 - 89 B4 3B 88000000 - mov [rbx+rdi+00000088],esi &lt;&lt;
7FF7463A55B9 - 41 83 AE 60030000 02 - sub dword ptr [r14+00000360],02
7FF7463A55C1 - E9 0E000000 - jmp 7FF7463A55D4
RAX=00007FF7463A55AA
RBX=0000021254770000 ←ベースっぽいの探して、8 Bytes Exact Valueで静的ベースアドレス探す
RCX=0000000008946208 そのあとベースアドレスをRecalculateでAddress入れ替えて完了
RDX=0000000000000068
RSI=0000000000000195
RDI=0000000008A432E0
RSP=0000005F121FEF40
resetLuaState()
ターンカウントは0ターン目開始で辛抱強くカウント増やしたら4つに絞り込める、その一番上からC下がるとステートがある
プレイヤーHPに0x1000000足した範囲に居そう
メモリスキャン範囲にAddressList.getMemoryRecordByDescription('PlayerHP').CachedAddressからAddressList.getMemoryRecordByDescription('PlayerHP').CachedAddress+1000000いけるわ
1. PPSSPPのデバッグ→メモリビューからUser memoryを選択、08800000の行を1111とかで埋める
(CheatEngine視点だと2バイト単位で数字が反転してたりしてクッソ混乱するので全部同じ数字にするのがよい)
2. CheatEngine側でArray of byteで検索、4個ぐらいまで絞り込めて、そのうち1つだけFind out what writes to this addressで書き込み時に反応がある
その書き込みログを見るとベースアドレスが取れるので、そこから↓みたいな範囲に必要な情報があるとわかる
[PPSSPPWindows64.exe+DD3788]+8800000
[PPSSPPWindows64.exe+DD3788]+8800000+1800000or3800000(高メモリモードのタイトル)
手番アドレス探し
4byte hex:12345678 =&gt; array of byte:78 56 34 12
よって1手目ガード、5手目ブレイクなら
01000000 ??000000 ??000000 ??000000 03000000 ??000000
SceneStateは入力待ち中4、戦闘中5、ターン終わりの1回転モーション中3
Pointerにチェック入れてオフロードんところに1EC33CDF774-[(BaseAddress)]みたいに入れると差分がわかるので、
それをDescriptionにでもメモっておく
んでアドレス(BaseAddress)、オフセット差分値でおk。
ちなみにPointer形式の入力欄でなくても“[(BaseAddress)]+差分”で等価に書ける
</Comments>
<LuaScript>
<LuaScriptEntry Name="PreExec">-- Pre Exec
-- #############################################################
-- デバッグ用フラグ
local DEBUG_FLG = false
if(DEBUG_FLG) then
MainForm.USE_DEBUG_LOG = DEBUG_FLG
print('* Pre-test')
assert(var_dump == nil)
assert(var_export == nil)
assert(debug_dump == nil)
assert(MainForm.callFunction == nil)
assert(MainForm.botTimer == nil)
print('* finished')
end
</LuaScriptEntry>
<LuaScriptEntry Name=" Dump Function ">-- Dump Function (author: u-makino)
-- -------------------------------------------------------------
-- Lua言語の予習せずに知識ゼロのまま適当に書こうとしたら
-- クッソ貧弱なAPIしかなくてお手上げだったので渋々先に作ったやつ
--  
-- dump (Object[,detail=0])
-- オブジェクトの内容をJSONめいた書式で整形出力する
-- + 第二引数が 0 または偽の場合、プロパティ要素のみ列挙する
-- + 第二引数が 1 または真の場合、参照可能な全要素を列挙する
-- + 第二引数が 2 &lt;=N となる場合、加えて関数の情報を表示する
-- #############################################################
local INDENT = ' '
local function dump(o, detail, i)
detail = tonumber(detail) or (detail and 1) or 0
i = tonumber(i) or 0
if type(o) == 'table' then
local s = ''
for k,v in pairs(o) do
if type(k) ~= 'number' then
if k == '__get' then
v = v()
end
k = '"' .. k .. '"'
end
s = s .. k .. ' : ' .. dump(v,detail, i+1) .. ",\n" .. string.rep(INDENT, i)
end
if s == '' then
return '{}'
end
return "{\n" .. string.rep(INDENT, i) .. string.sub(s, 0, string.len(s) - 2 - string.len(INDENT) * i) .. "\n" .. string.rep(INDENT, i - 1) .. '}'
elseif inheritsFromObject(o) and getPropertyList(o) then
local r = getPropertyList(o)
local t = {}
for k=0, r.Count-1, 1 do
t[r[k]] = o[r[k]]
end
return dump(t, detail, i+1)
elseif detail &gt; 0 and type(o) ~= 'string' and getRef(o) and getmetatable(o) then
return dump(getmetatable(o), detail, i+1)
elseif type(o) ~= 'number' and type(o) ~= 'boolean' and type(o) ~= 'nil' then
if type(o) == 'function' then
if detail &gt; 1 then
return dump(debug.getinfo(o), 1, i+1)
elseif i == 0 and detail &gt; 0 then
return dump(debug.getinfo(o))
end
return 'function()'
end
return '"' .. tostring(o) .. '"'
else
return tostring(o)
end
end
-- #############################################################
-- var_export (Object[,detail=0])
-- dumpを呼び出すためのグローバル関数
-- #############################################################
function var_export(o, detail)
return dump(o, detail)
end
-- #############################################################
-- var_dump (Object[,detail=0])
-- dumpの戻り値をそのままprintするやつ
-- #############################################################
function var_dump(o, detail)
print(dump(o, detail))
end
-- #############################################################
-- debug_dump (Object[,detail=0])
-- デバッグ用フラグで出し分けするやつ
-- #############################################################
function debug_dump(o, detail)
if not MainForm.USE_DEBUG_LOG then return end
print(string.rep('#', 64) .. "\n" .. dump(o, detail) .. "\n" .. string.rep('#', 64))
end
</LuaScriptEntry>
<LuaScriptEntry Name=" Global Objects ">-- Global Objects (author: u-makino)
-- -------------------------------------------------------------
-- Luaのグローバルオブジェクトはかなりマズ味っぽい
-- じゃあ面倒だしMainFormの中にぶち込んでしまおう
-- #############################################################
-- Lua BOTを繰り返し実行するTicker
MainForm.botTimer = createTimer(MainForm, false)
assert(MainForm.botTimer, 'botTimer is not created.')
-- #############################################################
-- スタックトレース出せるのもっと早く知りたかった
-- つっても正直あんま役に立たないなこれ
-- https://devforum.roblox.com/t/get-traceback-from-pcall/53821
-- #############################################################
MainForm.callFunction = function(func, ...)
local traceback
local result = table.pack(
xpcall(func, function(err)
traceback = debug.traceback()
return false, err
end, ...)
)
if result[1] then
return unpack(result, 1, result.n)
else
debug_dump({traceback=traceback, e=result})
return false, result[2], traceback
end
end
</LuaScriptEntry>
<LuaScriptEntry Name=" CE Script Editor ">-- CE Script Editor (author: DaSpamer)
-- -------------------------------------------------------------
-- https://forum.cheatengine.org/viewtopic.php?t=616655
--  
-- 上記で拾ったLuaエディタ拡張
-- メインメニュー &gt; Table 内に追加される
-- #############################################################
local config = { -- later save/load from registry or from file...
DEFAULT_SYNTAX = 'LuaSyntax'; -- [LuaSyntax,CeaSyntax,TxtSyntax]
windowCaption = 'Script Editor'; -- how to name the window
windowWidth = 1280;
windowHeight = 720;
windowLeft = 0;
windowTop = 0;
bottomPanelHeight = 280;
toolbar_icon_size = 24; -- modify for your own needs...
toolbar_auto_size = false; -- autosize..
viewLimit = 3; -- eh modify if you want more views; can be useful when working on lua scripts with autoassembler, or just text related
closeTabsOnClose = true;
showOnPrint = true;
comment_range = 10; -- related to AA templates
-- related to search/replace dialog
search_backward = false;
search_matchCase = false;
search_matchWhole = false;
search_wrap = true;
search_searchMode = 2;
search_isTransparent = false;
search_TransparentMode = 0;
search_TransparentValue = 225;
};
local scriptForm -- so we could set parent to the search dialog...
local scriptEditorRegistry = getSettings('scriptEditor'); -- load config stored in registry or create new one
if(not cheatEngineIs64Bit()) then -- executeCodeLocalEx is implemented for 64bit only at the moment...
if(scriptEditorRegistry['32bitError'] ~= '1') then
showMessage("Cheat Engine Script editor currently works only with 64bit CE");
scriptEditorRegistry['32bitError'] = 1;
end
return;
end
if (scriptEditorRegistry) then
for key,value in pairs(config) do
local savedValue = scriptEditorRegistry[key]
if (savedValue and #savedValue &gt; 0) then
savedValue = tonumber(savedValue) or savedValue; -- try to convert to number...
if (savedValue == 'true') then
savedValue = true;
elseif (savedValue == 'false') then
savedValue = false;
end
if (type(config[key]) == type(savedValue)) then -- make sure we insert boolean to boolean, string to string , number to number(numbers are a bit less important tho)
config[key] = tonumber(savedValue) or savedValue;
else
-- print('incorrect type! -', type(savedValue),savedValue, '\tExpected - ',type(config[key]),config[key]);
scriptEditorRegistry[key] = tostring(config[key]); -- update registry...
end
else
scriptEditorRegistry[key] = tostring(value);
end
end
scriptEditorRegistry.destroy();
end
local updateKeyInReg = function(key,value)
local scriptEditorRegistry = getSettings('scriptEditor'); -- load config stored in registry or create new one
if (scriptEditorRegistry) then
config[key] = value;
scriptEditorRegistry[key] = tostring(value);
end
end
local searchReplaceDialog
do
local searchForm = createForm(false);
searchForm.Popupmode = 0; -- can't seem to keep the window above script editor, rather mainform... so better nothing
searchForm.BorderStyle = bsSizeToolWin;
searchForm.Constraints.MinHeight = 250;
searchForm.Constraints.MaxHeight = 250;
searchForm.Constraints.MinWidth = 550;;
searchForm.setSize(searchForm.Constraints.MinWidth,searchForm.Constraints.MinHeight); -- update size based on constraints...
local textObj -- assigned textObj to search/replace within
local pageControl = createPageControl(searchForm);
pageControl.align = alClient;
(pageControl.addTab() or pageControl.ActivePage).Caption = "Find";
(pageControl.addTab() or pageControl.Page[1]).Caption = "Replace";
local statusBar,statusLabel
local tabContainer = createPanel(pageControl.ActivePage) -- so we could share objects between both pages;
tabContainer.Align = alClient;
tabContainer.BevelInner = 0;
tabContainer.BevelOuter = 0;
local findLabel = createLabel(tabContainer);
findLabel.Caption = "&amp;Find what :";
local findEdit = createEdit(tabContainer);
findEdit.Caption = "";
findEdit.AutoSize = false;
local findButton = createButton(tabContainer)
findButton.Caption = "Find Next";
findButton.Hint = "Use Shift+Enter to search in the opposite direction.";
findButton.showHint = true;
local countButton = createButton(tabContainer);
countButton.Caption = "Count"; countButton.visible = false;
local findPrevButton = createButton(tabContainer);
findPrevButton.Caption = "▲"
findPrevButton.Visible = false;
local findNextButton = createButton(tabContainer);
findNextButton.Caption = "▼ Find Next";
findNextButton.Visible = false;
local findToggle = createCheckBox(tabContainer)
findToggle.OnChange = function(sender)
local show = sender.Checked;
findButton.visible = not show;
findPrevButton.visible = show;
findNextButton.visible = show;
end
local backwardCheckbox = createCheckBox(tabContainer);
backwardCheckbox.Caption = "Backward direction";
local matchwholeCheckbox = createCheckBox(tabContainer);
matchwholeCheckbox.Caption = "Match whole word only";
local matchcaseCheckbox = createCheckBox(tabContainer);
matchcaseCheckbox.Caption = "Match case";
local wrapCheckbox = createCheckBox(tabContainer);
wrapCheckbox.Caption = "Wrap around";
local searchMode = createRadioGroup(tabContainer);
searchMode.Caption = "Mode"
searchMode.Items.add("Normal");
searchMode.Items.add("Extended (\\r, \\n, \\t, \\0, \\x...)");
searchMode.Items.add("Lua Pattern Matching");
searchMode.ItemIndex = 2;
local replaceLabel = createLabel(tabContainer);
replaceLabel.Caption = "&amp;Replace what :";
replaceLabel.visible = false;
local replaceEdit = createEdit(tabContainer);
replaceEdit.Caption = "";
replaceEdit.AutoSize = false;
replaceEdit.visible = false;
local replaceButton = createButton(tabContainer);
replaceButton.Caption = "Replace";
replaceButton.visible = false;
local replaceAllButton = createButton(tabContainer);
replaceAllButton.Caption = "Replace All";
replaceAllButton.visible = false;
local transparencyGroupbox = createRadioGroup(tabContainer);
local transparentCheckbox = createCheckBox(tabContainer);
transparentCheckbox.Caption = "Transparency"
transparencyGroupbox.Items.add("On losing focus");
transparencyGroupbox.Items.add("Always");
transparencyGroupbox.ItemIndex = 0;
transparencyGroupbox.ChildSizing.Layout = 0
transparencyGroupbox.Enabled = false;
local transparencySlider = createTrackBar(transparencyGroupbox);
transparencySlider.TickMarks = 2;
transparencySlider.TickStyle = 0;
transparencySlider.PageSize = 40;
transparencySlider.Min = 100;
transparencySlider.Position = 100;
transparencySlider.Max = 225;
transparencySlider.onChange = function(sender)
searchForm.AlphaBlendValue = sender.Position;
end
transparentCheckbox.onChange = function(sender)
transparencyGroupbox.Enabled = sender.Checked;
transparencySlider.Enabled = sender.Checked;
transparencyGroupbox.OnSelectionChanged(transparencyGroupbox);
transparencySlider.onChange(transparencySlider);
end
transparencyGroupbox.OnSelectionChanged = function(sender)
if (not sender.Enabled) then
searchForm.AlphaBlend = false;
else
searchForm.AlphaBlend = transparencyGroupbox.ItemIndex == 1;
transparencySlider.onChange(transparencySlider);
end
end
searchForm.onactivate = function(sender)
if (transparencyGroupbox.Enabled and transparencyGroupbox.ItemIndex == 0) then -- on losing focus...
sender.AlphaBlend = false;
end
end
searchForm.ondeactivate = function(sender)
if (transparencyGroupbox.Enabled and transparencyGroupbox.ItemIndex == 0) then -- on losing focus...
sender.AlphaBlend = true;
end
end
searchForm.registerFirstShowCallback(function(sender) -- object size are not set until form is shown...
findLabel.setPosition(20,20);
findEdit.setSize(300,20);
findEdit.setPosition(findLabel.left+findLabel.width+5,findLabel.top-(findEdit.Height-findLabel.height)//2);
findEdit.anchors = '[akLeft,akTop,akRight]';
findButton.setSize(120,22);
findButton.setPosition(findEdit.left+findEdit.width+10,findEdit.Top-(findButton.height-findEdit.height)//2)
findButton.anchors = '[akTop,akRight]';
countButton.setPosition(findButton.Left,findButton.Top+findButton.Height+5);
countButton.setSize(findButton.getSize());
countButton.anchors = '[akTop,akRight]';
findPrevButton.setSize(25,22);
findPrevButton.setPosition(findButton.Left,findButton.Top);
findPrevButton.anchors = '[akTop,akRight]';
findNextButton.setPosition(findPrevButton.Left+findPrevButton.Width+5,findPrevButton.Top);
findNextButton.setSize(90,22);
findNextButton.anchors = '[akTop,akRight]';
findToggle.anchors = '[akTop,akRight]';
findToggle.setPosition(findButton.left+findButton.Width+5,findButton.top+(findButton.Height-findToggle.height)//2);
backwardCheckbox.setPosition(10,115);
matchwholeCheckbox.setPosition(backwardCheckbox.Left,backwardCheckbox.Top+backwardCheckbox.Height);
matchcaseCheckbox.setPosition(matchwholeCheckbox.Left,matchwholeCheckbox.Top+matchwholeCheckbox.Height);
wrapCheckbox.setPosition(matchcaseCheckbox.Left,matchcaseCheckbox.Top+matchcaseCheckbox.Height);
searchMode.setSize(180,80);
searchMode.setPosition(185,110);
-- replaceLabel.setPosition(findLabel.Left+(findLabel.width-replaceLabel.Width),findLabel.Top+findLabel.Height+10); -- resize badly for some reason :/
replaceLabel.setPosition(2,findLabel.Top+findLabel.Height+10);
replaceEdit.setSize(findEdit.getSize());
replaceEdit.setPosition(findEdit.left,replaceLabel.top-(replaceEdit.Height-replaceLabel.height)//2);
replaceEdit.anchors = '[akLeft,akTop,akRight]';
replaceButton.setPosition(findButton.Left,findButton.Top+findButton.Height+5);
replaceButton.setSize(findButton.getSize());
replaceButton.anchors = '[akTop,akRight]';
replaceAllButton.setPosition(replaceButton.Left,replaceButton.Top+replaceButton.Height+5);
replaceAllButton.setSize(replaceButton.getSize());
replaceAllButton.anchors = '[akTop,akRight]';
statusBar = createComponentClass('TStatusBar',searchForm);
statusBar.Parent = searchForm;
statusBar.AutoSize = false;
-- statusBar.align = alBottom;
statusLabel = createLabel(statusBar);
statusLabel.Caption = " ";
statusLabel.setPosition(5,(statusLabel.parent.height-statusLabel.height)//2);
statusLabel.setMsg = function(msg,color)
statusLabel.Font.Color = color or 0;
statusLabel.Caption = msg:gsub("\n","");
end
transparencyGroupbox.setSize(150,80);
transparencyGroupbox.setPosition(380,110);
transparentCheckbox.setPosition(transparencyGroupbox.left-5,transparencyGroupbox.top);
transparencySlider.setSize(135,20);
transparencyGroupbox.Component[0].setPosition(5,0);
transparencyGroupbox.Component[1].setPosition(5,20);
transparencyGroupbox.Component[2].Left = 5; -- can't use position lol
transparencyGroupbox.Component[2].Top = 40;
executeCodeLocalEx("SetWindowLongPtrA",searchForm.Handle,-8,scriptForm.Handle) --sets the main window as owner ... -8:GWLP_HWNDPARENT
-- sender.unregisterFirstShowCallback(sender);
end);
local isSearchBackward = function()
return backwardCheckbox.Checked;
end
local isMatchWhole = function()
return matchwholeCheckbox.Checked; -- match whole words only?
end
local isMatchCase = function()
return matchcaseCheckbox.Checked; -- match case?
end
local isWrapAround = function()
return wrapCheckbox.Checked;
end
local isPatternModeSearch = function()
return searchMode.ItemIndex &gt;= 2;
end
local isExtendedModeSearch = function()
return searchMode.ItemIndex &gt;= 1;
end
-- does not look pretty but it works...
local _searchPos = {x=0,y=0};
local getSearchPos = function()
return unpack(_searchPos);
end
local setSearchPos = function(x,y)
_searchPos = {tonumber(x) or _searchPos[1],tonumber(y) or _searchPos[2]};
end
local findNext = function(text,pattern,PatternMode,wrap) -- returns x,y;
local _y,_x = getSearchPos();
local _tx,x,y = _x;
::find_next_label::
x,y = text:find(pattern,_tx,PatternMode); -- start from at the end of current found text; when using %w x,y will be the same
if (x and y) then -- found text successfully;
if(_x == x and _y == y) then
_tx = _tx + 1;
goto find_next_label;
end
else
if (not wrap) then
return false;
end
if (_tx == 0) then -- already reseted and it seems like that there is no such pattern..
return false; -- exit...
end
_tx = 0;
goto find_next_label; -- could call the function again tho..
end
return x,y;
end
local findPrevious = function(text,pattern,PatternMode,wrap) -- returns x,y;
local x,y,mx,_x,_y = 0,-1,(getSearchPos());
::find_previous_label::
x,y = text:find(pattern,y+1,PatternMode); -- start from start
if (x and y) then
if (x &lt; mx) then -- repeat until found text pos &gt;= current selstart/getSearchPos();
if (_x == x and _y == y) then -- endless loop?
-- y = y+1;
return x,y
end
_x,_y = x,y;
goto find_previous_label
else
if (not _x and x &gt;= mx) then -- first occurrence! find the last one now...
if (not wrap) then
return false;
end
mx = #text+1 -- go to the end of the text
_x,_y = x,y;
goto find_previous_label
else
return _x,_y;
end
end
else -- only 1 result...
if (_x and _y) then
return _x,_y;
else
return false;
end
end
end
local escapeString = function(str) -- escape magic patterns
return str:gsub("[%.%$%%%^%[%]%*%+%-%?%(%)]",'%%%1');
end
local _bytesRep = {}; -- cache of up to 255 bytes..
local unescapeSpecialChars = function(pattern)
local getByteRep = function(str) -- string literal; \x[hex] or \[decimal] -- equivalent to to string.char
if(_bytesRep[str])then return _bytesRep[str];end -- save loadstring call.. increasing performance by a lot
if (str:match("\\%d+") or str:match("\\x%x+")) then -- to avoid user inputing "\FF" as it would throw error;
local f,msg = loadstring(("return'%s'"):format(str));
if(f)then _bytesRep[str]=f();return _bytesRep[str];
else error(msg,0);end
end
return false;
end
-- local getByteRep = function(str) -- string.char way...
-- if(_bytesRep[str])then return _bytesRep[str];end
-- local isHex,Num = str:match("\\(x?)(%x+)")
-- if (Num) then
-- Num = tonumber(Num,isHex~='' and 16); -- or 10... same shit
-- local status,msg = pcall(string.char,Num)
-- if (status)then _bytesRep[str]=msg;return msg;
-- else error(msg,0);end
-- end
-- return false;
-- end
local t = { ["\\n"] = "\n"; -- Newline
["\\t"] = "\t"; -- Tab
["\\r"] = "\r"; -- Carriage return
["\\f"] = "\f"; -- Formfeed
["\\v"] = "\v"; -- vertical tab
["\\0"] = "\0"; -- NUL
["\\b"] = "\b"; -- BACKSPACE
["\\a"] = "\a"; -- BELL
['\\"'] = "\""; -- not sure why would a user would try to escape it here...
["\\'"] = "\'";
-- ["\\\\"] = "\\"; -- already done in the last gsub..
-- ["u{2020}"] -- unsupported -&gt; (current) synedit does not support unicode...
};
-- ignores \\n \\t and such.. (already escaped as its plain text fetched from editbox)
-- return pattern:gsub("%f[\\](\\%w%x?%x?)",function(c)return t[c]or getByteRep(c)or c;end):gsub('\\\\','\\'); -- get rid of double slashes as text given is already "escaped"
return pattern:gsub("%f[\\](\\%w%x*)",function(c)return t[c]or getByteRep(c)or c;end):gsub('\\\\','\\'); -- we may only use escaped sequence of byte in range 0-255;greedy performance &gt; n captures, but greedy %x is not suitable when using string.char, comparing to loadstring...
end
local patternToCaseInsensitive = function(pattern)
-- mark existing brackes with \0; should be safe as we're using plain text from edit boxes
-- convert also %bxy to %b[xy] and revert (incase user would want to match with letters...)
return pattern:gsub("%%b(%a%a)","%%b[%1]"):gsub("([%[%]])","\0%1\0"):gsub("(%%?)(%a)",function(p,c)if(p=='')then return c:match("%u")and("[%s%s]"):format(c,c:lower())or("[%s%s]"):format(c,c:upper());end;return p..c;end):gsub("%z%[%z(.-)%z%]%z",function(t)return ("[%s]"):format(t:gsub("%[(%a)%a%]","%1"));end):gsub("%%b%[(..)%]","%%b%1");
end
local formatPattern = function(pattern,patternCase)
pattern = (isExtendedModeSearch() and unescapeSpecialChars(pattern) or pattern);
pattern = (not isMatchCase() and patternToCaseInsensitive(pattern) or pattern);
pattern = (isMatchWhole() and ("%%f[%%w]%s%%f[%%W]"):format(pattern) or pattern);
return pattern;
end
local findString = function(text,pattern,positions,backward,wrap) -- obj:TSynEdit, position:{x,y}, backward:TButton, backward:boolean, wrap:boolean (for count function);
if (text) then
local text = text:gsub("\r\n$",""); -- remove carriage return &amp; newline at the end of the text
local textLength = #text+1;
setSearchPos(positions.x,positions.y);
if (not isPatternModeSearch()) then
pattern = escapeString(pattern);
end
local wrap = (not wrap and isWrapAround());
local status,x,y = pcall(backward and findPrevious or findNext,text,formatPattern(pattern),false,wrap);
if (x and y) then
x,y = math.max(0,x),math.min(textLength,y);
end
return status,x,y
end
return false,"Missing text input";
end
local searchText = function(sender,displayMsg)
statusLabel.setMsg("");
local pattern = findEdit.Text;
if (#pattern &gt; 0) then
local backward = sender == findPrevButton;
if (not backward and sender ~= findNextButton) then
backward = isKeyPressed(VK_SHIFT);
if (isSearchBackward())then backward=not backward;end --reverse...
end
local startPosition = {x = textObj.SelStart, y = textObj.SelEnd};
local status,x,y = findString(textObj.Lines.Text,pattern,startPosition,backward);
if (not status) then
statusLabel.setMsg(("Find input error:%s"):format(x),0xFF);
-- return print('Find input error:',x);
return;
elseif(not x) then
statusLabel.setMsg(("Find: Can't find the text \"%s\""):format(pattern),0xFF);
return;
end
if (backward and ((x &gt;= textObj.SelStart and y &gt;= textObj.SelEnd) or x+y+1 == textObj.SelStart + textObj.SelEnd)) then
statusLabel.setMsg("Find: Found the 1st occurrence from the bottom. The beginning of the document has been reached",0x8000);
elseif(not backward and x &lt;= textObj.SelStart and y &lt;= textObj.SelEnd) then
statusLabel.setMsg("Find: Found the 1st occurrence from the top. The end of the document has been reached",0x8000);
end
if (x and y) then
textObj.SelStart = x;
textObj.SelEnd = y+1; -- selection mark end position is always bigger by 1 from captured position...
end
textObj.setFocus();
end
end
local countText = function(sender)
statusLabel.setMsg("");
local pattern = findEdit.Text;
if (#pattern &gt; 0) then
local startPosition = {x=0,y=0};
local text = textObj.Lines.Text;
local count = 0;
while true do
local status,x,y = findString(text,pattern,startPosition,false,true); -- text,pattern,position,backward,wrap;
if (x and y) then
count = count +1;
startPosition.x,startPosition.y = x,y;
else
break;
end
end
statusLabel.setMsg(("Count: %d matches in entire file"):format(count),0xC00000);
end
end
local overwriteString = function(text,str,x,y)
return text:sub(0,x-1)..str..text:sub(y+1);
end
local copyString = function(text,x,y)
return text:sub(x,y)
end
local replaceStringByPosition = function(text,pattern,replacePattern,x,y)
if (text) then
local capturedString = text:sub(x,y);
local mArgs = {[0] = capturedString, capturedString:match(formatPattern(pattern))}; -- %0 capture index is captured string itself..
local newString = (isExtendedModeSearch()and unescapeSpecialChars(replacePattern)or replacePattern):gsub("%f[%%](%%(%d))",function(str,index);
index = tonumber(index);
if(index&gt;#mArgs)then error(("invalid capture index %%%d"):format(index),0);end
return mArgs[index];
end);
-- local newText = overwriteString(text,newString,x,y);
-- return newText,x,x+#newString; -- replaces whole text
return newString,x,x+#newString;
end
return false;
end
local replaceStringByPattern = function(text,pattern,replacePattern,position,backward) -- newText, replacedString {x,y}
if (text) then
text = text:gsub("\r\n$","");
local status,x,y = findString(text,pattern,position,backward);
if (x and y) then
return replaceStringByPosition(text,pattern,replacePattern,x,y);
end
end
return false;
end
-- optimize, join all strings at once rather than create new text every time - for large text file
local replaceAllStringByPattern = function(text,pattern,replacePattern,startPosition)
if (text) then
text = text:gsub("\r\n$","");
pattern = formatPattern(pattern);
replacePattern = (isExtendedModeSearch()and unescapeSpecialChars(replacePattern)or replacePattern);
local stringsArray = {};
local positionDelta = 0;
local position = {x=0,y=0};
local count = 0;
while true do
local status,x,y = findString(text,pattern,position,false,true);
if (x and y) then
local capturedString = text:sub(x,y);
local mArgs = {[0] = capturedString, capturedString:match(pattern)}; -- %0 capture index is captured string itself..
local newString = replacePattern:gsub("%f[%%](%%(%d))",function(str,index);
index = tonumber(index);
if(index&gt;#mArgs)then error(("invalid capture index %%%d"):format(index),0);end
return mArgs[index];
end);
if (startPosition and x &lt; startPosition) then
positionDelta = positionDelta + (#newString-#capturedString);
end
stringsArray[#stringsArray+1] = copyString(text,position.y,x-1);
stringsArray[#stringsArray+1] = newString;
position = {x=x-1,y=y+1};
count = count +1;
else
stringsArray[#stringsArray+1] = copyString(text,position.y);
break;
end
if (count &gt; 10000) then -- doubt this much of strings should be changed... and if yes then a user probably should try to do it in chunks.
error('Fatal error',0);
end
end
if (count == 0) then
return false;
end
return table.concat(stringsArray,""),count,positionDelta;
end
end
-- if current selected text is the pattern then replace otherwise find pattern and select
local replaceText = function(sender) -- replace and highlight changes
local pattern = findEdit.Text;
statusLabel.setMsg("");
if (#pattern &gt; 0) then
local replacePattern = replaceEdit.Text;
local backward = isKeyPressed(VK_SHIFT);
local text = textObj.Lines.Text;
if (sender == replaceAllButton) then
local position = {x=textObj.SelStart,y=textObj.SelEnd};
local status,newText,count,seldelta = pcall(replaceAllStringByPattern,text,pattern,replacePattern,position.x);
if (not status) then
statusLabel.setMsg(("Find/replace input error:%s"):format(newText),0xFF);
return;
elseif(not newText) then
statusLabel.setMsg(("Find: Can't find the text \"%s\""):format(pattern),0xFF);
return;
elseif(newText and count) then
-- many methods aren't exposed to lua so we gotta use clipboard for so we could later 'undo'
local clipboard_data = readFromClipboard();
writeToClipboard(newText);
textObj.SelStart = 0;
textObj.SelEnd = #text;
textObj.PasteFromClipboard();
writeToClipboard(clipboard_data); -- restore
textObj.SelStart = position.x+seldelta;
textObj.SelEnd = position.y+seldelta;
-- textObj.Lines.Text = newText; -- doing so will not allow us to undo;
statusLabel.setMsg(("Replace All: %d occurrences were replaced in entire file"):format(count),0xC00000);
end
else
if (isSearchBackward())then backward=not backward;end
local startPosition = {x = textObj.SelEnd+1,y = textObj.SelStart-1}; -- reverse start position, so we could replace currently highlighted text aswell..
local selectedText = textObj.SelText;
if (#selectedText &gt; 0) then
local status,x,y = findString(text,pattern,startPosition,backward); -- better way would be to format pattern and match the string we have...
if (x and y) then
if (x == textObj.SelStart and y+1 == textObj.SelEnd) then
-- local newText,x,y = replaceStringByPosition(text,pattern,replacePattern,x,y); will prevent us from undoing...
local newString,x,y = replaceStringByPosition(text,pattern,replacePattern,x,y);
local clipboard_data = readFromClipboard();
writeToClipboard(newString);
textObj.PasteFromClipboard();
writeToClipboard(clipboard_data); -- restore clipboard data
-- textObj.Lines.Text = newText;
startPosition = {x=x,y=y};
-- local status,sx,sy = findString(newText,pattern,startPosition,backward); -- find next string, using the new text returned by replace func...
local status,sx,sy = findString(textObj.Lines.Text,pattern,startPosition,backward);
if (sx and sy) then
textObj.SelStart = sx;
textObj.SelEnd = sy+1;
statusLabel.setMsg("Replace: 1 occurrence was replaced. The next occurrence found.",0xC00000);
else
textObj.SelStart = y+1;
statusLabel.setMsg("Replace: 1 occurrence was replaced. No more occurrences were found.",0xC00000);
end
else
textObj.SelStart = x;
textObj.SelEnd = y+1;
end
end
else
return searchText(sender);
end
end
-- textObj.setFocus();
end
end
findEdit.OnKeyPress = function (sender,key)
if (string.byte(key) == 13) then
return searchText(sender);
end
return key;
end
pageControl.onmousedown = function(sender,button,x,y)
local currentPage = sender.ActivePage;
local pageCaption = currentPage.Caption;
tabContainer.Parent = currentPage;
local isReplace = pageCaption == 'Replace';
replaceButton.visible = isReplace;
replaceAllButton.visible = isReplace;
replaceLabel.visible = isReplace;
replaceEdit.visible = isReplace;
countButton.visible = not isReplace;
pageControl.Parent.Caption = pageCaption;
end
pageControl.onmousedown(pageControl);
findButton.onClick = searchText;
findNextButton.onClick = searchText;
findPrevButton.onClick = searchText;
countButton.onClick = countText;
replaceButton.onClick = replaceText;
replaceAllButton.onClick = replaceText;
searchReplaceDialog = {form = searchForm};
searchReplaceDialog.findNext = searchText; -- for hotkey...
searchForm.OnClose = function(sender)
if (searchReplaceDialog.config) then
local config = searchReplaceDialog.config;
config.search_backward = backwardCheckbox.Chcked;
config.search_matchCase = matchwholeCheckbox.Checked;
config.search_matchWhole = matchwholeCheckbox.Checked
config.search_wrap = wrapCheckbox.Checked;
config.search_searchMode = searchMode.ItemIndex;
config.search_TransparentValue = transparencySlider.Position;
config.search_TransparentMode = transparencyGroupbox.ItemIndex;
config.search_isTransparent = transparentCheckbox.Checked;
end
sender.hide();
end
searchReplaceDialog.show = function(object,tabIndex,config,pattern)
if (object.Lines) then -- has lines so its good
textObj = object;
if (tabIndex) then
pageControl.ActivePage = pageControl.Page[math.max(math.min(tabIndex,pageControl.PageCount-1),0)];
pageControl.onmousedown(pageControl);
end
if (config) then
searchReplaceDialog.config = config; -- so we could update later the states...
if (config.search_backward) then
backwardCheckbox.Checked = true;
end
if (config.search_matchCase) then
matchwholeCheckbox.Checked = true;
end
if (config.search_matchWhole) then
matchcaseCheckbox.Checked = true;
end
if (config.search_wrap) then
wrapCheckbox.Checked = true;
end
if (config.search_searchMode) then
searchMode.ItemIndex = math.max(math.min(tonumber(config.search_searchMode) or 0,searchMode.Items.Count-1),0);
end
if (config.search_TransparentValue) then
transparencySlider.Position = config.search_TransparentValue;
end
if (config.search_TransparentMode) then
transparencyGroupbox.ItemIndex = config.search_TransparentMode;
end
if (config.search_isTransparent) then
transparentCheckbox.Checked = config.search_isTransparent;
end
end
if (pattern) then
findEdit.Text = pattern;
else
if (#object.SelText &gt;0) then
-- maybe to do: if nothing is actually selected, select the whole word under caret.
findEdit.Text = object.SelText;
end
end
searchForm.centerScreen();
searchForm.show();
end
end
searchReplaceDialog.hide = function()
searchForm.hide();
end
end
-- base64: http://lua-users.org/wiki/BaseSixtyFour
local a='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
local function base64enc(b)return(b:gsub('.',function(c)local d,a='',c:byte()for e=8,1,-1 do d=d..(a%2^e-a%2^(e-1)&gt;0 and'1'or'0')end;return d end)..'0000'):gsub('%d%d%d?%d?%d?%d?',function(c)if#c&lt;6 then return''end;local f=0;for e=1,6 do f=f+(c:sub(e,e)=='1'and 2^(6-e)or 0)end;return a:sub(f+1,f+1)end)..({'','==','='})[#b%3+1]end;local function base64dec(b)b=string.gsub(b,'[^'..a..'=]','')return b:gsub('.',function(c)if c=='='then return''end;local d,g='',a:find(c)-1;for e=6,1,-1 do d=d..(g%2^e-g%2^(e-1)&gt;0 and'1'or'0')end;return d end):gsub('%d%d%d?%d?%d?%d?%d?%d?',function(c)if#c~=8 then return''end;local f=0;for e=1,8 do f=f+(c:sub(e,e)=='1'and 2^(8-e)or 0)end;return string.char(f)end)end
local function readFile(a,b)local c=io.open(a,'r')if not c then return false end;local d=c:read('*all')c:close()if b then local e,f={},0;for g in d:gmatch('[^\n]+')do e[#e+1]=g end;return function()f=f+1;return e[f]end end;return d end
local function writeFile(a,b,c)if type(b)=='string'then local d=c and'a'or'w'local e=io.open(a,d)e:write(b)e:close()return true end;return false end
local function png_to_bmp(input)if(input)then local stream=createStringStream(base64dec(input));local pic=createPicture();pic.loadFromStream(stream,'png');stream.destroy();return pic.Bitmap;end;return false;end
local close_image,close_image_onHover
local CAPTION_EXTRA_SPACE_COUNT
local selectedTab,selectedView; -- so we could draw an indicator, and current view
local getKeystroke
if (getCEVersion() == 7.2) then
getKeystroke = function(obj,i)
if (obj.ClassName =='TSynEditKeyStrokes' and i &lt; obj.Count) then
local pObj = userDataToInteger(obj);
local pKeystrokeStruct = readIntegerLocal(pObj+0x20);
if (pKeystrokeStruct) then
-- object not destroyed...
local pArray = readIntegerLocal(pKeystrokeStruct+0x8);
return integerToUserData(readIntegerLocal(pArray+i*8));
end
end
return false;
end
end
local function checkAAScript(script,self)
local e_status,e_error = autoAssembleCheck(script,false,self);
local d_status,d_error = autoAssembleCheck(script,true,self);
return e_status and d_status, e_error or d_error;
end
local function isMemoryViewer(memoryViewerTable,Handle) --:TMemoryBrowser
-- get all forms and check for ClassName of TMemoryBrowser
-- compares each form handle with given handle
-- return object if found
-- for i=0,getFormCount()-1 do -- interate each time over all forms.... waste
-- local currentForm = getForm(i);
-- if (currentForm.Handle == Handle and currentForm.ClassName == 'TMemoryBrowser') then
-- return currentForm;
-- end
-- end
for id,memoryViewer in pairs(memoryViewerTable) do
if (memoryViewer.Handle == Handle) then
return memoryViewer;
end
end
end
local function isMultipleMemoryViewers() --:boolean,table
local mv = {};
for i=0,getFormCount()-1 do
local currentForm = getForm(i);
if (currentForm.ClassName == 'TMemoryBrowser') then
mv[#mv+1] = currentForm;
end
end
return #mv == 1,mv;
end
local function getRecentMemoryViewer()
-- if multiple memory viewers are open, we can assume that the top most (z order) memory viwer is the target memory viewer for templates.
-- returns memoryViewer object.
local mv_single,mv_t = isMultipleMemoryViewers(); -- is only one memory viewer opened?, memory viewer table (a bit of optimization)
if (mv_single) then -- only one is opened...
return mv_t[1];
end
local selfProcessId = getCheatEngineProcessID();
local currentHwnd = getWindow(getForegroundWindow(), GW_HWNDFIRST);
if (currentHwnd) then
if (getWindowProcessID(currentHwnd)== selfProcessId) then
local memoryViewer = isMemoryViewer(mv_t,currentHwnd) -- probably not likely to be top most.. lol
if (memoryViewer) then
return memoryViewer;
end
end
while (currentHwnd and currentHwnd~=0) do
currentHwnd=getWindow(currentHwnd,GW_HWNDNEXT)
if (getWindowProcessID(currentHwnd)== selfProcessId) then
local memoryViewer = isMemoryViewer(mv_t,currentHwnd) -- cha ching $$$
if (memoryViewer) then
return memoryViewer;
end
end
end
end
end
local function getMemoryViewAddress()
return (getNameFromAddress(getRecentMemoryViewer().DisassemblerView.SelectedAddress):gsub('(.+)(%+%x+)$','"%1"%2')); -- append quotes...
end
local syntaxRules = {
GENERAL_ITEM = 0x00;
STRICT_AA_ITEM = 0x01;
STRICT_LUA_ITEM = 0x02;
STRICT_NEW_ITEM = 0x10;
}
syntaxRules.STRICT_NEW_AA_ITEM = syntaxRules.STRICT_AA_ITEM | syntaxRules.STRICT_NEW_ITEM;
syntaxRules.getSyntaxRule = function(classname)return syntaxRules[(classname=='TSynAASyn'and'STRICT_AA_ITEM'or classname=='TSynLuaSyn'and'STRICT_LUA_ITEM'or'GENERAL_ITEM')]; end;
syntaxRules.matchingCurrentSyntax = function(targetSyntax,itemSyntax,secondaryRule) -- targetSyntax:syntaxRules, itemSyntax:object.tag;
return itemSyntax &amp; 0xF == targetSyntax, itemSyntax &amp; 0xF0 == secondaryRule; -- primary rule, secondary;
end
syntaxRules.getCurrentSyntaxRule = function(obj) -- obj:tsynedit
local syntax = obj.Highlighter
return syntaxRules.getSyntaxRule(syntax and syntax.ClassName or '');
end
local function addDrawEvent(object,parent) -- clunky, but I think that's the best I can do with PageControl...
local temp_bmp = createBitmap(1,1);
local temp_canvas = temp_bmp.Canvas;
local tabs = { closeWidth = close_image.width; closeHeight = close_image.height; maxheight = 0;lastTab = nil;}
local pageControlEvents,parentEvents = {},{};
local invalidate = function(sender) -- to force full repaint, repaint has less overhead but does not give desired output
return executeCodeLocalEx('user32.InvalidateRect',sender.Handle,0,0);
end
local function drawSelectedTab(sender)
local pageCount = sender.PageCount-1;
if (pageCount &gt;= 0) then
temp_canvas.Handle = sender.dc;
for i=0,pageCount do
local tab = tabs[i+1];
if (sender.Page[i] == selectedTab) then
temp_canvas.Brush.Color = 0xFF; -- better than pen...
temp_canvas.fillRect(tab.absX+5,tab.absY+2,tab.absX+tab.absWidth+3,tab.absY+5)
temp_canvas.Draw(tab.closeX,tab.closeY,bmp);
end
end
return sender.rdc; -- releseDC
end
end
local function drawCloseButton(sender)
local pageCount = sender.PageCount-1;
if (pageCount &gt; 0 or sender.canDestroyLastTab) then
temp_canvas.Handle = sender.dc;
for i=0,pageCount do
local tab = tabs[i+1];
if (tab) then
local bmp = (tab.highlight_close and close_image_onHover or close_image);
temp_canvas.Draw(tab.closeX,tab.closeY,bmp);
end
end
return sender.rdc; -- releseDC
end
end
function pageControlEvents.onmousemove(sender,x,y)
local pageCount = sender.PageCount;
if (pageCount == 0) then
return;
end
if (x &gt;= 0 and (pageCount &gt; 1 or object.canDestroyLastTab)) then
local _y = y;
local y = y + tabs.maxheight;
for _,tab in ipairs(tabs) do
if ((x &gt;= tab.closeX and x &lt; tab.closeX + tabs.closeWidth) and (y &gt;= tab.closeY and y &lt; tab.closeY + tabs.closeHeight)) then
tab.highlight_close = true;
else
tab.highlight_close = false;
end
end
end
tabs.lastTab = sender.Page[sender.TabIndex];
sender.onResize(sender);
sender.update(); -- Fix flicker
drawCloseButton(object); -- we cannot use sender to access DC...
drawSelectedTab(object);
end
function pageControlEvents.onresize(sender)
local pageCount,maxheight,rects = sender.PageCount,0,{} -- index for array
for i=0,pageCount-1 do
local rect = sender.tabRect(i);
rects[i] = rect; -- less calls == better
if (rect.Top &lt; maxheight) then
maxheight = rect.Top; -- first get the max height;
end
end
local maxheight,w,h = math.abs(maxheight),tabs.closeWidth,tabs.closeHeight; -- we just need the bitmap for approx size..
tabs.maxheight = maxheight;
if (pageCount &lt; #tabs) then
for i=pageCount+1,#tabs do
tabs[i] = nil -- cleanup
end
end
for i=1,pageCount do
local rect = rects[i-1];
rect.highlight_close = tabs[i] and tabs[i].highlight_close or false;
local l,r,t,b = rect.Left,rect.Right,math.abs(rect.Top),math.abs(rect.Bottom);
local bh = b+h;
rect.absX = l;
rect.absWidth = r-l;
rect.absY = maxheight-t
rect.absHeight = t-b;
rect.closeX = r-w-2;
rect.closeY = maxheight-bh -(t - bh)//2 + 2;
tabs[i] = rect;
end
end
function pageControlEvents.onmouseleave(sender)
object.onmousemove(object,0,0);
end
function pageControlEvents.onmouseup(sender,button,x,y)
object.onmousemove(object,x,y);
end
function pageControlEvents.onmousedown(sender,button,x,y)
if (button ~= 0) then
return;
end
local removedTabId;
for id,tab in ipairs(tabs) do
if (tab.highlight_close) then
removedTabId = id;
break;
end
end
if (removedTabId) then
if (sender.ActivePage == selectedTab) then
selectedTab = nil;
end
if (selectedTab) then
sender.ActivePage = selectedTab;
end
if (object.onTabDestroy) then
if(object.onTabDestroy(object,removedTabId-1)) then-- was handled
return true
end
else
sender.ActivePage.destroy();
end
table.remove(tabs,removedTabId);
if (sender.TabIndex &lt; 0) then
sender.TabIndex = 0;
end
end -- siwtching tabs when multilined is active won't update close positions
if (selectedTab ~= sender.ActivePage) then
local previousTab = selectedTab;
selectedTab = sender.ActivePage;
if (previousTab and previousTab.Parent~= selectedTab.Parent) then
previousTab.Parent.repaint();
previousTab.Parent.onmousemove(previousTab.Parent,0,0);
end
end
object.onmousemove(object,x,y);
end
function parentEvents.onmouseenter(sender)
for i=0,sender.ComponentCount-1 do
local c = sender.Component[i];
if (c and c.onmousemove) then
c.onmousemove(c,-1,-1);
end
end
end
function parentEvents.onmousemove(sender)
if (sender.onmouseenter) then
sender.onmouseenter(sender);
end
end
function parentEvents.onmouseleave(sender)
if (sender.onmouseenter) then
sender.onmouseenter(sender);
end
end
function parentEvents.onpaint(sender)
if (sender.onmouseenter) then
sender.onmouseenter(sender);
end
end
::lazy_repeat::
local mt = getmetatable(object);
local __newindex = mt.__newindex;
mt.__newindex = function(self,key,value)
local _key = tostring(key):lower();
if (value == nil) then
return __newindex(self,pageControlEvents[_key])
elseif (self[key] and type(value)== 'function') then
local func = self[key];
return __newindex(self,key,function(...)
-- func(...) -- pageControlEvents....
return func(...) or value(...);
end);
end
return __newindex(self,key,value);
end
for k,v in pairs(pageControlEvents) do
object[k] = v;
end
for k,v in pairs(parentEvents) do
parent[k] = v;
end
::end_lazy_repeat::
object.onresize(object);
end
local function addDCmethod(o)
local mt = getmetatable(o);
local __index = mt.__index;
local handle = o.handle;
mt.dc,mt.rdc = true,true; -- property that would aquire or release dc
function mt.getDC() -- function
if (o.Tag == 0) then -- because of the userdata behavior we cannot store as a property...
o.Tag = ExecuteCodeLocal('GetDC',handle);
end
return o.Tag;
end
function mt.releaseDC() -- function
local status = false;
if (o.Tag ~= 0) then
local status = ExecuteCodeLocalEx('releaseDC',handle,o.Tag) == 1;
o.Tag = 0;
end
return status;
end
mt.__index = function(self,key)
if (type(key) == 'string') then
local lkey = key:lower();
if (lkey == 'dc' or key == 'getdc') then
return mt.getDC();
elseif (lkey == 'rdc' or key == 'releasedc') then
return mt.releaseDC();
end
end
return __index(self,key);
end
end
local _createPageControl = createPageControl;
local tabCache = {};
local function getCachedObject(object)
local hasCached = tabCache[userDataToInteger(object)];
if (not hasCached) then
tabCache[userDataToInteger(object)] = object;
end
return hasCached
end
local createPageControl = function(parent,NoCloseButton)
-- workaround for drawing on top of pagecontrol... we cannot access canvas..
local pc = _createPageControl(parent);
getCachedObject(pc); -- cache it...
local function attachPage(o)
if (o) then
if (getmetatable(o).getDC) then
return;
end
addDCmethod(o);
local mt = getmetatable(o);
local __index = mt.__index;
local __newindex = mt.__newindex;
mt.__index = function(self, key)
local item = __index(self,key);
if (tostring(key):lower() == 'caption') then
return item:sub(1,-CAPTION_EXTRA_SPACE_COUNT-1);
elseif (type(item) == 'userdata' and item.ClassName == 'TTabSheet') then
if (getCachedObject(item)) then
return getCachedObject(item); -- use cached object...
end
attachPage(item);
end
return item;
end
if (o.ClassName == 'TTabSheet') then
-- let's add some space to the caption so we could draw later our desired 'X' buttons;
mt.__newindex = function(self,key,value)
if (type(key) == 'string') then
if (key:lower() == 'caption') then
local newCaption = ("%s%s"):format(value,string.rep(' ',CAPTION_EXTRA_SPACE_COUNT));
local status = __newindex(self,key,newCaption);
if (not NoCloseButton and parent.onpaint) then
parent.onpaint(parent);
end
return status;
end
end
return __newindex(self,key,value);
end
end
end
end
addDCmethod(pc);
local mt = getmetatable(pc)
local __index = mt.__index;
mt.__index = function(self,key)
local lkey = key:lower();
if (lkey == 'page' or lkey == 'activepage') then
local page = __index(self,key); -- returns table with all pages
local int_page = type(page) == 'userdata' and userDataToInteger(page) or page; -- Page is a table... we cannot use userDataToInteger
if (tabCache[int_page]) then
return tabCache[int_page]; -- use cached object...
end
attachPage(page);--return cache version! either store somewhere using userDataToInteger
return page;
end
return __index(self,key);
end
if (not NoCloseButton) then
pc.canDestroyLastTab = true;
addDrawEvent(pc,parent); -- workaround for windows;
end
return pc; -- only accessing thorugh this object would allow us to obtain and release dc linked..
end
local updateToolbar
local function createView(parent,views) -- creates view, and if nessecary also a splitter...
local mainWindow = parent;
while (mainWindow.ClassName ~= "TCEForm") do
mainWindow = mainWindow.parent;
end
if (not views.ContainerPageControl) then
views.ContainerPageControl = createPageControl(parent.parent);
local tabsContainer = views.ContainerPageControl
tabsContainer.visible = false;
tabsContainer.addTab();
local tab = tabsContainer.ActivePage;
local lua = createSynEdit(tab,0); -- just to get highlighters...
local cea = createSynEdit(tab,1); -- cheat engine assembly
views.LuaSyntax = lua.Highlighter
views.CeaSyntax = cea.Highlighter
views.TxtSyntax = 0 -- none.. removes syntax
end
local viewCount = #views;
if (viewCount == views.viewLimit) then
return false;
end
local viewObj
if (viewCount == 0) then -- first view;
viewObj = createPageControl(parent);
selectedView = viewObj; -- initialize view...
else
local newSplitter = createSplitter(parent); -- we cannot link splitter to the view;
views.splitters[viewCount] = newSplitter;
viewObj = createPageControl(parent);
views[#views].width = views[#views].width // 2 -- so we could see the new view
end
viewObj.Constraints.MinHeight = 20;
viewObj.Constraints.MinWidth = 150;
viewObj.Options = '[nboDoChangeOnSetIndex]' -- call onChange ...
views[viewCount+1] = viewObj; -- assign new view;
if (views.icons) then
viewObj.Images = views.icons;
end
local function findView(targetView) -- returns viewObj instead of sender...
for id,view in ipairs(views) do
if (view == targetView) then
return view,id;
end
end
end
viewObj.OnMouseWheelUp = function()
local tabIndex = viewObj.ActivePage.TabIndex
if (tabIndex &gt; 0) then
viewObj.ActivePage = viewObj.Page[tabIndex-1];
viewObj.notifyViewChange();
end
end
viewObj.OnMouseWheelDown = function()
local tabIndex = viewObj.ActivePage.TabIndex
if (tabIndex &lt; viewObj.PageCount-1) then
viewObj.ActivePage = viewObj.Page[tabIndex+1];
viewObj.notifyViewChange();
end
end
viewObj.sortViews = function()
local viewCount,temp_left = #views,0;
for i=1,viewCount do
local view = views[i];
view.align = i == viewCount and alClient or alLeft;
view.anchors = i == viewCount and '[akTop,akRight,akBottom]' or '[akTop,akLeft,akRight,akBottom]';
view.left = temp_left; -- fix conflicts
temp_left = temp_left + view.width;
local hasSplitter = views.splitters[i];
if (hasSplitter) then
hasSplitter.align = alLeft;
hasSplitter.left = temp_left;
temp_left = temp_left + hasSplitter.width;
end
end
end
-- optimize a bit...
local execute = parent.parent.ComponentByName['toolbar'].ComponentByName['execute'];
local new_view = parent.parent.ComponentByName['toolbar'].ComponentByName['new_view'];
local next_view = parent.parent.ComponentByName['toolbar'].ComponentByName['next_view'];
local prev_view = parent.parent.ComponentByName['toolbar'].ComponentByName['prev_view'];
local function updateToolbar()
if (new_view) then
local highlighter = selectedView.ActivePage.synedit.Highlighter
local smi = mainWindow.SyntaxMI;
if (smi) then
if (highlighter) then
mainWindow.LuaSyntax.Checked = highlighter.ClassName == 'TSynLuaSyn';
mainWindow.CeaSyntax.Checked = highlighter.ClassName == 'TSynAASyn';
execute.enabled = true;
else
mainWindow.TxtSyntax.Checked = false;
execute.enabled = false;
end
end
local _,viewId = findView(viewObj);
if (selectedView.PageCount &lt;= 1) then
new_view.Enabled = false;
if (viewId == 1) then
next_view.Enabled = false;
prev_view.Enabled = false;
else
next_view.Enabled = viewId &lt; #views;
prev_view.Enabled = viewId &gt; 1;
end
else
new_view.Enabled = #views &lt; views.viewLimit;
next_view.Enabled = viewId &lt; #views;
prev_view.Enabled = viewId &gt; 1;
end
end
end
viewObj.notifyViewChange = function(sender)
local previousView = selectedView;
selectedTab = viewObj.ActivePage;
selectedView = viewObj;
if (viewObj == selectedView) then -- fix flicker when updating previous
updateToolbar();
end
if (previousView and previousView ~= viewObj) then
previousView.repaint();
previousView.onmousemove(previousView,0,0);
end
if (mainWindow.visible) then -- avoid trying to setFocus on hidden object..
selectedTab.synedit.setFocus(); -- put focus on the new tab...
end
viewObj.onmousemove(viewObj,0,0);
end
viewObj.createNewTab = function(caption)
local tabsContainer = views.ContainerPageControl;
if (tabsContainer) then
-- we cannot transfer ownership (currently at least), so destroying a view while
-- its owned component have a different parent will also destroy them (may result in empty pagecontrol...)
tabsContainer.addTab();
local page = tabsContainer.Page[tabsContainer.PageCount-1];
page.Parent = viewObj;
page.TabVisible = true;
end
if (not caption) then
views.openedTabs = views.openedTabs + 1;
end
local id = viewObj.PageCount-1;
local newTab = viewObj.Page[id];
newTab.ImageIndex = views.iconsId.file_unchanged
newTab.Caption = caption or ('New %d'):format(views.openedTabs);
local synedit = createSynEdit(newTab,views[DEFAULT_SYNTAX]);
synedit.BorderStyle = 'bsNone';
synedit.onClick = function(sender)
local isOpenedFile = views.getOpenedTab(newTab);
if (isOpenedFile and isOpenedFile.MemoryRecord) then
-- update memoryrecord description (incase it was changed...)
local caption = isOpenedFile.MemoryRecord.Description
if (newTab.Caption ~=caption) then
isOpenedFile.path = '[Memory record] '.. caption;
newTab.Caption = caption;
sender.Parent.Parent.onChange();
end
end
if (newTab ~= selectedTab) then
-- findView(sender.Parent.Parent).notifyViewChange();
getCachedObject(sender.Parent.Parent).notifyViewChange();
sender.Parent.Parent.onChange();
end
end
synedit.onChange = function(sender,key)
if (newTab.ImageIndex == views.iconsId.file_changed) then
return;
end
local isOpenedFile = views.getOpenedTab(newTab);
if (isOpenedFile) then
isOpenedFile.modified = true;
end
newTab.ImageIndex = views.iconsId.file_changed;
sender.Parent.Parent.onChange();
end
if (getKeystroke) then
local keyStrokes = synedit.Keystrokes
getKeystroke(keyStrokes,45).ShortCut = textToShortCut("ALT+N"); -- newline key; Ctrl+N to Alt+N
getKeystroke(keyStrokes,46).ShortCut = textToShortCut("CTRL+D"); -- deleteword key; Ctrl+T to Ctrl+D
end
synedit.ScrollBars = 6 --ssAutoBoth
synedit.Options = views.synedit_options;
synedit.Options2 = views.synedit_options2;
synedit.MouseOptions = views.synedit_mouseoptions;
synedit.name = 'synedit';
synedit.Lines.Text = '';
synedit.Parent = newTab;
synedit.align = alClient;
synedit.Font.Quality = 'fqCleartype';
synedit.Font.Size = 10;
synedit.BlockTabIndent = 1; -- fix tabs
synedit.BlockIndent = 0;
synedit.TabWidth = 3; -- finally can tab like a person without having to scroll miles
synedit.Lines.LineBreak = '\r\n'; -- fix saving -- fix also searching
viewObj.TabIndex = id;
selectedTab = newTab;
viewObj.notifyViewChange();
-- add popup menu...
local isCurrentSyntax = function(itemSyntax,secondaryRule)
return syntaxRules.matchingCurrentSyntax(syntaxRules.getCurrentSyntaxRule(synedit),itemSyntax,secondaryRule);
end
-- @cheat engine source :p
local rsCodeInjectionTemplate = 'Code Injection Template';
local rsOnWhatAddressJump = 'On what address do you want the jump?';
local rsWhatIdentifierTouse = 'What do you want to name the symbol for the injection point?';
local comment_range = config.comment_range;
local syn_popup = createPopupMenu(synedit);
syn_popup.OnPopup = function(sender)
-- filter based current syntax...
-- items based current used syntax
-- items based new file/existing item
local isOpenedFile = views.getOpenedTab(newTab); -- let's see if any file/object is assigned
local syntaxType = syntaxRules.getCurrentSyntaxRule(synedit);
local items = syn_popup.Items;
for i=0,items.Count -1 do
local item = items.Item[i]
local itemSyntaxRule = item.Tag;
if (itemSyntaxRule &gt; 0) then -- has any?
local isMatchingSyntax,isOnlyNewItem = syntaxRules.matchingCurrentSyntax(syntaxType,itemSyntaxRule,syntaxRules.STRICT_NEW_ITEM);
if (not isMatchingSyntax or (isOpenedFile and isOnlyNewItem)) then
item.visible = false;
else
item.visible = true;
end
else
item.visible = true;
end
end
end
local createCustomMenuItem = function(itemOwner,caption,func,_type)
assert(itemOwner,'no owner was given');
-- assert(func,'no function was given');
-- quick method to set up menu items...
local item = createMenuItem(itemOwner);
item.caption = caption;
item.OnClick = func;
item.tag = syntaxRules[_type];
(itemOwner.Items or itemOwner).add(item);
return item;
end
local createSynMenuItem = function(caption,func,_type)
return createCustomMenuItem(syn_popup,caption,func,_type);
end
local mTemplate = createSynMenuItem('Templates',nil,'STRICT_AA_ITEM');
local mCodeInjection = createCustomMenuItem(mTemplate,'Code Injection',function()
local address = inputQuery(rsCodeInjectionTemplate,rsOnWhatAddressJump,getMemoryViewAddress());
if (not address) then
return;
end
generateCodeInjectionScript(synedit.Lines,address);
synedit.onchange(synedit);
end,'STRICT_AA_ITEM');
local mAOBInjection = createCustomMenuItem(mTemplate,'AOB Injection',function()
local address = inputQuery(rsCodeInjectionTemplate,rsOnWhatAddressJump,getMemoryViewAddress());
if (not address) then
return;
end
local Lines = synedit.Lines;
local nextAllocNum = getNextAllocNumber(Lines);
local symbolName = inputQuery(rsCodeInjectionTemplate,rsWhatIdentifierTouse,("%s%s"):format("INJECT",tostring(nextAllocNum &gt; 0 and nextAllocNum or '')));
generateAOBInjectionScript(Lines,symbolName,address,comment_range);
synedit.onchange(synedit);
end,'STRICT_AA_ITEM');
local mFullCodeInjection = createCustomMenuItem(mTemplate,'Full Code Injection',function()
local address = inputQuery(rsCodeInjectionTemplate,rsOnWhatAddressJump,getMemoryViewAddress());
if (not address) then
return;
end
generateFullInjectionScript(synedit.Lines,address);
synedit.onchange(synedit);
end,'STRICT_AA_ITEM');
createCustomMenuItem(mTemplate,'-'); -- seperator...
--[[
-- isn't yet published.. tho it is documented already ...
local mAddSnapshotComment = createCustomMenuItem(mTemplate,'Add code snapshot as comment',function()
local address = inputQuery('Code snapshot comment','From what address you want to take the snapshot?',getMemoryViewAddress());
if (not address) then
return;
end
local commentRadius = inputQuery('Code snapshot comment','Comment radius',comment_range);
addSnapshotAsComment(synedit.Lines,address,commentRadius);
end,'STRICT_AA_ITEM');
--]]
local mCTFrameWorkCode = createSynMenuItem('Add Cheat Table Framework code',function()
local enableStr,disableStr = '[ENABLE]','[DISABLE]';
local enableComment = "//code from here to '[DISABLE]' will be used to enable the cheat";
local disableComment = "//code from here till the end of the code will be used to disable the cheat";
local hasEnable,hasDisable
local enableStrEscaped,disableStrEscaped = (enableStr:gsub('([%[%]]+)','%%%1')),(disableStr:gsub('([%[%]]+)','%%%1'));
local Lines = synedit.Lines;
for i=0,Lines.Count-1 do
local line = Lines.String[i]
if (not hasEnable and line:match(enableStrEscaped)) then
hasEnable = true;
end
if (not hasDisable and line:match(disableStrEscaped)) then
hasDisable = true;
end
if (hasEnable and hasDisable) then
return
end
end
local caretPos = synedit.SelStart -- save current
if (not hasEnable) then
Lines.insert(0,enableStr);Lines.insert(1,enableComment);
synedit.SelStart = caretPos+(#enableStr+2)+(#enableComment+2); -- additional newline...
end
if (not hasDisable) then
Lines.add(disableStr);Lines.add(disableComment);
Lines.add(''); -- one thing I hate is that the caret does not go to the end of the last line.. gotta fix it..
end
synedit.onchange(synedit);
end, 'STRICT_AA_ITEM');
-- to avoid creation of many many scripts, allow only new tabs to be assigned as an addresslist object;
local mAddToAddressList = createSynMenuItem('Save to addresslist', function()
local script = synedit.Lines.Text;
local status,Err = checkAAScript(script);
if (not status) then
print(selectedTab.Caption,'Error: ',Err);
return;
end
-- okay script is good
local al = AddressList
local caption = newTab.Caption;
local path = '[Memory record]'..caption;
local mr = AddressList.createMemoryRecord();
mr.Description = caption;
mr.Type = vtAutoAssembler;
mr.Script = script;
views.setOpenedFileTab(newTab,{path = path;MemoryRecord = mr});
getCachedObject(newTab.parent).saveFile(); -- save file and update...
end, 'STRICT_NEW_AA_ITEM');
createSynMenuItem('-',nil,'STRICT_AA_ITEM');
local miCut = createSynMenuItem('Cut',synedit.CutToClipboard);
local miCopy = createSynMenuItem('Copy',synedit.CopyToClipboard);
local miPaste = createSynMenuItem('Paste',synedit.PasteFromClipboard);
local miUndo = createSynMenuItem('Undo',synedit.Undo);
local miRedo = createSynMenuItem('Redo',synedit.Redo);
local miRedo = createSynMenuItem('Select All',synedit.SelectAll);
-- to do....
-- createSynMenuItem('-');
-- local miFind = createSynMenuItem('Find');
-- local miFindReplace = createSynMenuItem('Find/Replace');
synedit.PopupMenu = syn_popup;
return newTab;
end
local function getMaxTabsHeight()
local maxheight = 0;
for i=0,viewObj.PageCount-1 do
local rect = viewObj.tabRect(i);
if (rect.Top &lt; maxheight) then
maxheight = rect.Top; -- first get the max height;
end
end
return math.abs(maxheight);
end
local middleButtonClick = false -- allow to close with middle button
viewObj.onmousedown = function(sender,button,x,y)
if (middleButtonClick) then
middleButtonClick = false;
return viewObj.onTabDestroy();
end
if (button &gt;= 1) then
middleButtonClick = button == 2;
mouse_event(6, getMousePos()); -- as I am uncapable of getting tab under mouse when right clicking
else
viewObj.notifyViewChange();
end
end
viewObj.setActivePage = function(page)
if (page) then
viewObj.ActivePage = page;
viewObj.notifyViewChange();
viewObj.onchange(viewObj);
end
end
viewObj.setTabView = function(tab,view)
view = view or viewObj;
tab = tab or viewObj.ActivePage;
if (tab.Parent == tView) then
return;
end
local tabParent = getCachedObject(tab.parent);
selectedView = tabParent;
tab.parent = view;
tab.TabVisible = true;
view.TabIndex = view.PageCount-1;
if (tabParent.PageCount == 0) then
tabParent.destroyView();
else
viewObj.notifyViewChange();
end
end
viewObj.moveToNewView = function(tab)
local newView = createView(parent,views); -- create a single function for this complete class; to avoid referencing functions.
if (newView) then
newView.setTabView(tab or viewObj.ActivePage);
end
end
viewObj.moveToNextView = function(view)
local _,viewId = findView(viewObj);
if (viewId == 1 and viewObj.PageCount &lt;= 1) then
return
end
local nextView = views[viewId+1];
if (nextView) then
nextView.setTabView(viewObj.ActivePage);
end
end
viewObj.moveToPrevView = function(view)
local _,viewId = findView(viewObj);
local nextView = views[viewId-1];
if (nextView) then
nextView.setTabView(viewObj.ActivePage);
end
end
viewObj.moveTabRight = function(tab)
local page = tab or viewObj.ActivePage;
local TabIndex = page.TabIndex;
if (page.PageIndex &lt; viewObj.PageCount-1) then
page.PageIndex = page.PageIndex + 1;
end
viewObj.onmousemove(viewObj,0,0);
end
viewObj.moveTabLeft = function(tab)
local page = tab or viewObj.ActivePage;
local TabIndex = page.TabIndex;
if (page.PageIndex &gt; 0) then
page.PageIndex = page.PageIndex - 1;
end
viewObj.onmousemove(viewObj,0,0);
end
viewObj.destroyView = function(targetView)
-- find view in array...
if ((targetView or viewObj) == views[1]) then return end;
local targetId;
for id,view in ipairs(views) do
if (view == (targetView or viewObj)) then
view.name = nil;
view.destroy();
table.remove(views,id);
local splitter = views.splitters[id-1];
if (splitter) then
splitter.destroy(); -- destroy splitter related to view
table.remove(views.splitters,id-1);
end
targetId = id;
break;
end
end
if (selectedView == viewObj) then
selectedView = views[targetId] or views[#views]; -- set new view as active;
selectedTab = selectedView.ActivePage;
end
selectedView.sortViews();
selectedView.notifyViewChange();
end
viewObj.closeTab = function(tab) -- addCloseButton dependency
if (viewObj.PageCount &gt; 1) then
tab = tab or viewObj.ActivePage;
tab.synedit.destroy();
tab.destroy();
selectedTab = viewObj.ActivePage;
selectedView.notifyViewChange();
else
local synedit = viewObj.ActivePage.synedit;
if (viewObj == views[1]) then
if (synedit.Lines.Text == '') then
return
end
synedit.destroy();
viewObj.ActivePage.destroy();
viewObj.createNewTab();
viewObj.onchange(viewObj);
return
end
synedit.destroy();
viewObj.ActivePage.destroy();
viewObj.destroyView();
return true;
end
end
viewObj.onTabDestroy = function(sender,id)
local tab = type(id)=='number' and viewObj.Page[id] or type(id)=='userdata' and id or viewObj.ActivePage;
local isOpenedFile = views.getOpenedTab(tab);
local synedit = tab.synedit;
local text = synedit.Lines.Text:gsub('%s','');
if ((not isOpenedFile and #text &gt; 0) or (isOpenedFile and isOpenedFile.modified)) then
if (not mainWindow.visible) then
mainWindow.show();
end
local mr = messageDialog(('Save script - %s'):format(tab.Caption),('Do you want to save changes to "%s" ?'):format(isOpenedFile and isOpenedFile.path or tab.Caption),mtInformation,mbYes,mbNo,mbCancel);
if (mr == mrCancel) then
return true, 'user canceled';
end
if (mr == mrYes) then
if (not viewObj.saveFile()) then
return true, 'could not write';
end;
end
end
if (isOpenedFile) then
views.setOpenedFileTab(tab,nil);
end
return viewObj.closeTab(tab);
end
local function createSpecificFileDialog(owner,dialogFunc)
local fileDialog = (dialogFunc or createOpenDialog)(owner);
fileDialog.Filter = 'Lua files (*.lua)|*.lua|Cheat Engine Assembly files (*.cea)|*.cea|Normal text file (*.txt)|*.text|All files (*.*)|*'
fileDialog.options = 'ofPathMustExist'
fileDialog.InitialDir = config.openDialogPath;
fileDialog.FilterIndex = 4;
return fileDialog;
end
viewObj.openFile = function(file)
if (type(file)=='string') then
local path,fileName,fileExtension = file:match('^(.+\\)(.+%.(.+))$'); -- path full filename, and extension can be whatever after the last dot
local isOpened = views.getOpenedTabFromPath(file); -- searches all cached tabs for path == file
if (not isOpened) then
local source = readFile(file);
assert(source,'failed to read file! :'..file);
local tab = viewObj.createNewTab(fileName);
local synedit = tab.synedit;
synedit.Lines.Text = source;
synedit.Highlighter = views.getSyntaxFromExtension(fileExtension);
views.setOpenedFileTab(tab,{path = file, fileName = fileName, fileExtension = fileExtension});
else
local parentView = getCachedObject(isOpened.Parent); -- get main pagecontrol parent;
if (parentView) then -- set active page;
return parentView.setActivePage(isOpened);
end
end
elseif(type(file)=='userdata') then
local path = '[Memory record] '..file.Description;
local isOpened = views.getOpenedTabMR(file);
if (not isOpened) then
local tab = viewObj.createNewTab(file.Description);
local synedit = tab.synedit;
synedit.Lines.Text = file.Script;
synedit.Highlighter = views.CeaSyntax;
views.setOpenedFileTab(tab,{path = path;MemoryRecord = file});
else
local parentView = getCachedObject(isOpened.Parent);
if (parentView) then
return parentView.setActivePage(isOpened);
end
end
else
local fileDialog = createSpecificFileDialog(viewObj)
fileDialog.options = fileDialog.options..'ofAllowMultiSelect';
if (fileDialog.execute()) then
local files = fileDialog.Files;
for i=0,files.Count-1 do
local pathToFile = files[i];
local isOpened = views.getOpenedTabFromPath(pathToFile);
if (not isOpened) then
local path,fileName,fileExtension = pathToFile:match('^(.+\\)(.+%.(.+))$');
local source = readFile(pathToFile);
local tab = viewObj.createNewTab(fileName);
local synedit = tab.synedit;
synedit.Lines.Text = source;
synedit.Highlighter = views.getSyntaxFromExtension(fileExtension);
views.setOpenedFileTab(tab,{path = pathToFile, fileName = fileName, fileExtension = fileExtension});
else
-- open existing tab!
-- viewObj.ActivePage = isOpened -- can have different parent...
local parentView = getCachedObject(isOpened.Parent);
if (parentView) then
return parentView.setActivePage(isOpened);
end
end
end
end
fileDialog.destroy();
end
viewObj.notifyViewChange();
viewObj.onchange(viewObj);
end
viewObj.saveFile = function(saveAs)
local tab = viewObj.ActivePage;
local isOpenedFile = views.getOpenedTab(tab);
local synedit = tab.synedit;
local data = synedit.Lines.Text;
if (isOpenedFile and isOpenedFile.MemoryRecord) then
if (not mainWindow.CeaSyntax.Checked) then
print(selectedTab.Caption,'Error: Wrong syntax!');
return false;
end
local status,Err = checkAAScript(data);
if (status) then
isOpenedFile.MemoryRecord.Script = data;
else
print(selectedTab.Caption,'Error: ',Err,self and '(Self Target)');
return false;
end
elseif (not isOpenedFile or saveAs) then
local fileDialog = createSpecificFileDialog(mainView,createSaveDialog);
fileDialog.options = fileDialog.options..'ofOverwritePrompt';
fileDialog.FileName = tab.Caption;
fileDialog.DefaultExt = synedit.Highlighter and (synedit.Highlighter.ClassName == 'TSynLuaSyn' and '.lua' or synedit.Highlighter.ClassName == 'TSynAASyn' and '.cea') or '.txt';
if(not fileDialog.execute()) then
return false;
end
if (not writeFile(fileDialog.FileName,data)) then
messageDialog('Could not write to file!',mtError,mbOK);
return false;
end
local path,fileName,fileExtension = fileDialog.FileName:match('^(.+\\)(.+%.(.+))$');
tab.Caption = fileName;
views.setOpenedFileTab(tab,{path = fileDialog.FileName, fileName = fileName, fileExtension = fileExtension});
fileDialog.destroy();
viewObj.onchange(viewObj);
elseif (isOpenedFile) then
if (not writeFile(isOpenedFile.path,data)) then
messageDialog('Could not write to file!',mtError,mbOK);
return false;
end
end
if (isOpenedFile) then
isOpenedFile.modified = false;
end
synedit.MarkTextAsSaved();
tab.ImageIndex = views.iconsId.file_unchanged;
viewObj.onChange();
return true;
end
viewObj.onChange = function(sender)
if (viewObj.PageCount &gt; 0 and viewObj.ActivePage) then
local tab = viewObj.ActivePage;
local isOpenedFile = views.getOpenedTab(tab);
if (isOpenedFile) then
mainWindow.Caption = ('%s%s - %s'):format(isOpenedFile.modified and '*' or '',isOpenedFile.path,config.windowCaption);
else
local text = tab.synedit.Lines.Text
mainWindow.Caption = ("%s%s - %s"):format(#tab.synedit.Lines.Text &gt; 0 and '*' or '',tab.Caption,config.windowCaption);
end
end
end
viewObj.sortViews();
local popupMenu = createPopupMenu(viewObj);
local popupItems = popupMenu.Items;
local closeTabsRight = createMenuItem(popupMenu);
local closeTabsLeft = createMenuItem(popupMenu);
local closeTabsUnchanged = createMenuItem(popupMenu);
local moveNewView = createMenuItem(popupMenu);
local moveToNextView = createMenuItem(popupMenu);
local moveToPrevView = createMenuItem(popupMenu);
closeTabsLeft.Caption = 'Close all to the left';
closeTabsRight.Caption = 'Close all to the right';
closeTabsUnchanged.Caption = 'Close all unchanged';
moveNewView.Caption = 'Move to a new view';
moveToNextView.Caption = 'Move to the next view';
moveToPrevView.Caption = 'Move to the previous view';
-- user may switch view only if he has more than one tab in current view....
moveNewView.onClick = function(sender)
viewObj.moveToNewView();
end
closeTabsRight.onClick = function(sender)
local pageId = viewObj.ActivePage.TabIndex+1;
for i=pageId,viewObj.PageCount-1 do
local status,cancelMsg = viewObj.onTabDestroy(viewObj,pageId);
if (cancelMsg) then
break;
end
end
-- while viewObj.PageCount-1 &gt; pageId do
-- viewObj.onTabDestroy(viewObj,pageId);
-- end
end
closeTabsLeft.onClick = function(sender)
local pageId = viewObj.ActivePage.TabIndex;
for i=0,pageId-1 do
local status,cancelMsg = viewObj.onTabDestroy(viewObj,0);
if (cancelMsg) then
break;
end
end
end
closeTabsUnchanged.onClick = function(sender)
for i=viewObj.PageCount-1,0,-1 do
if (viewObj.Page[i].ImageIndex == views.iconsId.file_unchanged) then
viewObj.onTabDestroy(viewObj,i);
end
end
end
moveToNextView.onClick = function(sender)
viewObj.moveToNextView();
end
moveToPrevView.onClick = function(sender)
viewObj.moveToPrevView();
end
popupMenu.OnPopup = function(sender)
local PageCount = viewObj.PageCount
local tabIndex = viewObj.ActivePage.TabIndex;
-- local _,viewId = findView(viewObj);
local _,viewId = getCachedObject(viewObj);
if (PageCount &lt;= 1 ) then
moveNewView.Enabled = false;
if (views[1] == viewObj) then
moveToNextView.Enabled = false;
moveToPrevView.Enabled = false;
closeTabsLeft.Enabled = false;
closeTabsRight.Enabled = false;
closeTabsUnchanged.Enabled = false;
else
moveToNextView.Enabled = viewId ~= #views;
moveToPrevView.Enabled = viewId ~= 1;
end
else
moveNewView.Enabled = viewId ~= views.viewLimit;
if (#views &gt; 1) then
moveToNextView.Enabled = viewId ~= #views;
moveToPrevView.Enabled = viewId ~= 1;
else
moveToNextView.Enabled = false;
moveToPrevView.Enabled = false;
end
closeTabsLeft.Enabled = tabIndex ~= 0;
closeTabsRight.Enabled = tabIndex ~= PageCount-1;
closeTabsUnchanged.Enabled = true;
end
end
popupItems.add(closeTabsLeft);
popupItems.add(closeTabsRight);
popupItems.add(closeTabsUnchanged);
popupItems.add(seperator);
popupItems.add(moveNewView);
popupItems.add(moveToNextView);
popupItems.add(moveToPrevView);
viewObj.PopupMenu = popupMenu;
return viewObj;
end
CAPTION_EXTRA_SPACE_COUNT = 5; -- so we could draw the close buttons if necessary
-- modify the pictures if you want to use different close buttons
close_image = png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABUElEQVQ4T6XSTcuCQBAA4OnD/kJR3S0pD0G3QCQkgv5viIgI3r0E4iWKuqT2YbcK25cZcVWKPLwDsrPjPu7KTg3+EbXMNhoNNplMoNVqgSAINOLzfD7h8XjQ+Hq9wHVdSJKEXIbZarWC9/sNjLHS+K3mOA5ZwrIss36/D/V6vfInLpcLnM9n8H0/x71eD2rp9Gdcr1c4nU6w3W7T1ePxmHW7XcLr9ZrwcrnkHynWEIdhmOPRaEQ4C13XKV0sFlDMsXa73SAIAtjtdunOiDudTum4hmHwuaZpPEccRVGOJUn6wKZpcjCfz3kexzHh/X6f7jwcDgnjNWFYlkWjqqqlHGsZPhwOKR4MBqzdbhO2bZugoih8t2INMV4Xx6IoEsaGqIr7/U74eDzyi2Wz2Yx3VrHLinmSJLRms9ngHnlXNJtNNp1OK1vU87yP3q467df3fwxz9xCrlragAAAAAElFTkSuQmCC");
close_image_onHover = png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABNElEQVQ4T6XSPUtcQRTG8d8NwUIsBMXOzs7KLp9BRCKI2IhfwNbawkIQhAgLhi2CYGGdRiJBCxHfEBXBzi6dBrHKghEnzO4MjIuyCzkwzLkz83/OuTNP5T+iymwvYRsDaQym+Q73+I0HzOEPTS7D4Rl/28bTO9+fWhWrJvyVMI+eLn7hCPtYynCdMIuPXcDH2MFahjcIM/iA/hCaEo+tpppRrp3iB75kuEaYLi5gKAncVZUyj0Jn2EUtw+uEqbaWh5NAXP5VdHGOn9jI8BrhM14KgZECvi3gC+yhnuFVwiTic8UYTeBNVb3K495Vuu1vGV4hTKQ3HUvgZVGtXIvwATYzvEwYRzRFp7jGIbYyjHCSKkeB7LY4l85rpDMLpcNi3kf4/oZFo2VLmy6i0ebtTt2+uf8P9UNwEGbDzMIAAAAASUVORK5CYII=");
local views = {
splitters = {};
fileTabs = {};
viewLimit = config.viewLimit;
openedTabs = 0;
-- synedit_options = '[eoAutoIndent,eoBracketHighlight,eoGroupUndo,eoKeepCaretX,eoSmartTabs,eoTabIndent,eoTabsToSpaces,eoTrimTrailingSpaces,eoHideRightMargin]';
synedit_options = '[eoEnhanceHomeKey,eoAutoIndent,eoBracketHighlight,eoGroupUndo,eoKeepCaretX,eoTabIndent,eoTrimTrailingSpaces,eoHideRightMargin]';
synedit_options2 = '[eoFoldedCopyPaste,eoOverwriteBlock,eoEnhanceEndKey]';
--synedit_mouseoptions= '[emAltSetsColumnMode,emDragDropEditing,emCtrlWheelZoom]';
synedit_mouseoptions= '[emAltSetsColumnMode,emDragDropEditing,emShowCtrlMouseLinks,emCtrlWheelZoom]';
getSyntaxFromExtension=function(ext)return views[("%sSyntax"):format(ext:lower():gsub("^%l",string.upper))]or views.TxtSyntax;end; -- Lua,LUA,lUa,luA... --&gt; LuaSyntax
};
views.getOpenedTabFromPath = function(path) -- opened tab object
for tab,file in pairs(views.fileTabs) do
if (file.path == path) then
return integerToUserData(tab);
end
end
end
views.getOpenedTabMR = function(mr) -- opened tab object
for tab,file in pairs(views.fileTabs) do
if (file.MemoryRecord == mr) then
return integerToUserData(tab);
end
end
end
views.getOpenedTab = function(obj) -- opened tab data
return views.fileTabs[userDataToInteger(obj)];
end
views.setOpenedFileTab = function(obj,data)
views.fileTabs[userDataToInteger(obj)] = data;
end
scriptForm = createForm(false);
scriptForm.DoubleBuffered = true;
scriptForm.PopupMode = 'pmNone'; -- fix the 'always on top' behavior
scriptForm.KeyPreview = true; -- so we could open new tab ffs
scriptForm.name = 'ScriptEditor';
scriptForm.setSize(config.windowWidth,config.windowHeight);
scriptForm.setPosition(config.windowLeft,config.windowTop);
scriptForm.borderStyle = bsSizeable;
scriptForm.Caption = config.windowCaption;
local previousWidth = scriptForm.width;
scriptForm.onresize = function(sender)
local totalWidth = 0;
for _,view in ipairs(views) do
totalWidth = totalWidth + view.width;
end
local width = sender.width;
if (totalWidth &gt; width) then
for _,view in ipairs(views) do
view.width = math.floor(view.width / previousWidth * width);
end
end
end
local mainMenu = createMainMenu(scriptForm);
local FileItem = createMenuItem(scriptForm);
local new = createMenuItem(scriptForm);
local open = createMenuItem(scriptForm);
local save = createMenuItem(scriptForm);
local saveAs = createMenuItem(scriptForm);
local seperator_1 = createMenuItem(scriptForm);
local close = createMenuItem(scriptForm);
local closeAll = createMenuItem(scriptForm);
local EditItem = createMenuItem(scriptForm);
local ZoomIn = createMenuItem(scriptForm);
local ZoomOut = createMenuItem(scriptForm);
local ZoomRestore = createMenuItem(scriptForm);
local seperator_2 = createMenuItem(scriptForm);
local Syntax = createMenuItem(scriptForm);
local Txt = createMenuItem(scriptForm);
local Lua = createMenuItem(scriptForm);
local Asm = createMenuItem(scriptForm);
local seperator_3 = createMenuItem(scriptForm);
local find = createMenuItem(scriptForm);
local findNext = createMenuItem(scriptForm);
local replace = createMenuItem(scriptForm);
local seperator_4 = createMenuItem(scriptForm);
local execute = createMenuItem(scriptForm);
local execute2 = createMenuItem(scriptForm);
local SettingsItem = createMenuItem(scriptForm);
local closeTabsOnCloseItem = createMenuItem(scriptForm);
local showOnPrintItem = createMenuItem(scriptForm);
FileItem.Caption = 'File';
EditItem.Caption = 'Edit';
SettingsItem.Caption= 'Settings';
new.Caption = 'New';
open.Caption = 'Open file';
save.Caption = 'Save';
saveAs.Caption = 'Save As';
seperator_1.Caption = '-';
close.Caption = 'Close';
closeAll.name = 'closeAll'; -- so when closing MainForm user may save all files...
closeAll.Caption = 'Close all';
new.Shortcut = getKeystroke and "CTRL+N" or "CTRL+E"; --- can't figure out yet how to override tsynedit hotkeys ffs
open.Shortcut = "CTRL+O";
save.Shortcut = "CTRL+S";
saveAs.Shortcut = "CTRL+ALT+S";
close.Shortcut = "CTRL+W";
closeAll.Shortcut = "CTRL+ALT+W";
ZoomIn.Caption = 'Zoom in (Ctrl + Mouse Wheel Up)';
ZoomOut.Caption = 'Zoom out (Ctrl + Mouse Wheel Down)';
ZoomRestore.Caption = 'Restore Default Zoom';
seperator_2.Caption = '-';
Syntax.Name = 'SyntaxMI';
Syntax.Caption = 'Syntax';
Txt.Name = 'TxtSyntax';
Txt.Caption = 'None';
Txt.Shortcut = "ALT+3";
Lua.Name = 'LuaSyntax';
Lua.Caption = 'Lua';
Lua.Shortcut = "ALT+2";
Asm.Name = 'CeaSyntax';
Asm.Caption = 'Cheat Engine Assembly';
Asm.Shortcut = "ALT+1";
seperator_3.Caption = '-';
find.Caption = "Find..."
find.Shortcut = "CTRL+F"
findNext.Caption = "Find next"
findNext.Shortcut = "F3"
replace.Caption = "Replace..."
replace.Shortcut = "CTRL+SHIFT+F"
seperator_4.Caption = '-';
execute.name = 'executeMI';
execute.Caption = 'Execute Script';
execute.Shortcut = "F5";
execute2.Caption = 'Execute Script (self target)';
execute2.Shortcut = "SHIFT+F5";
showOnPrintItem.Caption = "Show on \"print\"";
closeTabsOnCloseItem.Caption= "Close all tabs when closing window";
showOnPrintItem.Checked = config.showOnPrint;
closeTabsOnCloseItem.Checked = config.closeTabsOnClose;
-- ZoomIn.Shortcut = "CTRL+Num +";
-- ZoomOut.Shortcut = "CTRL+Num -";
-- ZoomRestore.Shortcut = "CTRL+Num /";
new.OnClick = function(sender)
selectedView.createNewTab();
end
open.OnClick = function(sender)
selectedView.openFile();
end
save.onClick = function(sender)
selectedView.saveFile();
end
saveAs.onClick = function(sender)
selectedView.saveFile(true);
end
close.OnClick = function(sender)
selectedView.onTabDestroy();
end
closeAll.OnClick = function(sender)
-- for _,view in ipairs(views) do
for i=#views,1,-1 do -- reversed... as we are modifiying views table when a view is destroyed..
local view = views[i];
for pageId=view.PageCount-1,0,-1 do
local status,err = view.onTabDestroy(view,pageId);
if (err) then
return err;
end
end
end
end
ZoomRestore.onClick = function(sender)
selectedTab.synedit.Font.Size = 10;
end
ZoomIn.onClick = function(sender)
local font = selectedTab.synedit.Font;
font.size = font.size+1;
end
ZoomOut.onClick = function(sender)
local font = selectedTab.synedit.Font;
font.size = font.size-1;
end
local setSyntax = function(sender)
local synedit = selectedTab.synedit;
local hl
for i=0,Syntax.Count-1 do
if (Syntax.Item[i] == sender) then
sender.Checked = true;
hl = i== 0 and views.TxtSyntax or (i == 1 and views.LuaSyntax or views.CeaSyntax);
else
Syntax.Item[i].Checked = false;
end
end
synedit.Highlighter = hl;
end
Txt.Onclick = setSyntax
Lua.Onclick = setSyntax
Asm.Onclick = setSyntax
find.OnClick = function(sender)
searchReplaceDialog.show(getCurrentSynEdit(),0,config)
end
findNext.OnClick = function(sender)
searchReplaceDialog.findNext();
end
replace.OnClick = function(sender)
searchReplaceDialog.show(getCurrentSynEdit(),1,config)
end
execute.onClick = function(sender)
local text = selectedTab.synedit.Lines.Text;
if (scriptForm.LuaSyntax.Checked) then
local status,Function,ErrorMessage = pcall(loadstring,text);
if (Function) then
Function();
elseif(ErrorMessage) then
print(selectedTab.Caption,'Script Error:'..ErrorMessage,0);
end
elseif(scriptForm.CeaSyntax.Checked) then
self = sender == execute2;
local status,Err = checkAAScript(text,self);
if (status) then
if (autoAssemble(text,self)) then -- forgot to activate scripts.
print(selectedTab.Caption,': script activated successfully',self and '(Self Target)');
else
print(selectedTab.Caption,': failed to enable script',self and '(Self Target)');
end
else
print(selectedTab.Caption,': ',Err,self and '(Self Target)');
end
end
end
closeTabsOnCloseItem.onClick = function(sender)
local active = not sender.Checked;
updateKeyInReg('closeTabsOnClose',active);
sender.Checked = active;
end
showOnPrintItem.onClick = function(sender)
local active = not sender.Checked;
updateKeyInReg('showOnPrint',active);
sender.Checked = active;
end
execute2.Onclick = execute.onClick
FileItem.add(new);
FileItem.add(open);
FileItem.add(save);
FileItem.add(saveAs);
FileItem.add(seperator_1);
FileItem.add(close);
FileItem.add(closeAll);
EditItem.add(ZoomIn);
EditItem.add(ZoomOut);
EditItem.add(ZoomRestore);
EditItem.add(seperator_2);
Syntax.add(Txt);
Syntax.add(Lua);
Syntax.add(Asm);
EditItem.add(Syntax);
EditItem.add(seperator_3);
EditItem.add(find);
EditItem.add(findNext);
EditItem.add(replace);
EditItem.add(seperator_4);
EditItem.add(execute);
EditItem.add(execute2);
SettingsItem.add(showOnPrintItem);
SettingsItem.add(closeTabsOnCloseItem);
mainMenu.Items.add(FileItem);
mainMenu.Items.add(EditItem);
mainMenu.Items.add(SettingsItem);
scriptForm.Menu = mainMenu;
-- bottom panel with buttons and options;
local bottomPanel = createPanel(scriptForm);
bottomPanel.align = alBottom;
bottomPanel.height = config.bottomPanelHeight;
if (not _LUAENGINE_STRIPPED) then
local luaEngine = getLuaEngine();
luaEngine.parent = MainForm;
luaEngine.top = -10000;
luaEngine.show(); -- can't fix menu items if it won't show up..
-- newLuaEngine.sendToBack(); --behind everything
luaEngine.cbShowOnPrint.Checked=false; -- avoid popup bs
local newLuaEngine = createLuaEngine()
luaEngine.OnShow = function(sender)
sender.hide();
newLuaEngine.show();
end
luaEngine.onenter = luaEngine.OnShow
_LUAENGINE_STRIPPED = true;
luaEngine.hide();
processMessages();
local mOutput = luaEngine.mOutput;
mOutput.Parent = bottomPanel;
mOutput.align = alClient;
mOutput.Visible = true;
local mPopup = createPopupMenu(mOutput);
local menu_items,undo_text = {};
local mOutputPopupItems = { {name='Copy', func=function()writeToClipboard(mOutput.Lines.Text);end},
{name='Clear', func=function()undo_text=mOutput.Lines.Text;mOutput.Lines.Text = '';menu_items['Undo'].enabled=true;end},
{name='Clear Selection', func=function()undo_text=mOutput.Lines.Text;mOutput.clearSelection();menu_items['Undo'].enabled=true;end},
{name='Undo',enabled=false, func=function()if(undo_text)then mOutput.Lines.Text=undo_text;undo_text=false;menu_items['Undo'].enabled=false;end;end},
};
for _,itemData in pairs (mOutputPopupItems) do
local item = createMenuItem(mPopup);
item.Caption = itemData.name;
item.OnClick = itemData.func
if (itemData.enabled ~= nil) then
item.enabled = itemData.enabled;
end
mPopup.Items.add(item);
menu_items[itemData.name] = item;
end
menu_items['Undo'].enabled = false;
mOutput.onchange = function(sender)
if (not scriptForm.visible and config.showOnPrint) then
scriptForm.show();
end
end
mOutput.PopupMenu = mPopup;
local calculateTextOffsetLength = function(synEdit,lineY)
local lines = synEdit.Lines;
local length,count = 1,lines.Count;
local lineY = (lineY &lt; count and lineY or count)-1;
for i=0,lineY do -- exclude target line
length = length + #lines.String[i] + 2; -- ffs new line aren't included, emptyline (newline) are 2 chars long
end
return length;
end
-- mOutput.OnMouseUp = function(sender)
mOutput.OnDblClick = function(sender)
local currentLineY = mOutput.CaretPos.y;
local line = mOutput.Lines.String[currentLineY]:lower();
local errorLine = line:match('error in line (%d+) %(.-%).-:'); -- assm error match
if (not errorLine) then
errorLine = line:match('^error:.-%.%.%."%]:(%d+):'); -- lua script;
if (not errorLine) then
local LuaTagPattern = 'lua error in the script at line (%d+):%[';
local LuaBodyPattern= '^%.%.%."%]:(%d+):';
local LuaTagLine = line:match(LuaTagPattern);
local LuaBodyLine = line:match(LuaBodyPattern); -- {$LUA} script part.. error line actually starts at the next line ffs.
local SecondLine = mOutput.Lines.String[currentLineY+(LuaTagLine and 1 or -1)]:lower();
errorLine = SecondLine:match(LuaTagLine and LuaBodyPattern or LuaTagPattern);
if (errorLine) then
errorLine = errorLine + (LuaTagLine or LuaBodyLine) -1;
end
end
end
if (not errorLine) then
return;
end
if (errorLine) then
local syn = getCurrentSynEdit();
local distance = calculateTextOffsetLength(syn,tonumber(errorLine)-1); -- line starts from 0, in editor from 1..
syn.SelStart = distance;
syn.setFocus();
end
end
end
local splitter = createSplitter(scriptForm);
splitter.align = alBottom;
local icon_list = createImageList(scriptForm);
icon_list.width = config.toolbar_icon_size;
icon_list.height = config.toolbar_icon_size;
views.icons = icon_list;
views.iconsId = { -- encoded images, might be better to simply load from table file or directory.. but for portability this suits. source: https://www.iconarchive.com/show/blue-bits-icons-by-icojam.1.html
file_changed = icon_list.add(png_to_bmp("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"));
file_unchanged = icon_list.add(png_to_bmp("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"));
new_file = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAJaElEQVR42tWaa2wU1xXHz52ZXewFG0NUKO2HtkEKVZWAIAhVPBoSCZBSFSgCtUljb0KkVlRNpUpVpX6oWqHKJS0oAVzAtHFrQ0OBYkIwBNMEP4ohIjz8hESBSEDrYBvH9s56d707M6fnnDu73rgpTY23dte6e89ez47P757/fcy5VvB//lL/6YKCJRsUBEMAhglKKTAMg2oqhqJiSJv8KL4ZZm6q0APwHEAnKQWkHgJMke2mIGQB3LxQhzkFmLFk7aKhWQ9vF6epGAwhtf/Z9GGU7zRoCGYSAHY6lQBMJvw6Dh7ZHtWTlKfmzCi8HnAS22qqD13OCcCsZetWphZuqDVME0wqDMD2vxQfwlDoRwPB4Gi4FIFkDLyhQfDiVBJRKW6ci01tUXhx07dTH7RdLuvv6/vF1m3bImMK8PnH1q8cWrD+lGmZ1OEmUlGGZaAAaRilTGknOMWqQr6hoRWFIik3pbxkDDEhAMpNRNETALLjNn5/9XL1zIrF2NTU1FJbWxv+/SuvtI4ZwJxVT6/s/crqUwYBmBkAqk0j3ftpMN9WwwDkvaElpQgCJQqJQeUxgI6C8gjge08uUS+sW4G9d+/CjRs3+isrKzfOmDnzWGlp6acaH/cEeOFnpU88FX7+LbYR+X4I6CHID3IBvx5u81wPHMeR4rpcp8ROJhIwaEcgSkXqyIDUTyxbDOtXfx1SqRTc7emBzs7OVMUfKn5SVDRtB0F49wWwe+/vln/3+Y1nPM9TVDCrBr/IZ8yyud1xXUUO0YSTZMe0TQ7G4zEVGYhghJyPDAyoSCSC8xc8qlasWiW9TaCKIPDOnTvegQMHfk7fKX15+3YcNUBFRcXycDj8XwOwTRDiNEFoAIftlCIIAogQQIRg+vHB2bPVgkcXYpKmV/59LBbDvr4+SA4NYdX+/T+oqqrafb8AdVkOf6yw465fS5tIyM3YLB2BYOdSjtROkiMRB4HQkdDFtkleNthcR3X90JwvxzquXltU39jY8T+PALWK7ZIskhQBR4P4cnIgHiM52SQnX0o2AVFRdtRGH0RF7Sje7esPX2lp2TduAGwThJZT1nhgmFgsjrbNUhoQWQkAwUSjUeB2mwDev3EjfPXd9+4LYNQSyr7W5ZmIHNeRSGWkRRDsuMhJ1xF2nuREECQlklBJS1v7+EYgMzuRnJxMBDLRkIFra8dllmIAtllCV1paw+9cujT+AH60PklOUtOYoIGsJaRhbJKQjRfeuRhuOn9+fCWU/n362uHZSUsq6ds8O/mDWWRkR2w4e+5ccV1Dw/4JEwHMklN2BHidcHgdiMe1hHhAUwTq6htKak+fvi+AMY9Aun1kJFKOXiviPLBlKo3A6dN/LX69pmbiRSDdnhWJ7KjItoMHcc2JEyV/OXJk4gLItiNrYGtbVm7adsTxeE1Nyb59+yamhLx/JyfeN9Fqza/q6upiekaY2BHwRgxsH0AFAgE8ePBgSfnevRMPwKUt9+DgILoj7sES4gFNLSo/lE8Ah0rKy8snnoRo9YXyqgPQowrl8U2ckeyAti03CY8/NBNa2tuL7xcgJxEYpN3or189hReLFpLfBvrZDjK1XZTqV+HCW9ja0U4RmIASYoCtf67FS0WL+EEada5JA3CWo8jpV89OvYUt7R0le/bsmXgSIgDYWV0HrTMWi3ToURsceRxFyTtNc/qBIgCtJKFdu3dPzAjsPFqHbTOWcj7GT81IPgMT9NRWONSrigtuYitFYNeuXRMToOxoPbZ9dinnKNHwx4ApeSYDQoNdan3w/TEByJmEfnusHtpnfi2TrpRck29PJwk96bbBlebm4nFZB1y9z2Eg3a6BMhGgaVSVnziL1z63XGTjO08shshputOnVg41Y31T03O3P+zeH7EHh73lfJTrQHBSEHMG0NXdjX/80yFIBfI414tZHYbpaX8g7zN4c9ZXBcCkXrcsS1m0+nIedjraqqD5NRyI2B/Sgic5Uw/T2W+5DXS91/JaziT0j85O2Hz4b/DBtLmQzqVaASomF0OSxWzTpAPBYADygkEwLUvS9vQGAUldGpLW50GdoL0Rp45d/hv0nZByIbLzucqcRYAA8JdHzsLVgkcU9S4GAhY7rAKWgRrCVJZl4uRQngqYAZIQB8LgAwhZE4CWBF7gaFVjxahILIGeZFolB44hSEJkx7NVOQUorT5HAA+ToxYBSK8qchwDlilyKZicRzCWop6WxYsXMoOdNjQMOYv60MFU0XgCU6x9+o0HBk4xHPjopWdyC/Cro+fh3alzqdd9p02DbAsty4CCySEVJDs9derOl25HkAgYInSJADUmkg4mHE8D0DVTSEI9257+VACjHgMvHnubASAoPW5SbUkdmhSEUP4kGRcmp+rFeVMfW+lIyKaORzvKmY8BQ3RfggCXbE5ZTzFc6PrNU7kdA1uPX4BrUx9RwQBJiHRPvU+2iQWhfLEpEmiy0s3hhYx1D4Y+ZSApIQOQZFTKdTGWdAmAJaSwwHShc8u3chuBl46/DV0z50MwYPkR4HFgkXzyZQYyqS3m6XO29LlbekudTzOWiQ7oQaxgyHFhKCUAwIM5gEm4vqU4RxEg5XK+88ybb5LtKTn7kNUHlYxD+uS6nrqdCmJ0/jq9kClTDkKB3Ob3wsRdpeor8OatW/W9vR9dl+9lrSV8DzuWOD+2AOljGx6J+qVX3yybj3E4UrwSV55swMjcNdzltHjROFD8RgGlt8J4j5r990a8eKU5XL5nT44zc/qsSb7DzqEvJ/Tt9DGUl/WZn8gqTzaCPW+NyMYytYw8XyIF8R548HYDtLV3FO/YuTM3eyFkSfi9KzZHI6vXvZHtWdfHBgdV5RuNGJ23VqZOH0AGKOu8MN6tvnSrEds7Okq279gxtgCZgz1yKC0hscVrb9jRbFv3fgaMJVTFEvIBTB8A5YyfJJToUg8SAEVg9ABlZWXLN23aVJfV44DZ22Tfzm7/mHyyJOONkJOWUAMMzFsrM41Mo0rvg3j+nxrrAhoDcLm5pXjUzwObN2/+Ir020rKfaUs74M8r/vFr1nHriAKZY1jIfOYcaFdX96Ro3gM/jC7ckIc8C+n/wdD/pECXFcbuKPv1l8/09Q/86PDhw62jAsjl6xtrvlnwhQVLbxtLvzOVnfbXAJmROAJ59h3VUvbjn5564+SWe91n3ACWPfZ46IFpRYfNvMlTPskL9Fzo7e4ub6h769V73eefBSJITEloH80AAAAASUVORK5CYII="));
open_file = icon_list.add(png_to_bmp("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"));
close_file = icon_list.add(png_to_bmp("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"));
save_file = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAJ6ElEQVR42tWaf1BU1xXHz31vdwFFxR/Fqm1qpI1Noh01jn9ojdaqJNIYY3UmaQvMmJl27DTTPzrT/zpt/MP+UBvtODpoBQUmpmjoSEBdDD9UEOWHuIAaREjEEQk/BPYt+/u903Pue+DWxKYC6ubt3Lln7+4+zuee7/3xzkXA1/wSX/WFCcs2C3CMA1BUEEKAoihUU1EEFUW2yZfgm+HwTQUaAEYYMByUBWQdAAyRrYdgnA3gVnUZPlaAxGUblgRmzNsjnaaiMISsrfeqBSMsp8GEYCYJwE6H/IBBv1X7wCDboDpGGGJu4sSb9rB/V2F+3uXHAjBj+ca1ocWbnYqqgkqFAdj+QrEgFIFWNBAUjoZOEQh6wQgMguGj4vfIovu4aNTmgb9ufTPU1nh5b39f35927trlHlOAWSs2rQ0s2nRatanU4SpSEYpNQQlkwgihynaCE6wq5BsqpqJQSkoPCSPoRfRLAKH7PWhIALJ9Gv56/UrxizVLsbKy0uV0OtP/eehQw5gBzE3+2dreF9afVghAHQagWlWGen8IzLLFfQDyXjElJQgCZRT8g8JgADMKwiCAX61bJt7ZuAZ7e3qgtbW1/8iRI1sSp08/sX379v9rfPxPgHf+sH3VW+lvl7CNyPdDQANBvpALWPX9NkM3IBwOy6LrXIekHfT7YVBzg4eKrN0Dsl61fClsWp8CoVAIerq7oaOjI5SZlfn7hITJ/yAIY1QA+w8cXPnLt7eUGoYhqGBEDVaR7zHC5vawrgtyiCacIDtm2uSgz+cV7gE3usl598CAcLvduHDRS2JNcrLsbQIVBIGdnZ3G0aNH/0i/2b57zx4cMUBmZubK9PT0RwZgmyCk0wRhAoTZDgmCIAA3AbgJph/nJCWJRS8txiBNr/y51+vFvr4+CAYCmJ2b+5vs7Oz9owUoi3D4vwo7rlu1bJMS0odtlo6EYOdCYVmHgxwJH0gIMxJm0TSSlwYa1x6zfm7u971Xr11fUn7u3NUnHgFqlbZOsghSBMImiCWnMPi8JCeN5GRJSSMgKkLzaGiBCI/mwZ6+/vR6lyvnqQGwTRCmnCLGA8N4vT7UNJbSgJSVBCAYj8cD3K4RQEtra/q1T5pHBTBiCUV+V+eZiBw3IxEalhZBsONSTmbtZudJTgRBUiIJpbkam55uBIZnJ5JTeDgCw9GQA1czHZezFAOwzRKqdzWk19TVPX0AK1pfJidZ05iggWxKyITRSEIaVtfUpldWVT1dCQ19PvTd+7OTKamgZfPsZA1mKSPNrUHFhQupZWfP5kZNBDBCTpER4HUizOuAz2dKiAc0RaCs/Gyas7h4VABjHoGh9gcjEQqba4WPB7acSt1QXHwmtaCwMPoiMNQeEYnIqMhtBw/iwqKitOMffhi9AHLbETGwTVuu3LTt8OFHhYVpOTk50Skh42Fy4n0TrdZ85efnp9IzQnRHwHhgYFsAwm6347/y8tIyMjK+HgCRcqKfC5vNhtk5OWkHDx6Mfgk9uO1QbTb5gHQo63Bqe3v7lc97+9ob6qrdIwF4ohFgm7MeKj2i6vRM8bcdO3bglG+nB3o7bt7pHdh05ayzM6oB6GfocDikbz09PfiB81z4WtJrdrvuxylVh5tud9zdcPmssy1qJUS6lykcXsjyis5A3beSwW+Ll3mo8YYXplUf+bS1+ZP1rgtlTVEXAfaHeh9pdwr5RU5xMfFHOOiYxM4LKshJtDgRFom1uV1tjXU/vVxRWhE9ABQxh90un94KTzmhZuoy0eOYimEdORPISScUMv+kiFjFwMQreQNtVWdSo0ZCNmvWOeUshqrxC6Bv4nekbLgtEAybySZOZwoztTnV/Rl48/98OCoioLA8yKnSkhJxHuZg95S5QHoxE2Xc62T7AiHkrBlHYLK/G7Fw5+kut3fTYwfg1RU4//UQAPJN0KDFyooKKPMkiK7pC1AH6Sl/hGD2uLR9wRBMCg0I28mdVXfvuVNqSor6HquEuru7obCgANYmJ8O0adO+ICG+WDp1tbVQfEeHrmeWQhisvKSwEpNWOp8YIF4fBPhox/XWtrZVNAt1PtZZqK+/HzPfPw7Xpy4Wc3rqcPPal2HGzJnDEeC/zVuFpqZGUXS9C7uSVkOYk9skJ+516bEwpQWKKuJFEG2nd9+62Xx9dU2Zs/VR1oFHBtA8HpF9NA+rxi8EzT5JTI4R+Gx7Obz+w4Vi9uzZ0ikbrbQtLTfwRE2L6H5+HQZ0GJ4ueRuhqDaBiirTijHE4SjZ19VYVZ5cX3X+SqSPYw7g9/sh9+gH4rz6PHapCRAb46CeVnGSQ4UZn5aKlEXfxXnz58Pt27fF8fJq7H3xdeFDFTk3b6NplBxHDgQfARk0iGOpPabyiKex/NRPairKzj3o45iOgUAwCMeOHYePA7Og054oT3DiYhykcxVsNJvEx6jwjc/Ow5JvOqCxvRvu/WADDKJdnjXYHXaWDZ/vDBc7/S6u7riv7kT2m5erLxZ8mY9jGoHGhgY8VFwNrbOWizA1s+PjHA6hUgRsBEMQIi5GxSl3XRCaOU9oSgyqJBVawBBN563DKYoGyWlC88fY5nz/3VMni959mI9jGgF+KC8vLYXClgG4M30R0CLKEmK9gwRQeZepQAwvWjxe2aaNG8pDNkXWfDhFnBDfVgUL1W6ora9P279v35NLbNEWGC5dvCgKXO3Y+cwy0BW7sKuKGQEauFQjQ5BsaN9j560zrVa0CQXFWrwUjO9wwfe0ZrFixQrMyspK+/t77z2hJzLr2IY6XjS4XJhf2QC9z60RfkNB1vMQgM2mgJ2kw4+M5Dd5b8qGZ6EJvTdxVkc1rFn9Y7nAZR0+nLZz587H/ERmnjXJ3/AChtZCdqO5GY6VVIH7xXU0WG1SSnZLTrExdnnqybLnVYFJJno6YHJzMaS8+goQnDx1pgikjhbgoRHg51Y0L9PmaJibONnOEO3tt8Sxk6WozUsBTYkjOanIEHGxdhYMnyZLCU3w90Jc/Qnxxmsp8oEG5TKMUkI7xhpg+GCPnB6SkLSl17L3TTDL/ryzE/MKTsHg/BThtk0kAIpArIOnHJ7zxQTDg+rFPHgjJVmMj483Zcj3oMBkZWaOHGDv3r0rt27dWhbR44CR22TLjmwfks8wpPWez72O/bsAPC+sBXdcIjhoJuLFa6IIAVbkwsZXV0NCQkLEqSdIWWYcOJC6e/fukQFs27aNVv7ZW3jDNXQN/QFrsFrHrxHHrQ8Uqzdl4qqru0e4GptWJm3+7TJPwmwxwaZjb8HezljddzhpzrNh1j1E3JNPOW+0tBzPyMh46OH3V/6zx1hfK1Ynj4+zqwcX/Px3b/VfrbzXdKliXUVp8aWR3u+JA/D18upXHDY98JcBzXO6rrameDT3+g/FkZ03FtZalAAAAABJRU5ErkJggg=="));
move_left = icon_list.add(png_to_bmp("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"));
move_right = icon_list.add(png_to_bmp("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"));
prev_view = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAANKUlEQVR42u1YCXSU1RW+9/9n/pnMhEwyWcgCSViSCFoFBSJZgICyhrCJoj3WtT3tEWppS8G2qAWPdbe41OV4KsLRCh6pCGHRCodESIADIsGACZCEQFizTmaY9X+97/3/TAZIIBEpp+f0nUze+9+8/8397v3uffc+hP/xhtdbgP8DuN4CXDMAWQP7Gw0Gg91ITcLrg1NlDPx+v08NBJoqqw77ugUgKT4uSjEpC2NstvusVksSgZCui/R6IwCqy+U62djc8iGNX2g4fbatSwApveOjSe1fIrBheA20Pn7yVBiUPRpaTx2D1R+8ByQY9E1NhcJ7HwKDYoItn30M31XsB4vFCnfd/xDEpPSDQ7u2wRfF60BVVWCAu70+//iGM2dbOgWQmpy4BNTAn8UX1Bi18HH4XFdruhoXzbobXLkPIxoV5kMjDPMcwvee+QN74IWVuKfVyBSzGW6MN+P6J+5lhQ//BvYoGdjLamFmswJs4zJc9+kqsSVDeUn9yVNPdwqgT2J8CfEl71oAePTZd+DztnjMTI5jbskIt/S2oLd4Gfu6TyHabVHMEhkJZ7wSTj61nh3vmwcVjX5MiLWxs14Z7pBr8LW5c/jvA8qG0roTJ0d3CiApzl6uGA3ZPzZ1OJZfPvkifOzoA9YIBWSzBWZkxcA3bz0Bvgm/hZoWN3ALJMTHw8Dyt8CaOxvWHm6HCIsZZKsNpqoH4PU/zuPKAEk2lNN+ObUnTrJOARgN8ohrYYG09HSYtehlrGw3sPTYSDi29u+4ce0a9osFi7GpbzYLSDIM9NTj3xY9xgrGT4I+hT/HBhdjN8cgrFoyD2trasR+ssG4k7qcmuMN/10AfGwymXBARgY7dfIkNDU28t/m85ialsYURYGjR44gOatYa7fHYlJyMjtcXQUejye4VgCIT0jI2bV336UAHn3owfK0tNRszeygvSP+wnqdEsHn0JgxfR0DFnqnY3zxO2L/C97Rdr90Xcf+fHCusbFcUUw5Kz/656UAtmzZsnPUqFHD+WLShNCcCF+kfK4ZekCViQYXzAfX05gfPqF1tIb6C+fD1utrLl3b2d7671bs37+zqakpZ/FTT3UNgI/PONzY6PToKgfU//M4wMJewZCxKMAFzRyapyf+4+HzQf0G13CShdEytFZ8oe8drUjoOF3P2traBADuA4/Nm9clAOEDT36+D97e9j1IkgRIH1mWwUSHjSRLNEcwyOl4isF7pGe+TqxF+vA1qM0FiNJ0+BA81Ndr+4m1oD/r86H3pfBnhDmDomGs+RT3Gw6g/EoAhAWeWvctvlNSxSTaUDLIaFaMjISlfSUWBEUf+i2JiR+TJeGvUnCe1qEGgtuNuT0+Tav6PF+jrxe9BkR/T+zBp7XxPTfYcKzSwIg63bfA0+v2wzulVUJQs8kEcofQHdrWNSRxa8jBsdYzZzOwfcVg9Dq1Z9ozEFDFL6L4J/6DwWgQ7/t8PkohLCK9sFqt4AggGLNngTG+LwcABUpDzyzw9Pr9+G7pYWakHzAYjFz53Bq6BiWdSh3ak4R19DGta12xgPmOH7yA1xePZVliRUs/QGN0PDtTVgxxY+9Dd+lHzJB9FzRtX4Nlmz5jyYs+gbvJAgXGE922gADwl+IKAcBkMpJwBiE4yRiijADBqULAxJiDk3V6UWt+/UEWaDt32fOB3mBjFixDJTqOte39CqRhRWjZ/zlzDJ4E6rebcNfaD1nfZ7fAPYPtOMZwvGcU+kvxAXhvxxFQjEadLpc6qzaPITpJYQ48pmE9mANuCiNqMOQCP6PEsxZSRS/p9PJ5fcCt7Xa7qTfywwv8IMORO/8EswfFwBjDiZ5RaMmGA/iPslpG9QBozBHUIRwhLQOG00Z3XO4vZpOCHxalsoSoCBHPgzGchZ8JHfNaH4z9+lrK/bGi8iD769l+MCsrGkfL9T2j0JKN3+H75bVMlrmToUYhAmBrP8Fc1gTKCyx6JNEAEdUwwmwOrV9R2IclRVuvmGJ09T0HsK10O3uusT/MzLLhaKn7AASFlm6shOU768hZg9RBsLfWQFSgHYw+JxxLygY0WQV1LJRJms0mEVkExahfWdgHEjUA8EMaj0oEAJ5rGkAWsMEoqb5nFFq6qRIJgNAo14zdUcOi0Id1tkHM7HdC6rl9UJ+SgxG2GCYOOK52TiftwEICwBJ/BAs83zwQZmbacBTW9YxCSzcdxOW7CAA5r91RhzEGH6uLuQmpwCYOq2DxuyC9uQJbM8cxMPfSAYAekTiAFJZou3oAL7RkwMyMKMzvAQBBoWc2H4T3iUJ253HobfRBXewtlBZoEQX0PjLggn6t30Fz5h2A5ki94NAcfOWUFEi0Wa6aQi+2ZsKMjCggAD2j0DObD+GaL0tYv14IdfG3osfrY2oomwyBwCTPSWZHF7QNGNWRVhCGFZOTfxQLvNSWBdMH9sJ8qO0ZhV5Z/SWWHapjDSm38xSAskiV+Xx+9Hi8erqrgt3fgoltR1hL5jiQFLOWu5DGeVr0gQBguWoALzsGEYBIzGM13afQgYoKeGXDHqjuPQL8Aa2Q4IktBXGRz5ynw8bma4WExkpoyhDC63kRhLLUFZOTrp5CX++AV52Doai/FQhA9ygUa7cPf3XDbqhOzkXyV37y0CImUnMUj4xFepshom43NGaMQxJeOK5IDeisAB5yiUwrppAFepmvzgLby9gy140wNT0Cc9WjV7bAm2+8sWuPwzzsSEoe+FWuUJVJYhFDg8STOUTSPDPs/Rectg8GFLQhdvFTWWshMPOHx7KYCAPcMmQoUr37gwCU7NjJlp2/CQrTTJgbOHJ5APkTi3KSbxuz+czgokg/cZwLTlERFAOdsgZZsEihzuw6B6qrTTy7iEqcUv5AQBQtPErxZ1WPUgnOY/DuwkcgLj5e/Eaw8Aq7F7h0Tq+N/USh8j374DX3TTAl1QRkga4pNHzspJH9RhSsaxwyO9ZPJRSxgNIohhEmAzNSWCRD8JRL1K+g5y1cWLfHg25yag7A5wug2+tlPn+AA0I/Oc8N5w/Dgp9Oxl502KninQCdI1rNywOCOFFoLY9sAdqDRzVSAKN1QP+QClq22tMfpnIL+A+HLECS58wNAhiRN3p4eu7k9c3D5sT7AuSDJC0pGiIUGRWjzCR+y8GZoYrrAZGMaZmkChRa0eX2MBIWSHAkoRjNgY+EomeW5ayCwKB8xF5xTC8VRQrNt/TSer0666CeLLgoqkDUqiMCqML0dAVzwgCQ8nJ+/fjjGoCcUWMmpU/82Sdns8ZbuAaINsxIFoiMMFFQJI6SQSXdiSkHFk5Mu4rU2Ec8dbrczBfQAZDQHICX5vk4o50AZOUhEACtjpZEQeMlTYnjWhM8VBSBXiNwMFoBLbJuDYCvWgDYs3dvyfz588cEKSgolDN2QlH/8fd+1JR1p5WbN8Iog5l4j4JKqljEo5F2f6NqubxGA3C6KW8nC3j5x8d7v/AHTqWBjkPgzcwFsoAIs7x5tegAoBf1kiasVshrmuexWCSPAeEXCDPSFBjprxY+UFZW9u+FixbdeQEA3gomFk5LHTdnVUvmWIU7riLLGp1Qi0Jc9dwSsvA3JnyAU+g89wENANKHH3bgIX6TVVhaSyWcHzASMSpOaNKvslC+pDGHn9wdFNJjMZ8Tlzi8/uHj6WkKjvRWCQsQgK86BTD/iScxJTZq52HLgOGOAblCMzwKUcUIEj/ENCpBDHNBa+lqoJMA9FtAoTUVQL8o1C5zOEikgr5lyHRQTTa9ANKLea0EJfOiNo9B7XM/0cQSrqdft0xLNcJIX9XlLaAfZOUmRRmxqrIR2gfkU0wWWhcRifuG0BFtbW2phwO7t8MJSqdRNoi6mcpAoVFx56AVvPr1iHzhVQp0OGy4D4BWRwgfCUCwZtZyq2mpBrzd8/3lLcDb1q1by/Py8kbs2L4d1h51Ynv6SEEXohJRhzFev5OIIswZzx6Fs9X7cejYKYzXsAaDdmcUvDcRQukDQK1O0MQCpuUcoIMRDyz4Gs+y9GsXHSDC4GgJLacOdg9Afn5+NnfQ0tJS2HDMC870bNIJP9hU4OEVVBFxeKgEa1MtDPHXwOSJE4Spw+5MQ0U7Cxb0F8119l3wMrfjEqBjjudG/Ky4LIUIQBlP5oST0uKSbdvgiwaGjtRbkdROmlH180wF7cBS0Xbue5ZvaYbRBQWsMwEv6S8Srqf9Dm6BhQvHdwpg8eLFA2VZtvKbCI64qbUNqquqxw2e/djzztTbZDWghm6PebphDnjQufntSk/z6V/16R3Xym/WtOvwjqvyTp+7+O6yY35TwVMWr9exfPnyo50C6KyNK5yJbkfL3OEPLHjVkTJUDlZlFvBCe/GbB4/V1kwq2bCm7kr7XKvWrWR99JQZyM47Hh96/+9fakm8WYpQPST8G4fq6monlBZ/Wn+9hO82AN4Kpt6F6HH+7id3z32+6ZutJHzNlJL1n9ZeT+F7BIC3O6bNlvxtjY/4JeMXX3+1+brRJrz9B2rxIMdz0r9GAAAAAElFTkSuQmCC"));
next_view = icon_list.add(png_to_bmp("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"));
new_view = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAANQklEQVR42u1ZCXCV1RU+57/vf2teXhIIayCgIBULtorEhlUUrIiMgMqiTsWxy4zS6XSkgErRoAI6joodlVZZC9U6VdlkBxFrFkSBYICQkMRAyEJCdt7LW27Pvff/33shL4HMFLEz/Yc///3vO3f5zvnOuef8IPyPX3itN/B/ANd6A1cNwKAB1+kWiyVJp0vDa4MzxDkEAgF/KBisycsv8F8RgJ7JXeOtNuu8RI9nlsvl7EkgtGuye+MiAKHm5uZz1Rdq11P7lbKKqvp2AfTunpxAat+FwIfhVdD6hIn3wY1pY6Cu/Hv455r3gDYGffr2hUkzZ4PFaoO9n34A3+UeBafTBQ88OhsSe/eHEzn7YefWzRAKhYADHmzxByaUVVbVxgTQt1ePDAgFn5M/0MXpim5H97Un01578rSHoHnE44i6lftRh2G+E/jei3/iv3plHR6q07nVboebku24ZcFMPunxP8Ah60B0u5zcbrcC3/Ymbv7Xh3JKjiyj9Fz58zEBpPRI/oL4MvJqAHji5RWwqT4Zb+jVlXs1HW7u7sSWrW/yL1MmYZInnjvj4qCyRcOJ5Vv4mT4jIbc6gN26eHhVC4O7WBEuf2qGWB+QWQ6UnD03JiaAnl2Tsqy6Je2/TR2B5Xd/fhU+aEgBl8MKzO6EKYMS4dt3FoD/7j9CUa0XhAW6JSfDgKx3wDXiQdhY0AgOpx2YywP3hY7BW8/MEcoAjVmyaL704rPneEwAuoUNvxoWSO3XD6bNfw3zGi28X5c4+H7j27ht48f8N3MXYk2fNB7UGAzwleIb85/kd0y4B1Im/RrLmjkfmojwYcYcLC4qkvMxi55Nj/SiM2U/LADRttlseP3Agbz83Dmoqa4Wa4t+7Juayq1WK5wuLERyVimblNQFe/bqxQtO5YPP5zNlJYDkbt3Sc7453BbAE7Mfy0pN7ZumzA5qjPwX9TQoYb6H25wbchx4eEykfekYOX+rMWr2tnKR+UXjfHV1ltVqS1+34R9tAezduzd79OjRtwlh0oTUnAxfpHyhGXrBEJcXtOo35aktDp+wHMnQs3V/lLwh01Y21tzGurlHj2bX1NSkL1y0qH0Aol3Z4MXqJp+hckDjr4gDPGoIho1FAc40c7if3sTi0f2mfk0ZQbIoWoZl5Q/G3AlWDRsqSnl9fb0EIHzgyTlz2gUgfeDPmw7Du/tPgqZpgHQzxsBGh43GNOojGOR0IsUQT6R3ISdlkW4hg6ovSJSmw4fgoSGv5pOyYLwb/eHxWvQ7wowbE2CcvVz4jQCQdTkA0gKLNh/BFV/kc40m1CwM7Vad02ZpXo2boOimtTQuF2Oa9FfN7Cc5VCCE3bjX51daNfqFjCEvnwqIMU7OIbpVe/pPPDjOWsaJOldugec3H4UVB/LlRu02G7DIpiPaNjSkCWsws62evOkC8MNbQW9pUu80ZzAYkiui/CP/gkW3yPF+v59SCKdML1wuFzQEEfS0aaAn9xEA4A5rWecs8PyWo/jXAwVcpwUsFl0oX1jD0KBmUCmiPU1ax2iTXN3audx/5ngrXl/aZkzjkxevQT0hmVdmboWu42ah98AGbkl7AGr+/TFmbv+U95r/ETxEFrhDP3vFFpAAXtiaKwHYbDptziI3TnsMU0aCEFQhYLItwDGDXnRdeOsxHqw/3+H5QCP42LlvojWhK6//Zg9owyaj8+gm3jD4Hggd2Y45G9fzPi/vhemDk3Cs5UznKPTC1mPw3leFYNV1gy5tnVX1Y5hOWpQDjy3bAvagl8JIyAy5IM4o+a5CqnxqBr38LX4Q1vZ6vfTUxeEFAWBQOP5ZePDGRBhrOds5CmV8dgxXZhZzqgdAMUdSh3CEtQwYTRvDcYW/2G1WXD+5L+8W75Dx3IzhPPpMiPSrpxn7DVnK/TE37zhfUtUfpg1KwDGstHMUytj2Ha7KKuaMCSdDRSHDB5QVzEii3olq6LDbw/JrJ6XwngmudikkXhsbGyWAWD4S8Psx+9C3/LW6G2DqIA+O0a4cgKTQ4m15sDq7hJw1Rpw3AJjUcVImabfbZGSRcvRcNykFeigAEOtqamqCp5/LgApuyLSKTggs6IPh/ZLgs5SpZAEPjNZKO0ehxdvzkABIjQrNGQ4acWIFAJ0OO5cHnFC7oJM6sJAA8B4dWIDCJT6+6A2e474lHO/VHKqd4K/FB+2FfEe/h2DqDR4cjSWdo9Di7cdxdY4AwCBMHYZhyghLkNYlAEBzcTAikgDQm/fwdAzgiReW84PuWwm1GocGABEMEgK1+ICtgO/sPx2mDozHUZ0AICn04o7jsIooxMiJGUalCCadCFg8VVHmASZ/lwWHeq67tzf08Dg7pNCTS96Bw11ulzIiiQ6QIweCXM6fGKiFqXo+7LpuBkwZGA8EoHMUenHHCSQAMgqFqcMUTcQCpHmRG4Vp0yqtIAxrJ/a6rAWeWvouP9zlF8acLJJ2UEiN91Xj/ewk3339TLh/gBtHQXHnKPTSzhP4flYJF+eAGUY1xSEBBBLccTKMqpMYjVNZ5TkC5xoJwNkhgDkCQHK6QG9ENo1OZ6YU1FSBdweO8T0DZhGAOBzJizpHoZd2noSVWcWUq+iUiUblQEQVkb/EuRQ9aMlw9iiDiZGlrp3Y87IU+v2yFXAkeURkbsbC0S6JKDSq4SDsG/QITL7OBQQgTKGKysr0jMWLO7bAy7vy8f1sOgdoMl23KqoYNLFR+ecgCpnng8F/aSUQ1iApYYFkp4pgseI8AcCnX1/Jj3UfJWljbN60NAG4gLfXZvP9gx6Ge1MdOCJ0WlkgNzdn1/4vRxYXl3BdZMjtAtidjyuJQigBWIg1TPkALWansOmguG++t44gik7LbmX87+//Dfy6QxVBKvsUf7jZqkIPL+mZJgEIRZG/IVlcRr4k3oCubz/hjcwNDlrazv08EAyIFMNbfb66ROih4uSRT9ul0JLdp2AlRSHTvHo4J0IQBbjT7lDUkRsWG2JGfqTeX7qZQ8bKjVCYOERSgxRA1KObiVsVSKJNQYfm08FOczKVtggegs5Uik5/QDi1VxRFhDoocioa48Qg1L81e027Fliy5xSuyvk+rF2R+oq0Wmhc+oDTeQltlEODCqX421QfX/vJNshz/5QMpam0nDHULTSP2jxaLIy7nHbUmS7OGFnQgEFJMAoaLg4XglTf7KU0UJhPE4twJ7RA/fLH1nYAoABXHYwAkBtnRCWLihLxcS4j7GlGFBJcj5yoWn05txdmwXECQNQgAFKrSBvnuoVJurhddjmnTBAxUuFxTYGhyVQ1TsppvOglEsnCHEO0TpwWgJrXH2kDIMuk0NK9hW0AiEmF1mhRcmKboJLQtwQAmlErqJoWtYYK7iAAJz1DSevGpskyOoERH7zdLidaqW2GzkgoRnmyK16CsgB1elsC3BsIKQAkE0cUqnptVmsA+/btyxo1alSaAQBWf10KgJcU4KLAp1vw1kWhVJzSasFIOSll6svBeTobTiYMBavUOKOnRT6dNvIhh036BQuf7kY4NpJFQUUuawVxa+ALBskXAhCkNhWmEKcFoeLVmWtiAZAWWLbvNK76utQIkVEFuGZUYLQIWQHtlEJrpgwzDjVqaHXlPK44hwAMQatOFCLek/apzbjb6ZBtsgQXnmPWGOZhCFL54nimc48AEGXQHwzy5pYgARAUQu5mQShbOr19Cyz7/DRZ4GzrPCeqkDdTalHAiKhkHkLMIqxFv9WVQ0JJFlR2/zlVdRbDAsIPLEQfh4xA5E/QHIqu7jQjtUZwUMRiXHyO0aQVfIEg+PwSAAhn1nkLFCx9tAMLfF6Eq78+E3YuQ/PhCszkutCYjSghzgqZSsgYTzbw1fPEgs8li0HyGtR3MeWHpMMQ9nBq3HvLFHWQoQibQopJ2XjveTyzcz0PJKZAapyG3UN13OvzQlVlVdnxEyc+E1/tGpq9me0C+KKoFg+drTM2hIYTS3NwjBQfZr/QsAqp5k7Fpo2GOcYYIAH4vc2Yv+dj3jz0PjGADi9FPTIehUuKcher0HYuj/cfMxkGJ1DdUX5cnsSZmZl75s2fP97cc0wKmR9VzWLcLMBb9Zn9ZsHe3pjo36P6xPefDbu+goab75e0sajPNJIe4nZfrII+p3fDbcPT5Hjx3ShIjkwAdncEIFOE0eiNyGco1GYDoVjALicXBbiJstEP92RB48+mGGeMcmLhoILn8RcrsdepnfzWYbdFf0yGr4QF5s2bEBPAwoULB1BMdokawKy9w9o2P3WD+Qk88jn80veOfhN3S0sLlFdWuXoPSdvhGz49TgBgBgBxykoKeSsw791nlsfHx690UdQSVgqQBWhsw+rVq0/HBPBDXuPvmeQenH5nqS9tuoejFv4YAOrgAk9zBRx+e96CbVs2Le1onmsG4M67J7pvGnFX6cW0GQQAzTpbOrxI1uKbyzFvxbMEYOOPE8CYcePdQ8b8slQb+bAHwl+npQnE/2WBvaEcD/9l7oId27b+OAGMHjvOmZTg+YjZXXGxdsFDQaiurFyxf9+eDR3N8x9rIFDje/P3yQAAAABJRU5ErkJggg=="));
zoom_out = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEY0lEQVR42u2WS48UVRTH7zn3Vs+YiAQ1M4ZXfDAM4oxRJJ34AXyC+gGAiMygX2J8RY2JJq74AMaETtwrAYGIbpqNmjBuXLhl6UKcftXUPZ7Hre6auKhZmFRI6oaaunW66Pr/zvmfUw3uPl/QtIAWoGkBLUDTAlqApgW0AE0LaAGaFtACNC2gBWhaQAvQtID/HeDQS+dg/sGHvtyzePAYAjjE8kC92QOf0TmUM/CWPwO5j6+DR+f5Wj8ASA+A9JRZjPgoiNxosk12DSSbKAdNpRARcIz0/w7u/nnr12+++Koe4OVzsHf55G13cLXrEUkEee+BzxTk7IEEgj/jOAqAxN1cFniPhEoFsggMRBhIHwVKRwIogXuDIbFgiBIzAIgEHCOncf4OIZPvK+7cuPzz5++drQU4/NoF2Lf03O3t/Std71WkZbbMsO4ZKqBmvROC62TBqpQqBoC6d+ic6Ud9EjmrjgEAV2DixnnhRGS0Sugh+yKWMfsO+v1m79ZnF8/UAjz++hoyQD8/sNINUgG1BQKLlz1YVQykEzwwgFYJvaadvNlJ/qQK6D92AyQlTvfyYREjbQ0nnHVlEPGadbGRJL5IcU4IxM0bvR8/Xa8HeOLUGj589Pl+vl8sBArAIGwdFV6COLHNfCdjIEfSHyJa7k89IVUnqUQqAUESyEG1kwCwP+jvwVgCFCWmdjJAthIU2gfSb6AANz9Zqwd48vS6AkwOrHaDWMUqwIJBRZfZf2Ausz1aA0ustJA1ujUtpAYm873tBYbvkfPWcOy2o3o+3QPTZo5ke3mGAFz/+EI9wFNvrKcKPNtFbtiAlQp4qQBQJ2Tqe3GNF9tIBWSfml72DKWuSRTltLEMm9e1GoPhGPJIaQqBNnTqCW1oKZ1UgDav9659tAuAI29exEcYYMQWkh4IklFWrfvUA/Oc/YBeAVBtpllXC6WqaD9g6XuYTRmSKZOmkIzP4XgCOc/UlHWNxTS2ijRexZ60+UPv6ofv1AMsvfUuPnr0RH/w2PFuxhMmJMt4tRC6DMX7HW5aFo0u2QindvLJQjqVPDgoLVNaw7xu1wwyHI1dbmWZTqIE4Ip0Fos6Brjywfl6gGUBOPZC/97C012e7eXEmVYgC546WVaKheq7gierviNYuMW1ApZVEVhYKSiWDc3xrdGEpxHtiEWDNTsJgGTjzrXe9+/vAmDp1HlcXH2x/8/C8W7gEalZ1xeWAbD3uQd8mfXp5AlqJ9SeMTCeTmkKVd60aWRK9lHH6Gic67SRhiWYWWhmJ60yEAN8t/H2Lnrg1bOwZ/HQ13sPLz+jwnjyVF9Sch0QK7HyZ4VcO4ulnxKq35V+r0yg0iIMkBdxNp1k6kD1PptEsv7645erP13a2KgFUIhXzjB6ASHrJGE2Dmdv2opIc0ll73aMz/TzZ8cI1Wv1vL2pIlG6B/5zrx7bufPZHP327SXaFcD9tFqAplcL0PRqAZpeLUDTqwVoerUATa8WoOnVAjS9/gUOwMdAqwR6twAAAABJRU5ErkJggg=="));
zoom_in = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAICklEQVR42u1Za2xVVRbea59z722LVKy2xVhEhLYijHBlLKhIH4ggUN/4KJI4PvGFr0l8zGR8Yoy/fCsqMTHxrzHxV2990UJvKTeZMbYyqNCSiT9QIKZI7/vsWY+9b6/+KH+c9EzC4Z6es/c53LO+tb611rfPBfV/vsFUG3ASwFQbEBoANZde7wX5LCjP568FsF/Pn7KjCZRfeYo59NmHxdAAqF+xASoamj+G+rlLyHIAjTseNbDRNFZ0DrLnRr/eMfLR1k3hAbD8OqheeNmuXH3zxc5INp4Mt2N31Fors39P93fb/romNADObL0Bqhcs35Wta15mAaClYGwkaMLIQdPQqJE9iX1vPxYeAA3tN7oILAuMfC9YAIygDIAmAAcGE3vDBGD2ypuh7sL2ZHbm+UsBKQLKqCIiKQSBKhQDoRT905IbemSwe/jNR8MDYM6qLqiLtyfT9ee1kJGamaKNo1OuUDC5fNEGAwwCSAy98Uh4AJx7RRfUxjuSGQLACYxU0RMAcMDESmdzEBhjNFLom9cfDg+AuVdshFqkUGbm/KVc6zkKulQ2+dyO8/mCyv97Z/fXrz0UHgDzVm/EHOhIjtfPb7EGC4U0FSP+Y7SLDFKouK8/kXz5nvAAaFxzK9Qt6cAcOL8MgC2jGqTySFRk/oeBnt6td6wODYCmKzdB/Z9XYg4ghcRo8nypmUFZFyY6qe8HEl+9cHt4ADSv6YIzW1Yn0zMpAoppQ4nraMNelxzg5FbfJ3s+f+4v/zsAc9bfpcHzwItWKF0uA2DCk+JlUCjgVO7YL7phSXsfAlhK93ra1XzN9yAG1Hi+8jyPI1D8rj+R/uXwumB8zIAfxZ6B/QL7RkA7Ph8LFe54VEpkSDGvVFA0//xga3BCAA2rboXqhsZPp89qXKA56Zww4/ouBnmcmmygZ6tLZEZt3dGcjrkyivMmEvFVxPdBe54RPUTRUOb0SJAujv18xChxRiafN9l8QDarItpOgIxYbx2GJfjg8O6xQz/eknr/OTMpgFlrbtPVc+OpdF1TXGggyUeh9zwyDCuK1uxlN69t88KRIUCxiihE/QhTyGgrJVhPW42ktLIy1RAocvjYeIY8DuJ4rQK8WiyKMCGHVB1M9R45MNSWeveZyQGcvfZOfercC1Ljtc1xl3RoOBqM4fdA+WI4JynNS1TkWhQ9XhGLKY8Tl59slaiW9YFTpgKAx8oq1nQ2q7KFgE0iCw2Bx/uIThQbAnB0dG/b4Nt/nxzA7HUIYN6i1PEzmuPsdeIve94j75IzZI4AoXfxGkegIhaFWDTKVGGzydOyHmCvK7DnIOcWmTFWXpBuOp7GTs1zggC/gM/pExsZ7D0ysrdt91t/mxzAOZjAMxDArwjAE9ooRx0CgN412hPua8v1qsqoikQiXO+1JAfTSdSoKvUEq+oEAK9wiOoWFA6OpTNQNORzLXSy83RP1eie3sMHhtuSbz41OYA5nXcjgMUYgaa4GO8p8Tiw0TIW6njied71b2SDU58TqzJlx8YqU0pgI7ySHa+NZ7IqX6RKJNe4GjFwrapGd/f9vP/b1v43npwcwLlX3aNPa1yMEWiK++URAJfEMkc5EI16MK2ykhMUq64oTZbTExSiO4VCSooi0UKeTO3ZSGJwJFQ2X4AMVSO8Ql4PVFkEDg72HUYAO19/YnIA867eXAKA3jactGg4gyHKeFJpCMQpVZUyLilQMLbsWjBQWtBIVgudjMsBtDSQ8sSG5opFSOcKDCbgSTCS0BqmjQ5iBIZb+147AYDGazbrmqZ46tjpGAFf6ONrV3E8OfdBxSIRVYkVR5dVJWlarlo6CTFRbcTmCdoY++YikBKLAAKVzeWxF8g1yuBA6qiahhH46Yfh1t5XH58cQPO19+qa5gtTYzWN8YhP3mbOU2NG6njgaDWtMqYiiIQTlymlShHQrvZLxxYPO6+DtgaAS1JbeVBqYwQyGIHAcCnFecIgHqEcIAA7XjkBgHnrbtMzL1ieOl7bFI8QhSSRuQr5njQuHxN5elXFRIOzTZYe6CiktQCwHDIuFMAOEAMxc7mMMlVwggFgFpOFCAICmxv0n6MHdvf9ODTYuuudZ08AAJWl50efrjytdrZnVaXWrsJASdtUYNMC26Do2vzWtWuPejPqwEoMXaZAlaON1VPT0z/9Z9/O7s+VbViK2y/IGpplhG1mSuYppfNjR/f1v//iS7+39w9Roys2bYH5l6wayM9adJHSokb17ylkX81RdcoN9fZs33JDeOT0pRvugD+tvJYBWJXKlLPel8oj3uQGlxne0bP9wevDA2BF12ZY0LaeALQgeTBnlKUQ9QTNAbBc5rns0FeJ98IEoLXrXgfgIlGpIJLD9gHDFFIqsAmNAHrefSBkABa2rx8oWAqh8dyxJQpcI7FhSeWhIQHYFiYAbRspAp0cAc2ND2x5tRHATyCVxkbgy55t94cMwMKOzoFcw+IWbZeUWiLBjzDadVURdPmhLxLv3BcqAPcxhXJURnmZSTkg+oe0nWga18jAIICeEALoHMg2LGqxfUDktfuNwP5CQyBoniIQKgq1diGAjvXJDFKo/MWWLikJbfuArHkL33yR2L5lQ3jezK3gKtSZHD8LIyA5UPabACs2q2lE8AVDX4YLwPKb7oKFK6/pz58dX+ZePkBpQS+PASufaQ4j0B0qAJff/ihU19Q+X3PW7EaPXk+A+5VSlQC4jbh0aP/ef33yyj9eDA2AqdxOApjq7SSAqd7+C7vpFV7CaHCZAAAAAElFTkSuQmCC"));
search_file = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAIoklEQVR42tWYe1BTdxbH782bJIT3+2FVGMBqu2vttra7tshqnTKUWqFgAXkpz4Ui7via2a10BdF10HWAaUECVAqEQHhXZkGLEAKCuMrsH0Jgu1AEioQIJJiEPPaEJvSaSXwtIfU3c+d3Qy739/2cc37nd05Q5CUfqKkFvHQAYZ99RlhaWnIlEYk+D+fm7BCVCqXSaA/kcvk9Eok0VsliyX+VAEH79nnQaNS47dvf2evp6bnRwsICJRCJiEqpRKRSKSKcnVXx+fz/9vT01D6SSArt7OwGCwoLVSYHiI6KsiQSiX8NCtoXv27dK2Y4PH6JSCAo4KsFBEVFKIrChNKVSqX5olhMEMM1NjoqbWhsYC4uPvoLu7p61mQAwcFBPr7v+7L/uGvXJhC9JFco7isUih8pFMqSGQwIGQqIRyGkZHBJAYKEQ1HHBZHIaVYgIN1o/36o52ZvSF19/d01BwgOCno9NDS0Zdu2bfYQ30KRWHzb1taWBKFjjcPhtGur9T82Ly4uzsMlhY+bJicmLP51+7aAU1vrf7Wl5daaAUQeOODo5+fH9fX1fUUkEk2Cefvc3Nyc8Xg8DitYe68LolKpEKFQ+ACe97o/Pu7Q2dEx3snlbgeQSaMDxMUdQq2trMr/lJIaAuKn4brh7u7uBFZHdcUb+LwCCRAzAPEa7AlbZlFRjVwhD2EWlyiNCvDJJ3vfyzyded2MSpWOjY01bNiwwUYr3pBoGDh932kg5mDfvDt07x6RWcz8gF1dc81oALGxMeg6d/e6+IRE/5GRkX4GgzFKg9ypT6ghAJ2/ITKZbEkhl9tOTEx4l5VdaZmbmw8oKS1dSa+rChAcHOx05Ej6sLOTM35waKjC1dXVfEUNxg04XZfoh1j5PD8/L4bX+/Xf6lOw2dWe1TU1940CEBMd/WlmVhbrwfT0+IxAUGsNw4B2nAGQx57V3kBWEkPqfXv0hx8cLl68GFrN4bCMApCampKZkfHlif7+/i5YcIBAIJA0inAYZSsQurMhT8H5oILJVTAzsyU/P+8sbOSTRgHIPH26JCk5OZzb2dlszmD8BxbF6wBgReJ0CJ4EhoOayXZhYeHNS5f+8W1J6TfRRgE4deqL8s8/Twv5/vp1Dt3cfBD+pBaB14rQ3utCYQEMeEw9HKQSye/y8/I4BZcvhxkFICPjVMHhw+kxbW1tTRA+PFicgBGtnvEGQAyCab1gRqFshKLvrbzc3ILCoqIkowAkJyUdzz579kw3j9ctmJ1lQhFHBgEETSjhMSFF0MwrQDqgKBZKvQfs7e13iEUin7+fO3e0vLLyvFEAoiIjfbOzs6+BeCGXy02h0+koBoCA8QIBA4TXA4gFwkEtpYQSPB5OZFpubu6OKjabaxQAqIHokZGRQ5s3b7ZpbGo6D2VAJ6xPVAvGXlgoDdBjgDozjmFu7gWFYOCN9vap1rZWnyp29aJRANQj/XBazt9OZ6ZBKh28c+dOApVKlWtEa0HUoohYED1QKzDwSuKrmzYlSCQStws5OdnMkl9SqFEAIsLDXVNTU/+9fv16alNTU7FEKr2MV5ehIAi+XhGqvsd6Qfez9nlXFxd/6M529/ffeshiVf2mtq5uwqgA6gEVaVpW1pkcqEQfNTU2fgmR3AbNCw4TRng999h5WbyVldU7Xl5e4Q+FQkpWVlYClBAFumsZBeDo0aMkW1ub5oSERD8oK8T/bG29BB1XDTRhqNbS+mA0YUOA6pMIWWePt5dXEPTHZvm5ud/AHFvEZCrWBCAuLm7n8ePHG+Dop3p4eiIQv0u9vb284eHhr8hkMh8uvd5QCwdPeUHG2e/o6LgFemRiYUFB5U/T0zHlFRUSfWutKkB8fDwDuqlXYQ+0WllaUBGUqCwuvnw1JCRkt4ODAx76XBlUqQPQKt6EvcEHr8yp9wd4xs4cMo2zs/Mbzk5O3tD4k34cG5V9/dXX2RQzszMFhYUyQ2uuGgCkzz2JiYklKqWS5uTkRCdT6KoLF86nwYmcNzY2+tbWrb/N+Djw452QDlFoMeUyqRSBJn+5rlf3yLBrl8ML6n5lfX19y8DAwBfQzPc/bd1VATh27NhuyD410IXRRAsLCJlCRVhVrJMQQueg+FJqvIODYmyzpaXFPm8v7z9Ap+YBDT5DqVIighnBw5GRYf7g4FAHPFMNHrmHbVqMCnDyxIldoaGhbBqdbgGWVE1NTiLdPT2Kvr6+31dUVNzU9z9wYqMSqYSAx+HJKgR0qhApiUySl5Q8m+hVA4BsszMsLIxD/1k8MjU1hXR1dSECgYAFGzaKzWZL/p/3GxXgz0eOvHcgMrIeel7GsvjJSZTH46mgDuKA+LCqqiqpscW/MEB6evqOAxERddC0WC2HDVie19WFzgqFtdDMh1dWVi6+yHvXBCA1JeXd6OjoBobmFzZt2MDmbRzi8/eXl5eL10r8cwMkJydvP3jwYLMFg2GJ/iweBfEqOKiuDg4OBl+5cmXNLP/cAElJSW/HxsQ0Qn1ig/5iefUPsy18Pv9TJpO5sNbinxkgISHhTbB8k7WVlT2qiXl12CgVimtwsgYVFRXNmUL8MwHAAfRGfFzcVUtLSzut5WHDIlAKtN+9ezcQss28qcQ/FQCEbz146FCzjbW1o8byKIhXSWWyDkiZe6HeF5pS/BMBYmNjXwfrf2drY+OMtbxCqezq4nI/qm9omH2ehdYUICoq6jXIOC0ayyNay8P9TWjW/Tkczq9CvF4AEL8FNm2zvZ2dG4o5pKCq7OV1dwewWKxpU4s2CAB1vM/+0NAWqN3dsWFDIpNvd/N4/tBUTJla8BMB8vPycj4KDEyD3L5S25AplAEQ/8G35eU/mVrsUwHAAy4QQu1yuXxjZ0cHqhbf09PzYVlZ2f0XXWBNAdQjIiLC08PDo9LFxYXc2dm5p7S0dNzUIp8LQD0CAgKIMBEaGxsfmVrgCwG8TOOlB/gfwwDUXmbLVaUAAAAASUVORK5CYII="));
execute = icon_list.add(png_to_bmp("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwEAYAAAAHkiXEAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAABngAAAZ4AA06Y++AAAAB3RJTUUH4AoUBh8rKjDiJwAACPlJREFUeNrtmntwVOUZxn/vcrGCOmK9V2lLCEIu3EoQDeR6dtNAkEWlKgYZygjkujEXQixia5VBq/WK1YozvUSr46UJbkhCNoLQqWFULraFWjlnE1BEUERACEl2v/5xPjKZdpxCdXNG5/z+2Z2dyTffPM933uf93hNwcXFxcXFxcXFxcXFxcXFx6TckVgvfPfOturwFMHB55NWuT373SCRZvSInxm2JpkXvZ/XyUM/66ELPuIbOlRdMO7uxk6NOC+EUnlgtPPiB6BUnU6VAGingeP5O8TKKD8c/rzbRzqXBdobIReqx115cFtjUlJs78mKnhXCKmBnAJRxhH3GUi5ceFrOMeCyQANlYDJE4LqYnL1dVUsewv/srj7/xnenT78suf3RD0/QnhiY4LUx/ETMDZIf+DDCRDpBiJisTWIqBCVQxGgtkPqkcPutpBjOEI3eG1HReYcmuhwOe1y+a8eBP1hTvDW3JG8F9TgsVK2JnQIc8B0ANVylbcC8mSJFciwUEGEsYqMFLFKScJCwQHwnsu9Kn3lcHGP7iQnWUZ0l7Pb/gmpbxM69LutVpwb5uYmfAEjkXQIrItEuPGFjAMkZigtyBjy9ACiWd/UA5CcoCqvFhgRTLJCyQRC7hSOZw9Su1ici26bdvb759ZuSRpoWLmmZf5z1/oNMCflViZ8B0/eVOvOwGyhiLCVLINewFKsWgC6hmFCZICVmYIMWShQkss3+nCoMukIWSwt6Bc7mAQZwM5Kgb1dMUvVc9f9e6wlnzfjpm3qqGrf67ZbvTgp4psQthjRRLRt+aTzVeIiDFpNABUsIEZQvuxQIqSdBGTWM/UCZejgM1xGHqEDdBZspYDl58L5/wGYOf3akWqXFsb/Pmzw3W+f0pm5wW9nSJuQGUMdo+2WTxKUipGHwOLCMeE6jQJadApmIC5SQRxjYkAhJgPGH7yVEWsFQbVc1VWCBFZPApyGi5kCOTD+BhILT9IH9u8DX/7DW+/FuD9f7rL2pyWugvI+Y1VMpIIAy8YQtKIolY9glXFtAihrQBierHWCAlZPM5SJNk8ikQUpnKAhLxypsgRTIFE2hWPsLAGHKIAht4Bgs4DkzwXIkHQS1sRjEAdUNO/q3BoH/2ig3s5xjjnoyrbc27ue7nkeFOGxC7DIjTX8oxOA5SKNP4CKggQZccAxOklIl2d0QK7dglqge7ZO0GKSSd3UBAsnU22CF+at0Cmco+YJFe9782AnB+MwKoxzK4jKHs2Fabf0twrf/69J1zZzWUznq0HypBvxvwMKjLgSrJ4SRQrS9ixWTrLie7bymhCi/dIEVih3SAccrCDnELpIxk/eSk8iFQicFJ6L3glZCFdXpbQyXXMAAP0Y1VnnOVIRv+tCt/QfAF/3VXzPzWGACgJoEUMYl2kBJSlN2GejGBSsbosE3vDdsv+ghahqGzIUMbNIZTfx8BKZIUOoBiJul1fVjAeWe0xaCtwc2j6OYcPP/8OP+2YJ1/Vk1W/uLgU/6sswZ/kw1YDkAl8coO22y7pEgqJnCHffGiBoMoSICxOlSnKNsgQ5ec+N4QPwQUSzaHgRr9eyU+20i5FhMYwZD/f8tDtxBlILKyleNcwTl/2Zj/swaPfwL3xkqk2IVwumcygBRFV2ACm8U+oYnK7npKMTgK0igZHARaVKYygSR8sgWkRCbrsM0hDIzWJ79Ct6mvMU2ZQIhsO8R1VxXHDwHYzj++0v4jKDzDMunk+9zAu0CYbfpQfRMMkAr7Uwk5OmzHY4E0cjV7gBZ89ADJfdrUMEizDtsWZWdFOV46QdbKNPYBIZXV2xW1gZTIRCygUeWxB+iSOLqB59VaBp3BhhWgImuBHnj6Hjx0M+yuSO1DM8J1y7kqVjrFvg0tlgx2AxuVfcNNwqAbpFCuZg9Ii/LZ7ag+yQl6JlREKvuAFvHRSd8nx74xN+obc0hlYIIsxUc3yFu8yF5QVwIjTmuLEaKb30bRRbRkSO3zeXPqgjveibUu/WYAi+zwlELSOQDSIgZHsU+4bUi2ruHpfQUlSZecEibSDtJIii45XmkDkvQ0tZAMDgDrJYujQKuys6P1SwwQFOwrQOiiZ+nL7KJFzXnu49q38p6qn8+A/hK+/wyYRRwWMA0fUSDRnoJKAanKAkLi0xexXN2mGnwG0iRZfAaE9JOT2Geaapcoe7iXoEO8TK/bYN+Y1RyQxacE7/obQgT1iAUc5dgvV9b+IW9eXeuxpwAI9r/w/WaAeInjGMh3JY2DQKvKUlpQu4YzCROkiUmEgZA9niaJBF2K0pQFrBevNsqrX+wYHANpkEwOAK0qQ1lAMjnSRicdHESaz6ObHlTgstrn8mbX1b+3xymhHTOAH2HfiW/qM7sxddhaQEhl6hNucBKkQK7lAyCksrVRhrSBBBiHCdLAFPYArXaWnOp+ZBWz2RrOlEGylPo7buNxlayeqE+ovTRvdf332OG00M4ZMJILwa7lyq7NOTpsEzFBCkjjIyAkXk5gh62pT7gFsq43bNN7Q7wHpEqmEj4xRQ6reWrzqgPykoTlrgdW/D4+d1P9y50LeIlNrHJa3v9N7A24RP/nRUXvzXaqFjQTu2TYb8RKmUA7yDquVmGg1R6+kaSfnEKy+ITVsl9u4dAr8XKT+rV6suLc367K8QfHdGwhHoAFTgt6psTegFN37Qox2E3fsM3m8H9MPfuWnEKZggViqjm077pchspKBpVef3biWWd7akOlD6xK9a8dQdRpAb8q/fZKTxZjv2Js1VPPkB5PJ/e2k2mYIG9LLjuPPMshlc+7vxggT8pejj0+9uGyjH81rOtezfvAn52W7euj/96p3qLb0Yl46dIzoQ9AWpWhTPUbPpL5Uv/HV2WGaqSu2nP/4LTcxnX71zstUKyJnQE9nOA8urAv+YfExwj2g3jE4AugQ92ktm0dyTlyv6wu3nzPsGtornqzEMh1WpT+JHbT0L+CJ1M9BCg8G0/iZRTRg4NZx43sWDLcs5R7WJNy14phU6Lrq9683GkhvrU8NPWdF4wOZj4YePt942Z5xun9uLi4uLi4uLi4uLi4OM2/AdDldWIeD/1+AAAALnpUWHRkYXRlOmNyZWF0ZQAAeNozMjA00zU00DUyCDEwszI2tDIx1jYwsDIwAABBMwUFAzXnBgAAAC56VFh0ZGF0ZTptb2RpZnkAAHjaMzIwNNM1NNA1MggxMLMyNrQyMdY2MLAyMAAAQTMFBSoKT44AAABuelRYdHN2ZzpiYXNlLXVyaQAAeNoFwVEOhCAMBcATse/DYIi36WIlJEibgnS9/c5ctfEBYJHB3VGz9JHlmRhTjAqDVFGzdKjxXZ8bYxVoozd0/s1wiTnZGYy10RvITDxsO6VtT/kbz0gx8Wes8gc9ACZ9O+4qpwAAAABJRU5ErkJggg=="));
}
local toolbar = createPanel(scriptForm);
toolbar.name = 'toolbar';toolbar.Caption = '';
-- toolbar.AutoSize = true;
toolbar.height = 38;
toolbar.align = alTop;
toolbar.BevelInner = 0;
toolbar.BevelOuter = 0;
local function createBitBtn(owner)
local b = createComponentClass('TBitBtn',owner);
b.parent = owner;
return b;
end
local function createNewToolBarIcon(owner,name)
local b = createBitBtn(owner);
b.DoubleBuffered = true;
b.GlyphShowMode = 0; -- gsmAlways; show glyph
b.Images = icon_list;b.ImageIndex = views.iconsId[name];
b.Layout = 3; -- blGlyphBottom ; 4 = Buttons
b.setSize(38,38);
b.AutoSize = tostring(config.toolbar_auto_size) == 'true'; -- not sure how registry returns booleans...
b.align = alLeft;
b.margin = 6; -- fix center
b.name = name;b.Caption = '';
b.ShowHint = true;
return b;
end
local function createSeperator(owner,w,h,lineWidth) -- quite useless, easier to use splitter and disable it, but hey it looks fine
local container = createPanel(owner);container.setSize(w,h);
container.BevelInner,container.BevelOuter,container.BevelWidth = 0,0,0;
local sep = createImage(container); sep.align = alClient;
local bmp = sep.Picture.Bitmap;bmp.Width,bmp.height = container.getSize();
bmp.TransparentColor = 0;bmp.Transparent = true;
local c = bmp.Canvas;
c.Pen.Width = lineWidth or 1;c.Pen.Color = 0xA0A0A0;
c.Line(container.Width//2,4,container.Width//2,container.Height-4);
sep.Transparent = true;
container.align = alLeft;
return container;
end
-- let's create in reversed order because of the alignment ..
local execute = createNewToolBarIcon(toolbar,'execute');
createSeperator(toolbar,5,toolbar.height);
local new_view = createNewToolBarIcon(toolbar,'new_view');
local next_view = createNewToolBarIcon(toolbar,'next_view');
local prev_view = createNewToolBarIcon(toolbar,'prev_view');
createSeperator(toolbar,5 ,toolbar.height);
local move_right = createNewToolBarIcon(toolbar,'move_right');
local move_left = createNewToolBarIcon(toolbar,'move_left');
createSeperator(toolbar,5,toolbar.height);
local zoom_out = createNewToolBarIcon(toolbar,'zoom_out');
local zoom_in = createNewToolBarIcon(toolbar,'zoom_in');
createSeperator(toolbar,5,toolbar.height);
local search = createNewToolBarIcon(toolbar,'search_file');
createSeperator(toolbar,5,toolbar.height);
local save = createNewToolBarIcon(toolbar,'save_file');
local close = createNewToolBarIcon(toolbar,'close_file');
local open = createNewToolBarIcon(toolbar,'open_file');
local new = createNewToolBarIcon(toolbar,'new_file');
new_view.Enabled = false;
next_view.Enabled = false;
prev_view.Enabled = false;
local removeFocus = function () executeCodeLocal('SetFocus',0); end;
local getCurrentSynEdit = function() return selectedTab.synedit; end;
getCurrentSynEdit = function() return selectedTab.synedit; end;
execute.Hint = 'Execute current script (hold shift to self target)';
new_view.Hint = 'Move script to a new view';
next_view.Hint = 'Move script to the next view';
prev_view.Hint = 'Move script to the previous view';
move_right.Hint = 'Move tab to the right';
move_left.Hint = 'Move tab to the left';
zoom_out.Hint = 'Zoom out';
zoom_in.Hint = 'Zoom in';
save.Hint = 'Save script to file';
close.Hint = 'Close script';
open.Hint = 'Open script from file';
new.Hint = 'New script';
new.onClick = function(sender)
selectedView.createNewTab();
end
close.onClick = function(sender)
selectedView.onTabDestroy();
end
zoom_in.onClick = function(sender)
local font = getCurrentSynEdit().Font
font.Size = font.size+1;
end
zoom_out.onClick = function(sender)
local font = getCurrentSynEdit().Font
font.Size = font.size-1;
end
move_left.onClick = function(sender)
selectedView.moveTabLeft();
end
move_right.onClick = function(sender)
selectedView.moveTabRight();
end
execute.onClick = function(sender,self) -- a bit copypasta... could just access menu items and doClick...
local tabName = selectedTab.Caption;
local text = getCurrentSynEdit().Lines.Text;
if (scriptForm.LuaSyntax.Checked) then
local status,Function,ErrorMessage = pcall(loadstring,text);
if (Function) then
Function();
elseif(ErrorMessage) then
print(tabName.Caption,'Script Error:'..ErrorMessage,0);
end
elseif(scriptForm.CeaSyntax.Checked) then
self = self or isKeyPressed(VK_SHIFT);
local status,Err = autoAssembleCheck(text,true,self);
if (status) then
autoAssemble(text,self); -- forgot to activate scripts here too..
print(tabName,'The code injection was successfull',self and '(Self Target)');
else
print(tabName,'Error: ',Err,self and '(Self Target)');
end
end
end
new_view.onClick = function(sender)
selectedView.moveToNewView();
end
next_view.onClick = function(sender)
selectedView.moveToNextView();
end
prev_view.onClick = function(sender)
selectedView.moveToPrevView();
end
open.onClick = function(sender)
selectedView.openFile();
end;
save.onClick = function(sender)
selectedView.saveFile();
end
search.onClick = function(sender)
searchReplaceDialog.show(getCurrentSynEdit(),nil,config)
end
local mainPanel = createPanel(scriptForm); --scriptForm.Component[25]..
mainPanel.align = alClient;
mainPanel.BevelInner = 0;
mainPanel.BevelOuter = 0;
mainView = createView(mainPanel,views);
mainView.canDestroyLastTab = false;
mainView.createNewTab(); -- we could just leave blank and let user choose what to open..
local function isMemoryRecordDestroyed(mr)
local al = AddressList;
local mr_array = al.MemoryRecord;
for i=0,al.Count-1 do
if (mr_array[i] == mr) then
return false;
end
end
return true;
end
local function removeOrphanTabs()
-- when destroying a tab, it's page index can get shifted! so in order to properly remove a tab we need to fetch tab parent
for tab,data in pairs(views.fileTabs) do
local hasMemoryRecord = data.MemoryRecord
if (hasMemoryRecord) then
if (isMemoryRecordDestroyed(hasMemoryRecord)) then
local targetTab = getCachedObject(integerToUserData(tab));
views.setOpenedFileTab(targetTab,nil); -- clean up;
local mr = messageDialog(('Close script - %s'):format(targetTab.Caption),('[Memory Record] - "%s" has been deleted.\nDo you want to close the script?'):format(targetTab.Caption),mtInformation,mbYes,mbNo,mbCancel);
if (mr == mrYes) then
local view = getCachedObject(targetTab.parent);
view.closeTab(targetTab);
else
local synedit = targetTab.synedit;
synedit.onchange(synedit); -- mark is modified...
end
end
end
end
end
local OnActivate_timer = createTimer(scriptForm,false);
OnActivate_timer.Interval = 1;
OnActivate_timer.OnTimer = function(sender)
sender.Enabled = false;
scriptForm.sendToBack();
scriptForm.bringToFront();
end
scriptForm.OnActivate = function(sender)
removeOrphanTabs();
OnActivate_timer.Enabled = true; -- fix that OnActivate bug causing the window to disappear..
end
scriptForm.onClose = function(sender)
-- honestly can use saveFormPosition, but for upcoming session feature gotta use registry either way..
if (config.closeTabsOnClose) then
scriptForm.closeAll.doClick();
end
config.windowWidth = scriptForm.Width;
config.windowHeight = scriptForm.Height;
config.windowLeft = scriptForm.Left;
config.windowTop = scriptForm.Top;
config.bottomPanelHeight = bottomPanel.height;
searchReplaceDialog.hide(); -- in case it is not hidden, so we could save its properties...
local scriptEditorRegistry = getSettings('scriptEditor');
for key,value in pairs(config) do -- save config....
scriptEditorRegistry[key] = tostring(value);
end
scriptEditorRegistry.destroy();
scriptForm.hide();
end
local MainForm_Close = MainForm.OnClose
MainForm.OnClose = function(sender)
local closeAll = scriptForm.findComponentByName('closeAll')
if (closeAll) then
if (closeAll.OnClick()) then -- user probably canceled...
return;
end
scriptForm.onClose(scriptForm); -- so we could save size and position..
end
if (MainForm_Close) then
-- return MainForm_Close(sender); -- seems that it halts somewhere...
MainForm_Close(sender);
end
return closeCE();
end
-- @DB : https://forum.cheatengine.org/viewtopic.php?p=5567408#5567408
local al = getAddressList();
if (al.PopupMenu) then
local popMenu = al.PopupMenu;
local ItemExists = popMenu.open_in_script_editor;
if (ItemExists) then
ItemExists.name = '';
ItemExists.destroy();
end
local Item = createMenuItem(popMenu);
Item.Name = 'open_in_script_editor';
Item.Shortcut = "CTRL+SPACE";
Item.Caption = 'Open in script editor';
Item.OnClick = function(sender)
local selectedItems = al.getSelectedRecords();
if (selectedItems) then
for k,memrecord in pairs(selectedItems) do
if (memrecord.Type == vtAutoAssembler) then -- onyl autoassemble scripts
if (not scriptForm.visible) then
scriptForm.show();
end
selectedView.openFile(memrecord);
end
end
end
end
local _onpopup = popMenu.OnPopup;
if (_onpopup) then
popMenu.OnPopup = function(sender)
Item.Visible = al.SelCount &gt; 0;
_onpopup(sender);
end
else
popMenu.OnPopup = function(sender)
Item.Visible = al.SelCount &gt; 0;
end
end
popMenu.Items.add(Item);
end
if (not MainForm.scriptEditor) then
local item = createMenuItem(MainForm);
item.name = 'ScriptEditor';
item.Caption = 'Script Editor';
item.Shortcut = 'CTRL+L';
item.onClick = function() scriptForm.show(); end;
MainForm.miTable.insert(0,item); -- adds to 'Table' menu
end
</LuaScriptEntry>
<LuaScriptEntry Name=" Address List GUI ">-- Address List GUI (author: Aylin)
-- -------------------------------------------------------------
-- https://forum.cheatengine.org/viewtopic.php?t=617942
--  
-- 上記で拾ったアドレスリスト編集ウィンドウ
-- メインメニューに新規項目として追加される
-- #############################################################
local SCALING_RATIO = 1.5
local function getScalingSize(originalSize)
return math.floor(tonumber(originalSize) * SCALING_RATIO)
end
local function getScalingRatio()
return SCALING_RATIO
end
local adrrFormCrt1=1
function AddrformCrt()
AddrListPanel = createForm()
AddrListPanel.Position=poDesktopCenter
AddrListPanel.Width= getScalingSize(660)
AddrListPanel.Height= getScalingSize(260)
AddrListPanel.Caption = 'Address List Function'
AddrListPanel.BorderStyle="bsSizeable"
AddrListPanel.BorderIcons="[biSystemMenu,biMinimize]"
AddrListPanel.PopupMode = '0'
local jn={ }
jn.L11 = createLabel(AddrListPanel)
jn.L11.Left= getScalingSize(10) jn.L11.Top= getScalingSize(11) jn.L11.Font.Size= getScalingSize(12)
jn.L11.Caption=' Add the address - Decription \nand add or clear Offset ↓ (No 0x) ↓'
jn.L12 = createLabel(AddrListPanel)
jn.L12.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(45) jn.L12.Top= getScalingSize(-3) jn.L12.Font.Size= getScalingSize(13)
jn.L12.Caption="&lt;---&gt;" jn.L12.Font.Style="fsBold"
jn.L1=createLabel(AddrListPanel)
jn.L1.Left= getScalingSize(10) jn.L1.Top= getScalingSize(56) jn.L1.Font.Size= getScalingSize(12) jn.L1.Caption="Description: "
jn.L2=createLabel(AddrListPanel)
jn.L2.Left= getScalingSize(10) jn.L2.Top= getScalingSize(80) jn.L2.Font.Size= getScalingSize(12) jn.L2.Caption="Address....: "
jn.L3=createLabel(AddrListPanel)
jn.L3.Left= getScalingSize(10) jn.L3.Top= getScalingSize(104) jn.L3.Font.Size= getScalingSize(12) jn.L3.Caption="Offset(0)...: "
jn.L4=createLabel(AddrListPanel)
jn.L4.Left= getScalingSize(10) jn.L4.Top= getScalingSize(128) jn.L4.Font.Size= getScalingSize(12) jn.L4.Caption="Offset(1)...: "
jn.L5=createLabel(AddrListPanel)
jn.L5.Left= getScalingSize(10) jn.L5.Top= getScalingSize(152) jn.L5.Font.Size= getScalingSize(12) jn.L5.Caption="Offset(2)...: "
jn.L6=createLabel(AddrListPanel)
jn.L6.Left= getScalingSize(10) jn.L6.Top= getScalingSize(176) jn.L6.Font.Size= getScalingSize(12) jn.L6.Caption="Offset(3)...: "
jn.L7=createLabel(AddrListPanel)
jn.L7.Left= getScalingSize(10) jn.L7.Top= getScalingSize(200) jn.L7.Font.Size= getScalingSize(12) jn.L7.Caption="Offset(4)...: "
jn.L8=createLabel(AddrListPanel)
jn.L8.Left= getScalingSize(390) jn.L8.Top= getScalingSize(192) jn.L8.Font.Size= getScalingSize(10) jn.L8.Caption="↓ Addr List Clear ↓\nWrite: Line or all"
jn.E1=createEdit(AddrListPanel) jn.E1.AutoSize=false jn.E1.Height= getScalingSize(20)
jn.E1.Left= getScalingSize(90) jn.E1.Top= getScalingSize(55) jn.E1.Font.Size= getScalingSize(12) jn.E1.Width= getScalingSize(160)
jn.E2=createEdit(AddrListPanel) jn.E2.AutoSize=false jn.E2.Height= getScalingSize(20)
jn.E2.Left= getScalingSize(90) jn.E2.Top= getScalingSize(79) jn.E2.Font.Size= getScalingSize(12) jn.E2.Width= getScalingSize(160)
jn.E3=createEdit(AddrListPanel) jn.E3.AutoSize=false jn.E3.Height= getScalingSize(20)
jn.E3.Left= getScalingSize(110) jn.E3.Top= getScalingSize(103) jn.E3.Font.Size= getScalingSize(12) jn.E3.Width= getScalingSize(140)
jn.E4=createEdit(AddrListPanel) jn.E4.AutoSize=false jn.E4.Height= getScalingSize(20)
jn.E4.Left= getScalingSize(110) jn.E4.Top= getScalingSize(127) jn.E4.Font.Size= getScalingSize(12) jn.E4.Width= getScalingSize(140)
jn.E5=createEdit(AddrListPanel) jn.E5.AutoSize=false jn.E5.Height= getScalingSize(20)
jn.E5.Left= getScalingSize(110) jn.E5.Top= getScalingSize(151) jn.E5.Font.Size= getScalingSize(12) jn.E5.Width= getScalingSize(140)
jn.E6=createEdit(AddrListPanel) jn.E6.AutoSize=false jn.E6.Height= getScalingSize(20)
jn.E6.Left= getScalingSize(110) jn.E6.Top= getScalingSize(175) jn.E6.Font.Size= getScalingSize(12) jn.E6.Width= getScalingSize(140)
jn.E7=createEdit(AddrListPanel) jn.E7.AutoSize=false jn.E7.Height= getScalingSize(20)
jn.E7.Left= getScalingSize(110) jn.E7.Top= getScalingSize(199) jn.E7.Font.Size= getScalingSize(12) jn.E7.Width= getScalingSize(140)
jn.E8=createEdit(AddrListPanel) jn.E8.AutoSize=false jn.E8.Height= getScalingSize(23)
jn.E8.Left= getScalingSize(445) jn.E8.Top= getScalingSize(226) jn.E8.Font.Size= getScalingSize(12) jn.E8.Width= getScalingSize(60)
jn.E8.ShowHint=true jn.E8.TextHint='ClrLine?'
local b=createButton(AddrListPanel)
b.Left= getScalingSize(10) b.Top= getScalingSize(225) b.caption="Add Offset" b.Width= getScalingSize(80) b.Height= getScalingSize(b.Height * getScalingRatio())
local b1=createButton(AddrListPanel)
b1.Left= getScalingSize(260) b1.Top= getScalingSize(225) b1.caption="Add Address List" b1.Width= getScalingSize(125) b1.Height= getScalingSize(b1.Height * getScalingRatio())
local b2=createButton(AddrListPanel)
b2.Left= getScalingSize(110) b2.Top= getScalingSize(225) b2.caption="Clear Offset" b2.Width= getScalingSize(140) b2.Height= getScalingSize(b2.Height * getScalingRatio())
local b3=createButton(AddrListPanel)
b3.Left= getScalingSize(390) b3.Top= getScalingSize(225) b3.caption="Clear" b3.Width= getScalingSize(50) b3.Height= getScalingSize(b3.Height * getScalingRatio())
local AddrBtn=createButton(AddrListPanel)
AddrBtn.Top= getScalingSize(225) AddrBtn.caption="Open-AddressList" AddrBtn.Width= getScalingSize(140) AddrBtn.Height= getScalingSize(AddrBtn.Height * getScalingRatio())
AddrBtn.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(150)
local AddrBtn1=createButton(AddrListPanel)
AddrBtn1.Top= getScalingSize(198) AddrBtn1.caption="Add Addr Manually" AddrBtn1.Width= getScalingSize(140) AddrBtn1.Height= getScalingSize(AddrBtn1.Height * getScalingRatio())
AddrBtn1.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(150)
local AddrAlw=createPanel(AddrListPanel) AddrAlw.Color="0x80FFDE"
AddrAlw.Height= getScalingSize(180) AddrAlw.Left= getScalingSize(260) AddrAlw.Top= getScalingSize(13) AddrAlw.Width=getScalingSize(AddrListPanel.Width) - getScalingSize(272)
jn.CBox = createComboBox(AddrListPanel)
jn.CBox.Left= getScalingSize(260) jn.CBox.Height= getScalingSize(23) jn.CBox.Top= getScalingSize(198) jn.CBox.Width= getScalingSize(125)
jn.CBox.Font.Size= getScalingSize(10) jn.CBox.ReadOnly=true jn.CBox.Style='csDropDownList'
function formatTypes1(t2)
t2=tostring(t2)
if t2=="Byte" then t2=0 end
if t2=="4 Bytes" then t2=2 end
if t2=="8 Bytes" then t2=3 end
if t2=="Fload" then t2=4 end
if t2=="Double" then t2=5 end
if t2=="String" then t2=6 end
if t2=="Array of Byte" then t2=8 end
if t2=="Binary" then t2=9 end
if t2=="AutoAssembler" then t2=11 end
if t2=="Custom" then t2=13 end
return t2
end
jn.CBox.Clear()
jn.CBox.Items.Add("Byte")
jn.CBox.Items.Add("4 Bytes")
jn.CBox.Items.Add("8 Bytes")
jn.CBox.Items.Add("Fload")
jn.CBox.Items.Add("Double")
jn.CBox.Items.Add("String")
jn.CBox.Items.Add("Array of Byte")
jn.CBox.Items.Add("Binary")
jn.CBox.Items.Add("AutoAssembler")
jn.CBox.Items.Add("Custom") --13
jn.CBox.ItemIndex=0
local top1 = getScalingSize(-15)
local chk11={ }
local OffCount=0
local ec = 2
local ec1 = 2
for x=2, 6 do jn["E"..x+1].visible=false jn["L"..x+1].visible=false end
function CounOffs1()
OffCount=0
if jn.E3.Text~="" then OffCount=1 end
if jn.E4.Text~="" then OffCount=2 end
if jn.E5.Text~="" then OffCount=3 end
if jn.E6.Text~="" then OffCount=4 end
if jn.E7.Text~="" then OffCount=5 end
return OffCount
end
b1.OnClick=function()
local al=getAddressList()
local shc = al.createMemoryRecord()
CounOffs1()
if jn.E2.Text~="" then
shc.setAddress(jn.E2.Text) end
shc.setOffsetCount(tonumber(OffCount))
if jn.E3.Text~="" then
shc.setOffset(0, "0x"..jn.E3.Text) end
if jn.E4.Text~="" then
shc.setOffset(1, "0x"..jn.E4.Text) end
if jn.E5.Text~="" then
shc.setOffset(2, "0x"..jn.E5.Text) end
if jn.E6.Text~="" then
shc.setOffset(3, "0x"..jn.E6.Text) end
if jn.E7.Text~="" then
shc.setOffset(4, "0x"..jn.E7.Text) end
shc.Type = formatTypes1(jn.CBox.Text)
shc.description=jn.E1.Text
end
b.OnClick=function()
if ec~=7 then
ec =tonumber(ec) + 1
ec1 =tonumber(ec1) + 1
name1=jn["E"..ec]
name2=jn["L"..ec]
name1.visible=true
name2.visible=true
end
end
b2.OnClick=function()
if ec1~=2 then
name1=jn["E"..ec]
name2=jn["L"..ec]
ec =tonumber(ec) - 1
ec1 =tonumber(ec1) - 1
name1.Text=""
name1.visible=false
name2.visible=false
end
end
b3.OnClick=function()
if jn.E8.Text=="" then jn.E8.Text="0" end
al11=getAddressList()
x1=al11.Count - 1
cnt1=tonumber(jn.E8.Text)
if jn.E8.Text=="all" then
for i=0, al11.Count-1 do
memoryrecord_delete(addresslist_getMemoryRecord(al11, 0))
end
else
if x1&gt;=cnt1 then
desc2=(al11[cnt1].Description)
memoryrecord_delete(addresslist_getMemoryRecord(al11, cnt1))
else
showMessage("Line not found")
end
end
end
local alw=AddrAlw
local add1=1
--AddressList.Parent = mf.Panel1
local clr11=GetAddressList().Control[0].BackgroundColor
AddrBtn.OnClick=function()
if add1==1 then
AddressList.Parent=alw
AddrBtn.caption="Close-AddressList"
GetAddressList().Control[0].BackgroundColor="0x80FFDE"
add1=2
else
AddressList.Parent = getMainForm().Panel1
AddrBtn.caption="Open-AddressList"
GetAddressList().Control[0].BackgroundColor=clr11
add1=1
end
end
AddrBtn1.OnClick=getMainForm().btnAddAddressManually.OnClick
AddrListPanel.OnResize=function()
if AddrListPanel.Width&lt;= getScalingSize(660) then AddrListPanel.Width= getScalingSize(660) end
AddrListPanel.Height= getScalingSize(260)
jn.L12.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(45)
AddrAlw.Width=getScalingSize(AddrListPanel.Width) - getScalingSize(272)
AddrBtn.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(150)
AddrBtn1.Left=getScalingSize(AddrListPanel.Width) - getScalingSize(150)
AddressList.Width=getScalingSize(AddrAlw.Width)
end
AddrListPanel.OnClose=function()
AddressList.Parent = getMainForm().Panel1
AddrListPanel.visible=false
end
adrrFormCrt1=2
end
------------ add CE
if adressPanelEdit then adressPanelEdit.Destroy() adressPanelEdit=nil end
adressPanelEdit=createButton(getMainForm().Panel5)
adressPanelEdit.Height=getMainForm().btnAddAddressManually.Height
adressPanelEdit.Top=getMainForm().btnAddAddressManually.Top
adressPanelEdit.Width=getMainForm().btnAddAddressManually.Width getScalingSize(-30)
adressPanelEdit.Left=getMainForm().btnAddAddressManually.left - getMainForm().btnAddAddressManually.Width + getScalingSize(15)
adressPanelEdit.Caption="Open AddrList Panel"
getMainForm().OnResize=function()
adressPanelEdit.Left=getMainForm().btnAddAddressManually.left - getMainForm().btnAddAddressManually.Width + getScalingSize(15)
end
adressPanelEdit.OnClick=function()
if adrrFormCrt1==2 then
if AddrListPanel.visible==true then
adressPanelEdit.Caption="Open AddrList Panel"
AddrListPanel.visible=false
AddressList.Parent = getMainForm().Panel1
else
AddrListPanel.visible=true
adressPanelEdit.Caption="Close AddrList Panel"
end
end
if adrrFormCrt1==1 then
AddrformCrt()
adressPanelEdit.Caption="Close AddrList Panel"
end
end
</LuaScriptEntry>
<LuaScriptEntry Name=" Hex,Dec Calculator ">-- Hex,Dec Calculator (author: Frouk)
-- -------------------------------------------------------------
-- https://forum.cheatengine.org/viewtopic.php?t=618054
--  
-- 上記で拾った誰かの習作
-- メインメニューに新規項目として追加される
-- #############################################################
local SCALING_RATIO = 1.5
local useGroupMenu = true
local extGroupMenuCaption = 'Extra Extensions'
local extItemCaption = 'Hex,Dec Calculator'
local mm = MainForm.Menu
local extMenu = nil
--GUI elements start
local form = createForm(false)
form.Height = 300;
form.Width = 300;
form.Caption = 'Hex,Dec Calculator';
form.Constraints.MinHeight = 300;
form.Constraints.MinWidth = 300;
form.BorderStyle = bsSingle
form.Position = poScreenCenter
form.Width = form.Width * SCALING_RATIO
form.Height = form.Height * SCALING_RATIO
local read = createPanel(form)
read.Align = alLeft
read.Width = 300
read.BevelOuter = bvNone
read.Width = read.Width * SCALING_RATIO
read.Height = read.Height * SCALING_RATIO
local hex = createCheckBox(read)
hex.AnchorSideLeft.Control = read
hex.AnchorSideTop.Control = read
hex.BorderSpacing.Left = 10
hex.BorderSpacing.Top = 10
hex.Caption = 'Show in hex'
hex.Width = hex.Width * SCALING_RATIO
hex.Height = hex.Height * SCALING_RATIO
hex.BorderSpacing.Left = hex.BorderSpacing.Left * SCALING_RATIO
hex.BorderSpacing.Top = hex.BorderSpacing.Top * SCALING_RATIO
local dec = createCheckBox(read)
dec.AnchorSideLeft.Control = read
dec.AnchorSideTop.Control = read--
dec.BorderSpacing.Left = 10
dec.BorderSpacing.Top = 30
dec.Caption = 'Show in dec'
dec.Width = dec.Width * SCALING_RATIO
dec.Height = dec.Height * SCALING_RATIO
dec.BorderSpacing.Left = dec.BorderSpacing.Left * SCALING_RATIO
dec.BorderSpacing.Top = dec.BorderSpacing.Top * SCALING_RATIO
local editText = createLabel(read)
editText.AnchorSideLeft.Control = read
editText.AnchorSideTop.Control = read
editText.BorderSpacing.Left = 10
editText.BorderSpacing.Top = 90
editText.Caption = 'Address or value'
editText.Width = editText.Width * SCALING_RATIO
editText.Height = editText.Height * SCALING_RATIO
editText.BorderSpacing.Left = editText.BorderSpacing.Left * SCALING_RATIO
editText.BorderSpacing.Top = editText.BorderSpacing.Top * SCALING_RATIO
local editBox = createEdit(read)
editBox.AnchorSideLeft.Control = read
editBox.AnchorSideTop.Control = read
editBox.Width = 100
editBox.BorderSpacing.Left = 10
editBox.BorderSpacing.Top = 110
editBox.Text = ''
editBox.Width = editBox.Width * SCALING_RATIO
editBox.Height = editBox.Height * SCALING_RATIO
editBox.BorderSpacing.Left = editBox.BorderSpacing.Left * SCALING_RATIO
editBox.BorderSpacing.Top = editBox.BorderSpacing.Top * SCALING_RATIO
local convertButton = createButton(read)
convertButton.AnchorSideLeft.Control = read
convertButton.AnchorSideTop.Control = read
convertButton.BorderSpacing.Left = 10
convertButton.BorderSpacing.Top = 140
convertButton.Caption = 'Convert'
convertButton.Width = convertButton.Width * SCALING_RATIO
convertButton.Height = convertButton.Height * SCALING_RATIO
convertButton.BorderSpacing.Left = convertButton.BorderSpacing.Left * SCALING_RATIO
convertButton.BorderSpacing.Top = convertButton.BorderSpacing.Top * SCALING_RATIO
local result = createLabel(read)
result.AnchorSideLeft.Control = read
result.AnchorSideTop.Control = read
result.BorderSpacing.Left = 10
result.BorderSpacing.Top = 180
result.Caption = ' '
result.Width = result.Width * SCALING_RATIO
result.Height = result.Height * SCALING_RATIO
result.BorderSpacing.Left = result.BorderSpacing.Left * SCALING_RATIO
result.BorderSpacing.Top = result.BorderSpacing.Top * SCALING_RATIO
local copyButton = createButton(read)
copyButton.AnchorSideLeft.Control = read
copyButton.AnchorSideTop.Control = read
copyButton.BorderSpacing.Left = 10
copyButton.BorderSpacing.Top = 60
copyButton.Width = 175
copyButton.Caption = 'Copy result to clipboard'
copyButton.Width = copyButton.Width * SCALING_RATIO
copyButton.Height = copyButton.Height * SCALING_RATIO
copyButton.BorderSpacing.Left = copyButton.BorderSpacing.Left * SCALING_RATIO
copyButton.BorderSpacing.Top = copyButton.BorderSpacing.Top * SCALING_RATIO
local infoButton = createButton(read)
infoButton.AnchorSideLeft.Control = read
infoButton.AnchorSideTop.Control = read
infoButton.BorderSpacing.Left = 10
infoButton.BorderSpacing.Top = 210
infoButton.Caption = 'Info'
infoButton.Width = infoButton.Width * SCALING_RATIO
infoButton.Height = infoButton.Height * SCALING_RATIO
infoButton.BorderSpacing.Left = infoButton.BorderSpacing.Left * SCALING_RATIO
infoButton.BorderSpacing.Top = infoButton.BorderSpacing.Top * SCALING_RATIO
local infoForm = createForm(false)
infoForm.Height = 300;
infoForm.Width = 300;
infoForm.Caption = 'Info';
infoForm.Constraints.MinHeight = 300;
infoForm.Constraints.MinWidth = 300;
infoForm.BorderStyle = bsSingle
infoForm.Position = poScreenCenter
infoForm.Width = infoForm.Width * SCALING_RATIO
infoForm.Height = infoForm.Height * SCALING_RATIO
infoForm.Constraints.MinHeight = infoForm.Constraints.MinHeight * SCALING_RATIO
infoForm.Constraints.MinWidth = infoForm.Constraints.MinWidth * SCALING_RATIO
local infoFormPanel = createPanel(infoForm)
infoFormPanel.Align = alLeft
infoFormPanel.Width = 300
infoFormPanel.BevelOuter = bvNone
infoFormPanel.Width = infoFormPanel.Width * SCALING_RATIO
infoFormPanel.Height = infoFormPanel.Height * SCALING_RATIO
local hexUsage = createLabel(infoFormPanel)
hexUsage.AnchorSideLeft.Control = infoFormPanel
hexUsage.AnchorSideTop.Control = infoFormPanel
hexUsage.BorderSpacing.Left = 10
hexUsage.BorderSpacing.Top = 10
hexUsage.Caption = 'IF Hex:Type a value you need'
hexUsage.BorderSpacing.Left = hexUsage.BorderSpacing.Left * SCALING_RATIO
hexUsage.BorderSpacing.Top = hexUsage.BorderSpacing.Top * SCALING_RATIO
local decUsage = createLabel(infoFormPanel)
decUsage.AnchorSideLeft.Control = infoFormPanel
decUsage.AnchorSideTop.Control = infoFormPanel
decUsage.BorderSpacing.Left = 10
decUsage.BorderSpacing.Top = 30
decUsage.Caption = 'IF Dec:Type like this 0xYourValue'
decUsage.BorderSpacing.Left = decUsage.BorderSpacing.Left * SCALING_RATIO
decUsage.BorderSpacing.Top = decUsage.BorderSpacing.Top * SCALING_RATIO
local decUsage2 = createLabel(infoFormPanel)
decUsage2.AnchorSideLeft.Control = infoFormPanel
decUsage2.AnchorSideTop.Control = infoFormPanel
decUsage2.BorderSpacing.Left = 10
decUsage2.BorderSpacing.Top = 50
decUsage2.Caption = 'Replace YourValue with your value'
decUsage2.BorderSpacing.Left = decUsage2.BorderSpacing.Left * SCALING_RATIO
decUsage2.BorderSpacing.Top = decUsage2.BorderSpacing.Top * SCALING_RATIO
--GUI elements end
--Form settings start
form.Cursor = crCross
read.Cursor = crCross
infoForm.Cursor = crHelp
infoFormPanel.Cursor = crHelp
editBox.Enabled = false;
form.OnClose = function(sender)
result.Caption = ' '
editBox.Text = ' '
dec.Checked = false;
hex.Checked = false
return caHide
end
copyButton.OnClick = function(sender)
copyText = result.Caption
sleep(1)
writeToClipboard(copyText)
end
hex.OnChange = function(sender)
if sender.Checked then
dec.Enabled = not sender.Checked
editBox.Enabled = sender.Checked
end
if not sender.Checked then
dec.Enabled = not sender.Checked
editBox.Enabled = sender.Checked
end
end
dec.OnChange = function(sender)
if sender.Checked then
hex.Enabled = not sender.Checked
editBox.Enabled = sender.Checked
end
if not sender.Checked then
hex.Enabled = not sender.Checked
editBox.Enabled = sender.Checked
end
end
convertButton.OnClick = function(sender)
if dec.Enabled == true and hex.Enabled == true then
beep()
showMessage('Can\'t convert the value,chose value type to convert!')
end
local editNumber = editBox.Text
if dec.Checked == true then
local resultText = string.format('%d',editBox.Text)
result.Caption = resultText
end
if hex.Checked == true then
local resultText = string.format('0x%X',editBox.Text)
result.Caption = resultText
end
end
infoButton.OnClick = function(sender)
local infoMenu = createMainMenu(infoForm)
infoForm.show()
end
infoForm.OnClose = function(sender)
return caHide
end
--Form settings end
--Group menu elements start
if useGroupMenu then
for i=0,mm.Items.Count-1 do
if mm.Items.Item[i].Caption == extGroupMenuCaption then
extMenu = mm.Items.Item[i]
break
end
end
if not extMenu then
extMenu = createMenuItem(mm)
extMenu.Caption = extGroupMenuCaption
mm.Items.add(extMenu)
end
else
extMenu = mm.Items
end
local extMenuItem = createMenuItem(extMenu)
extMenuItem.Caption = extItemCaption
extMenu.add(extMenuItem)
--Group menu elements end
--Main functions start
--Main functions end
--Group menu start
extMenuItem.OnClick = function(sender)
local mainMenu = createMainMenu(form)
form.show()
end
--Group menu end
</LuaScriptEntry>
<LuaScriptEntry Name=" Show String ">-- String scans show whole string (author: Dark Byte)
-- -------------------------------------------------------------
-- https://forum.cheatengine.org/viewtopic.php?t=619071
--  
-- #############################################################
if originalflod then
MainForm.Foundlist3.OnData=originalflod
end
originalflod=MainForm.Foundlist3.OnData
MainForm.Foundlist3.OnData=function(sender, item)
local ms=getCurrentMemscan()
if originalflod then
originalflod(sender, item)
if ms.VarType=='vtString' then
local a=tonumber(ms.FoundList.getAddress(item.index),16)
item.SubItems[0]=readString(a,200,ms.Unicode)
end
end
end
</LuaScriptEntry>
<LuaScriptEntry Name=" Web Image Viewer ">-- View images in the selected process. (author: AylinCE)
-- -------------------------------------------------------------
-- https://forum.cheatengine.org/viewtopic.php?t=619074
--  
-- https画像アドレスViewer
-- メインメニューに新規項目として追加される
-- #############################################################
------------------------ GUI
function loadImgWiew()
if f then f.destroy() f=nil end
f = createForm() f.setSize(600,430) f.Caption = "Image Viewer" setProperty(f , "BiDiMode", "bdLeftToRight")
f.Color=0xFF0000 f.Position=poDesktopCenter f.Popupmode=0;
list = createListBox(f) list.Height=310 list.Width=150 list.setPosition(5,85) list.color=0x00FFFF
list.Font.Style="fsBold"
local lx1 = createLabel(f)
lx1.AutoSize=false lx1.Height=80 lx1.Left=5 lx1.Top=1 lx1.Width=150
lx1.Font.Size=10 lx1.Font.Color=0xFFFFFF lx1.OptimalFill=true lx1.Font.Style="fsBold"
lx1.Alignment= "taCenter"
lx1.caption = 'Double-click the\nselection to view it.\nTo see,\ndouble-click the selection.'
local bx1=createButton(f)
bx1.Left=5 bx1.Top=400 bx1.Width=150
bx1.Font.Size=12 bx1.Font.Style="fsBold" bx1.caption="Load List"
local pnl1 = createPanel(f)
pnl1.Left=160 pnl1.Height=390 pnl1.Top=5 pnl1.Width=435 pnl1.Color=0xFFFFFF
local Img1 = createImage(pnl1)
Img1.Left=5 Img1.Height=380 Img1.Top=5 Img1.Width=425
local lx2 = createLabel(f)
lx2.AutoSize=false lx2.Height=29 lx2.Left=160 lx2.Top=395 lx2.Width=435
lx2.Font.Size=10 lx2.Font.Color=0xFFFFFF lx2.OptimalFill=true lx2.Font.Style="fsBold"
lx2.Alignment= "taCenter"
lx2.caption = 'Picture Original Size, Height: 0 / Width: 0 '
------------------------ Func
aa3={"https://cheatengine.org/celogo.png"}
local items = list.Items
for i,k in pairs(aa3) do
strings_add(items,k)
end
function loadUrl(link)
local int=getInternet()
s=int.getURL(link)
int.destroy()
return s
end
function crtPictures11(link)
aLnk=loadUrl(link)
local ss222=createStringStream(aLnk)
p1=createPicture()
p1.loadFromStream(ss222)
ss222.destroy()
return p1
end
function selectLinks()
local a1 = list.ItemIndex
local pro1 = list.Items
local Links = pro1[a1]
--print(Links)
if Links then
newLink=crtPictures11(Links)
if newLink then
Img1.AutoSize=true
Img1.Stretch=false
Img1.Picture=newLink
lx2.caption = "Picture Original Size, Height: " .. Img1.Height .. " / Width: " .. Img1.Width
--print(Img1.Height,Img1.Width)
if Img1.Width&lt;pnl1.Width or Img1.Height&lt;pnl1.Height then
Img1.AutoSize=true
Img1.Left=pnl1.Width / 2 - Img1.Width / 2
Img1.Top=pnl1.Height / 2 - Img1.Height / 2
--print(Img1.Left,Img1.Top)
else
Img1.AutoSize=false
Img1.Width=pnl1.Width - 10
Img1.Height=pnl1.Height - 10
Img1.setPosition(5,5)
Img1.Stretch=true
end
end
end
end
function loadPngList()
bx1.caption="Please Wait . . "
local items = list.Items
items.clear()
aob=AOBScan("68 74 74 70 73 3A 2F 2F") --String(https://)
if aob~=nil then
for i=1, aob.Count -1 do
ms=getCurrentMemscan()
a=tonumber(aob[i],16)
item=readString(a,200,ms.Unicode)
if item~=nil then
item1=(item):match("(.-).png")
item11=(item):match("(.-).jpg")
if item1~=nil then
item2=(item):match("https://(.-).png")
item3="https://" .. item2 .. ".png"
strings_add(items,item3)
--print(item3)
end
if item4~=nil then
item5=(item):match("https://(.-).jpg")
item6="https://" .. item5 .. ".jpg"
strings_add(items,item6)
--print(item3)
end
end
end
end
aob=nil
bx1.caption="Load List"
end
bx1.OnClick=loadPngList
list.onDblClick=selectLinks
end
--------------------- CE Menu
local mf = getMainForm()
local mainMenu = mf.Menu.Items
local extMenu = nil
for i=0,mainMenu.Count-1 do
if mainMenu.Item[i].Caption == 'Extra Extensions' then
extMenu = mainMenu.Item[i]
break
end
end
if not extMenu then
extMenu = createMenuItem(mf.Menu)
extMenu.Caption = 'Extra Extensions'
mainMenu.add(extMenu)
end
local IWiew = createMenuItem(extMenu)
IWiew.Name = 'IWiew'
IWiew.Caption = 'ImgWiewer'
IWiew.onClick = loadImgWiew
extMenu.add(IWiew)
</LuaScriptEntry>
<LuaScriptEntry Name=" Copy Pointer Offsets ">--##### Copy Pointer Offsets for Cheat Engine
--##### Author: FreeER
--##### Github: https://github.com/FreeER
--##### Website: https://www.facebook.com/groups/CheatTheGame
--##### YouTube: https://www.youtube.com/channel/UCLy60mbqc3rSvh42jkpCDxw
--[[
http://cheatthegame.net/?view=thread&amp;id=37&amp;part=1#postid-48
adds a context menu option to print offsets for pointers
]]
local function findMenu(mi)
while not mi.Menu do mi = mi.Parent end
return mi.Menu
end
local del_mi = MainForm.Deletethisrecord1
local del_menu = findMenu(del_mi)
local mi = createMenuItem(del_menu)
mi.Caption = 'Print Offsets'
local function printOffsets(memrec)
print(memrec.Description)
local base,offsets=memrec.getAddress()
print(base)
if not offsets then return end
local combined = ('['):rep(#offsets) .. base
for i=#offsets, 1, -1 do
local hex = ('%02X'):format(offsets[i])
print(hex)
combined = ('%s]+%s'):format(combined,hex)
end
print(combined)
print('')
end
mi.OnClick = function()
local al = getAddressList()
local records = al.getSelectedRecords()
for k,v in pairs(records) do
if v.Type ~= vtAutoAssembler and not v.isGroupHeader then
printOffsets(v)
end
end
end
del_menu.Items.insert(del_mi.MenuIndex, mi)
</LuaScriptEntry>
<LuaScriptEntry Name="PostExec">-- Post Exec
-- #############################################################
if(MainForm.USE_DEBUG_LOG) then
print('* Post-test')
assert(debug.getinfo(var_dump).what == 'Lua')
assert(debug.getinfo(var_export).what == 'Lua')
assert(debug.getinfo(debug_dump).what == 'Lua')
local result = table.pack(MainForm.callFunction(var_export, {aaa=123}))
assert(result[1] == true and string.byte(result[2]) == string.byte('{'))
assert(MainForm.botTimer and MainForm.botTimer.Enabled == false)
assert(startAutoBattleBotTimer == nil)
assert(stopAutoBattleBotTimer == nil)
print('* finished')
end
</LuaScriptEntry>
</LuaScript>
</CheatTable>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment