diff --git a/Assets/Include/Array.au3 b/Assets/Include/Array.au3 new file mode 100644 index 0000000..046ef33 --- /dev/null +++ b/Assets/Include/Array.au3 @@ -0,0 +1,2616 @@ +#include-Once + +#include "AutoItConstants.au3" +#include "MsgBoxConstants.au3" +#include "StringConstants.au3" + +; #INDEX# ======================================================================================================================= +; Title .........: Array +; AutoIt Version : 3.3.14.2 +; Language ......: English +; Description ...: Functions for manipulating arrays. +; Author(s) .....: JdeB, Erik Pilsits, Ultima, Dale (Klaatu) Thompson, Cephas,randallc, Gary Frost, GEOSoft, +; Helias Gerassimou(hgeras), Brian Keene, Michael Michta, gcriaco, LazyCoder, Tylo, David Nuttall, +; Adam Moore (redndahead), SmOke_N, litlmike, Valik, Melba23 +; =============================================================================================================================== + +; #CURRENT# ===================================================================================================================== +; _ArrayAdd +; _ArrayBinarySearch +; _ArrayColDelete +; _ArrayColInsert +; _ArrayCombinations +; _ArrayConcatenate +; _ArrayDelete +; _ArrayDisplay +; _ArrayExtract +; _ArrayFindAll +; _ArrayInsert +; _ArrayMax +; _ArrayMaxIndex +; _ArrayMin +; _ArrayMinIndex +; _ArrayPermute +; _ArrayPop +; _ArrayPush +; _ArrayReverse +; _ArraySearch +; _ArrayShuffle +; _ArraySort +; _ArraySwap +; _ArrayToClip +; _ArrayToString +; _ArrayTranspose +; _ArrayTrim +; _ArrayUnique +; _Array1DToHistogram +; =============================================================================================================================== + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; __Array_Combinations +; __Array_ExeterInternal +; __Array_GetNext +; __Array_GreaterThan +; __Array_LessThan +; __Array_MinMaxIndex +; __Array_StringRepeat +; __ArrayDualPivotSort +; __ArrayQuickSort1D +; __ArrayQuickSort2D +; __ArrayUnique_AutoErrFunc +; =============================================================================================================================== + +; #GLOBAL CONSTANTS# ============================================================================================================ +Global Enum $ARRAYFILL_FORCE_DEFAULT, $ARRAYFILL_FORCE_SINGLEITEM, $ARRAYFILL_FORCE_INT, $ARRAYFILL_FORCE_NUMBER, $ARRAYFILL_FORCE_PTR, $ARRAYFILL_FORCE_HWND, $ARRAYFILL_FORCE_STRING +Global Enum $ARRAYUNIQUE_NOCOUNT, $ARRAYUNIQUE_COUNT +Global Enum $ARRAYUNIQUE_AUTO, $ARRAYUNIQUE_FORCE32, $ARRAYUNIQUE_FORCE64, $ARRAYUNIQUE_MATCH, $ARRAYUNIQUE_DISTINCT +; =============================================================================================================================== + +; #FUNCTION# ==================================================================================================================== +; Author ........: Jos +; Modified.......: Ultima - code cleanup; Melba23 - added 2D support & multiple addition +; =============================================================================================================================== +Func _ArrayAdd(ByRef $aArray, $vValue, $iStart = 0, $sDelim_Item = "|", $sDelim_Row = @CRLF, $iForce = $ARRAYFILL_FORCE_DEFAULT) + + If $iStart = Default Then $iStart = 0 + If $sDelim_Item = Default Then $sDelim_Item = "|" + If $sDelim_Row = Default Then $sDelim_Row = @CRLF + If $iForce = Default Then $iForce = $ARRAYFILL_FORCE_DEFAULT + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) + Local $hDataType = 0 + Switch $iForce + Case $ARRAYFILL_FORCE_INT + $hDataType = Int + Case $ARRAYFILL_FORCE_NUMBER + $hDataType = Number + Case $ARRAYFILL_FORCE_PTR + $hDataType = Ptr + Case $ARRAYFILL_FORCE_HWND + $hDataType = Hwnd + Case $ARRAYFILL_FORCE_STRING + $hDataType = String + EndSwitch + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $iForce = $ARRAYFILL_FORCE_SINGLEITEM Then + ReDim $aArray[$iDim_1 + 1] + $aArray[$iDim_1] = $vValue + Return $iDim_1 + EndIf + If IsArray($vValue) Then + If UBound($vValue, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(5, 0, -1) + $hDataType = 0 + Else + Local $aTmp = StringSplit($vValue, $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT) + If UBound($aTmp, $UBOUND_ROWS) = 1 Then + $aTmp[0] = $vValue + EndIf + $vValue = $aTmp + EndIf + Local $iAdd = UBound($vValue, $UBOUND_ROWS) + ReDim $aArray[$iDim_1 + $iAdd] + For $i = 0 To $iAdd - 1 + If IsFunc($hDataType) Then + $aArray[$iDim_1 + $i] = $hDataType($vValue[$i]) + Else + $aArray[$iDim_1 + $i] = $vValue[$i] + EndIf + Next + Return $iDim_1 + $iAdd - 1 + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) + If $iStart < 0 Or $iStart > $iDim_2 - 1 Then Return SetError(4, 0, -1) + Local $iValDim_1, $iValDim_2 = 0, $iColCount + If IsArray($vValue) Then + If UBound($vValue, $UBOUND_DIMENSIONS) <> 2 Then Return SetError(5, 0, -1) + $iValDim_1 = UBound($vValue, $UBOUND_ROWS) + $iValDim_2 = UBound($vValue, $UBOUND_COLUMNS) + $hDataType = 0 + Else + ; Convert string to 2D array + Local $aSplit_1 = StringSplit($vValue, $sDelim_Row, $STR_NOCOUNT + $STR_ENTIRESPLIT) + $iValDim_1 = UBound($aSplit_1, $UBOUND_ROWS) + Local $aTmp[$iValDim_1][0], $aSplit_2 + For $i = 0 To $iValDim_1 - 1 + $aSplit_2 = StringSplit($aSplit_1[$i], $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT) + $iColCount = UBound($aSplit_2) + If $iColCount > $iValDim_2 Then + ; Increase array size to fit max number of items on line + $iValDim_2 = $iColCount + ReDim $aTmp[$iValDim_1][$iValDim_2] + EndIf + For $j = 0 To $iColCount - 1 + $aTmp[$i][$j] = $aSplit_2[$j] + Next + Next + $vValue = $aTmp + EndIf + ; Check if too many columns to fit + If UBound($vValue, $UBOUND_COLUMNS) + $iStart > UBound($aArray, $UBOUND_COLUMNS) Then Return SetError(3, 0, -1) + ReDim $aArray[$iDim_1 + $iValDim_1][$iDim_2] + For $iWriteTo_Index = 0 To $iValDim_1 - 1 + For $j = 0 To $iDim_2 - 1 + If $j < $iStart Then + $aArray[$iWriteTo_Index + $iDim_1][$j] = "" + ElseIf $j - $iStart > $iValDim_2 - 1 Then + $aArray[$iWriteTo_Index + $iDim_1][$j] = "" + Else + If IsFunc($hDataType) Then + $aArray[$iWriteTo_Index + $iDim_1][$j] = $hDataType($vValue[$iWriteTo_Index][$j - $iStart]) + Else + $aArray[$iWriteTo_Index + $iDim_1][$j] = $vValue[$iWriteTo_Index][$j - $iStart] + EndIf + EndIf + Next + Next + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return UBound($aArray, $UBOUND_ROWS) - 1 + +EndFunc ;==>_ArrayAdd + +; #FUNCTION# ==================================================================================================================== +; Author ........: Jos +; Modified.......: Ultima - added $iEnd as parameter, code cleanup; Melba23 - added support for empty & 2D arrays +; =============================================================================================================================== +Func _ArrayBinarySearch(Const ByRef $aArray, $vValue, $iStart = 0, $iEnd = 0, $iColumn = 0) + + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iColumn = Default Then $iColumn = 0 + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + + ; Bounds checking + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) + If $iDim_1 = 0 Then Return SetError(6, 0, -1) + + If $iEnd < 1 Or $iEnd > $iDim_1 - 1 Then $iEnd = $iDim_1 - 1 + If $iStart < 0 Then $iStart = 0 + If $iStart > $iEnd Then Return SetError(4, 0, -1) + Local $iMid = Int(($iEnd + $iStart) / 2) + + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $aArray[$iStart] > $vValue Or $aArray[$iEnd] < $vValue Then Return SetError(2, 0, -1) + ; Search + While $iStart <= $iMid And $vValue <> $aArray[$iMid] + If $vValue < $aArray[$iMid] Then + $iEnd = $iMid - 1 + Else + $iStart = $iMid + 1 + EndIf + $iMid = Int(($iEnd + $iStart) / 2) + WEnd + If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iColumn < 0 Or $iColumn > $iDim_2 Then Return SetError(7, 0, -1) + If $aArray[$iStart][$iColumn] > $vValue Or $aArray[$iEnd][$iColumn] < $vValue Then Return SetError(2, 0, -1) + ; Search + While $iStart <= $iMid And $vValue <> $aArray[$iMid][$iColumn] + If $vValue < $aArray[$iMid][$iColumn] Then + $iEnd = $iMid - 1 + Else + $iStart = $iMid + 1 + EndIf + $iMid = Int(($iEnd + $iStart) / 2) + WEnd + If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found + Case Else + Return SetError(5, 0, -1) + EndSwitch + + Return $iMid +EndFunc ;==>_ArrayBinarySearch + +; #FUNCTION# ==================================================================================================================== +; Author ........: Melba23 +; Modified.......: +; =============================================================================================================================== +Func _ArrayColDelete(ByRef $aArray, $iColumn, $bConvert = False) + + If $bConvert = Default Then $bConvert = False + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) + If UBound($aArray, $UBOUND_DIMENSIONS) <> 2 Then Return SetError(2, 0, -1) + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) + Switch $iDim_2 + Case 2 + If $iColumn < 0 Or $iColumn > 1 Then Return SetError(3, 0, -1) + If $bConvert Then + Local $aTempArray[$iDim_1] + For $i = 0 To $iDim_1 - 1 + $aTempArray[$i] = $aArray[$i][(Not $iColumn)] + Next + $aArray = $aTempArray + Else + ContinueCase + EndIf + Case Else + If $iColumn < 0 Or $iColumn > $iDim_2 - 1 Then Return SetError(3, 0, -1) + For $i = 0 To $iDim_1 - 1 + For $j = $iColumn To $iDim_2 - 2 + $aArray[$i][$j] = $aArray[$i][$j + 1] + Next + Next + ReDim $aArray[$iDim_1][$iDim_2 - 1] + EndSwitch + + Return UBound($aArray, $UBOUND_COLUMNS) +EndFunc ;==>_ArrayColDelete + +; #FUNCTION# ==================================================================================================================== +; Author ........: Melba23 +; Modified.......: +; =============================================================================================================================== +Func _ArrayColInsert(ByRef $aArray, $iColumn) + + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + Local $aTempArray[$iDim_1][2] + Switch $iColumn + Case 0, 1 + For $i = 0 To $iDim_1 - 1 + $aTempArray[$i][(Not $iColumn)] = $aArray[$i] + Next + Case Else + Return SetError(3, 0, -1) + EndSwitch + $aArray = $aTempArray + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) + If $iColumn < 0 Or $iColumn > $iDim_2 Then Return SetError(3, 0, -1) + ReDim $aArray[$iDim_1][$iDim_2 + 1] + For $i = 0 To $iDim_1 - 1 + For $j = $iDim_2 To $iColumn + 1 Step -1 + $aArray[$i][$j] = $aArray[$i][$j - 1] + Next + $aArray[$i][$iColumn] = "" + Next + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return UBound($aArray, $UBOUND_COLUMNS) +EndFunc ;==>_ArrayColInsert + +; #FUNCTION# ==================================================================================================================== +; Author ........: Erik Pilsits +; Modified.......: 07/08/2008 +; =============================================================================================================================== +Func _ArrayCombinations(Const ByRef $aArray, $iSet, $sDelimiter = "") + + If $sDelimiter = Default Then $sDelimiter = "" + If Not IsArray($aArray) Then Return SetError(1, 0, 0) + If UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(2, 0, 0) + + Local $iN = UBound($aArray) + Local $iR = $iSet + Local $aIdx[$iR] + For $i = 0 To $iR - 1 + $aIdx[$i] = $i + Next + Local $iTotal = __Array_Combinations($iN, $iR) + Local $iLeft = $iTotal + Local $aResult[$iTotal + 1] + $aResult[0] = $iTotal + + Local $iCount = 1 + While $iLeft > 0 + __Array_GetNext($iN, $iR, $iLeft, $iTotal, $aIdx) + For $i = 0 To $iSet - 1 + $aResult[$iCount] &= $aArray[$aIdx[$i]] & $sDelimiter + Next + If $sDelimiter <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1) + $iCount += 1 + WEnd + Return $aResult +EndFunc ;==>_ArrayCombinations + +; #FUNCTION# ==================================================================================================================== +; Author ........: Ultima +; Modified.......: Partypooper - added target start index; Melba23 - add 2D support +; =============================================================================================================================== +Func _ArrayConcatenate(ByRef $aArrayTarget, Const ByRef $aArraySource, $iStart = 0) + + If $iStart = Default Then $iStart = 0 + If Not IsArray($aArrayTarget) Then Return SetError(1, 0, -1) + If Not IsArray($aArraySource) Then Return SetError(2, 0, -1) + Local $iDim_Total_Tgt = UBound($aArrayTarget, $UBOUND_DIMENSIONS) + Local $iDim_Total_Src = UBound($aArraySource, $UBOUND_DIMENSIONS) + Local $iDim_1_Tgt = UBound($aArrayTarget, $UBOUND_ROWS) + Local $iDim_1_Src = UBound($aArraySource, $UBOUND_ROWS) + If $iStart < 0 Or $iStart > $iDim_1_Src - 1 Then Return SetError(6, 0, -1) + Switch $iDim_Total_Tgt + Case 1 + If $iDim_Total_Src <> 1 Then Return SetError(4, 0, -1) + ReDim $aArrayTarget[$iDim_1_Tgt + $iDim_1_Src - $iStart] + For $i = $iStart To $iDim_1_Src - 1 + $aArrayTarget[$iDim_1_Tgt + $i - $iStart] = $aArraySource[$i] + Next + Case 2 + If $iDim_Total_Src <> 2 Then Return SetError(4, 0, -1) + Local $iDim_2_Tgt = UBound($aArrayTarget, $UBOUND_COLUMNS) + If UBound($aArraySource, $UBOUND_COLUMNS) <> $iDim_2_Tgt Then Return SetError(5, 0, -1) + ReDim $aArrayTarget[$iDim_1_Tgt + $iDim_1_Src - $iStart][$iDim_2_Tgt] + For $i = $iStart To $iDim_1_Src - 1 + For $j = 0 To $iDim_2_Tgt - 1 + $aArrayTarget[$iDim_1_Tgt + $i - $iStart][$j] = $aArraySource[$i][$j] + Next + Next + Case Else + Return SetError(3, 0, -1) + EndSwitch + Return UBound($aArrayTarget, $UBOUND_ROWS) +EndFunc ;==>_ArrayConcatenate + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - array passed ByRef, jaberwocky6669, Melba23 - added 2D support & multiple deletion +; =============================================================================================================================== +Func _ArrayDelete(ByRef $aArray, $vRange) + + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + If IsArray($vRange) Then + If UBound($vRange, $UBOUND_DIMENSIONS) <> 1 Or UBound($vRange, $UBOUND_ROWS) < 2 Then Return SetError(4, 0, -1) + Else + ; Expand range + Local $iNumber, $aSplit_1, $aSplit_2 + $vRange = StringStripWS($vRange, 8) + $aSplit_1 = StringSplit($vRange, ";") + $vRange = "" + For $i = 1 To $aSplit_1[0] + ; Check for correct range syntax + If Not StringRegExp($aSplit_1[$i], "^\d+(-\d+)?$") Then Return SetError(3, 0, -1) + $aSplit_2 = StringSplit($aSplit_1[$i], "-") + Switch $aSplit_2[0] + Case 1 + $vRange &= $aSplit_2[1] & ";" + Case 2 + If Number($aSplit_2[2]) >= Number($aSplit_2[1]) Then + $iNumber = $aSplit_2[1] - 1 + Do + $iNumber += 1 + $vRange &= $iNumber & ";" + Until $iNumber = $aSplit_2[2] + EndIf + EndSwitch + Next + $vRange = StringSplit(StringTrimRight($vRange, 1), ";") + EndIf + If $vRange[1] < 0 Or $vRange[$vRange[0]] > $iDim_1 Then Return SetError(5, 0, -1) + ; Remove rows + Local $iCopyTo_Index = 0 + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + ; Loop through array flagging elements to be deleted + For $i = 1 To $vRange[0] + $aArray[$vRange[$i]] = ChrW(0xFAB1) + Next + ; Now copy rows to keep to fill deleted rows + For $iReadFrom_Index = 0 To $iDim_1 + If $aArray[$iReadFrom_Index] == ChrW(0xFAB1) Then + ContinueLoop + Else + If $iReadFrom_Index <> $iCopyTo_Index Then + $aArray[$iCopyTo_Index] = $aArray[$iReadFrom_Index] + EndIf + $iCopyTo_Index += 1 + EndIf + Next + ReDim $aArray[$iDim_1 - $vRange[0] + 1] + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + ; Loop through array flagging elements to be deleted + For $i = 1 To $vRange[0] + $aArray[$vRange[$i]][0] = ChrW(0xFAB1) + Next + ; Now copy rows to keep to fill deleted rows + For $iReadFrom_Index = 0 To $iDim_1 + If $aArray[$iReadFrom_Index][0] == ChrW(0xFAB1) Then + ContinueLoop + Else + If $iReadFrom_Index <> $iCopyTo_Index Then + For $j = 0 To $iDim_2 + $aArray[$iCopyTo_Index][$j] = $aArray[$iReadFrom_Index][$j] + Next + EndIf + $iCopyTo_Index += 1 + EndIf + Next + ReDim $aArray[$iDim_1 - $vRange[0] + 1][$iDim_2 + 1] + Case Else + Return SetError(2, 0, False) + EndSwitch + + Return UBound($aArray, $UBOUND_ROWS) + +EndFunc ;==>_ArrayDelete + +; #FUNCTION# ==================================================================================================================== +; Author ........: randallc, Ultima +; Modified.......: Gary Frost (gafrost), Ultima, Zedna, jpm, Melba23, AZJIO, UEZ +; =============================================================================================================================== +Func _ArrayDisplay(Const ByRef $aArray, $sTitle = Default, $sArrayRange = Default, $iFlags = Default, $vUser_Separator = Default, $sHeader = Default, $iMax_ColWidth = Default, $iAlt_Color = Default, $hUser_Function = Default) + + ; Default values + If $sTitle = Default Then $sTitle = "ArrayDisplay" + If $sArrayRange = Default Then $sArrayRange = "" + If $iFlags = Default Then $iFlags = 0 + If $vUser_Separator = Default Then $vUser_Separator = "" + If $sHeader = Default Then $sHeader = "" + If $iMax_ColWidth = Default Then $iMax_ColWidth = 350 + If $iAlt_Color = Default Then $iAlt_Color = 0 + If $hUser_Function = Default Then $hUser_Function = 0 + + ; Check for transpose, column align, verbosity and button and "Row" column visibility + Local $iTranspose = BitAND($iFlags, 1) + Local $iColAlign = BitAND($iFlags, 6) ; 0 = Left (default); 2 = Right; 4 = Center + Local $iVerbose = BitAND($iFlags, 8) + Local $iButtonMargin = ((BitAND($iFlags, 32)) ? (0) : ((BitAND($iFlags, 16)) ? (20) : (40))) ; Flag 32 = 0; flag 16 = 20; neither flag = 40 + Local $iNoRow = BitAND($iFlags, 64) + + ; Check valid array + Local $sMsg = "", $iRet = 1 + If IsArray($aArray) Then + ; Dimension checking + Local $iDimension = UBound($aArray, $UBOUND_DIMENSIONS), $iRowCount = UBound($aArray, $UBOUND_ROWS), $iColCount = UBound($aArray, $UBOUND_COLUMNS) + If $iDimension > 2 Then + $sMsg = "Larger than 2D array passed to function" + $iRet = 2 + EndIf + Else + $sMsg = "No array variable passed to function" + EndIf + If $sMsg Then + If $iVerbose And MsgBox($MB_SYSTEMMODAL + $MB_ICONERROR + $MB_YESNO, _ + "ArrayDisplay Error: " & $sTitle, $sMsg & @CRLF & @CRLF & "Exit the script?") = $IDYES Then + Exit + Else + Return SetError($iRet, 0, "") + EndIf + EndIf + + ; Determine copy separator + Local $iCW_ColWidth = Number($vUser_Separator) + + ; Separator handling + Local $sAD_Separator = ChrW(0xFAB1) + ; Set separator to use in this UDF and store existing one + Local $sCurr_Separator = Opt("GUIDataSeparatorChar", $sAD_Separator) + ; Set default user separator if required + If $vUser_Separator = "" Then $vUser_Separator = $sCurr_Separator + + ; Declare variables + Local $vTmp, $iRowLimit = 65525, $iColLimit = 250 ; Row = AutoIt 64k limit minus UDF controls; Column - arbitrary limit + + ; Set original dimensions for data display + Local $iDataRow = $iRowCount + Local $iDataCol = $iColCount + + ; Set display limits for dimensions - column value only set for 2D arrays + Local $iItem_Start = 0, $iItem_End = $iRowCount - 1, $iSubItem_Start = 0, $iSubItem_End = (($iDimension = 2) ? ($iColCount - 1) : (0)) + ; Flag to determine if range set + Local $bRange_Flag = False, $avRangeSplit + ; Check for range settings + If $sArrayRange Then + ; Split into separate dimension sections + Local $aArray_Range = StringRegExp($sArrayRange & "||", "(?U)(.*)\|", 3) + ; Dimension 1 + If $aArray_Range[0] Then + $avRangeSplit = StringSplit($aArray_Range[0], ":") + If @error Then + $iItem_End = Number($avRangeSplit[1]) + Else + $iItem_Start = Number($avRangeSplit[1]) + $iItem_End = Number($avRangeSplit[2]) + EndIf + EndIf + ; Check row bounds + If $iItem_Start > $iItem_End Then + $vTmp = $iItem_Start + $iItem_Start = $iItem_End + $iItem_End = $vTmp + EndIf + If $iItem_Start < 0 Then $iItem_Start = 0 + If $iItem_End > $iRowCount - 1 Then $iItem_End = $iRowCount - 1 + ; Check if range set + If $iItem_Start <> 0 Or $iItem_End <> $iRowCount - 1 Then $bRange_Flag = True + ; Dimension 2 + If $iDimension = 2 And $aArray_Range[1] Then + $avRangeSplit = StringSplit($aArray_Range[1], ":") + If @error Then + $iSubItem_End = Number($avRangeSplit[1]) + Else + $iSubItem_Start = Number($avRangeSplit[1]) + $iSubItem_End = Number($avRangeSplit[2]) + EndIf + ; Check column bounds + If $iSubItem_Start > $iSubItem_End Then + $vTmp = $iSubItem_Start + $iSubItem_Start = $iSubItem_End + $iSubItem_End = $vTmp + EndIf + If $iSubItem_Start < 0 Then $iSubItem_Start = 0 + If $iSubItem_End > $iColCount - 1 Then $iSubItem_End = $iColCount - 1 + ; Check if range set + If $iSubItem_Start <> 0 Or $iSubItem_End <> $iColCount - 1 Then $bRange_Flag = True + EndIf + EndIf + + ; Create data display + Local $sDisplayData = "[" & $iDataRow + ; Check if rows will be truncated + Local $bTruncated = False + If $iTranspose Then + If $iItem_End - $iItem_Start > $iColLimit Then + $bTruncated = True + $iItem_End = $iItem_Start + $iColLimit - 1 + EndIf + Else + If $iItem_End - $iItem_Start > $iRowLimit Then + $bTruncated = True + $iItem_End = $iItem_Start + $iRowLimit - 1 + EndIf + EndIf + If $bTruncated Then + $sDisplayData &= "*]" + Else + $sDisplayData &= "]" + EndIf + If $iDimension = 2 Then + $sDisplayData &= " [" & $iDataCol + If $iTranspose Then + If $iSubItem_End - $iSubItem_Start > $iRowLimit Then + $bTruncated = True + $iSubItem_End = $iSubItem_Start + $iRowLimit - 1 + EndIf + Else + If $iSubItem_End - $iSubItem_Start > $iColLimit Then + $bTruncated = True + $iSubItem_End = $iSubItem_Start + $iColLimit - 1 + EndIf + EndIf + If $bTruncated Then + $sDisplayData &= "*]" + Else + $sDisplayData &= "]" + EndIf + EndIf + ; Create tooltip data + Local $sTipData = "" + If $bTruncated Then $sTipData &= "Truncated" + If $bRange_Flag Then + If $sTipData Then $sTipData &= " - " + $sTipData &= "Range set" + EndIf + If $iTranspose Then + If $sTipData Then $sTipData &= " - " + $sTipData &= "Transposed" + EndIf + + ; Split custom header on separator + Local $asHeader = StringSplit($sHeader, $sCurr_Separator, $STR_NOCOUNT) ; No count element + If UBound($asHeader) = 0 Then Local $asHeader[1] = [""] + $sHeader = "Row" + Local $iIndex = $iSubItem_Start + If $iTranspose Then + ; All default headers + For $j = $iItem_Start To $iItem_End + $sHeader &= $sAD_Separator & "Col " & $j + Next + Else + ; Create custom header with available items + If $asHeader[0] Then + ; Set as many as available + For $iIndex = $iSubItem_Start To $iSubItem_End + ; Check custom header available + If $iIndex >= UBound($asHeader) Then ExitLoop + $sHeader &= $sAD_Separator & $asHeader[$iIndex] + Next + EndIf + ; Add default headers to fill to end + For $j = $iIndex To $iSubItem_End + $sHeader &= $sAD_Separator & "Col " & $j + Next + EndIf + ; Remove "Row" header if not needed + If $iNoRow Then $sHeader = StringTrimLeft($sHeader, 4) + + ; Display splash dialog if required + If $iVerbose And ($iItem_End - $iItem_Start + 1) * ($iSubItem_End - $iSubItem_Start + 1) > 10000 Then + SplashTextOn("ArrayDisplay", "Preparing display" & @CRLF & @CRLF & "Please be patient", 300, 100) + EndIf + + ; Convert array into ListViewItem compatible lines + Local $iBuffer = 4094 ; Max characters a ListView will display (Windows limitation) + If $iTranspose Then + ; Swap dimensions + $vTmp = $iItem_Start + $iItem_Start = $iSubItem_Start + $iSubItem_Start = $vTmp + $vTmp = $iItem_End + $iItem_End = $iSubItem_End + $iSubItem_End = $vTmp + EndIf + Local $avArrayText[$iItem_End - $iItem_Start + 1] + For $i = $iItem_Start To $iItem_End + ; Add row number if required + If Not $iNoRow Then $avArrayText[$i - $iItem_Start] = "[" & $i & "]" + For $j = $iSubItem_Start To $iSubItem_End + If $iDimension = 1 Then + If $iTranspose Then + Switch VarGetType($aArray[$j]) + Case "Array" + $vTmp = "{Array}" + Case Else + $vTmp = $aArray[$j] + EndSwitch + Else + Switch VarGetType($aArray[$i]) + Case "Array" + $vTmp = "{Array}" + Case Else + $vTmp = $aArray[$i] + EndSwitch + EndIf + Else + If $iTranspose Then + Switch VarGetType($aArray[$j][$i]) + Case "Array" + $vTmp = "{Array}" + Case Else + $vTmp = $aArray[$j][$i] + EndSwitch + Else + Switch VarGetType($aArray[$i][$j]) + Case "Array" + $vTmp = "{Array}" + Case Else + $vTmp = $aArray[$i][$j] + EndSwitch + EndIf + EndIf + ; Truncate if required so ListView will display + If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer) + $avArrayText[$i - $iItem_Start] &= $sAD_Separator & $vTmp + Next + ; Remove leading delimiter if no "Row" column + If $iNoRow Then $avArrayText[$i - $iItem_Start] = StringTrimLeft($avArrayText[$i - $iItem_Start], 1) + Next + + ; GUI Constants + Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 64 + Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 102 + Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 512 + Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 2 + Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 4 + Local Const $_ARRAYCONSTANT_GUI_DOCKHCENTER = 8 + Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3 + Local Const $_ARRAYCONSTANT_GUI_FOCUS = 256 + Local Const $_ARRAYCONSTANT_GUI_BKCOLOR_LV_ALTERNATE = 0xFE000000 + Local Const $_ARRAYCONSTANT_SS_CENTER = 0x1 + Local Const $_ARRAYCONSTANT_SS_CENTERIMAGE = 0x0200 + Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4) + Local Const $_ARRAYCONSTANT_LVM_GETITEMRECT = (0x1000 + 14) + Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29) + Local Const $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH = (0x1000 + 30) + Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44) + Local Const $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT = (0x1000 + 50) + Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54) + Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1 + Local Const $_ARRAYCONSTANT_LVIS_SELECTED = 0x2 + Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8 + Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20 + Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200 + Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000 + Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000 + Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000 + Local Const $_ARRAYCONSTANT_WM_SETREDRAW = 11 + Local Const $_ARRAYCONSTANT_LVSCW_AUTOSIZE = -1 + + ; Set coord mode 1 + Local $iCoordMode = Opt("GUICoordMode", 1) + + ; Create GUI + Local $iOrgWidth = 210, $iHeight = 200, $iMinSize = 250 + Local $hGUI = GUICreate($sTitle, $iOrgWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX)) + Local $aiGUISize = WinGetClientSize($hGUI) + Local $iButtonWidth_2 = $aiGUISize[0] / 2 + Local $iButtonWidth_3 = $aiGUISize[0] / 3 + ; Create ListView + Local $idListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - $iButtonMargin, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS) + GUICtrlSetBkColor($idListView, $_ARRAYCONSTANT_GUI_BKCOLOR_LV_ALTERNATE) + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES) + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT) + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE) + Local $idCopy_ID = 9999, $idCopy_Data = 99999, $idData_Label = 99999, $idUser_Func = 99999, $idExit_Script = 99999 + ; Check if any buttons required + If $iButtonMargin Then + ; Create Copy buttons + $idCopy_ID = GUICtrlCreateButton("Copy Data && Hdr/Row", 0, $aiGUISize[1] - $iButtonMargin, $iButtonWidth_2, 20) + $idCopy_Data = GUICtrlCreateButton("Copy Data Only", $iButtonWidth_2, $aiGUISize[1] - $iButtonMargin, $iButtonWidth_2, 20) + ; Check if other buttons are required + If $iButtonMargin = 40 Then + Local $iButtonWidth_Var = $iButtonWidth_2 + Local $iOffset = $iButtonWidth_2 + If IsFunc($hUser_Function) Then + ; Create UserFunc button if function passed + $idUser_Func = GUICtrlCreateButton("Run User Func", $iButtonWidth_3, $aiGUISize[1] - 20, $iButtonWidth_3, 20) + $iButtonWidth_Var = $iButtonWidth_3 + $iOffset = $iButtonWidth_3 * 2 + EndIf + ; Create Exit button and data label + $idExit_Script = GUICtrlCreateButton("Exit Script", $iOffset, $aiGUISize[1] - 20, $iButtonWidth_Var, 20) + $idData_Label = GUICtrlCreateLabel($sDisplayData, 0, $aiGUISize[1] - 20, $iButtonWidth_Var, 18, BitOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE)) + ; Change label colour and create tooltip if required + Select + Case $bTruncated Or $iTranspose Or $bRange_Flag + GUICtrlSetColor($idData_Label, 0xFF0000) + GUICtrlSetTip($idData_Label, $sTipData) + EndSelect + EndIf + EndIf + ; Set resizing + GUICtrlSetResizing($idListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS) + GUICtrlSetResizing($idCopy_ID, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) + GUICtrlSetResizing($idCopy_Data, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) + GUICtrlSetResizing($idData_Label, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) + GUICtrlSetResizing($idUser_Func, $_ARRAYCONSTANT_GUI_DOCKHCENTER + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) + GUICtrlSetResizing($idExit_Script, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) + + ; Start ListView update + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_WM_SETREDRAW, 0, 0) + + ; Fill listview + Local $idItem + For $i = 0 To UBound($avArrayText) - 1 + $idItem = GUICtrlCreateListViewItem($avArrayText[$i], $idListView) + If $iAlt_Color Then + GUICtrlSetBkColor($idItem, $iAlt_Color) + EndIf + Next + + ; Align columns if required - $iColAlign = 2 for Right and 4 for Center + If $iColAlign Then + Local Const $_ARRAYCONSTANT_LVCF_FMT = 0x01 + Local Const $_ARRAYCONSTANT_LVM_SETCOLUMNW = (0x1000 + 96) + Local $tColumn = DllStructCreate("uint Mask;int Fmt;int CX;ptr Text;int TextMax;int SubItem;int Image;int Order;int cxMin;int cxDefault;int cxIdeal") + DllStructSetData($tColumn, "Mask", $_ARRAYCONSTANT_LVCF_FMT) + DllStructSetData($tColumn, "Fmt", $iColAlign / 2) ; Left = 0; Right = 1; Center = 2 + Local $pColumn = DllStructGetPtr($tColumn) + ; Loop through columns + For $i = 1 To $iSubItem_End - $iSubItem_Start + 1 + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNW, $i, $pColumn) + Next + EndIf + + ; End ListView update + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_WM_SETREDRAW, 1, 0) + + ; Allow for borders with and without vertical scrollbar + Local $iBorder = 45 + If UBound($avArrayText) > 20 Then + $iBorder += 20 + EndIf + ; Adjust dialog width + Local $iWidth = $iBorder, $iColWidth = 0, $aiColWidth[$iSubItem_End - $iSubItem_Start + 2], $iMin_ColWidth = 55 + ; Get required column widths to fit items + For $i = 0 To $iSubItem_End - $iSubItem_Start + 1 + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $_ARRAYCONSTANT_LVSCW_AUTOSIZE) + $iColWidth = GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0) + ; Set minimum if required + If $iColWidth < $iMin_ColWidth Then + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $iMin_ColWidth) + $iColWidth = $iMin_ColWidth + EndIf + ; Add to total width + $iWidth += $iColWidth + ; Store value + $aiColWidth[$i] = $iColWidth + Next + ; Reduce width if no "Row" colukm + If $iNoRow Then $iWidth -= 55 + ; Now check max size + If $iWidth > @DesktopWidth - 100 Then + ; Apply max col width limit to reduce width + $iWidth = $iBorder + For $i = 0 To $iSubItem_End - $iSubItem_Start + 1 + If $aiColWidth[$i] > $iMax_ColWidth Then + ; Reset width + GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $iMax_ColWidth) + $iWidth += $iMax_ColWidth + Else + ; Retain width + $iWidth += $aiColWidth[$i] + EndIf + Next + EndIf + ; Check max/min width + If $iWidth > @DesktopWidth - 100 Then + $iWidth = @DesktopWidth - 100 + ElseIf $iWidth < $iMinSize Then + $iWidth = $iMinSize + EndIf + + ; Get row height + Local $tRECT = DllStructCreate("struct; long Left;long Top;long Right;long Bottom; endstruct") ; $tagRECT + DllCall("user32.dll", "struct*", "SendMessageW", "hwnd", GUICtrlGetHandle($idListView), "uint", $_ARRAYCONSTANT_LVM_GETITEMRECT, "wparam", 0, "struct*", $tRECT) + ; Set required GUI height + Local $aiWin_Pos = WinGetPos($hGUI) + Local $aiLV_Pos = ControlGetPos($hGUI, "", $idListView) + $iHeight = ((UBound($avArrayText) + 2) * (DllStructGetData($tRECT, "Bottom") - DllStructGetData($tRECT, "Top"))) + $aiWin_Pos[3] - $aiLV_Pos[3] + ; Check min/max height + If $iHeight > @DesktopHeight - 100 Then + $iHeight = @DesktopHeight - 100 + ElseIf $iHeight < $iMinSize Then + $iHeight = $iMinSize + EndIf + + If $iVerbose Then SplashOff() + + ; Display and resize dialog + GUISetState(@SW_HIDE, $hGUI) + WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, (@DesktopHeight - $iHeight) / 2, $iWidth, $iHeight) + GUISetState(@SW_SHOW, $hGUI) + + ; Switch to GetMessage mode + Local $iOnEventMode = Opt("GUIOnEventMode", 0), $iMsg + + While 1 + + $iMsg = GUIGetMsg() ; Variable needed to check which "Copy" button was pressed + Switch $iMsg + Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE + ExitLoop + + Case $idCopy_ID, $idCopy_Data + ; Count selected rows + Local $iSel_Count = GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT, 0, 0) + ; Display splash dialog if required + If $iVerbose And (Not $iSel_Count) And ($iItem_End - $iItem_Start) * ($iSubItem_End - $iSubItem_Start) > 10000 Then + SplashTextOn("ArrayDisplay", "Copying data" & @CRLF & @CRLF & "Please be patient", 300, 100) + EndIf + ; Generate clipboard text + Local $sClip = "", $sItem, $aSplit + ; Add items + For $i = 0 To $iItem_End - $iItem_Start + ; Skip if copying selected rows and item not selected + If $iSel_Count And Not (GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, $_ARRAYCONSTANT_LVIS_SELECTED)) Then + ContinueLoop + EndIf + $sItem = $avArrayText[$i] + If $iMsg = $idCopy_Data Then + ; Remove row ID if required + $sItem = StringRegExpReplace($sItem, "^\[\d+\].(.*)$", "$1") + EndIf + If $iCW_ColWidth Then + ; Expand columns + $aSplit = StringSplit($sItem, $sAD_Separator) + $sItem = "" + For $j = 1 To $aSplit[0] + $sItem &= StringFormat("%-" & $iCW_ColWidth + 1 & "s", StringLeft($aSplit[$j], $iCW_ColWidth)) + Next + Else + ; Use defined separator + $sItem = StringReplace($sItem, $sAD_Separator, $vUser_Separator) + EndIf + $sClip &= $sItem & @CRLF + Next + ; Add header line if required + If $iMsg = $idCopy_ID Then + If $iCW_ColWidth Then + $aSplit = StringSplit($sHeader, $sAD_Separator) + $sItem = "" + For $j = 1 To $aSplit[0] + $sItem &= StringFormat("%-" & $iCW_ColWidth + 1 & "s", StringLeft($aSplit[$j], $iCW_ColWidth)) + Next + Else + $sItem = StringReplace($sHeader, $sAD_Separator, $vUser_Separator) + EndIf + $sClip = $sItem & @CRLF & $sClip + EndIf + ;Send to clipboard + ClipPut($sClip) + ; Remove splash if used + SplashOff() + ; Refocus ListView + GUICtrlSetState($idListView, $_ARRAYCONSTANT_GUI_FOCUS) + + Case $idUser_Func + ; Get selected indices + Local $aiSelItems[$iRowLimit] = [0] + For $i = 0 To GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0) + If GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, $_ARRAYCONSTANT_LVIS_SELECTED) Then + $aiSelItems[0] += 1 + $aiSelItems[$aiSelItems[0]] = $i + $iItem_Start + EndIf + Next + ReDim $aiSelItems[$aiSelItems[0] + 1] + ; Pass array and selection to user function + $hUser_Function($aArray, $aiSelItems) + GUICtrlSetState($idListView, $_ARRAYCONSTANT_GUI_FOCUS) + + Case $idExit_Script + ; Clear up + GUIDelete($hGUI) + Exit + EndSwitch + WEnd + + ; Clear up + GUIDelete($hGUI) + Opt("GUICoordMode", $iCoordMode) ; Reset original Coord mode + Opt("GUIOnEventMode", $iOnEventMode) ; Reset original GUI mode + Opt("GUIDataSeparatorChar", $sCurr_Separator) ; Reset original separator + + Return 1 + +EndFunc ;==>_ArrayDisplay + +; #FUNCTION# ==================================================================================================================== +; Author ........: Melba23 +; Modified.......: +; =============================================================================================================================== +Func _ArrayExtract(Const ByRef $aArray, $iStart_Row = -1, $iEnd_Row = -1, $iStart_Col = -1, $iEnd_Col = -1) + + If $iStart_Row = Default Then $iStart_Row = -1 + If $iEnd_Row = Default Then $iEnd_Row = -1 + If $iStart_Col = Default Then $iStart_Col = -1 + If $iEnd_Col = Default Then $iEnd_Col = -1 + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + If $iEnd_Row = -1 Then $iEnd_Row = $iDim_1 + If $iStart_Row = -1 Then $iStart_Row = 0 + If $iStart_Row < -1 Or $iEnd_Row < -1 Then Return SetError(3, 0, -1) + If $iStart_Row > $iDim_1 Or $iEnd_Row > $iDim_1 Then Return SetError(3, 0, -1) + If $iStart_Row > $iEnd_Row Then Return SetError(4, 0, -1) + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + Local $aRetArray[$iEnd_Row - $iStart_Row + 1] + For $i = 0 To $iEnd_Row - $iStart_Row + $aRetArray[$i] = $aArray[$i + $iStart_Row] + Next + Return $aRetArray + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iEnd_Col = -1 Then $iEnd_Col = $iDim_2 + If $iStart_Col = -1 Then $iStart_Col = 0 + If $iStart_Col < -1 Or $iEnd_Col < -1 Then Return SetError(5, 0, -1) + If $iStart_Col > $iDim_2 Or $iEnd_Col > $iDim_2 Then Return SetError(5, 0, -1) + If $iStart_Col > $iEnd_Col Then Return SetError(6, 0, -1) + If $iStart_Col = $iEnd_Col Then + Local $aRetArray[$iEnd_Row - $iStart_Row + 1] + Else + Local $aRetArray[$iEnd_Row - $iStart_Row + 1][$iEnd_Col - $iStart_Col + 1] + EndIf + For $i = 0 To $iEnd_Row - $iStart_Row + For $j = 0 To $iEnd_Col - $iStart_Col + If $iStart_Col = $iEnd_Col Then + $aRetArray[$i] = $aArray[$i + $iStart_Row][$j + $iStart_Col] + Else + $aRetArray[$i][$j] = $aArray[$i + $iStart_Row][$j + $iStart_Col] + EndIf + Next + Next + Return $aRetArray + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return 1 + +EndFunc ;==>_ArrayExtract + +; #FUNCTION# ==================================================================================================================== +; Author ........: GEOSoft, Ultima +; Modified.......: +; =============================================================================================================================== +Func _ArrayFindAll(Const ByRef $aArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iCompare = 0, $iSubItem = 0, $bRow = False) + + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iCase = Default Then $iCase = 0 + If $iCompare = Default Then $iCompare = 0 + If $iSubItem = Default Then $iSubItem = 0 + If $bRow = Default Then $bRow = False + + $iStart = _ArraySearch($aArray, $vValue, $iStart, $iEnd, $iCase, $iCompare, 1, $iSubItem, $bRow) + If @error Then Return SetError(@error, 0, -1) + + Local $iIndex = 0, $avResult[UBound($aArray, ($bRow ? $UBOUND_COLUMNS : $UBOUND_ROWS))] ; Set dimension for Column/Row + Do + $avResult[$iIndex] = $iStart + $iIndex += 1 + $iStart = _ArraySearch($aArray, $vValue, $iStart + 1, $iEnd, $iCase, $iCompare, 1, $iSubItem, $bRow) + Until @error + + ReDim $avResult[$iIndex] + Return $avResult +EndFunc ;==>_ArrayFindAll + +; #FUNCTION# ==================================================================================================================== +; Author ........: Jos +; Modified.......: Ultima - code cleanup; Melba23 - element position check, 2D support & multiple insertions +; =============================================================================================================================== +Func _ArrayInsert(ByRef $aArray, $vRange, $vValue = "", $iStart = 0, $sDelim_Item = "|", $sDelim_Row = @CRLF, $iForce = $ARRAYFILL_FORCE_DEFAULT) + + If $vValue = Default Then $vValue = "" + If $iStart = Default Then $iStart = 0 + If $sDelim_Item = Default Then $sDelim_Item = "|" + If $sDelim_Row = Default Then $sDelim_Row = @CRLF + If $iForce = Default Then $iForce = $ARRAYFILL_FORCE_DEFAULT + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + Local $hDataType = 0 + Switch $iForce + Case $ARRAYFILL_FORCE_INT + $hDataType = Int + Case $ARRAYFILL_FORCE_NUMBER + $hDataType = Number + Case $ARRAYFILL_FORCE_PTR + $hDataType = Ptr + Case $ARRAYFILL_FORCE_HWND + $hDataType = Hwnd + Case $ARRAYFILL_FORCE_STRING + $hDataType = String + EndSwitch + Local $aSplit_1, $aSplit_2 + If IsArray($vRange) Then + If UBound($vRange, $UBOUND_DIMENSIONS) <> 1 Or UBound($vRange, $UBOUND_ROWS) < 2 Then Return SetError(4, 0, -1) + Else + ; Expand range + Local $iNumber + $vRange = StringStripWS($vRange, 8) + $aSplit_1 = StringSplit($vRange, ";") + $vRange = "" + For $i = 1 To $aSplit_1[0] + ; Check for correct range syntax + If Not StringRegExp($aSplit_1[$i], "^\d+(-\d+)?$") Then Return SetError(3, 0, -1) + $aSplit_2 = StringSplit($aSplit_1[$i], "-") + Switch $aSplit_2[0] + Case 1 + $vRange &= $aSplit_2[1] & ";" + Case 2 + If Number($aSplit_2[2]) >= Number($aSplit_2[1]) Then + $iNumber = $aSplit_2[1] - 1 + Do + $iNumber += 1 + $vRange &= $iNumber & ";" + Until $iNumber = $aSplit_2[2] + EndIf + EndSwitch + Next + $vRange = StringSplit(StringTrimRight($vRange, 1), ";") + EndIf + If $vRange[1] < 0 Or $vRange[$vRange[0]] > $iDim_1 Then Return SetError(5, 0, -1) + For $i = 2 To $vRange[0] + If $vRange[$i] < $vRange[$i - 1] Then Return SetError(3, 0, -1) + Next + Local $iCopyTo_Index = $iDim_1 + $vRange[0] + Local $iInsertPoint_Index = $vRange[0] + ; Get lowest insert point + Local $iInsert_Index = $vRange[$iInsertPoint_Index] + ; Insert lines + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $iForce = $ARRAYFILL_FORCE_SINGLEITEM Then + ReDim $aArray[$iDim_1 + $vRange[0] + 1] + For $iReadFromIndex = $iDim_1 To 0 Step -1 + ; Copy existing elements + $aArray[$iCopyTo_Index] = $aArray[$iReadFromIndex] + ; Move up array + $iCopyTo_Index -= 1 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + While $iReadFromIndex = $iInsert_Index + ; Insert new item + $aArray[$iCopyTo_Index] = $vValue + ; Move up array + $iCopyTo_Index -= 1 + ; Reset insert index + $iInsertPoint_Index -= 1 + If $iInsertPoint_Index < 1 Then ExitLoop 2 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + WEnd + Next + Return $iDim_1 + $vRange[0] + 1 + EndIf + ReDim $aArray[$iDim_1 + $vRange[0] + 1] + If IsArray($vValue) Then + If UBound($vValue, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(5, 0, -1) + $hDataType = 0 + Else + Local $aTmp = StringSplit($vValue, $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT) + If UBound($aTmp, $UBOUND_ROWS) = 1 Then + $aTmp[0] = $vValue + $hDataType = 0 + EndIf + $vValue = $aTmp + EndIf + For $iReadFromIndex = $iDim_1 To 0 Step -1 + ; Copy existing elements + $aArray[$iCopyTo_Index] = $aArray[$iReadFromIndex] + ; Move up array + $iCopyTo_Index -= 1 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + While $iReadFromIndex = $iInsert_Index + ; Insert new item + If $iInsertPoint_Index <= UBound($vValue, $UBOUND_ROWS) Then + If IsFunc($hDataType) Then + $aArray[$iCopyTo_Index] = $hDataType($vValue[$iInsertPoint_Index - 1]) + Else + $aArray[$iCopyTo_Index] = $vValue[$iInsertPoint_Index - 1] + EndIf + Else + $aArray[$iCopyTo_Index] = "" + EndIf + ; Move up array + $iCopyTo_Index -= 1 + ; Reset insert index + $iInsertPoint_Index -= 1 + If $iInsertPoint_Index = 0 Then ExitLoop 2 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + WEnd + Next + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) + If $iStart < 0 Or $iStart > $iDim_2 - 1 Then Return SetError(6, 0, -1) + Local $iValDim_1, $iValDim_2 + If IsArray($vValue) Then + If UBound($vValue, $UBOUND_DIMENSIONS) <> 2 Then Return SetError(7, 0, -1) + $iValDim_1 = UBound($vValue, $UBOUND_ROWS) + $iValDim_2 = UBound($vValue, $UBOUND_COLUMNS) + $hDataType = 0 + Else + ; Convert string to 2D array + $aSplit_1 = StringSplit($vValue, $sDelim_Row, $STR_NOCOUNT + $STR_ENTIRESPLIT) + $iValDim_1 = UBound($aSplit_1, $UBOUND_ROWS) + StringReplace($aSplit_1[0], $sDelim_Item, "") + $iValDim_2 = @extended + 1 + Local $aTmp[$iValDim_1][$iValDim_2] + For $i = 0 To $iValDim_1 - 1 + $aSplit_2 = StringSplit($aSplit_1[$i], $sDelim_Item, $STR_NOCOUNT + $STR_ENTIRESPLIT) + For $j = 0 To $iValDim_2 - 1 + $aTmp[$i][$j] = $aSplit_2[$j] + Next + Next + $vValue = $aTmp + EndIf + ; Check if too many columns to fit + If UBound($vValue, $UBOUND_COLUMNS) + $iStart > UBound($aArray, $UBOUND_COLUMNS) Then Return SetError(8, 0, -1) + ReDim $aArray[$iDim_1 + $vRange[0] + 1][$iDim_2] + For $iReadFromIndex = $iDim_1 To 0 Step -1 + ; Copy existing elements + For $j = 0 To $iDim_2 - 1 + $aArray[$iCopyTo_Index][$j] = $aArray[$iReadFromIndex][$j] + Next + ; Move up array + $iCopyTo_Index -= 1 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + While $iReadFromIndex = $iInsert_Index + ; Insert new item + For $j = 0 To $iDim_2 - 1 + If $j < $iStart Then + $aArray[$iCopyTo_Index][$j] = "" + ElseIf $j - $iStart > $iValDim_2 - 1 Then + $aArray[$iCopyTo_Index][$j] = "" + Else + If $iInsertPoint_Index - 1 < $iValDim_1 Then + If IsFunc($hDataType) Then + $aArray[$iCopyTo_Index][$j] = $hDataType($vValue[$iInsertPoint_Index - 1][$j - $iStart]) + Else + $aArray[$iCopyTo_Index][$j] = $vValue[$iInsertPoint_Index - 1][$j - $iStart] + EndIf + Else + $aArray[$iCopyTo_Index][$j] = "" + EndIf + EndIf + Next + ; Move up array + $iCopyTo_Index -= 1 + ; Reset insert index + $iInsertPoint_Index -= 1 + If $iInsertPoint_Index = 0 Then ExitLoop 2 + ; Get next insert point + $iInsert_Index = $vRange[$iInsertPoint_Index] + WEnd + Next + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return UBound($aArray, $UBOUND_ROWS) +EndFunc ;==>_ArrayInsert + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup; Melba23 - Added 2D support +; =============================================================================================================================== +Func _ArrayMax(Const ByRef $aArray, $iCompNumeric = 0, $iStart = -1, $iEnd = -1, $iSubItem = 0) + + Local $iResult = _ArrayMaxIndex($aArray, $iCompNumeric, $iStart, $iEnd, $iSubItem) + If @error Then Return SetError(@error, 0, "") + If UBound($aArray, $UBOUND_DIMENSIONS) = 1 Then + Return $aArray[$iResult] + Else + Return $aArray[$iResult][$iSubItem] + EndIf +EndFunc ;==>_ArrayMax + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - Added $iCompNumeric and $iStart parameters and logic; Melba23 - Added 2D support; guinness - Reduced duplicate code. +; =============================================================================================================================== +Func _ArrayMaxIndex(Const ByRef $aArray, $iCompNumeric = 0, $iStart = -1, $iEnd = -1, $iSubItem = 0) + + If $iCompNumeric = Default Then $iCompNumeric = 0 + If $iStart = Default Then $iStart = -1 + If $iEnd = Default Then $iEnd = -1 + If $iSubItem = Default Then $iSubItem = 0 + Local $iRet = __Array_MinMaxIndex($aArray, $iCompNumeric, $iStart, $iEnd, $iSubItem, __Array_GreaterThan) ; Pass a delegate function to check if value1 > value2. + Return SetError(@error, 0, $iRet) +EndFunc ;==>_ArrayMaxIndex + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup; Melba23 - Added 2D support +; =============================================================================================================================== +Func _ArrayMin(Const ByRef $aArray, $iCompNumeric = 0, $iStart = -1, $iEnd = -1, $iSubItem = 0) + + Local $iResult = _ArrayMinIndex($aArray, $iCompNumeric, $iStart, $iEnd, $iSubItem) + If @error Then Return SetError(@error, 0, "") + If UBound($aArray, $UBOUND_DIMENSIONS) = 1 Then + Return $aArray[$iResult] + Else + Return $aArray[$iResult][$iSubItem] + EndIf +EndFunc ;==>_ArrayMin + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - Added $iCompNumeric and $iStart parameters and logic; Melba23 - Added 2D support; guinness - Reduced duplicate code. +; =============================================================================================================================== +Func _ArrayMinIndex(Const ByRef $aArray, $iCompNumeric = 0, $iStart = -1, $iEnd = -1, $iSubItem = 0) + If $iCompNumeric = Default Then $iCompNumeric = 0 + If $iStart = Default Then $iStart = -1 + If $iEnd = Default Then $iEnd = -1 + If $iSubItem = Default Then $iSubItem = 0 + Local $iRet = __Array_MinMaxIndex($aArray, $iCompNumeric, $iStart, $iEnd, $iSubItem, __Array_LessThan) ; Pass a delegate function to check if value1 < value2. + Return SetError(@error, 0, $iRet) +EndFunc ;==>_ArrayMinIndex + +; #FUNCTION# ==================================================================================================================== +; Author ........: Erik Pilsits +; Modified.......: Melba23 - added support for empty arrays +; =============================================================================================================================== +Func _ArrayPermute(ByRef $aArray, $sDelimiter = "") + + If $sDelimiter = Default Then $sDelimiter = "" + If Not IsArray($aArray) Then Return SetError(1, 0, 0) + If UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(2, 0, 0) + Local $iSize = UBound($aArray), $iFactorial = 1, $aIdx[$iSize], $aResult[1], $iCount = 1 + + If UBound($aArray) Then + For $i = 0 To $iSize - 1 + $aIdx[$i] = $i + Next + For $i = $iSize To 1 Step -1 + $iFactorial *= $i + Next + ReDim $aResult[$iFactorial + 1] + $aResult[0] = $iFactorial + __Array_ExeterInternal($aArray, 0, $iSize, $sDelimiter, $aIdx, $aResult, $iCount) + Else + $aResult[0] = 0 + EndIf + Return $aResult +EndFunc ;==>_ArrayPermute + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Ultima - code cleanup; Melba23 - added support for empty arrays +; =============================================================================================================================== +Func _ArrayPop(ByRef $aArray) + If (Not IsArray($aArray)) Then Return SetError(1, 0, "") + If UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(2, 0, "") + + Local $iUBound = UBound($aArray) - 1 + If $iUBound = -1 Then Return SetError(3, 0, "") + Local $sLastVal = $aArray[$iUBound] + + ; Remove last item + If $iUBound > -1 Then + ReDim $aArray[$iUBound] + EndIf + + ; Return last item + Return $sLastVal +EndFunc ;==>_ArrayPop + +; #FUNCTION# ==================================================================================================================== +; Author ........: Helias Gerassimou(hgeras), Ultima - code cleanup/rewrite (major optimization), fixed support for $vValue as an array +; Modified.......: +; =============================================================================================================================== +Func _ArrayPush(ByRef $aArray, $vValue, $iDirection = 0) + + If $iDirection = Default Then $iDirection = 0 + If (Not IsArray($aArray)) Then Return SetError(1, 0, 0) + If UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(3, 0, 0) + Local $iUBound = UBound($aArray) - 1 + + If IsArray($vValue) Then ; $vValue is an array + Local $iUBoundS = UBound($vValue) + If ($iUBoundS - 1) > $iUBound Then Return SetError(2, 0, 0) + + ; $vValue is an array smaller than $aArray + If $iDirection Then ; slide right, add to front + For $i = $iUBound To $iUBoundS Step -1 + $aArray[$i] = $aArray[$i - $iUBoundS] + Next + For $i = 0 To $iUBoundS - 1 + $aArray[$i] = $vValue[$i] + Next + Else ; slide left, add to end + For $i = 0 To $iUBound - $iUBoundS + $aArray[$i] = $aArray[$i + $iUBoundS] + Next + For $i = 0 To $iUBoundS - 1 + $aArray[$i + $iUBound - $iUBoundS + 1] = $vValue[$i] + Next + EndIf + Else + ; Check for empty array + If $iUBound > -1 Then + If $iDirection Then ; slide right, add to front + For $i = $iUBound To 1 Step -1 + $aArray[$i] = $aArray[$i - 1] + Next + $aArray[0] = $vValue + Else ; slide left, add to end + For $i = 0 To $iUBound - 1 + $aArray[$i] = $aArray[$i + 1] + Next + $aArray[$iUBound] = $vValue + EndIf + EndIf + EndIf + + Return 1 +EndFunc ;==>_ArrayPush + +; #FUNCTION# ==================================================================================================================== +; Author ........: Brian Keene +; Modified.......: Jos - added $iStart parameter and logic; Tylo - added $iEnd parameter and rewrote it for speed +; =============================================================================================================================== +Func _ArrayReverse(ByRef $aArray, $iStart = 0, $iEnd = 0) + + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If Not IsArray($aArray) Then Return SetError(1, 0, 0) + If UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(3, 0, 0) + If Not UBound($aArray) Then Return SetError(4, 0, 0) + + Local $vTmp, $iUBound = UBound($aArray) - 1 + + ; Bounds checking + If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound + If $iStart < 0 Then $iStart = 0 + If $iStart > $iEnd Then Return SetError(2, 0, 0) + + ; Reverse + For $i = $iStart To Int(($iStart + $iEnd - 1) / 2) + $vTmp = $aArray[$i] + $aArray[$i] = $aArray[$iEnd] + $aArray[$iEnd] = $vTmp + $iEnd -= 1 + Next + + Return 1 +EndFunc ;==>_ArrayReverse + +; #FUNCTION# ==================================================================================================================== +; Author ........: Michael Michta +; Modified.......: gcriaco ; Ultima - 2D arrays supported, directional search, code cleanup, optimization; Melba23 - added support for empty arrays and row search; BrunoJ - Added compare option 3 to use a regex pattern +; =============================================================================================================================== +Func _ArraySearch(Const ByRef $aArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iCompare = 0, $iForward = 1, $iSubItem = -1, $bRow = False) + + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iCase = Default Then $iCase = 0 + If $iCompare = Default Then $iCompare = 0 + If $iForward = Default Then $iForward = 1 + If $iSubItem = Default Then $iSubItem = -1 + If $bRow = Default Then $bRow = False + + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray) - 1 + If $iDim_1 = -1 Then Return SetError(3, 0, -1) + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + + ; Same var Type of comparison + Local $bCompType = False + If $iCompare = 2 Then + $iCompare = 0 + $bCompType = True + EndIf + ; Bounds checking + If $bRow Then + If UBound($aArray, $UBOUND_DIMENSIONS) = 1 Then Return SetError(5, 0, -1) + If $iEnd < 1 Or $iEnd > $iDim_2 Then $iEnd = $iDim_2 + If $iStart < 0 Then $iStart = 0 + If $iStart > $iEnd Then Return SetError(4, 0, -1) + Else + If $iEnd < 1 Or $iEnd > $iDim_1 Then $iEnd = $iDim_1 + If $iStart < 0 Then $iStart = 0 + If $iStart > $iEnd Then Return SetError(4, 0, -1) + EndIf + ; Direction (flip if $iForward = 0) + Local $iStep = 1 + If Not $iForward Then + Local $iTmp = $iStart + $iStart = $iEnd + $iEnd = $iTmp + $iStep = -1 + EndIf + + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 ; 1D array search + If Not $iCompare Then + If Not $iCase Then + For $i = $iStart To $iEnd Step $iStep + If $bCompType And VarGetType($aArray[$i]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$i] = $vValue Then Return $i + Next + Else + For $i = $iStart To $iEnd Step $iStep + If $bCompType And VarGetType($aArray[$i]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$i] == $vValue Then Return $i + Next + EndIf + Else + For $i = $iStart To $iEnd Step $iStep + If $iCompare = 3 Then + If StringRegExp($aArray[$i], $vValue) Then Return $i + Else + If StringInStr($aArray[$i], $vValue, $iCase) > 0 Then Return $i + EndIf + Next + EndIf + Case 2 ; 2D array search + Local $iDim_Sub + If $bRow Then + ; Search rows + $iDim_Sub = $iDim_1 + If $iSubItem > $iDim_Sub Then $iSubItem = $iDim_Sub + If $iSubItem < 0 Then + ; will search for all Col + $iSubItem = 0 + Else + $iDim_Sub = $iSubItem + EndIf + Else + ; Search columns + $iDim_Sub = $iDim_2 + If $iSubItem > $iDim_Sub Then $iSubItem = $iDim_Sub + If $iSubItem < 0 Then + ; will search for all Col + $iSubItem = 0 + Else + $iDim_Sub = $iSubItem + EndIf + EndIf + ; Now do the search + For $j = $iSubItem To $iDim_Sub + If Not $iCompare Then + If Not $iCase Then + For $i = $iStart To $iEnd Step $iStep + If $bRow Then + If $bCompType And VarGetType($aArray[$j][$j]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$j][$i] = $vValue Then Return $i + Else + If $bCompType And VarGetType($aArray[$i][$j]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$i][$j] = $vValue Then Return $i + EndIf + Next + Else + For $i = $iStart To $iEnd Step $iStep + If $bRow Then + If $bCompType And VarGetType($aArray[$j][$i]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$j][$i] == $vValue Then Return $i + Else + If $bCompType And VarGetType($aArray[$i][$j]) <> VarGetType($vValue) Then ContinueLoop + If $aArray[$i][$j] == $vValue Then Return $i + EndIf + Next + EndIf + Else + For $i = $iStart To $iEnd Step $iStep + If $iCompare = 3 Then + If $bRow Then + If StringRegExp($aArray[$j][$i], $vValue) Then Return $i + Else + If StringRegExp($aArray[$i][$j], $vValue) Then Return $i + EndIf + Else + If $bRow Then + If StringInStr($aArray[$j][$i], $vValue, $iCase) > 0 Then Return $i + Else + If StringInStr($aArray[$i][$j], $vValue, $iCase) > 0 Then Return $i + EndIf + EndIf + Next + EndIf + Next + Case Else + Return SetError(2, 0, -1) + EndSwitch + Return SetError(6, 0, -1) +EndFunc ;==>_ArraySearch + +; #FUNCTION# ==================================================================================================================== +; Author ........: Melba23 +; Modified.......: +; =============================================================================================================================== +Func _ArrayShuffle(ByRef $aArray, $iStart_Row = 0, $iEnd_Row = 0, $iCol = -1) + + ; Fisher–Yates algorithm + + If $iStart_Row = Default Then $iStart_Row = 0 + If $iEnd_Row = Default Then $iEnd_Row = 0 + If $iCol = Default Then $iCol = -1 + + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) + If $iEnd_Row = 0 Then $iEnd_Row = $iDim_1 - 1 + If $iStart_Row < 0 Or $iStart_Row > $iDim_1 - 1 Then Return SetError(3, 0, -1) + If $iEnd_Row < 1 Or $iEnd_Row > $iDim_1 - 1 Then Return SetError(3, 0, -1) + If $iStart_Row > $iEnd_Row Then Return SetError(4, 0, -1) + + Local $vTmp, $iRand + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + For $i = $iEnd_Row To $iStart_Row + 1 Step -1 + $iRand = Random($iStart_Row, $i, 1) + $vTmp = $aArray[$i] + $aArray[$i] = $aArray[$iRand] + $aArray[$iRand] = $vTmp + Next + Return 1 + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) + If $iCol < -1 Or $iCol > $iDim_2 - 1 Then Return SetError(5, 0, -1) + Local $iCol_Start, $iCol_End + If $iCol = -1 Then + $iCol_Start = 0 + $iCol_End = $iDim_2 - 1 + Else + $iCol_Start = $iCol + $iCol_End = $iCol + EndIf + For $i = $iEnd_Row To $iStart_Row + 1 Step -1 + $iRand = Random($iStart_Row, $i, 1) + For $j = $iCol_Start To $iCol_End + $vTmp = $aArray[$i][$j] + $aArray[$i][$j] = $aArray[$iRand][$j] + $aArray[$iRand][$j] = $vTmp + Next + Next + Return 1 + Case Else + Return SetError(2, 0, -1) + EndSwitch + +EndFunc ;==>_ArrayShuffle + +; #FUNCTION# ==================================================================================================================== +; Author ........: Jos +; Modified.......: LazyCoder - added $iSubItem option; Tylo - implemented stable QuickSort algo; Jos - changed logic to correctly Sort arrays with mixed Values and Strings; Melba23 - implemented stable pivot algo +; =============================================================================================================================== +Func _ArraySort(ByRef $aArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0, $iPivot = 0) + + If $iDescending = Default Then $iDescending = 0 + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iSubItem = Default Then $iSubItem = 0 + If $iPivot = Default Then $iPivot = 0 + If Not IsArray($aArray) Then Return SetError(1, 0, 0) + + Local $iUBound = UBound($aArray) - 1 + If $iUBound = -1 Then Return SetError(5, 0, 0) + + ; Bounds checking + If $iEnd = Default Then $iEnd = 0 + If $iEnd < 1 Or $iEnd > $iUBound Or $iEnd = Default Then $iEnd = $iUBound + If $iStart < 0 Or $iStart = Default Then $iStart = 0 + If $iStart > $iEnd Then Return SetError(2, 0, 0) + + If $iDescending = Default Then $iDescending = 0 + If $iPivot = Default Then $iPivot = 0 + If $iSubItem = Default Then $iSubItem = 0 + + ; Sort + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $iPivot Then ; Switch algorithms as required + __ArrayDualPivotSort($aArray, $iStart, $iEnd) + Else + __ArrayQuickSort1D($aArray, $iStart, $iEnd) + EndIf + If $iDescending Then _ArrayReverse($aArray, $iStart, $iEnd) + Case 2 + If $iPivot Then Return SetError(6, 0, 0) ; Error if 2D array and $iPivot + Local $iSubMax = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iSubItem > $iSubMax Then Return SetError(3, 0, 0) + + If $iDescending Then + $iDescending = -1 + Else + $iDescending = 1 + EndIf + + __ArrayQuickSort2D($aArray, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax) + Case Else + Return SetError(4, 0, 0) + EndSwitch + + Return 1 +EndFunc ;==>_ArraySort + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __ArrayQuickSort1D +; Description ...: Helper function for sorting 1D arrays +; Syntax.........: __ArrayQuickSort1D ( ByRef $aArray, ByRef $iStart, ByRef $iEnd ) +; Parameters ....: $aArray - Array to sort +; $iStart - Index of array to start sorting at +; $iEnd - Index of array to stop sorting at +; Return values .: None +; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima +; Modified.......: +; Remarks .......: For Internal Use Only +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __ArrayQuickSort1D(ByRef $aArray, Const ByRef $iStart, Const ByRef $iEnd) + If $iEnd <= $iStart Then Return + + Local $vTmp + + ; InsertionSort (faster for smaller segments) + If ($iEnd - $iStart) < 15 Then + Local $vCur + For $i = $iStart + 1 To $iEnd + $vTmp = $aArray[$i] + + If IsNumber($vTmp) Then + For $j = $i - 1 To $iStart Step -1 + $vCur = $aArray[$j] + ; If $vTmp >= $vCur Then ExitLoop + If ($vTmp >= $vCur And IsNumber($vCur)) Or (Not IsNumber($vCur) And StringCompare($vTmp, $vCur) >= 0) Then ExitLoop + $aArray[$j + 1] = $vCur + Next + Else + For $j = $i - 1 To $iStart Step -1 + If (StringCompare($vTmp, $aArray[$j]) >= 0) Then ExitLoop + $aArray[$j + 1] = $aArray[$j] + Next + EndIf + + $aArray[$j + 1] = $vTmp + Next + Return + EndIf + + ; QuickSort + Local $L = $iStart, $R = $iEnd, $vPivot = $aArray[Int(($iStart + $iEnd) / 2)], $bNum = IsNumber($vPivot) + Do + If $bNum Then + ; While $aArray[$L] < $vPivot + While ($aArray[$L] < $vPivot And IsNumber($aArray[$L])) Or (Not IsNumber($aArray[$L]) And StringCompare($aArray[$L], $vPivot) < 0) + $L += 1 + WEnd + ; While $aArray[$R] > $vPivot + While ($aArray[$R] > $vPivot And IsNumber($aArray[$R])) Or (Not IsNumber($aArray[$R]) And StringCompare($aArray[$R], $vPivot) > 0) + $R -= 1 + WEnd + Else + While (StringCompare($aArray[$L], $vPivot) < 0) + $L += 1 + WEnd + While (StringCompare($aArray[$R], $vPivot) > 0) + $R -= 1 + WEnd + EndIf + + ; Swap + If $L <= $R Then + $vTmp = $aArray[$L] + $aArray[$L] = $aArray[$R] + $aArray[$R] = $vTmp + $L += 1 + $R -= 1 + EndIf + Until $L > $R + + __ArrayQuickSort1D($aArray, $iStart, $R) + __ArrayQuickSort1D($aArray, $L, $iEnd) +EndFunc ;==>__ArrayQuickSort1D + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __ArrayQuickSort2D +; Description ...: Helper function for sorting 2D arrays +; Syntax.........: __ArrayQuickSort2D ( ByRef $aArray, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax ) +; Parameters ....: $aArray - Array to sort +; $iStep - Step size (should be 1 to sort ascending, -1 to sort descending!) +; $iStart - Index of array to start sorting at +; $iEnd - Index of array to stop sorting at +; $iSubItem - Sub-index to sort on in 2D arrays +; $iSubMax - Maximum sub-index that array has +; Return values .: None +; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima +; Modified.......: +; Remarks .......: For Internal Use Only +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __ArrayQuickSort2D(ByRef $aArray, Const ByRef $iStep, Const ByRef $iStart, Const ByRef $iEnd, Const ByRef $iSubItem, Const ByRef $iSubMax) + If $iEnd <= $iStart Then Return + + ; QuickSort + Local $vTmp, $L = $iStart, $R = $iEnd, $vPivot = $aArray[Int(($iStart + $iEnd) / 2)][$iSubItem], $bNum = IsNumber($vPivot) + Do + If $bNum Then + ; While $aArray[$L][$iSubItem] < $vPivot + While ($iStep * ($aArray[$L][$iSubItem] - $vPivot) < 0 And IsNumber($aArray[$L][$iSubItem])) Or (Not IsNumber($aArray[$L][$iSubItem]) And $iStep * StringCompare($aArray[$L][$iSubItem], $vPivot) < 0) + $L += 1 + WEnd + ; While $aArray[$R][$iSubItem] > $vPivot + While ($iStep * ($aArray[$R][$iSubItem] - $vPivot) > 0 And IsNumber($aArray[$R][$iSubItem])) Or (Not IsNumber($aArray[$R][$iSubItem]) And $iStep * StringCompare($aArray[$R][$iSubItem], $vPivot) > 0) + $R -= 1 + WEnd + Else + While ($iStep * StringCompare($aArray[$L][$iSubItem], $vPivot) < 0) + $L += 1 + WEnd + While ($iStep * StringCompare($aArray[$R][$iSubItem], $vPivot) > 0) + $R -= 1 + WEnd + EndIf + + ; Swap + If $L <= $R Then + For $i = 0 To $iSubMax + $vTmp = $aArray[$L][$i] + $aArray[$L][$i] = $aArray[$R][$i] + $aArray[$R][$i] = $vTmp + Next + $L += 1 + $R -= 1 + EndIf + Until $L > $R + + __ArrayQuickSort2D($aArray, $iStep, $iStart, $R, $iSubItem, $iSubMax) + __ArrayQuickSort2D($aArray, $iStep, $L, $iEnd, $iSubItem, $iSubMax) +EndFunc ;==>__ArrayQuickSort2D + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __ArrayDualPivotSort +; Description ...: Helper function for sorting 1D arrays +; Syntax.........: __ArrayDualPivotSort ( ByRef $aArray, $iPivot_Left, $iPivot_Right [, $bLeftMost = True ] ) +; Parameters ....: $aArray - Array to sort +; $iPivot_Left - Index of the array to start sorting at +; $iPivot_Right - Index of the array to stop sorting at +; $bLeftMost - Indicates if this part is the leftmost in the range +; Return values .: None +; Author ........: Erik Pilsits +; Modified.......: Melba23 +; Remarks .......: For Internal Use Only +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __ArrayDualPivotSort(ByRef $aArray, $iPivot_Left, $iPivot_Right, $bLeftMost = True) + If $iPivot_Left > $iPivot_Right Then Return + Local $iLength = $iPivot_Right - $iPivot_Left + 1 + Local $i, $j, $k, $iAi, $iAk, $iA1, $iA2, $iLast + If $iLength < 45 Then ; Use insertion sort for small arrays - value chosen empirically + If $bLeftMost Then + $i = $iPivot_Left + While $i < $iPivot_Right + $j = $i + $iAi = $aArray[$i + 1] + While $iAi < $aArray[$j] + $aArray[$j + 1] = $aArray[$j] + $j -= 1 + If $j + 1 = $iPivot_Left Then ExitLoop + WEnd + $aArray[$j + 1] = $iAi + $i += 1 + WEnd + Else + While 1 + If $iPivot_Left >= $iPivot_Right Then Return 1 + $iPivot_Left += 1 + If $aArray[$iPivot_Left] < $aArray[$iPivot_Left - 1] Then ExitLoop + WEnd + While 1 + $k = $iPivot_Left + $iPivot_Left += 1 + If $iPivot_Left > $iPivot_Right Then ExitLoop + $iA1 = $aArray[$k] + $iA2 = $aArray[$iPivot_Left] + If $iA1 < $iA2 Then + $iA2 = $iA1 + $iA1 = $aArray[$iPivot_Left] + EndIf + $k -= 1 + While $iA1 < $aArray[$k] + $aArray[$k + 2] = $aArray[$k] + $k -= 1 + WEnd + $aArray[$k + 2] = $iA1 + While $iA2 < $aArray[$k] + $aArray[$k + 1] = $aArray[$k] + $k -= 1 + WEnd + $aArray[$k + 1] = $iA2 + $iPivot_Left += 1 + WEnd + $iLast = $aArray[$iPivot_Right] + $iPivot_Right -= 1 + While $iLast < $aArray[$iPivot_Right] + $aArray[$iPivot_Right + 1] = $aArray[$iPivot_Right] + $iPivot_Right -= 1 + WEnd + $aArray[$iPivot_Right + 1] = $iLast + EndIf + Return 1 + EndIf + Local $iSeventh = BitShift($iLength, 3) + BitShift($iLength, 6) + 1 + Local $iE1, $iE2, $iE3, $iE4, $iE5, $t + $iE3 = Ceiling(($iPivot_Left + $iPivot_Right) / 2) + $iE2 = $iE3 - $iSeventh + $iE1 = $iE2 - $iSeventh + $iE4 = $iE3 + $iSeventh + $iE5 = $iE4 + $iSeventh + If $aArray[$iE2] < $aArray[$iE1] Then + $t = $aArray[$iE2] + $aArray[$iE2] = $aArray[$iE1] + $aArray[$iE1] = $t + EndIf + If $aArray[$iE3] < $aArray[$iE2] Then + $t = $aArray[$iE3] + $aArray[$iE3] = $aArray[$iE2] + $aArray[$iE2] = $t + If $t < $aArray[$iE1] Then + $aArray[$iE2] = $aArray[$iE1] + $aArray[$iE1] = $t + EndIf + EndIf + If $aArray[$iE4] < $aArray[$iE3] Then + $t = $aArray[$iE4] + $aArray[$iE4] = $aArray[$iE3] + $aArray[$iE3] = $t + If $t < $aArray[$iE2] Then + $aArray[$iE3] = $aArray[$iE2] + $aArray[$iE2] = $t + If $t < $aArray[$iE1] Then + $aArray[$iE2] = $aArray[$iE1] + $aArray[$iE1] = $t + EndIf + EndIf + EndIf + If $aArray[$iE5] < $aArray[$iE4] Then + $t = $aArray[$iE5] + $aArray[$iE5] = $aArray[$iE4] + $aArray[$iE4] = $t + If $t < $aArray[$iE3] Then + $aArray[$iE4] = $aArray[$iE3] + $aArray[$iE3] = $t + If $t < $aArray[$iE2] Then + $aArray[$iE3] = $aArray[$iE2] + $aArray[$iE2] = $t + If $t < $aArray[$iE1] Then + $aArray[$iE2] = $aArray[$iE1] + $aArray[$iE1] = $t + EndIf + EndIf + EndIf + EndIf + Local $iLess = $iPivot_Left + Local $iGreater = $iPivot_Right + If (($aArray[$iE1] <> $aArray[$iE2]) And ($aArray[$iE2] <> $aArray[$iE3]) And ($aArray[$iE3] <> $aArray[$iE4]) And ($aArray[$iE4] <> $aArray[$iE5])) Then + Local $iPivot_1 = $aArray[$iE2] + Local $iPivot_2 = $aArray[$iE4] + $aArray[$iE2] = $aArray[$iPivot_Left] + $aArray[$iE4] = $aArray[$iPivot_Right] + Do + $iLess += 1 + Until $aArray[$iLess] >= $iPivot_1 + Do + $iGreater -= 1 + Until $aArray[$iGreater] <= $iPivot_2 + $k = $iLess + While $k <= $iGreater + $iAk = $aArray[$k] + If $iAk < $iPivot_1 Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $iAk + $iLess += 1 + ElseIf $iAk > $iPivot_2 Then + While $aArray[$iGreater] > $iPivot_2 + $iGreater -= 1 + If $iGreater + 1 = $k Then ExitLoop 2 + WEnd + If $aArray[$iGreater] < $iPivot_1 Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $aArray[$iGreater] + $iLess += 1 + Else + $aArray[$k] = $aArray[$iGreater] + EndIf + $aArray[$iGreater] = $iAk + $iGreater -= 1 + EndIf + $k += 1 + WEnd + $aArray[$iPivot_Left] = $aArray[$iLess - 1] + $aArray[$iLess - 1] = $iPivot_1 + $aArray[$iPivot_Right] = $aArray[$iGreater + 1] + $aArray[$iGreater + 1] = $iPivot_2 + __ArrayDualPivotSort($aArray, $iPivot_Left, $iLess - 2, True) + __ArrayDualPivotSort($aArray, $iGreater + 2, $iPivot_Right, False) + If ($iLess < $iE1) And ($iE5 < $iGreater) Then + While $aArray[$iLess] = $iPivot_1 + $iLess += 1 + WEnd + While $aArray[$iGreater] = $iPivot_2 + $iGreater -= 1 + WEnd + $k = $iLess + While $k <= $iGreater + $iAk = $aArray[$k] + If $iAk = $iPivot_1 Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $iAk + $iLess += 1 + ElseIf $iAk = $iPivot_2 Then + While $aArray[$iGreater] = $iPivot_2 + $iGreater -= 1 + If $iGreater + 1 = $k Then ExitLoop 2 + WEnd + If $aArray[$iGreater] = $iPivot_1 Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $iPivot_1 + $iLess += 1 + Else + $aArray[$k] = $aArray[$iGreater] + EndIf + $aArray[$iGreater] = $iAk + $iGreater -= 1 + EndIf + $k += 1 + WEnd + EndIf + __ArrayDualPivotSort($aArray, $iLess, $iGreater, False) + Else + Local $iPivot = $aArray[$iE3] + $k = $iLess + While $k <= $iGreater + If $aArray[$k] = $iPivot Then + $k += 1 + ContinueLoop + EndIf + $iAk = $aArray[$k] + If $iAk < $iPivot Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $iAk + $iLess += 1 + Else + While $aArray[$iGreater] > $iPivot + $iGreater -= 1 + WEnd + If $aArray[$iGreater] < $iPivot Then + $aArray[$k] = $aArray[$iLess] + $aArray[$iLess] = $aArray[$iGreater] + $iLess += 1 + Else + $aArray[$k] = $iPivot + EndIf + $aArray[$iGreater] = $iAk + $iGreater -= 1 + EndIf + $k += 1 + WEnd + __ArrayDualPivotSort($aArray, $iPivot_Left, $iLess - 1, True) + __ArrayDualPivotSort($aArray, $iGreater + 1, $iPivot_Right, False) + EndIf +EndFunc ;==>__ArrayDualPivotSort + +; #FUNCTION# ==================================================================================================================== +; Author ........: Melba23 +; Modified.......: +; =============================================================================================================================== +Func _ArraySwap(ByRef $aArray, $iIndex_1, $iIndex_2, $bCol = False, $iStart = -1, $iEnd = -1) + + If $bCol = Default Then $bCol = False + If $iStart = Default Then $iStart = -1 + If $iEnd = Default Then $iEnd = -1 + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iDim_2 = -1 Then ; 1D array so force defaults + $bCol = False + $iStart = -1 + $iEnd = -1 + EndIf + ; Bounds check + If $iStart > $iEnd Then Return SetError(5, 0, -1) + If $bCol Then + If $iIndex_1 < 0 Or $iIndex_2 > $iDim_2 Then Return SetError(3, 0, -1) + If $iStart = -1 Then $iStart = 0 + If $iEnd = -1 Then $iEnd = $iDim_1 + Else + If $iIndex_1 < 0 Or $iIndex_2 > $iDim_1 Then Return SetError(3, 0, -1) + If $iStart = -1 Then $iStart = 0 + If $iEnd = -1 Then $iEnd = $iDim_2 + EndIf + Local $vTmp + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + $vTmp = $aArray[$iIndex_1] + $aArray[$iIndex_1] = $aArray[$iIndex_2] + $aArray[$iIndex_2] = $vTmp + Case 2 + If $iStart < -1 Or $iEnd < -1 Then Return SetError(4, 0, -1) + If $bCol Then + If $iStart > $iDim_1 Or $iEnd > $iDim_1 Then Return SetError(4, 0, -1) + For $j = $iStart To $iEnd + $vTmp = $aArray[$j][$iIndex_1] + $aArray[$j][$iIndex_1] = $aArray[$j][$iIndex_2] + $aArray[$j][$iIndex_2] = $vTmp + Next + Else + If $iStart > $iDim_2 Or $iEnd > $iDim_2 Then Return SetError(4, 0, -1) + For $j = $iStart To $iEnd + $vTmp = $aArray[$iIndex_1][$j] + $aArray[$iIndex_1][$j] = $aArray[$iIndex_2][$j] + $aArray[$iIndex_2][$j] = $vTmp + Next + EndIf + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return 1 + +EndFunc ;==>_ArraySwap + +; #FUNCTION# ==================================================================================================================== +; Author ........: Cephas +; Modified.......: Jos - added $iStart parameter and logic, Ultima - added $iEnd parameter, make use of _ArrayToString() instead of duplicating efforts; Melba23 - added 2D support +; =============================================================================================================================== +Func _ArrayToClip(Const ByRef $aArray, $sDelim_Col = "|", $iStart_Row = -1, $iEnd_Row = -1, $sDelim_Row = @CRLF, $iStart_Col = -1, $iEnd_Col = -1) + Local $sResult = _ArrayToString($aArray, $sDelim_Col, $iStart_Row, $iEnd_Row, $sDelim_Row, $iStart_Col, $iEnd_Col) + If @error Then Return SetError(@error, 0, 0) + If ClipPut($sResult) Then Return 1 + Return SetError(-1, 0, 0) +EndFunc ;==>_ArrayToClip + +; #FUNCTION# ==================================================================================================================== +; Author ........: Brian Keene , Valik - rewritten +; Modified.......: Ultima - code cleanup; Melba23 - added support for empty and 2D arrays +; =============================================================================================================================== +Func _ArrayToString(Const ByRef $aArray, $sDelim_Col = "|", $iStart_Row = -1, $iEnd_Row = -1, $sDelim_Row = @CRLF, $iStart_Col = -1, $iEnd_Col = -1) + + If $sDelim_Col = Default Then $sDelim_Col = "|" + If $sDelim_Row = Default Then $sDelim_Row = @CRLF + If $iStart_Row = Default Then $iStart_Row = -1 + If $iEnd_Row = Default Then $iEnd_Row = -1 + If $iStart_Col = Default Then $iStart_Col = -1 + If $iEnd_Col = Default Then $iEnd_Col = -1 + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + If $iStart_Row = -1 Then $iStart_Row = 0 + If $iEnd_Row = -1 Then $iEnd_Row = $iDim_1 + If $iStart_Row < -1 Or $iEnd_Row < -1 Then Return SetError(3, 0, -1) + If $iStart_Row > $iDim_1 Or $iEnd_Row > $iDim_1 Then Return SetError(3, 0, "") + If $iStart_Row > $iEnd_Row Then Return SetError(4, 0, -1) + Local $sRet = "" + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + For $i = $iStart_Row To $iEnd_Row + $sRet &= $aArray[$i] & $sDelim_Col + Next + Return StringTrimRight($sRet, StringLen($sDelim_Col)) + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iStart_Col = -1 Then $iStart_Col = 0 + If $iEnd_Col = -1 Then $iEnd_Col = $iDim_2 + If $iStart_Col < -1 Or $iEnd_Col < -1 Then Return SetError(5, 0, -1) + If $iStart_Col > $iDim_2 Or $iEnd_Col > $iDim_2 Then Return SetError(5, 0, -1) + If $iStart_Col > $iEnd_Col Then Return SetError(6, 0, -1) + For $i = $iStart_Row To $iEnd_Row + For $j = $iStart_Col To $iEnd_Col + $sRet &= $aArray[$i][$j] & $sDelim_Col + Next + $sRet = StringTrimRight($sRet, StringLen($sDelim_Col)) & $sDelim_Row + Next + Return StringTrimRight($sRet, StringLen($sDelim_Row)) + Case Else + Return SetError(2, 0, -1) + EndSwitch + Return 1 + +EndFunc ;==>_ArrayToString + +; #FUNCTION# ==================================================================================================================== +; Author ........: jchd +; Modified.......: jpm, czardas +; =============================================================================================================================== +Func _ArrayTranspose(ByRef $aArray) + Switch UBound($aArray, 0) + Case 0 + Return SetError(2, 0, 0) + Case 1 + Local $aTemp[1][UBound($aArray)] + For $i = 0 To UBound($aArray) - 1 + $aTemp[0][$i] = $aArray[$i] + Next + $aArray = $aTemp + Case 2 + Local $iDim_1 = UBound($aArray, 1), $iDim_2 = UBound($aArray, 2) + If $iDim_1 <> $iDim_2 Then + Local $aTemp[$iDim_2][$iDim_1] + For $i = 0 To $iDim_1 - 1 + For $j = 0 To $iDim_2 - 1 + $aTemp[$j][$i] = $aArray[$i][$j] + Next + Next + $aArray = $aTemp + Else ; optimimal method for a square grid + Local $vElement + For $i = 0 To $iDim_1 - 1 + For $j = $i + 1 To $iDim_2 - 1 + $vElement = $aArray[$i][$j] + $aArray[$i][$j] = $aArray[$j][$i] + $aArray[$j][$i] = $vElement + Next + Next + EndIf + Case Else + Return SetError(1, 0, 0) + EndSwitch + Return 1 +EndFunc ;==>_ArrayTranspose + +; #FUNCTION# ==================================================================================================================== +; Author ........: Adam Moore (redndahead) +; Modified.......: Ultima - code cleanup, optimization; Melba23 - added 2D support +; =============================================================================================================================== +Func _ArrayTrim(ByRef $aArray, $iTrimNum, $iDirection = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) + + If $iDirection = Default Then $iDirection = 0 + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iSubItem = Default Then $iSubItem = 0 + If Not IsArray($aArray) Then Return SetError(1, 0, 0) + + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + If $iEnd = 0 Then $iEnd = $iDim_1 + If $iStart > $iEnd Then Return SetError(3, 0, -1) + If $iStart < 0 Or $iEnd < 0 Then Return SetError(3, 0, -1) + If $iStart > $iDim_1 Or $iEnd > $iDim_1 Then Return SetError(3, 0, -1) + If $iStart > $iEnd Then Return SetError(4, 0, -1) + + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $iDirection Then + For $i = $iStart To $iEnd + $aArray[$i] = StringTrimRight($aArray[$i], $iTrimNum) + Next + Else + For $i = $iStart To $iEnd + $aArray[$i] = StringTrimLeft($aArray[$i], $iTrimNum) + Next + EndIf + Case 2 + Local $iDim_2 = UBound($aArray, $UBOUND_COLUMNS) - 1 + If $iSubItem < 0 Or $iSubItem > $iDim_2 Then Return SetError(5, 0, -1) + If $iDirection Then + For $i = $iStart To $iEnd + $aArray[$i][$iSubItem] = StringTrimRight($aArray[$i][$iSubItem], $iTrimNum) + Next + Else + For $i = $iStart To $iEnd + $aArray[$i][$iSubItem] = StringTrimLeft($aArray[$i][$iSubItem], $iTrimNum) + Next + EndIf + Case Else + Return SetError(2, 0, 0) + EndSwitch + + Return 1 +EndFunc ;==>_ArrayTrim + +; #FUNCTION# ==================================================================================================================== +; Author ........: SmOke_N +; Modified.......: litlmike, Erik Pilsits, BrewManNH, Melba23 +; =============================================================================================================================== +Func _ArrayUnique(Const ByRef $aArray, $iColumn = 0, $iBase = 0, $iCase = 0, $iCount = $ARRAYUNIQUE_COUNT, $iIntType = $ARRAYUNIQUE_AUTO) + + If $iColumn = Default Then $iColumn = 0 + If $iBase = Default Then $iBase = 0 + If $iCase = Default Then $iCase = 0 + If $iCount = Default Then $iCount = $ARRAYUNIQUE_COUNT + ; Check array + If UBound($aArray, $UBOUND_ROWS) = 0 Then Return SetError(1, 0, 0) + Local $iDims = UBound($aArray, $UBOUND_DIMENSIONS), $iNumColumns = UBound($aArray, $UBOUND_COLUMNS) + If $iDims > 2 Then Return SetError(2, 0, 0) + ; Check parameters + If $iBase < 0 Or $iBase > 1 Or (Not IsInt($iBase)) Then Return SetError(3, 0, 0) + If $iCase < 0 Or $iCase > 1 Or (Not IsInt($iCase)) Then Return SetError(3, 0, 0) + If $iCount < 0 Or $iCount > 1 Or (Not IsInt($iCount)) Then Return SetError(4, 0, 0) + If $iIntType < 0 Or $iIntType > 4 Or (Not IsInt($iIntType)) Then Return SetError(5, 0, 0) + If $iColumn < 0 Or ($iNumColumns = 0 And $iColumn > 0) Or ($iNumColumns > 0 And $iColumn >= $iNumColumns) Then Return SetError(6, 0, 0) + ; Autocheck of first element + If $iIntType = $ARRAYUNIQUE_AUTO Then + Local $vFirstElem = ( ($iDims = 1) ? ($aArray[$iBase]) : ($aArray[$iColumn][$iBase]) ) + If IsInt($vFirstElem) Then + Switch VarGetType($vFirstElem) + Case "Int32" + $iIntType = $ARRAYUNIQUE_FORCE32 + Case "Int64" + $iIntType = $ARRAYUNIQUE_FORCE64 + EndSwitch + Else + $iIntType = $ARRAYUNIQUE_FORCE32 + EndIf + EndIf + ; Create error handler + ObjEvent("AutoIt.Error", "__ArrayUnique_AutoErrFunc") + ; Create dictionary + Local $oDictionary = ObjCreate("Scripting.Dictionary") + ; Set case sensitivity + $oDictionary.CompareMode = Number(Not $iCase) + ; Add elements to dictionary + Local $vElem, $sType, $vKey, $bCOMError = False + For $i = $iBase To UBound($aArray) - 1 + If $iDims = 1 Then + ; 1D array + $vElem = $aArray[$i] + Else + ; 2D array + $vElem = $aArray[$i][$iColumn] + EndIf + ; Determine method to use + Switch $iIntType + Case $ARRAYUNIQUE_FORCE32 + ; Use element as key + $oDictionary.Item($vElem) ; Check if key exists - automatically created if not + If @error Then + $bCOMError = True ; Failed with an Int64, Ptr or Binary datatype + ExitLoop + EndIf + Case $ARRAYUNIQUE_FORCE64 + $sType = VarGetType($vElem) + If $sType = "Int32" Then + $bCOMError = True ; Failed with an Int32 datatype + ExitLoop + EndIf ; Create key + $vKey = "#" & $sType & "#" & String($vElem) + If Not $oDictionary.Item($vKey) Then ; Check if key exists + $oDictionary($vKey) = $vElem ; Store actual value in dictionary + EndIf + Case $ARRAYUNIQUE_MATCH + $sType = VarGetType($vElem) + If StringLeft($sType, 3) = "Int" Then + $vKey = "#Int#" & String($vElem) + Else + $vKey = "#" & $sType & "#" & String($vElem) + EndIf + If Not $oDictionary.Item($vKey) Then ; Check if key exists + $oDictionary($vKey) = $vElem ; Store actual value in dictionary + EndIf + Case $ARRAYUNIQUE_DISTINCT + $vKey = "#" & VarGetType($vElem) & "#" & String($vElem) + If Not $oDictionary.Item($vKey) Then ; Check if key exists + $oDictionary($vKey) = $vElem ; Store actual value in dictionary + EndIf + EndSwitch + Next + ; Create return array + Local $aValues, $j = 0 + If $bCOMError Then ; Mismatch Int32/64 + Return SetError(7, 0, 0) + ElseIf $iIntType <> $ARRAYUNIQUE_FORCE32 Then + ; Extract values associated with the unique keys + Local $aValues[$oDictionary.Count] + For $vKey In $oDictionary.Keys() + $aValues[$j] = $oDictionary($vKey) + ; Check for Ptr datatype + If StringLeft($vKey, 5) = "#Ptr#" Then + $aValues[$j] = Ptr($aValues[$j]) + EndIf + $j += 1 + Next + Else + ; Only need to list the unique keys + $aValues = $oDictionary.Keys() + EndIf + ; Add cout if required + If $iCount Then + _ArrayInsert($aValues, 0, $oDictionary.Count) + EndIf + ; Return array + Return $aValues + +EndFunc ;==>_ArrayUnique + +; #FUNCTION# ==================================================================================================================== +; Author ........: jchd, jpm +; Modified.......: +; =============================================================================================================================== +Func _Array1DToHistogram($aArray, $iSizing = 100) + If UBound($aArray, 0) > 1 Then Return SetError(1, 0, "") + $iSizing = $iSizing * 8 + Local $t, $n, $iMin = 0, $iMax = 0, $iOffset = 0 + For $i = 0 To UBound($aArray) - 1 + $t = $aArray[$i] + $t = IsNumber($t) ? Round($t) : 0 + If $t < $iMin Then $iMin = $t + If $t > $iMax Then $iMax = $t + Next + Local $iRange = Int(Round(($iMax - $iMin) / 8)) * 8 + Local $iSpaceRatio = 4 + For $i = 0 To UBound($aArray) - 1 + $t = $aArray[$i] + If $t Then + $n = Abs(Round(($iSizing * $t) / $iRange) / 8) + + $aArray[$i] = "" + If $t > 0 Then + If $iMin Then + $iOffset = Int(Abs(Round(($iSizing * $iMin) / $iRange) / 8) / 8 * $iSpaceRatio) + $aArray[$i] = __Array_StringRepeat(ChrW(0x20), $iOffset) + EndIf + Else + If $iMin <> $t Then + $iOffset = Int(Abs(Round(($iSizing * ($t - $iMin)) / $iRange) / 8) / 8 * $iSpaceRatio) + $aArray[$i] = __Array_StringRepeat(ChrW(0x20), $iOffset) + EndIf + EndIf + $aArray[$i] &= __Array_StringRepeat(ChrW(0x2588), Int($n / 8)) + + $n = Mod($n, 8) + If $n > 0 Then $aArray[$i] &= ChrW(0x2588 + 8 - $n) + $aArray[$i] &= ' ' & $t + Else + $aArray[$i] = "" + EndIf + Next + + Return $aArray +EndFunc ;==>_Array1DToHistogram + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __Array_StringRepeat +; Description ...: Repeats a string a specified number of times +; Syntax.........: __Array_StringRepeat ( $sString, $iRepeatCount ) +; Parameters ....: $sString - String to repeat +; $iRepeatCount - Number of times to repeat the string +; Return values .: a string with specified number of repeats. +; Author ........: Jeremy Landes +; Modified.......: jpm +; Remarks .......: This function is used internally. similar to _StringRepeat() but if $iRepeatCount = 0 returns "" +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __Array_StringRepeat($sString, $iRepeatCount) + ; Casting Int() takes care of String/Int, Numbers. + $iRepeatCount = Int($iRepeatCount) + ; Zero is a valid repeat integer. + If StringLen($sString) < 1 Or $iRepeatCount <= 0 Then Return SetError(1, 0, "") + Local $sResult = "" + While $iRepeatCount > 1 + If BitAND($iRepeatCount, 1) Then $sResult &= $sString + $sString &= $sString + $iRepeatCount = BitShift($iRepeatCount, 1) + WEnd + Return $sString & $sResult +EndFunc ;==>__Array_StringRepeat + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __Array_ExeterInternal +; Description ...: Permute Function based on an algorithm from Exeter University. +; Syntax.........: __Array_ExeterInternal ( ByRef $aArray, $iStart, $iSize, $sDelimiter, ByRef $aIdx, ByRef $aResult ) +; Parameters ....: $aArray - The Array to get Permutations +; $iStart - Starting Point for Loop +; $iSize - End Point for Loop +; $sDelimiter - String result separator +; $aIdx - Array Used in Rotations +; $aResult - Resulting Array +; Return values .: Success - Computer name +; Author ........: Erik Pilsits +; Modified.......: 07/08/2008 +; Remarks .......: This function is used internally. Permute Function based on an algorithm from Exeter University. +; + +; http://www.bearcave.com/random_hacks/permute.html +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __Array_ExeterInternal(ByRef $aArray, $iStart, $iSize, $sDelimiter, ByRef $aIdx, ByRef $aResult, ByRef $iCount) + If $iStart == $iSize - 1 Then + For $i = 0 To $iSize - 1 + $aResult[$iCount] &= $aArray[$aIdx[$i]] & $sDelimiter + Next + If $sDelimiter <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], StringLen($sDelimiter)) + $iCount += 1 + Else + Local $iTemp + For $i = $iStart To $iSize - 1 + $iTemp = $aIdx[$i] + + $aIdx[$i] = $aIdx[$iStart] + $aIdx[$iStart] = $iTemp + __Array_ExeterInternal($aArray, $iStart + 1, $iSize, $sDelimiter, $aIdx, $aResult, $iCount) + $aIdx[$iStart] = $aIdx[$i] + $aIdx[$i] = $iTemp + Next + EndIf +EndFunc ;==>__Array_ExeterInternal + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __Array_Combinations +; Description ...: Creates Combination +; Syntax.........: __Array_Combinations ( $iN, $iR ) +; Parameters ....: $iN - Value passed on from UBound($aArray) +; $iR - Size of the combinations set +; Return values .: Integer value of the number of combinations +; Author ........: Erik Pilsits +; Modified.......: 07/08/2008 +; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen. +; + +; http://www.bearcave.com/random_hacks/permute.html +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __Array_Combinations($iN, $iR) + Local $i_Total = 1 + + For $i = $iR To 1 Step -1 + $i_Total *= ($iN / $i) + $iN -= 1 + Next + Return Round($i_Total) +EndFunc ;==>__Array_Combinations + +; #INTERNAL_USE_ONLY# =========================================================================================================== +; Name...........: __Array_GetNext +; Description ...: Creates Combination +; Syntax.........: __Array_GetNext ( $iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx ) +; Parameters ....: $iN - Value passed on from UBound($aArray) +; $iR - Size of the combinations set +; $iLeft - Remaining number of combinations +; $iTotal - Total number of combinations +; $aIdx - Array containing combinations +; Return values .: Function only changes values ByRef +; Author ........: Erik Pilsits +; Modified.......: 07/08/2008 +; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen. +; + +; http://www.bearcave.com/random_hacks/permute.html +; Related .......: +; Link ..........: +; Example .......: +; =============================================================================================================================== +Func __Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx) + If $iLeft == $iTotal Then + $iLeft -= 1 + Return + EndIf + + Local $i = $iR - 1 + While $aIdx[$i] == $iN - $iR + $i + $i -= 1 + WEnd + + $aIdx[$i] += 1 + For $j = $i + 1 To $iR - 1 + $aIdx[$j] = $aIdx[$i] + $j - $i + Next + + $iLeft -= 1 +EndFunc ;==>__Array_GetNext + +Func __Array_MinMaxIndex(Const ByRef $aArray, $iCompNumeric, $iStart, $iEnd, $iSubItem, $fuComparison) ; Always swapped the comparison params around e.g. it was for min 100 > 1000 whereas 1000 < 100 makes more sense in a min function. + If $iCompNumeric = Default Then $iCompNumeric = 0 + If $iCompNumeric <> 1 Then $iCompNumeric = 0 + If $iStart = Default Then $iStart = 0 + If $iEnd = Default Then $iEnd = 0 + If $iSubItem = Default Then $iSubItem = 0 + If Not IsArray($aArray) Then Return SetError(1, 0, -1) + Local $iDim_1 = UBound($aArray, $UBOUND_ROWS) - 1 + If $iDim_1 < 0 Then Return SetError(1, 0, -1) + If $iEnd = -1 Then $iEnd = $iDim_1 + If $iStart = -1 Then $iStart = 0 + If $iStart < -1 Or $iEnd < -1 Then Return SetError(3, 0, -1) + If $iStart > $iDim_1 Or $iEnd > $iDim_1 Then Return SetError(3, 0, -1) + If $iStart > $iEnd Then Return SetError(4, 0, -1) + If $iDim_1 < 0 Then Return SetError(5, 0, -1) + Local $iMaxMinIndex = $iStart + Switch UBound($aArray, $UBOUND_DIMENSIONS) + Case 1 + If $iCompNumeric Then + For $i = $iStart To $iEnd + If $fuComparison(Number($aArray[$i]), Number($aArray[$iMaxMinIndex])) Then $iMaxMinIndex = $i + Next + Else + For $i = $iStart To $iEnd + If $fuComparison($aArray[$i], $aArray[$iMaxMinIndex]) Then $iMaxMinIndex = $i + Next + EndIf + Case 2 + If $iSubItem < 0 Or $iSubItem > UBound($aArray, $UBOUND_COLUMNS) - 1 Then Return SetError(6, 0, -1) + If $iCompNumeric Then + For $i = $iStart To $iEnd + If $fuComparison(Number($aArray[$i][$iSubItem]), Number($aArray[$iMaxMinIndex][$iSubItem])) Then $iMaxMinIndex = $i + Next + Else + For $i = $iStart To $iEnd + If $fuComparison($aArray[$i][$iSubItem], $aArray[$iMaxMinIndex][$iSubItem]) Then $iMaxMinIndex = $i + Next + EndIf + Case Else + Return SetError(2, 0, -1) + EndSwitch + + Return $iMaxMinIndex +EndFunc ;==>__Array_MinMaxIndex + +Func __Array_GreaterThan($vValue1, $vValue2) + Return $vValue1 > $vValue2 +EndFunc ;==>__Array_GreaterThan + +Func __Array_LessThan($vValue1, $vValue2) + Return $vValue1 < $vValue2 +EndFunc ;==>__Array_LessThan + +Func __ArrayUnique_AutoErrFunc() + ; Do nothing special, just check @error after suspect functions. +EndFunc ;==>__ArrayUnique_AutoErrFunc diff --git a/notifier/items.txt b/Assets/items.txt similarity index 100% rename from notifier/items.txt rename to Assets/items.txt diff --git a/D2Stats.au3 b/D2Stats.au3 index f14b77c..0a2b6d1 100644 --- a/D2Stats.au3 +++ b/D2Stats.au3 @@ -1,17 +1,16 @@ #RequireAdmin +#include #include #include #include #include #include -#include "notifier\notify_list.au3" - #pragma compile(Icon, Assets/icon.ico) #pragma compile(FileDescription, Diablo II Stats reader) #pragma compile(ProductName, D2Stats) -#pragma compile(ProductVersion, 0.3.7.3) -#pragma compile(FileVersion, 0.3.7.3) +#pragma compile(ProductVersion, 0.3.8.0) +#pragma compile(FileVersion, 0.3.8.0) #pragma compile(Comments, 09.09.2017) #pragma compile(UPX, True) ;compression ;#pragma compile(ExecLevel, requireAdministrator) @@ -31,10 +30,15 @@ if (not IsAdmin()) then endif OnAutoItExitRegister("_Exit") -if (not @Compiled) then HotKeySet("+{INS}", "HotKey_CopyStatsToClipboard") +if (not @Compiled) then + HotKeySet("+{INS}", "HotKey_CopyStatsToClipboard") + HotKeySet("+{PgUp}", "HotKey_CopyItemsToClipboard") +endif global const $HK_FLAG_D2STATS = BitOR($HK_FLAG_DEFAULT, $HK_FLAG_NOUNHOOK) +local $notify_list[0][0] + local $gui_event_close = -3 local $gui[128][3] = [[0]] local $gui_opt[16][3] = [[0]] @@ -42,12 +46,12 @@ local $gui_opt[16][3] = [[0]] local const $numStats = 1024 local $stats_cache[2][$numStats] -local $dlls[] = ["D2Client.dll", "D2Common.dll", "D2Win.dll"] -local $d2client, $d2common, $d2win, $d2sgpt +local $dlls[] = ["D2Client.dll", "D2Common.dll", "D2Win.dll", "D2Lang.dll"] +local $d2client, $d2common, $d2win, $d2lang, $d2sgpt local $d2pid, $d2handle, $failCounter local $lastUpdate = TimerInit() -local $d2inject_print, $d2inject_string +local $d2inject_print, $d2inject_string, $d2inject_getstring local $logstr = "" @@ -66,7 +70,7 @@ local $options[][5] = [ _ ["hidePass", 0, "cb", "Hide game password when minimap is open"], _ ["notify-enabled", 1, "cb", "Enable drop notifier", 0], _ ["notify-tiered", 1, "cb", "Tiered uniques", 0], _ -["notify-sacred", 1, "cb", "Sacred uniques / jewelry", 0], _ +["notify-sacred", 1, "cb", "Sacred uniques and jewelry", 0], _ ["notify-set", 1, "cb", "Set items", 0], _ ["notify-shrine", 1, "cb", "Shrines", 0], _ ["notify-respec", 1, "cb", "Belladonna Extract", 0] ] @@ -100,6 +104,8 @@ func Main() UpdateGUIOptions() ; Must update options after hotkeys if (IsIngame()) then + if (not $ingame) then DropNotifierSetup() + _MemoryWrite($d2client + 0x6011B, $d2handle, GetGUIOption("hidePass") ? 0x7F : 0x01, "byte") if (IsShowItemsToggle()) then @@ -163,9 +169,9 @@ func UpdateHandle() return _Debug("UpdateHandle", "Couldn't update dll handles.") endif - if (not InjectPrintFunction()) then + if (not InjectFunctions()) then _CloseHandle() - return _Debug("UpdateHandle", "Couldn't inject print function.") + return _Debug("UpdateHandle", "Couldn't inject functions.") endif $failCounter = 0 @@ -243,16 +249,45 @@ func HotKey_CopyStatsToClipboard() UpdateStatValues() local $ret = "" + for $i = 0 to $numStats-1 local $val = GetStatValue($i) + if ($val) then $ret &= StringFormat("%s = %s%s", $i, $val, @CRLF) endif next + ClipPut($ret) PrintString("Stats copied to clipboard.") endfunc +func HotKey_CopyItemsToClipboard() + if (not IsIngame()) then return + + local $nItems = _MemoryRead($d2common + 0x9FB94, $d2handle) + local $pItemsTxt = _MemoryRead($d2common + 0x9FB98, $d2handle) + + local $base, $nameid, $name, $misc + local $ret = "" + + for $class = 0 to $nItems - 1 + $base = $pItemsTxt + 0x1A8 * $class + + $misc = _MemoryRead($base + 0x84, $d2handle, "dword") + $nameid = _MemoryRead($base + 0xF4, $d2handle, "word") + + $name = _CreateRemoteThread($d2inject_getstring, $nameid) + $name = _MemoryRead($name, $d2handle, "wchar[100]") + $name = StringReplace($name, @LF, "|") + + $ret &= StringFormat("[class:%04i] [misc:%s] <%s>%s", $class, $misc ? 0 : 1, $name, @CRLF) + next + + ClipPut($ret) + PrintString("Items copied to clipboard.") +endfunc + func HotKey_CopyItem() if (not IsIngame() or GetIlvl() == 0) then return @@ -434,6 +469,65 @@ endfunc #EndRegion #Region Drop notifier +func DropNotifierSetup() + local $nItems = _MemoryRead($d2common + 0x9FB94, $d2handle) + local $pItemsTxt = _MemoryRead($d2common + 0x9FB98, $d2handle) + + local $base, $nameid, $name + + local $matches[] = ["Emblem .+", ".+ Trophy$", "Cycle", "Enchanting Crystal", "Wings of the Departed", ".+ Essence$", "Runestone", "Great Rune\|(.*)", "Mystic Orb\|(.*)"] + local $iMatches = UBound($matches) - 1 + + local $match, $group, $text + + redim $notify_list[$nItems][3] + + for $class = 0 to $nItems - 1 + $group = "" + $text = "" + + $base = $pItemsTxt + 0x1A8 * $class + + $nameid = _MemoryRead($base + 0xF4, $d2handle, "word") + $name = _CreateRemoteThread($d2inject_getstring, $nameid) + $name = _MemoryRead($name, $d2handle, "wchar[100]") + + $name = StringReplace($name, @LF, "|") + $name = StringRegExpReplace($name, "ÿc.", "") + + if (_MemoryRead($base + 0x84, $d2handle)) then + $group = StringInStr($name, "(Sacred)", 3) ? "sacred" : "tiered" + $text = $name + elseif ($name == "Ring" or $name == "Amulet" or $name == "Jewel" or StringInStr($name, "Quiver")) then + $group = "sacred" + $text = $name + elseif (StringInStr($name, "Shrine (10)")) then + $group = "shrine" + $text = StringTrimRight($name, 5) + elseif (StringInStr($name, "Belladonna")) then + $group = "respec" + $text = $name + elseif (StringInStr($name, "Welcome")) then + $add = 1 + $text = "Hello!" + else + for $i = 0 to $iMatches + $match = StringRegExp($name, $matches[$i], 3) + if (not @error) then + $text = $match[0] + exitloop + endif + next + endif + + $notify_list[$class][0] = $group + $notify_list[$class][1] = $text + $notify_list[$class][2] = $name + next + + if (not @compiled) then _ArrayDisplay($notify_list) +endfunc + func DropNotifier() local $ptr_offsets[4] = [0, 0x2C, 0x1C, 0x0] local $pPaths = _MemoryPointerRead($d2client + 0x11BBFC, $d2handle, $ptr_offsets) @@ -455,35 +549,36 @@ func DropNotifier() if ($type == 4) then $class = _MemoryRead($unit + 0x4, $d2handle) - $data = _MemoryRead($unit + 0x14, $d2handle) - $notify = $notify_list[$class][0] - $group = $notify_list[$class][1] + $group = $notify_list[$class][0] + $text = $notify_list[$class][1] - $clr = 8 ; Orange - if ($group <> "") then - $quality = _MemoryRead($data + 0x0, $d2handle) + if ($text <> "") then + $data = _MemoryRead($unit + 0x14, $d2handle) + $notify = 1 + $clr = 8 ; Orange - if ($quality == 5) then - $notify = GetGUIOption("notify-set") - $clr = 2 ; Green - elseif ($quality == 7 or ($group <> "tiered" and $group <> "sacred")) then - $notify = GetGUIOption("notify-" & $group) - $clr = $quality == 7 ? 4 : $clr ; Gold or Orange - else - $notify = 0 + if ($group <> "") then + $quality = _MemoryRead($data + 0x0, $d2handle) + + if ($quality == 5) then + $notify = GetGUIOption("notify-set") + $clr = 2 ; Green + elseif ($quality == 7 or ($group <> "tiered" and $group <> "sacred")) then + $notify = GetGUIOption("notify-" & $group) + $clr = $quality == 7 ? 4 : $clr ; Gold or Orange + else + $notify = 0 + endif endif - endif - if ($notify and _MemoryRead($data + 0x48, $d2handle, "byte") == 0) then - ; Using the ear level field to check if we've seen this item on the ground before - ; Resets when the item is picked up or we move too far away - _MemoryWrite($data + 0x48, $d2handle, 1, "byte") - - $text = $notify_list[$class][2] - if ($text == "") then $text = "" + if ($notify and _MemoryRead($data + 0x48, $d2handle, "byte") == 0) then + ; Using the ear level field to check if we've seen this item on the ground before + ; Resets when the item is picked up or we move too far away + _MemoryWrite($data + 0x48, $d2handle, 1, "byte") - PrintString("- " & $text, $clr) + PrintString("- " & $text, $clr) + endif endif endif @@ -1019,8 +1114,18 @@ D2Client.dll+CDE01 - 68 * - push D2Client.dll+CDE10 D2Client.dll+CDE06 - 31 C0 - xor eax,eax D2Client.dll+CDE08 - E8 43FAFAFF - call D2Client.dll+7D850 D2Client.dll+CDE0D - C3 - ret + +D2Client.dll+CDE10 - 8B CB - mov ecx,ebx +D2Client.dll+CDE12 - 31 C0 - xor eax,eax +D2Client.dll+CDE14 - BB * - mov ebx,D2Lang.dll+9450 +D2Client.dll+CDE19 - FF D3 - call ebx +D2Client.dll+CDE1B - C3 - ret #ce +func InjectFunctions() + return InjectPrintFunction() and InjectGetStringFunction() +endfunc + func InjectPrintFunction() local $sCode = "0x5368" & GetOffsetAddress($d2inject_string) & "31C0E843FAFAFFC3" local $ret = _MemoryWrite($d2inject_print, $d2handle, $sCode, "byte[14]") @@ -1029,6 +1134,14 @@ func InjectPrintFunction() return Hex($injected, 8) == Hex(Binary(Int(StringLeft($sCode, 10)))) endfunc +func InjectGetStringFunction() + local $sCode = "0x8BCB31C0BB" & GetOffsetAddress($d2lang + 0x9450) & "FFD3C3" + local $ret = _MemoryWrite($d2inject_getstring, $d2handle, $sCode, "byte[12]") + + local $injected = _MemoryRead($d2inject_getstring, $d2handle) + return Hex($injected, 8) == Hex(Binary(Int(StringLeft($sCode, 10)))) +endfunc + func UpdateDllHandles() local $loadlib = _WinAPI_GetProcAddress(_WinAPI_GetModuleHandle("kernel32.dll"), "LoadLibraryA") if (not $loadlib) then return _Debug("UpdateDllHandles", "Couldn't retrieve LoadLibraryA address.") @@ -1049,10 +1162,12 @@ func UpdateDllHandles() $d2client = $handles[0] $d2common = $handles[1] $d2win = $handles[2] + $d2lang = $handles[3] local $d2inject = $d2client + 0xCDE00 $d2inject_print = $d2inject + 0x0 - $d2inject_string = $d2inject + 0x10 + $d2inject_getstring = $d2inject + 0x10 + $d2inject_string = $d2inject + 0x20 $d2sgpt = _MemoryRead($d2common + 0x99E1C, $d2handle) diff --git a/notifier/lua53.exe b/notifier/lua53.exe deleted file mode 100644 index dc06dd0..0000000 Binary files a/notifier/lua53.exe and /dev/null differ diff --git a/notifier/notify.lua b/notifier/notify.lua deleted file mode 100644 index cc31321..0000000 --- a/notifier/notify.lua +++ /dev/null @@ -1,59 +0,0 @@ -local f = io.open("items.txt", "rb"); - -local itemType, code, name, add, grp, text; - -local output = {}; -local class = 0; - -local matches = {"Emblem .+", ".+ Trophy$", "Cycle", "Enchanting Crystal", "Wings of the Departed", ".+ Essence$", "Runestone", "^Great Rune|(.+)", "^Mystic Orb|(.+)"}; - -for line in f:lines() do - code, name = line:match"%[.?(....)%] <(.*)>"; - if (code and name) then - add = false; - grp = ""; - text = ""; - - if (itemType ~= "misc") then -- Weapons and armour - add = true; - grp = name:match"%(Sacred%)$" and "sacred" or "tiered"; - text = name; - elseif (name=="Ring" or name=="Amulet" or name=="Jewel" or name:match"Quiver") then - add = true; - grp = "sacred"; - text = name; - elseif (name:match"Shrine %(10%)") then - add = true; - grp = "shrine"; - text = name:gsub(" %(10%)$", ""); - elseif (name:match"Belladonna") then - add = true; - grp = "respec"; - text = name; - elseif (name:match"Welcome") then - add = true; - text = "Hello!"; - else - for _, match in ipairs (matches) do - text = name:match(match) or ""; - if (text ~= "") then - add = true; - break; - end - end - end - - table.insert(output, string.format('[%s,"%s","%s"], _ ; %s', add and "1" or "0", grp, text, line)); - class = class + 1; - else - code = line:match"{(%w+)}"; - itemType = code or itemType; - end -end -f:close(); - -f = io.open("notify_list.au3", "w+b"); -f:setvbuf"no"; -f:write("global $notify_list[][3] = [ _\r\n", table.concat(output), "\r\n[] ]"); -f:flush(); -f:close(); diff --git a/notifier/notify_list.au3 b/notifier/notify_list.au3 deleted file mode 100644 index 1caeb68..0000000 --- a/notifier/notify_list.au3 +++ /dev/null @@ -1,3 +0,0 @@ -global $notify_list[][3] = [ _ -[1,"tiered","Rancid Gas Potion"], _ ; [gps ] [1,"tiered","Oil Potion"], _ ; [ops ] [1,"tiered","Choking Gas Potion"], _ ; [gpm ] [1,"tiered","Exploding Potion"], _ ; [opm ] [1,"tiered","Strangling Gas Potion"], _ ; [gpl ] [1,"tiered","Fulminating Potion"], _ ; [opl ] [1,"tiered","Decoy Gidbinn"], _ ; [d33 ] [1,"tiered","The Gidbinn"], _ ; [g33 ] [1,"tiered","Wirt's Leg"], _ ; [leg ] [1,"tiered","Horadric Malus"], _ ; [hdm ] [1,"tiered","Hell Forge Hammer"], _ ; [hfh ] [1,"tiered","Horadric Staff"], _ ; [hst ] [1,"tiered","Shaft of the Horadric Staff"], _ ; [msf ] [1,"tiered","Khalim's Flail"], _ ; [qf1 ] [1,"tiered","Khalim's Will"], _ ; [qf2 ] [1,"tiered","Throwing Axe"], _ ; [tax ] [1,"tiered","Broad Sword"], _ ; [bsd ] [1,"tiered","Voulge"], _ ; [vou ] [1,"tiered","Angel Star (1)"], _ ; [4@A ] [1,"tiered","Angel Star (2)"], _ ; [5@A ] [1,"tiered","Angel Star (3)"], _ ; [6@A ] [1,"tiered","Angel Star (4)"], _ ; [7@A ] [1,"tiered","Angel Star (5)"], _ ; [8@A ] [1,"tiered","Angel Star (6)"], _ ; [9@A ] [1,"sacred","Angel Star (Sacred)"], _ ; [1@B ] [1,"tiered","Axe (1)"], _ ; [115 ] [1,"tiered","Axe (2)"], _ ; [183 ] [1,"tiered","Axe (3)"], _ ; [251 ] [1,"tiered","Axe (4)"], _ ; [319 ] [1,"tiered","Axe (5)"], _ ; [387 ] [1,"tiered","Axe (6)"], _ ; [455 ] [1,"sacred","Axe (Sacred)"], _ ; [16@ ] [1,"tiered","Backsword (1)"], _ ; [7@5 ] [1,"tiered","Backsword (2)"], _ ; [8@5 ] [1,"tiered","Backsword (3)"], _ ; [9@5 ] [1,"tiered","Backsword (4)"], _ ; [1@6 ] [1,"tiered","Backsword (5)"], _ ; [2@6 ] [1,"tiered","Backsword (6)"], _ ; [3@6 ] [1,"sacred","Backsword (Sacred)"], _ ; [4@6 ] [1,"tiered","Balanced Axe (1)"], _ ; [150 ] [1,"tiered","Balanced Axe (2)"], _ ; [218 ] [1,"tiered","Balanced Axe (3)"], _ ; [286 ] [1,"tiered","Balanced Axe (4)"], _ ; [354 ] [1,"tiered","Balanced Axe (5)"], _ ; [422 ] [1,"tiered","Balanced Axe (6)"], _ ; [490 ] [1,"sacred","Balanced Axe (Sacred)"], _ ; [51@ ] [1,"tiered","Balanced Knife (1)"], _ ; [148 ] [1,"tiered","Balanced Knife (2)"], _ ; [216 ] [1,"tiered","Balanced Knife (3)"], _ ; [284 ] [1,"tiered","Balanced Knife (4)"], _ ; [352 ] [1,"tiered","Balanced Knife (5)"], _ ; [420 ] [1,"tiered","Balanced Knife (6)"], _ ; [488 ] [1,"sacred","Balanced Knife (Sacred)"], _ ; [49@ ] [1,"tiered","Bardiche (1)"], _ ; [156 ] [1,"tiered","Bardiche (2)"], _ ; [224 ] [1,"tiered","Bardiche (3)"], _ ; [292 ] [1,"tiered","Bardiche (4)"], _ ; [360 ] [1,"tiered","Bardiche (5)"], _ ; [428 ] [1,"tiered","Bardiche (6)"], _ ; [496 ] [1,"sacred","Bardiche (Sacred)"], _ ; [57@ ] [1,"tiered","Bastard Sword (1)"], _ ; [110 ] [1,"tiered","Bastard Sword (2)"], _ ; [178 ] [1,"tiered","Bastard Sword (3)"], _ ; [246 ] [1,"tiered","Bastard Sword (4)"], _ ; [314 ] [1,"tiered","Bastard Sword (5)"], _ ; [382 ] [1,"tiered","Bastard Sword (6)"], _ ; [450 ] [1,"sacred","Bastard Sword (Sacred)"], _ ; [11@ ] [1,"tiered","Battle Axe (1)"], _ ; [121 ] [1,"tiered","Battle Axe (2)"], _ ; [189 ] [1,"tiered","Battle Axe (3)"], _ ; [257 ] [1,"tiered","Battle Axe (4)"], _ ; [325 ] [1,"tiered","Battle Axe (5)"], _ ; [393 ] [1,"tiered","Battle Axe (6)"], _ ; [461 ] [1,"sacred","Battle Axe (Sacred)"], _ ; [22@ ] [1,"tiered","Battle Staff (1)"], _ ; [154 ] [1,"tiered","Battle Staff (2)"], _ ; [222 ] [1,"tiered","Battle Staff (3)"], _ ; [290 ] [1,"tiered","Battle Staff (4)"], _ ; [358 ] [1,"tiered","Battle Staff (5)"], _ ; [426 ] [1,"tiered","Battle Staff (6)"], _ ; [494 ] [1,"sacred","Battle Staff (Sacred)"], _ ; [55@ ] [1,"tiered","Blade (1)"], _ ; [145 ] [1,"tiered","Blade (2)"], _ ; [213 ] [1,"tiered","Blade (3)"], _ ; [281 ] [1,"tiered","Blade (4)"], _ ; [349 ] [1,"tiered","Blade (5)"], _ ; [417 ] [1,"tiered","Blade (6)"], _ ; [485 ] [1,"sacred","Blade (Sacred)"], _ ; [46@ ] [1,"tiered","Blade Talons (1)"], _ ; [j25 ] [1,"tiered","Blade Talons (2)"], _ ; [j42 ] [1,"tiered","Blade Talons (3)"], _ ; [j59 ] [1,"tiered","Blade Talons (4)"], _ ; [j76 ] [1,"tiered","Blade Talons (5)"], _ ; [j93 ] [1,"tiered","Blade Talons (6)"], _ ; [o20 ] [1,"sacred","Blade Talons (Sacred)"], _ ; [95@ ] [1,"tiered","Bone Wand (1)"], _ ; [l12 ] [1,"tiered","Bone Wand (2)"], _ ; [l16 ] [1,"tiered","Bone Wand (3)"], _ ; [l20 ] [1,"tiered","Bone Wand (4)"], _ ; [l24 ] [1,"tiered","Bone Wand (5)"], _ ; [l28 ] [1,"tiered","Bone Wand (6)"], _ ; [l32 ] [1,"sacred","Bone Wand (Sacred)"], _ ; [71@ ] [1,"tiered","Bonebreaker (1)"], _ ; [8@8 ] [1,"tiered","Bonebreaker (2)"], _ ; [9@8 ] [1,"tiered","Bonebreaker (3)"], _ ; [1@9 ] [1,"tiered","Bonebreaker (4)"], _ ; [2@9 ] [1,"tiered","Bonebreaker (5)"], _ ; [3@9 ] [1,"tiered","Bonebreaker (6)"], _ ; [4@9 ] [1,"sacred","Bonebreaker (Sacred)"], _ ; [5@9 ] [1,"tiered","Bonesplitter (1)"], _ ; [!15 ] [1,"tiered","Bonesplitter (2)"], _ ; [!16 ] [1,"tiered","Bonesplitter (3)"], _ ; [!17 ] [1,"tiered","Bonesplitter (4)"], _ ; [!18 ] [1,"tiered","Bonesplitter (5)"], _ ; [!19 ] [1,"tiered","Bonesplitter (6)"], _ ; [!20 ] [1,"sacred","Bonesplitter (Sacred)"], _ ; [!21 ] [1,"tiered","Brandistock (1)"], _ ; [139 ] [1,"tiered","Brandistock (2)"], _ ; [207 ] [1,"tiered","Brandistock (3)"], _ ; [275 ] [1,"tiered","Brandistock (4)"], _ ; [343 ] [1,"tiered","Brandistock (5)"], _ ; [411 ] [1,"tiered","Brandistock (6)"], _ ; [479 ] [1,"sacred","Brandistock (Sacred)"], _ ; [40@ ] [1,"tiered","Broad Axe (1)"], _ ; [120 ] [1,"tiered","Broad Axe (2)"], _ ; [188 ] [1,"tiered","Broad Axe (3)"], _ ; [256 ] [1,"tiered","Broad Axe (4)"], _ ; [324 ] [1,"tiered","Broad Axe (5)"], _ ; [392 ] [1,"tiered","Broad Axe (6)"], _ ; [460 ] [1,"sacred","Broad Axe (Sacred)"], _ ; [21@ ] [1,"tiered","Broad Sword (1)"], _ ; [104 ] [1,"tiered","Broad Sword (2)"], _ ; [172 ] [1,"tiered","Broad Sword (3)"], _ ; [240 ] [1,"tiered","Broad Sword (4)"], _ ; [308 ] [1,"tiered","Broad Sword (5)"], _ ; [376 ] [1,"tiered","Broad Sword (6)"], _ ; [444 ] [1,"sacred","Broad Sword (Sacred)"], _ ; [05@ ] [1,"tiered","Bronze Sword (1)"], _ ; [3@7 ] [1,"tiered","Bronze Sword (2)"], _ ; [4@7 ] [1,"tiered","Bronze Sword (3)"], _ ; [5@7 ] [1,"tiered","Bronze Sword (4)"], _ ; [6@7 ] [1,"tiered","Bronze Sword (5)"], _ ; [7@7 ] [1,"tiered","Bronze Sword (6)"], _ ; [8@7 ] [1,"sacred","Bronze Sword (Sacred)"], _ ; [9@7 ] [1,"tiered","Cestus (1)"], _ ; [j23 ] [1,"tiered","Cestus (2)"], _ ; [j40 ] [1,"tiered","Cestus (3)"], _ ; [j57 ] [1,"tiered","Cestus (4)"], _ ; [j74 ] [1,"tiered","Cestus (5)"], _ ; [j91 ] [1,"tiered","Cestus (6)"], _ ; [o18 ] [1,"sacred","Cestus (Sacred)"], _ ; [93@ ] [1,"tiered","Clasped Orb (1)"], _ ; [j13 ] [1,"tiered","Clasped Orb (2)"], _ ; [j30 ] [1,"tiered","Clasped Orb (3)"], _ ; [j47 ] [1,"tiered","Clasped Orb (4)"], _ ; [j64 ] [1,"tiered","Clasped Orb (5)"], _ ; [j81 ] [1,"tiered","Clasped Orb (6)"], _ ; [j98 ] [1,"sacred","Clasped Orb (Sacred)"], _ ; [83@ ] [1,"tiered","Claws (1)"], _ ; [j24 ] [1,"tiered","Claws (2)"], _ ; [j41 ] [1,"tiered","Claws (3)"], _ ; [j58 ] [1,"tiered","Claws (4)"], _ ; [j75 ] [1,"tiered","Claws (5)"], _ ; [j92 ] [1,"tiered","Claws (6)"], _ ; [o19 ] [1,"sacred","Claws (Sacred)"], _ ; [94@ ] [1,"tiered","Claymore (1)"], _ ; [108 ] [1,"tiered","Claymore (2)"], _ ; [176 ] [1,"tiered","Claymore (3)"], _ ; [244 ] [1,"tiered","Claymore (4)"], _ ; [312 ] [1,"tiered","Claymore (5)"], _ ; [380 ] [1,"tiered","Claymore (6)"], _ ; [448 ] [1,"sacred","Claymore (Sacred)"], _ ; [09@ ] [1,"tiered","Club (1)"], _ ; [124 ] [1,"tiered","Club (2)"], _ ; [192 ] [1,"tiered","Club (3)"], _ ; [260 ] [1,"tiered","Club (4)"], _ ; [328 ] [1,"tiered","Club (5)"], _ ; [396 ] [1,"tiered","Club (6)"], _ ; [464 ] [1,"sacred","Club (Sacred)"], _ ; [25@ ] [1,"tiered","Composite Bow (1)"], _ ; [163 ] [1,"tiered","Composite Bow (2)"], _ ; [231 ] [1,"tiered","Composite Bow (3)"], _ ; [299 ] [1,"tiered","Composite Bow (4)"], _ ; [367 ] [1,"tiered","Composite Bow (5)"], _ ; [435 ] [1,"tiered","Composite Bow (6)"], _ ; [503 ] [1,"sacred","Composite Bow (Sacred)"], _ ; [64@ ] [1,"tiered","Compound Bow (1)"], _ ; [1@1 ] [1,"tiered","Compound Bow (2)"], _ ; [2@1 ] [1,"tiered","Compound Bow (3)"], _ ; [3@1 ] [1,"tiered","Compound Bow (4)"], _ ; [4@1 ] [1,"tiered","Compound Bow (5)"], _ ; [5@1 ] [1,"tiered","Compound Bow (6)"], _ ; [6@1 ] [1,"sacred","Compound Bow (Sacred)"], _ ; [7@1 ] [1,"tiered","Crossbow (1)"], _ ; [l53 ] [1,"tiered","Crossbow (2)"], _ ; [l57 ] [1,"tiered","Crossbow (3)"], _ ; [l61 ] [1,"tiered","Crossbow (4)"], _ ; [l65 ] [1,"tiered","Crossbow (5)"], _ ; [l69 ] [1,"tiered","Crossbow (6)"], _ ; [l73 ] [1,"sacred","Crossbow (Sacred)"], _ ; [77@ ] [1,"tiered","Crystal Sword (1)"], _ ; [113 ] [1,"tiered","Crystal Sword (2)"], _ ; [181 ] [1,"tiered","Crystal Sword (3)"], _ ; [249 ] [1,"tiered","Crystal Sword (4)"], _ ; [317 ] [1,"tiered","Crystal Sword (5)"], _ ; [385 ] [1,"tiered","Crystal Sword (6)"], _ ; [453 ] [1,"sacred","Crystal Sword (Sacred)"], _ ; [14@ ] [1,"tiered","Dagger (1)"], _ ; [142 ] [1,"tiered","Dagger (2)"], _ ; [210 ] [1,"tiered","Dagger (3)"], _ ; [278 ] [1,"tiered","Dagger (4)"], _ ; [346 ] [1,"tiered","Dagger (5)"], _ ; [414 ] [1,"tiered","Dagger (6)"], _ ; [482 ] [1,"sacred","Dagger (Sacred)"], _ ; [43@ ] [1,"tiered","Dart Thrower (1)"], _ ; [5@D ] [1,"tiered","Dart Thrower (2)"], _ ; [6@D ] [1,"tiered","Dart Thrower (3)"], _ ; [7@D ] [1,"tiered","Dart Thrower (4)"], _ ; [8@D ] [1,"tiered","Dart Thrower (5)"], _ ; [9@D ] [1,"tiered","Dart Thrower (6)"], _ ; [1@E ] [1,"sacred","Dart Thrower (Sacred)"], _ ; [2@E ] [1,"tiered","Dirk (1)"], _ ; [143 ] [1,"tiered","Dirk (2)"], _ ; [211 ] [1,"tiered","Dirk (3)"], _ ; [279 ] [1,"tiered","Dirk (4)"], _ ; [347 ] [1,"tiered","Dirk (5)"], _ ; [415 ] [1,"tiered","Dirk (6)"], _ ; [483 ] [1,"sacred","Dirk (Sacred)"], _ ; [44@ ] [1,"tiered","Double Axe (1)"], _ ; [116 ] [1,"tiered","Double Axe (2)"], _ ; [184 ] [1,"tiered","Double Axe (3)"], _ ; [252 ] [1,"tiered","Double Axe (4)"], _ ; [320 ] [1,"tiered","Double Axe (5)"], _ ; [388 ] [1,"tiered","Double Axe (6)"], _ ; [456 ] [1,"sacred","Double Axe (Sacred)"], _ ; [17@ ] [1,"tiered","Jared's Stone (1)"], _ ; [j14 ] [1,"tiered","Jared's Stone (2)"], _ ; [j31 ] [1,"tiered","Jared's Stone (3)"], _ ; [j48 ] [1,"tiered","Jared's Stone (4)"], _ ; [j65 ] [1,"tiered","Jared's Stone (5)"], _ ; [j82 ] [1,"tiered","Jared's Stone (6)"], _ ; [j99 ] [1,"sacred","Jared's Stone (Sacred)"], _ ; [84@ ] [1,"tiered","Eagle Orb (1)"], _ ; [j10 ] [1,"tiered","Eagle Orb (2)"], _ ; [j27 ] [1,"tiered","Eagle Orb (3)"], _ ; [j44 ] [1,"tiered","Eagle Orb (4)"], _ ; [j61 ] [1,"tiered","Eagle Orb (5)"], _ ; [j78 ] [1,"tiered","Eagle Orb (6)"], _ ; [j95 ] [1,"sacred","Eagle Orb (Sacred)"], _ ; [80@ ] [1,"tiered","Falchion (1)"], _ ; [103 ] [1,"tiered","Falchion (2)"], _ ; [171 ] [1,"tiered","Falchion (3)"], _ ; [239 ] [1,"tiered","Falchion (4)"], _ ; [307 ] [1,"tiered","Falchion (5)"], _ ; [375 ] [1,"tiered","Falchion (6)"], _ ; [443 ] [1,"sacred","Falchion (Sacred)"], _ ; [04@ ] [1,"tiered","Flail (1)"], _ ; [128 ] [1,"tiered","Flail (2)"], _ ; [196 ] [1,"tiered","Flail (3)"], _ ; [264 ] [1,"tiered","Flail (4)"], _ ; [332 ] [1,"tiered","Flail (5)"], _ ; [400 ] [1,"tiered","Flail (6)"], _ ; [468 ] [1,"sacred","Flail (Sacred)"], _ ; [29@ ] [1,"tiered","Flamberge (1)"], _ ; [111 ] [1,"tiered","Flamberge (2)"], _ ; [179 ] [1,"tiered","Flamberge (3)"], _ ; [247 ] [1,"tiered","Flamberge (4)"], _ ; [315 ] [1,"tiered","Flamberge (5)"], _ ; [383 ] [1,"tiered","Flamberge (6)"], _ ; [451 ] [1,"sacred","Flamberge (Sacred)"], _ ; [12@ ] [1,"tiered","Flamen Staff (1)"], _ ; [!56 ] [1,"tiered","Flamen Staff (2)"], _ ; [!57 ] [1,"tiered","Flamen Staff (3)"], _ ; [!58 ] [1,"tiered","Flamen Staff (4)"], _ ; [!59 ] [1,"tiered","Flamen Staff (5)"], _ ; [!60 ] [1,"tiered","Flamen Staff (6)"], _ ; [!61 ] [1,"sacred","Flamen Staff (Sacred)"], _ ; [!62 ] [1,"tiered","Flying Knife (1)"], _ ; [147 ] [1,"tiered","Flying Knife (2)"], _ ; [215 ] [1,"tiered","Flying Knife (3)"], _ ; [283 ] [1,"tiered","Flying Knife (4)"], _ ; [351 ] [1,"tiered","Flying Knife (5)"], _ ; [419 ] [1,"tiered","Flying Knife (6)"], _ ; [487 ] [1,"sacred","Flying Knife (Sacred)"], _ ; [48@ ] [1,"tiered","Giant Axe (1)"], _ ; [123 ] [1,"tiered","Giant Axe (2)"], _ ; [191 ] [1,"tiered","Giant Axe (3)"], _ ; [259 ] [1,"tiered","Giant Axe (4)"], _ ; [327 ] [1,"tiered","Giant Axe (5)"], _ ; [395 ] [1,"tiered","Giant Axe (6)"], _ ; [463 ] [1,"sacred","Giant Axe (Sacred)"], _ ; [24@ ] [1,"tiered","Giant Sword (1)"], _ ; [109 ] [1,"tiered","Giant Sword (2)"], _ ; [177 ] [1,"tiered","Giant Sword (3)"], _ ; [245 ] [1,"tiered","Giant Sword (4)"], _ ; [313 ] [1,"tiered","Giant Sword (5)"], _ ; [381 ] [1,"tiered","Giant Sword (6)"], _ ; [449 ] [1,"sacred","Giant Sword (Sacred)"], _ ; [10@ ] [1,"tiered","Glaive (1)"], _ ; [135 ] [1,"tiered","Glaive (2)"], _ ; [203 ] [1,"tiered","Glaive (3)"], _ ; [271 ] [1,"tiered","Glaive (4)"], _ ; [339 ] [1,"tiered","Glaive (5)"], _ ; [407 ] [1,"tiered","Glaive (6)"], _ ; [475 ] [1,"sacred","Glaive (Sacred)"], _ ; [36@ ] [1,"tiered","Gnarled Staff (1)"], _ ; [153 ] [1,"tiered","Gnarled Staff (2)"], _ ; [221 ] [1,"tiered","Gnarled Staff (3)"], _ ; [289 ] [1,"tiered","Gnarled Staff (4)"], _ ; [357 ] [1,"tiered","Gnarled Staff (5)"], _ ; [425 ] [1,"tiered","Gnarled Staff (6)"], _ ; [493 ] [1,"sacred","Gnarled Staff (Sacred)"], _ ; [54@ ] [1,"tiered","Goedendag (1)"], _ ; [6@9 ] [1,"tiered","Goedendag (2)"], _ ; [7@9 ] [1,"tiered","Goedendag (3)"], _ ; [8@9 ] [1,"tiered","Goedendag (4)"], _ ; [9@9 ] [1,"tiered","Goedendag (5)"], _ ; [1@A ] [1,"tiered","Goedendag (6)"], _ ; [2@A ] [1,"sacred","Goedendag (Sacred)"], _ ; [3@A ] [1,"tiered","Grand Scepter (1)"], _ ; [130 ] [1,"tiered","Grand Scepter (2)"], _ ; [198 ] [1,"tiered","Grand Scepter (3)"], _ ; [266 ] [1,"tiered","Grand Scepter (4)"], _ ; [334 ] [1,"tiered","Grand Scepter (5)"], _ ; [402 ] [1,"tiered","Grand Scepter (6)"], _ ; [470 ] [1,"sacred","Grand Scepter (Sacred)"], _ ; [31@ ] [1,"tiered","Great Axe (1)"], _ ; [122 ] [1,"tiered","Great Axe (2)"], _ ; [190 ] [1,"tiered","Great Axe (3)"], _ ; [258 ] [1,"tiered","Great Axe (4)"], _ ; [326 ] [1,"tiered","Great Axe (5)"], _ ; [394 ] [1,"tiered","Great Axe (6)"], _ ; [462 ] [1,"sacred","Great Axe (Sacred)"], _ ; [23@ ] [1,"tiered","Great Maul (1)"], _ ; [l36 ] [1,"tiered","Great Maul (2)"], _ ; [l39 ] [1,"tiered","Great Maul (3)"], _ ; [l42 ] [1,"tiered","Great Maul (4)"], _ ; [l45 ] [1,"tiered","Great Maul (5)"], _ ; [l48 ] [1,"tiered","Great Maul (6)"], _ ; [l51 ] [1,"sacred","Great Maul (Sacred)"], _ ; [75@ ] [1,"tiered","Great Sword (1)"], _ ; [112 ] [1,"tiered","Great Sword (2)"], _ ; [180 ] [1,"tiered","Great Sword (3)"], _ ; [248 ] [1,"tiered","Great Sword (4)"], _ ; [316 ] [1,"tiered","Great Sword (5)"], _ ; [384 ] [1,"tiered","Great Sword (6)"], _ ; [452 ] [1,"sacred","Great Sword (Sacred)"], _ ; [13@ ] [1,"tiered","Grim Wand (1)"], _ ; [l13 ] [1,"tiered","Grim Wand (2)"], _ ; [l17 ] [1,"tiered","Grim Wand (3)"], _ ; [l21 ] [1,"tiered","Grim Wand (4)"], _ ; [l25 ] [1,"tiered","Grim Wand (5)"], _ ; [l29 ] [1,"tiered","Grim Wand (6)"], _ ; [l33 ] [1,"sacred","Grim Wand (Sacred)"], _ ; [72@ ] [1,"tiered","Halberd (1)"], _ ; [159 ] [1,"tiered","Halberd (2)"], _ ; [227 ] [1,"tiered","Halberd (3)"], _ ; [295 ] [1,"tiered","Halberd (4)"], _ ; [363 ] [1,"tiered","Halberd (5)"], _ ; [431 ] [1,"tiered","Halberd (6)"], _ ; [499 ] [1,"sacred","Halberd (Sacred)"], _ ; [60@ ] [1,"tiered","Hammerhead Axe (1)"], _ ; [19@ ] [1,"tiered","Hammerhead Axe (2)"], _ ; [!29 ] [1,"tiered","Hammerhead Axe (3)"], _ ; [!30 ] [1,"tiered","Hammerhead Axe (4)"], _ ; [!31 ] [1,"tiered","Hammerhead Axe (5)"], _ ; [!32 ] [1,"tiered","Hammerhead Axe (6)"], _ ; [!33 ] [1,"sacred","Hammerhead Axe (Sacred)"], _ ; [!34 ] [1,"tiered","Hand Axe (1)"], _ ; [114 ] [1,"tiered","Hand Axe (2)"], _ ; [182 ] [1,"tiered","Hand Axe (3)"], _ ; [250 ] [1,"tiered","Hand Axe (4)"], _ ; [318 ] [1,"tiered","Hand Axe (5)"], _ ; [386 ] [1,"tiered","Hand Axe (6)"], _ ; [454 ] [1,"sacred","Hand Axe (Sacred)"], _ ; [15@ ] [1,"tiered","Hand of God (1)"], _ ; [9@B ] [1,"tiered","Hand of God (2)"], _ ; [1@C ] [1,"tiered","Hand of God (3)"], _ ; [2@C ] [1,"tiered","Hand of God (4)"], _ ; [3@C ] [1,"tiered","Hand of God (5)"], _ ; [4@C ] [1,"tiered","Hand of God (6)"], _ ; [5@C ] [1,"sacred","Hand of God (Sacred)"], _ ; [6@C ] [1,"tiered","Hatchet Hands (1)"], _ ; [j22 ] [1,"tiered","Hatchet Hands (2)"], _ ; [j39 ] [1,"tiered","Hatchet Hands (3)"], _ ; [j56 ] [1,"tiered","Hatchet Hands (4)"], _ ; [j73 ] [1,"tiered","Hatchet Hands (5)"], _ ; [j90 ] [1,"tiered","Hatchet Hands (6)"], _ ; [o17 ] [1,"sacred","Hatchet Hands (Sacred)"], _ ; [92@ ] [1,"tiered","Heavy Crossbow (1)"], _ ; [l54 ] [1,"tiered","Heavy Crossbow (2)"], _ ; [l58 ] [1,"tiered","Heavy Crossbow (3)"], _ ; [l62 ] [1,"tiered","Heavy Crossbow (4)"], _ ; [l66 ] [1,"tiered","Heavy Crossbow (5)"], _ ; [l70 ] [1,"tiered","Heavy Crossbow (6)"], _ ; [l74 ] [1,"sacred","Heavy Crossbow (Sacred)"], _ ; [78@ ] [1,"tiered","Hexblade (1)"], _ ; [!70 ] [1,"tiered","Hexblade (2)"], _ ; [!71 ] [1,"tiered","Hexblade (3)"], _ ; [!72 ] [1,"tiered","Hexblade (4)"], _ ; [!73 ] [1,"tiered","Hexblade (5)"], _ ; [!74 ] [1,"tiered","Hexblade (6)"], _ ; [!75 ] [1,"sacred","Hexblade (Sacred)"], _ ; [!76 ] [1,"tiered","Holy Lance (1)"], _ ; [!84 ] [1,"tiered","Holy Lance (2)"], _ ; [!85 ] [1,"tiered","Holy Lance (3)"], _ ; [!86 ] [1,"tiered","Holy Lance (4)"], _ ; [!87 ] [1,"tiered","Holy Lance (5)"], _ ; [!88 ] [1,"tiered","Holy Lance (6)"], _ ; [!89 ] [1,"sacred","Holy Lance (Sacred)"], _ ; [!90 ] [1,"tiered","Hunter's Bow (1)"], _ ; [161 ] [1,"tiered","Hunter's Bow (2)"], _ ; [229 ] [1,"tiered","Hunter's Bow (3)"], _ ; [297 ] [1,"tiered","Hunter's Bow (4)"], _ ; [365 ] [1,"tiered","Hunter's Bow (5)"], _ ; [433 ] [1,"tiered","Hunter's Bow (6)"], _ ; [501 ] [1,"sacred","Hunter's Bow (Sacred)"], _ ; [62@ ] [1,"tiered","Ida (1)"], _ ; [5@6 ] [1,"tiered","Ida (2)"], _ ; [6@6 ] [1,"tiered","Ida (3)"], _ ; [7@6 ] [1,"tiered","Ida (4)"], _ ; [8@6 ] [1,"tiered","Ida (5)"], _ ; [9@6 ] [1,"tiered","Ida (6)"], _ ; [1@7 ] [1,"sacred","Ida (Sacred)"], _ ; [2@7 ] [1,"tiered","Javelin (1)"], _ ; [132 ] [1,"tiered","Javelin (2)"], _ ; [200 ] [1,"tiered","Javelin (3)"], _ ; [268 ] [1,"tiered","Javelin (4)"], _ ; [336 ] [1,"tiered","Javelin (5)"], _ ; [404 ] [1,"tiered","Javelin (6)"], _ ; [472 ] [1,"sacred","Javelin (Sacred)"], _ ; [33@ ] [1,"tiered","Katar (1)"], _ ; [j20 ] [1,"tiered","Katar (2)"], _ ; [j37 ] [1,"tiered","Katar (3)"], _ ; [j54 ] [1,"tiered","Katar (4)"], _ ; [j71 ] [1,"tiered","Katar (5)"], _ ; [j88 ] [1,"tiered","Katar (6)"], _ ; [o15 ] [1,"sacred","Katar (Sacred)"], _ ; [90@ ] [1,"tiered","Kriegsmesser (1)"], _ ; [1@8 ] [1,"tiered","Kriegsmesser (2)"], _ ; [2@8 ] [1,"tiered","Kriegsmesser (3)"], _ ; [3@8 ] [1,"tiered","Kriegsmesser (4)"], _ ; [4@8 ] [1,"tiered","Kriegsmesser (5)"], _ ; [5@8 ] [1,"tiered","Kriegsmesser (6)"], _ ; [6@8 ] [1,"sacred","Kriegsmesser (Sacred)"], _ ; [7@8 ] [1,"tiered","Kriss (1)"], _ ; [144 ] [1,"tiered","Kriss (2)"], _ ; [212 ] [1,"tiered","Kriss (3)"], _ ; [280 ] [1,"tiered","Kriss (4)"], _ ; [348 ] [1,"tiered","Kriss (5)"], _ ; [416 ] [1,"tiered","Kriss (6)"], _ ; [484 ] [1,"sacred","Kriss (Sacred)"], _ ; [45@ ] [1,"tiered","Labrys (1)"], _ ; [!49 ] [1,"tiered","Labrys (2)"], _ ; [!50 ] [1,"tiered","Labrys (3)"], _ ; [!51 ] [1,"tiered","Labrys (4)"], _ ; [!52 ] [1,"tiered","Labrys (5)"], _ ; [!53 ] [1,"tiered","Labrys (6)"], _ ; [!54 ] [1,"sacred","Labrys (Sacred)"], _ ; [!55 ] [1,"tiered","Large Axe (1)"], _ ; [119 ] [1,"tiered","Large Axe (2)"], _ ; [187 ] [1,"tiered","Large Axe (3)"], _ ; [255 ] [1,"tiered","Large Axe (4)"], _ ; [323 ] [1,"tiered","Large Axe (5)"], _ ; [391 ] [1,"tiered","Large Axe (6)"], _ ; [459 ] [1,"sacred","Large Axe (Sacred)"], _ ; [20@ ] [1,"tiered","Light Crossbow (1)"], _ ; [l52 ] [1,"tiered","Light Crossbow (2)"], _ ; [l56 ] [1,"tiered","Light Crossbow (3)"], _ ; [l60 ] [1,"tiered","Light Crossbow (4)"], _ ; [l64 ] [1,"tiered","Light Crossbow (5)"], _ ; [l68 ] [1,"tiered","Light Crossbow (6)"], _ ; [l72 ] [1,"sacred","Light Crossbow (Sacred)"], _ ; [76@ ] [1,"tiered","Long Battle Bow (1)"], _ ; [165 ] [1,"tiered","Long Battle Bow (2)"], _ ; [233 ] [1,"tiered","Long Battle Bow (3)"], _ ; [301 ] [1,"tiered","Long Battle Bow (4)"], _ ; [369 ] [1,"tiered","Long Battle Bow (5)"], _ ; [437 ] [1,"tiered","Long Battle Bow (6)"], _ ; [505 ] [1,"sacred","Long Battle Bow (Sacred)"], _ ; [66@ ] [1,"tiered","Long Bow (1)"], _ ; [162 ] [1,"tiered","Long Bow (2)"], _ ; [230 ] [1,"tiered","Long Bow (3)"], _ ; [298 ] [1,"tiered","Long Bow (4)"], _ ; [366 ] [1,"tiered","Long Bow (5)"], _ ; [434 ] [1,"tiered","Long Bow (6)"], _ ; [502 ] [1,"sacred","Long Bow (Sacred)"], _ ; [63@ ] [1,"tiered","Long Staff (1)"], _ ; [152 ] [1,"tiered","Long Staff (2)"], _ ; [220 ] [1,"tiered","Long Staff (3)"], _ ; [288 ] [1,"tiered","Long Staff (4)"], _ ; [356 ] [1,"tiered","Long Staff (5)"], _ ; [424 ] [1,"tiered","Long Staff (6)"], _ ; [492 ] [1,"sacred","Long Staff (Sacred)"], _ ; [53@ ] [1,"tiered","Long Sword (1)"], _ ; [105 ] [1,"tiered","Long Sword (2)"], _ ; [173 ] [1,"tiered","Long Sword (3)"], _ ; [241 ] [1,"tiered","Long Sword (4)"], _ ; [309 ] [1,"tiered","Long Sword (5)"], _ ; [377 ] [1,"tiered","Long Sword (6)"], _ ; [445 ] [1,"sacred","Long Sword (Sacred)"], _ ; [06@ ] [1,"tiered","Long War Bow (1)"], _ ; [167 ] [1,"tiered","Long War Bow (2)"], _ ; [235 ] [1,"tiered","Long War Bow (3)"], _ ; [303 ] [1,"tiered","Long War Bow (4)"], _ ; [371 ] [1,"tiered","Long War Bow (5)"], _ ; [439 ] [1,"tiered","Long War Bow (6)"], _ ; [507 ] [1,"sacred","Long War Bow (Sacred)"], _ ; [68@ ] [1,"tiered","Mace (1)"], _ ; [126 ] [1,"tiered","Mace (2)"], _ ; [194 ] [1,"tiered","Mace (3)"], _ ; [262 ] [1,"tiered","Mace (4)"], _ ; [330 ] [1,"tiered","Mace (5)"], _ ; [398 ] [1,"tiered","Mace (6)"], _ ; [466 ] [1,"sacred","Mace (Sacred)"], _ ; [27@ ] [1,"tiered","Maiden Javelin (1)"], _ ; [j19 ] [1,"tiered","Maiden Javelin (2)"], _ ; [j36 ] [1,"tiered","Maiden Javelin (3)"], _ ; [j53 ] [1,"tiered","Maiden Javelin (4)"], _ ; [j70 ] [1,"tiered","Maiden Javelin (5)"], _ ; [j87 ] [1,"tiered","Maiden Javelin (6)"], _ ; [o14 ] [1,"sacred","Maiden Javelin (Sacred)"], _ ; [89@ ] [1,"tiered","Maiden Pike (1)"], _ ; [j18 ] [1,"tiered","Maiden Pike (2)"], _ ; [j35 ] [1,"tiered","Maiden Pike (3)"], _ ; [j52 ] [1,"tiered","Maiden Pike (4)"], _ ; [j69 ] [1,"tiered","Maiden Pike (5)"], _ ; [j86 ] [1,"tiered","Maiden Pike (6)"], _ ; [o13 ] [1,"sacred","Maiden Pike (Sacred)"], _ ; [88@ ] [1,"tiered","Maiden Spear (1)"], _ ; [j17 ] [1,"tiered","Maiden Spear (2)"], _ ; [x34 ] [1,"tiered","Maiden Spear (3)"], _ ; [j51 ] [1,"tiered","Maiden Spear (4)"], _ ; [j68 ] [1,"tiered","Maiden Spear (5)"], _ ; [j85 ] [1,"tiered","Maiden Spear (6)"], _ ; [o12 ] [1,"sacred","Maiden Spear (Sacred)"], _ ; [87@ ] [1,"tiered","Mammen Axe (1)"], _ ; [!22 ] [1,"tiered","Mammen Axe (2)"], _ ; [!23 ] [1,"tiered","Mammen Axe (3)"], _ ; [!24 ] [1,"tiered","Mammen Axe (4)"], _ ; [!25 ] [1,"tiered","Mammen Axe (5)"], _ ; [!26 ] [1,"tiered","Mammen Axe (6)"], _ ; [!27 ] [1,"sacred","Mammen Axe (Sacred)"], _ ; [!28 ] [1,"tiered","Maple Bow (1)"], _ ; [6@2 ] [1,"tiered","Maple Bow (2)"], _ ; [7@2 ] [1,"tiered","Maple Bow (3)"], _ ; [8@2 ] [1,"tiered","Maple Bow (4)"], _ ; [9@2 ] [1,"tiered","Maple Bow (5)"], _ ; [1@3 ] [1,"tiered","Maple Bow (6)"], _ ; [2@3 ] [1,"sacred","Maple Bow (Sacred)"], _ ; [3@3 ] [1,"tiered","Marrow Staff (1)"], _ ; [!63 ] [1,"tiered","Marrow Staff (2)"], _ ; [!64 ] [1,"tiered","Marrow Staff (3)"], _ ; [!65 ] [1,"tiered","Marrow Staff (4)"], _ ; [!66 ] [1,"tiered","Marrow Staff (5)"], _ ; [!67 ] [1,"tiered","Marrow Staff (6)"], _ ; [!68 ] [1,"sacred","Marrow Staff (Sacred)"], _ ; [!69 ] [1,"tiered","Maul (1)"], _ ; [l35 ] [1,"tiered","Maul (2)"], _ ; [l38 ] [1,"tiered","Maul (3)"], _ ; [l41 ] [1,"tiered","Maul (4)"], _ ; [l44 ] [1,"tiered","Maul (5)"], _ ; [l47 ] [1,"tiered","Maul (6)"], _ ; [l50 ] [1,"sacred","Maul (Sacred)"], _ ; [74@ ] [1,"tiered","Military Pick (1)"], _ ; [117 ] [1,"tiered","Military Pick (2)"], _ ; [185 ] [1,"tiered","Military Pick (3)"], _ ; [253 ] [1,"tiered","Military Pick (4)"], _ ; [321 ] [1,"tiered","Military Pick (5)"], _ ; [389 ] [1,"tiered","Military Pick (6)"], _ ; [457 ] [1,"sacred","Military Pick (Sacred)"], _ ; [18@ ] [1,"tiered","Morning Star (1)"], _ ; [127 ] [1,"tiered","Morning Star (2)"], _ ; [195 ] [1,"tiered","Morning Star (3)"], _ ; [263 ] [1,"tiered","Morning Star (4)"], _ ; [331 ] [1,"tiered","Morning Star (5)"], _ ; [399 ] [1,"tiered","Morning Star (6)"], _ ; [467 ] [1,"sacred","Morning Star (Sacred)"], _ ; [28@ ] [1,"tiered","Naginata (1)"], _ ; [!01 ] [1,"tiered","Naginata (2)"], _ ; [!02 ] [1,"tiered","Naginata (3)"], _ ; [!03 ] [1,"tiered","Naginata (4)"], _ ; [!04 ] [1,"tiered","Naginata (5)"], _ ; [!05 ] [1,"tiered","Naginata (6)"], _ ; [!06 ] [1,"sacred","Naginata (Sacred)"], _ ; [!07 ] [1,"tiered","Needle Crossbow (1)"], _ ; [7@C ] [1,"tiered","Needle Crossbow (2)"], _ ; [8@C ] [1,"tiered","Needle Crossbow (3)"], _ ; [9@C ] [1,"tiered","Needle Crossbow (4)"], _ ; [1@D ] [1,"tiered","Needle Crossbow (5)"], _ ; [2@D ] [1,"tiered","Needle Crossbow (6)"], _ ; [3@D ] [1,"sacred","Needle Crossbow (Sacred)"], _ ; [4@D ] [1,"tiered","Ono (1)"], _ ; [!35 ] [1,"tiered","Ono (2)"], _ ; [!36 ] [1,"tiered","Ono (3)"], _ ; [!37 ] [1,"tiered","Ono (4)"], _ ; [!38 ] [1,"tiered","Ono (5)"], _ ; [!39 ] [1,"tiered","Ono (6)"], _ ; [!40 ] [1,"sacred","Ono (Sacred)"], _ ; [!41 ] [1,"tiered","Pike (1)"], _ ; [141 ] [1,"tiered","Pike (2)"], _ ; [209 ] [1,"tiered","Pike (3)"], _ ; [277 ] [1,"tiered","Pike (4)"], _ ; [345 ] [1,"tiered","Pike (5)"], _ ; [413 ] [1,"tiered","Pike (6)"], _ ; [481 ] [1,"sacred","Pike (Sacred)"], _ ; [42@ ] [1,"tiered","Pilum (1)"], _ ; [133 ] [1,"tiered","Pilum (2)"], _ ; [201 ] [1,"tiered","Pilum (3)"], _ ; [269 ] [1,"tiered","Pilum (4)"], _ ; [337 ] [1,"tiered","Pilum (5)"], _ ; [405 ] [1,"tiered","Pilum (6)"], _ ; [473 ] [1,"sacred","Pilum (Sacred)"], _ ; [34@ ] [1,"tiered","Raptor Scythe (1)"], _ ; [!08 ] [1,"tiered","Raptor Scythe (2)"], _ ; [!09 ] [1,"tiered","Raptor Scythe (3)"], _ ; [!10 ] [1,"tiered","Raptor Scythe (4)"], _ ; [!11 ] [1,"tiered","Raptor Scythe (5)"], _ ; [!12 ] [1,"tiered","Raptor Scythe (6)"], _ ; [!13 ] [1,"sacred","Raptor Scythe (Sacred)"], _ ; [!14 ] [1,"tiered","Recurve Bow (1)"], _ ; [2@4 ] [1,"tiered","Recurve Bow (2)"], _ ; [3@4 ] [1,"tiered","Recurve Bow (3)"], _ ; [4@4 ] [1,"tiered","Recurve Bow (4)"], _ ; [5@4 ] [1,"tiered","Recurve Bow (5)"], _ ; [6@4 ] [1,"tiered","Recurve Bow (6)"], _ ; [7@4 ] [1,"sacred","Recurve Bow (Sacred)"], _ ; [8@4 ] [1,"tiered","Reflex Bow (1)"], _ ; [j16 ] [1,"tiered","Reflex Bow (2)"], _ ; [j33 ] [1,"tiered","Reflex Bow (3)"], _ ; [j50 ] [1,"tiered","Reflex Bow (4)"], _ ; [j67 ] [1,"tiered","Reflex Bow (5)"], _ ; [j84 ] [1,"tiered","Reflex Bow (6)"], _ ; [o11 ] [1,"sacred","Reflex Bow (Sacred)"], _ ; [86@ ] [1,"tiered","Repeating Crossbow (1)"], _ ; [l55 ] [1,"tiered","Repeating Crossbow (2)"], _ ; [l59 ] [1,"tiered","Repeating Crossbow (3)"], _ ; [l63 ] [1,"tiered","Repeating Crossbow (4)"], _ ; [l67 ] [1,"tiered","Repeating Crossbow (5)"], _ ; [l71 ] [1,"tiered","Repeating Crossbow (6)"], _ ; [l75 ] [1,"sacred","Repeating Crossbow (Sacred)"], _ ; [79@ ] [1,"tiered","Saber (1)"], _ ; [102 ] [1,"tiered","Saber (2)"], _ ; [170 ] [1,"tiered","Saber (3)"], _ ; [238 ] [1,"tiered","Saber (4)"], _ ; [306 ] [1,"tiered","Saber (5)"], _ ; [374 ] [1,"tiered","Saber (6)"], _ ; [442 ] [1,"sacred","Saber (Sacred)"], _ ; [03@ ] [1,"tiered","Sacred Globe (1)"], _ ; [j11 ] [1,"tiered","Sacred Globe (2)"], _ ; [j28 ] [1,"tiered","Sacred Globe (3)"], _ ; [j45 ] [1,"tiered","Sacred Globe (4)"], _ ; [j62 ] [1,"tiered","Sacred Globe (5)"], _ ; [j79 ] [1,"tiered","Sacred Globe (6)"], _ ; [j96 ] [1,"sacred","Sacred Globe (Sacred)"], _ ; [81@ ] [1,"tiered","Scepter (1)"], _ ; [129 ] [1,"tiered","Scepter (2)"], _ ; [197 ] [1,"tiered","Scepter (3)"], _ ; [265 ] [1,"tiered","Scepter (4)"], _ ; [333 ] [1,"tiered","Scepter (5)"], _ ; [401 ] [1,"tiered","Scepter (6)"], _ ; [469 ] [1,"sacred","Scepter (Sacred)"], _ ; [30@ ] [1,"tiered","Scimitar (1)"], _ ; [101 ] [1,"tiered","Scimitar (2)"], _ ; [169 ] [1,"tiered","Scimitar (3)"], _ ; [237 ] [1,"tiered","Scimitar (4)"], _ ; [305 ] [1,"tiered","Scimitar (5)"], _ ; [373 ] [1,"tiered","Scimitar (6)"], _ ; [441 ] [1,"sacred","Scimitar (Sacred)"], _ ; [02@ ] [1,"tiered","Scissors Katar (1)"], _ ; [j26 ] [1,"tiered","Scissors Katar (2)"], _ ; [j43 ] [1,"tiered","Scissors Katar (3)"], _ ; [j60 ] [1,"tiered","Scissors Katar (4)"], _ ; [j77 ] [1,"tiered","Scissors Katar (5)"], _ ; [j94 ] [1,"tiered","Scissors Katar (6)"], _ ; [o21 ] [1,"sacred","Scissors Katar (Sacred)"], _ ; [96@ ] [1,"tiered","Scythe (1)"], _ ; [158 ] [1,"tiered","Scythe (2)"], _ ; [226 ] [1,"tiered","Scythe (3)"], _ ; [294 ] [1,"tiered","Scythe (4)"], _ ; [362 ] [1,"tiered","Scythe (5)"], _ ; [430 ] [1,"tiered","Scythe (6)"], _ ; [498 ] [1,"sacred","Scythe (Sacred)"], _ ; [59@ ] [1,"tiered","Serpent Bow (1)"], _ ; [8@1 ] [1,"tiered","Serpent Bow (2)"], _ ; [9@1 ] [1,"tiered","Serpent Bow (3)"], _ ; [1@2 ] [1,"tiered","Serpent Bow (4)"], _ ; [2@2 ] [1,"tiered","Serpent Bow (5)"], _ ; [3@2 ] [1,"tiered","Serpent Bow (6)"], _ ; [4@2 ] [1,"sacred","Serpent Bow (Sacred)"], _ ; [5@2 ] [1,"tiered","Short Battle Bow (1)"], _ ; [164 ] [1,"tiered","Short Battle Bow (2)"], _ ; [232 ] [1,"tiered","Short Battle Bow (3)"], _ ; [300 ] [1,"tiered","Short Battle Bow (4)"], _ ; [368 ] [1,"tiered","Short Battle Bow (5)"], _ ; [436 ] [1,"tiered","Short Battle Bow (6)"], _ ; [504 ] [1,"sacred","Short Battle Bow (Sacred)"], _ ; [65@ ] [1,"tiered","Short Bow (1)"], _ ; [160 ] [1,"tiered","Short Bow (2)"], _ ; [228 ] [1,"tiered","Short Bow (3)"], _ ; [296 ] [1,"tiered","Short Bow (4)"], _ ; [364 ] [1,"tiered","Short Bow (5)"], _ ; [432 ] [1,"tiered","Short Bow (6)"], _ ; [500 ] [1,"sacred","Short Bow (Sacred)"], _ ; [61@ ] [1,"tiered","Short Spear (1)"], _ ; [134 ] [1,"tiered","Short Spear (2)"], _ ; [202 ] [1,"tiered","Short Spear (3)"], _ ; [270 ] [1,"tiered","Short Spear (4)"], _ ; [338 ] [1,"tiered","Short Spear (5)"], _ ; [406 ] [1,"tiered","Short Spear (6)"], _ ; [474 ] [1,"sacred","Short Spear (Sacred)"], _ ; [35@ ] [1,"tiered","Short Staff (1)"], _ ; [151 ] [1,"tiered","Short Staff (2)"], _ ; [219 ] [1,"tiered","Short Staff (3)"], _ ; [287 ] [1,"tiered","Short Staff (4)"], _ ; [355 ] [1,"tiered","Short Staff (5)"], _ ; [423 ] [1,"tiered","Short Staff (6)"], _ ; [491 ] [1,"sacred","Short Staff (Sacred)"], _ ; [52@ ] [1,"tiered","Short Sword (1)"], _ ; [100 ] [1,"tiered","Short Sword (2)"], _ ; [168 ] [1,"tiered","Short Sword (3)"], _ ; [236 ] [1,"tiered","Short Sword (4)"], _ ; [304 ] [1,"tiered","Short Sword (5)"], _ ; [372 ] [1,"tiered","Short Sword (6)"], _ ; [440 ] [1,"sacred","Short Sword (Sacred)"], _ ; [01@ ] [1,"tiered","Short War Bow (1)"], _ ; [166 ] [1,"tiered","Short War Bow (2)"], _ ; [234 ] [1,"tiered","Short War Bow (3)"], _ ; [302 ] [1,"tiered","Short War Bow (4)"], _ ; [370 ] [1,"tiered","Short War Bow (5)"], _ ; [438 ] [1,"tiered","Short War Bow (6)"], _ ; [506 ] [1,"sacred","Short War Bow (Sacred)"], _ ; [67@ ] [1,"tiered","Smoked Sphere (1)"], _ ; [j12 ] [1,"tiered","Smoked Sphere (2)"], _ ; [j29 ] [1,"tiered","Smoked Sphere (3)"], _ ; [j46 ] [1,"tiered","Smoked Sphere (4)"], _ ; [j63 ] [1,"tiered","Smoked Sphere (5)"], _ ; [j80 ] [1,"tiered","Smoked Sphere (6)"], _ ; [j97 ] [1,"sacred","Smoked Sphere (Sacred)"], _ ; [82@ ] [1,"tiered","Spatha (1)"], _ ; [9@4 ] [1,"tiered","Spatha (2)"], _ ; [1@5 ] [1,"tiered","Spatha (3)"], _ ; [2@5 ] [1,"tiered","Spatha (4)"], _ ; [3@5 ] [1,"tiered","Spatha (5)"], _ ; [4@5 ] [1,"tiered","Spatha (6)"], _ ; [5@5 ] [1,"sacred","Spatha (Sacred)"], _ ; [6@5 ] [1,"tiered","Spear (1)"], _ ; [137 ] [1,"tiered","Spear (2)"], _ ; [205 ] [1,"tiered","Spear (3)"], _ ; [273 ] [1,"tiered","Spear (4)"], _ ; [341 ] [1,"tiered","Spear (5)"], _ ; [409 ] [1,"tiered","Spear (6)"], _ ; [477 ] [1,"sacred","Spear (Sacred)"], _ ; [38@ ] [1,"tiered","Spetum (1)"], _ ; [140 ] [1,"tiered","Spetum (2)"], _ ; [208 ] [1,"tiered","Spetum (3)"], _ ; [276 ] [1,"tiered","Spetum (4)"], _ ; [344 ] [1,"tiered","Spetum (5)"], _ ; [412 ] [1,"tiered","Spetum (6)"], _ ; [480 ] [1,"sacred","Spetum (Sacred)"], _ ; [41@ ] [1,"tiered","Spiked Club (1)"], _ ; [125 ] [1,"tiered","Spiked Club (2)"], _ ; [193 ] [1,"tiered","Spiked Club (3)"], _ ; [261 ] [1,"tiered","Spiked Club (4)"], _ ; [329 ] [1,"tiered","Spiked Club (5)"], _ ; [397 ] [1,"tiered","Spiked Club (6)"], _ ; [465 ] [1,"sacred","Spiked Club (Sacred)"], _ ; [26@ ] [1,"tiered","Spirit Edge (1)"], _ ; [!77 ] [1,"tiered","Spirit Edge (2)"], _ ; [!78 ] [1,"tiered","Spirit Edge (3)"], _ ; [!79 ] [1,"tiered","Spirit Edge (4)"], _ ; [!80 ] [1,"tiered","Spirit Edge (5)"], _ ; [!81 ] [1,"tiered","Spirit Edge (6)"], _ ; [!82 ] [1,"sacred","Spirit Edge (Sacred)"], _ ; [!83 ] [1,"tiered","Stag Bow (1)"], _ ; [j15 ] [1,"tiered","Stag Bow (2)"], _ ; [j32 ] [1,"tiered","Stag Bow (3)"], _ ; [j49 ] [1,"tiered","Stag Bow (4)"], _ ; [j66 ] [1,"tiered","Stag Bow (5)"], _ ; [j83 ] [1,"tiered","Stag Bow (6)"], _ ; [o10 ] [1,"sacred","Stag Bow (Sacred)"], _ ; [85@ ] [1,"tiered","Stinger Crossbow (1)"], _ ; [3@E ] [1,"tiered","Stinger Crossbow (2)"], _ ; [4@E ] [1,"tiered","Stinger Crossbow (3)"], _ ; [5@E ] [1,"tiered","Stinger Crossbow (4)"], _ ; [6@E ] [1,"tiered","Stinger Crossbow (5)"], _ ; [7@E ] [1,"tiered","Stinger Crossbow (6)"], _ ; [8@E ] [1,"sacred","Stinger Crossbow (Sacred)"], _ ; [9@E ] [1,"tiered","Tepoztopilli (1)"], _ ; [!91 ] [1,"tiered","Tepoztopilli (2)"], _ ; [!92 ] [1,"tiered","Tepoztopilli (3)"], _ ; [!93 ] [1,"tiered","Tepoztopilli (4)"], _ ; [!94 ] [1,"tiered","Tepoztopilli (5)"], _ ; [!95 ] [1,"tiered","Tepoztopilli (6)"], _ ; [!96 ] [1,"sacred","Tepoztopilli (Sacred)"], _ ; [!97 ] [1,"tiered","Throwing Axe (1)"], _ ; [149 ] [1,"tiered","Throwing Axe (2)"], _ ; [217 ] [1,"tiered","Throwing Axe (3)"], _ ; [285 ] [1,"tiered","Throwing Axe (4)"], _ ; [353 ] [1,"tiered","Throwing Axe (5)"], _ ; [421 ] [1,"tiered","Throwing Axe (6)"], _ ; [489 ] [1,"sacred","Throwing Axe (Sacred)"], _ ; [50@ ] [1,"tiered","Throwing Knife (1)"], _ ; [146 ] [1,"tiered","Throwing Knife (2)"], _ ; [214 ] [1,"tiered","Throwing Knife (3)"], _ ; [282 ] [1,"tiered","Throwing Knife (4)"], _ ; [350 ] [1,"tiered","Throwing Knife (5)"], _ ; [418 ] [1,"tiered","Throwing Knife (6)"], _ ; [486 ] [1,"sacred","Throwing Knife (Sacred)"], _ ; [47@ ] [1,"tiered","Throwing Spear (1)"], _ ; [136 ] [1,"tiered","Throwing Spear (2)"], _ ; [204 ] [1,"tiered","Throwing Spear (3)"], _ ; [272 ] [1,"tiered","Throwing Spear (4)"], _ ; [340 ] [1,"tiered","Throwing Spear (5)"], _ ; [408 ] [1,"tiered","Throwing Spear (6)"], _ ; [476 ] [1,"sacred","Throwing Spear (Sacred)"], _ ; [37@ ] [1,"tiered","Trebuchet (1)"], _ ; [1@F ] [1,"tiered","Trebuchet (2)"], _ ; [2@F ] [1,"tiered","Trebuchet (3)"], _ ; [3@F ] [1,"tiered","Trebuchet (4)"], _ ; [4@F ] [1,"tiered","Trebuchet (5)"], _ ; [5@F ] [1,"tiered","Trebuchet (6)"], _ ; [6@F ] [1,"sacred","Trebuchet (Sacred)"], _ ; [7@F ] [1,"tiered","Trident (1)"], _ ; [138 ] [1,"tiered","Trident (2)"], _ ; [206 ] [1,"tiered","Trident (3)"], _ ; [274 ] [1,"tiered","Trident (4)"], _ ; [342 ] [1,"tiered","Trident (5)"], _ ; [410 ] [1,"tiered","Trident (6)"], _ ; [478 ] [1,"sacred","Trident (Sacred)"], _ ; [39@ ] [1,"tiered","Two-Handed Sword (1)"], _ ; [107 ] [1,"tiered","Two-Handed Sword (2)"], _ ; [175 ] [1,"tiered","Two-Handed Sword (3)"], _ ; [243 ] [1,"tiered","Two-Handed Sword (4)"], _ ; [311 ] [1,"tiered","Two-Handed Sword (5)"], _ ; [379 ] [1,"tiered","Two-Handed Sword (6)"], _ ; [447 ] [1,"sacred","Two-Handed Sword (Sacred)"], _ ; [08@ ] [1,"tiered","Valaska (1)"], _ ; [!42 ] [1,"tiered","Valaska (2)"], _ ; [!43 ] [1,"tiered","Valaska (3)"], _ ; [!44 ] [1,"tiered","Valaska (4)"], _ ; [!45 ] [1,"tiered","Valaska (5)"], _ ; [!46 ] [1,"tiered","Valaska (6)"], _ ; [!47 ] [1,"sacred","Valaska (Sacred)"], _ ; [!48 ] [1,"tiered","Viper Bow (1)"], _ ; [4@3 ] [1,"tiered","Viper Bow (2)"], _ ; [5@3 ] [1,"tiered","Viper Bow (3)"], _ ; [6@3 ] [1,"tiered","Viper Bow (4)"], _ ; [7@3 ] [1,"tiered","Viper Bow (5)"], _ ; [8@3 ] [1,"tiered","Viper Bow (6)"], _ ; [9@3 ] [1,"sacred","Viper Bow (Sacred)"], _ ; [1@4 ] [1,"tiered","Voulge (1)"], _ ; [157 ] [1,"tiered","Voulge (2)"], _ ; [225 ] [1,"tiered","Voulge (3)"], _ ; [293 ] [1,"tiered","Voulge (4)"], _ ; [361 ] [1,"tiered","Voulge (5)"], _ ; [429 ] [1,"tiered","Voulge (6)"], _ ; [497 ] [1,"sacred","Voulge (Sacred)"], _ ; [58@ ] [1,"tiered","Wand (1)"], _ ; [l10 ] [1,"tiered","Wand (2)"], _ ; [l14 ] [1,"tiered","Wand (3)"], _ ; [l18 ] [1,"tiered","Wand (4)"], _ ; [l22 ] [1,"tiered","Wand (5)"], _ ; [l26 ] [1,"tiered","Wand (6)"], _ ; [l30 ] [1,"sacred","Wand (Sacred)"], _ ; [69@ ] [1,"tiered","War Axe (1)"], _ ; [118 ] [1,"tiered","War Axe (2)"], _ ; [186 ] [1,"tiered","War Axe (3)"], _ ; [254 ] [1,"tiered","War Axe (4)"], _ ; [322 ] [1,"tiered","War Axe (5)"], _ ; [390 ] [1,"tiered","War Axe (6)"], _ ; [458 ] [1,"sacred","War Axe (Sacred)"], _ ; [1@@ ] [1,"tiered","War Hammer (1)"], _ ; [l34 ] [1,"tiered","War Hammer (2)"], _ ; [l37 ] [1,"tiered","War Hammer (3)"], _ ; [l40 ] [1,"tiered","War Hammer (4)"], _ ; [l43 ] [1,"tiered","War Hammer (5)"], _ ; [l46 ] [1,"tiered","War Hammer (6)"], _ ; [l49 ] [1,"sacred","War Hammer (Sacred)"], _ ; [73@ ] [1,"tiered","War Scepter (1)"], _ ; [131 ] [1,"tiered","War Scepter (2)"], _ ; [199 ] [1,"tiered","War Scepter (3)"], _ ; [267 ] [1,"tiered","War Scepter (4)"], _ ; [335 ] [1,"tiered","War Scepter (5)"], _ ; [403 ] [1,"tiered","War Scepter (6)"], _ ; [471 ] [1,"sacred","War Scepter (Sacred)"], _ ; [32@ ] [1,"tiered","War Staff (1)"], _ ; [155 ] [1,"tiered","War Staff (2)"], _ ; [223 ] [1,"tiered","War Staff (3)"], _ ; [291 ] [1,"tiered","War Staff (4)"], _ ; [359 ] [1,"tiered","War Staff (5)"], _ ; [427 ] [1,"tiered","War Staff (6)"], _ ; [495 ] [1,"sacred","War Staff (Sacred)"], _ ; [56@ ] [1,"tiered","War Sword (1)"], _ ; [106 ] [1,"tiered","War Sword (2)"], _ ; [174 ] [1,"tiered","War Sword (3)"], _ ; [242 ] [1,"tiered","War Sword (4)"], _ ; [310 ] [1,"tiered","War Sword (5)"], _ ; [378 ] [1,"tiered","War Sword (6)"], _ ; [446 ] [1,"sacred","War Sword (Sacred)"], _ ; [07@ ] [1,"tiered","Warp Blade (1)"], _ ; [!98 ] [1,"tiered","Warp Blade (2)"], _ ; [!99 ] [1,"tiered","Warp Blade (3)"], _ ; [!1! ] [1,"tiered","Warp Blade (4)"], _ ; [!2! ] [1,"tiered","Warp Blade (5)"], _ ; [!3! ] [1,"tiered","Warp Blade (6)"], _ ; [!4! ] [1,"sacred","Warp Blade (Sacred)"], _ ; [!5! ] [1,"tiered","Wrist Blade (1)"], _ ; [j21 ] [1,"tiered","Wrist Blade (2)"], _ ; [j38 ] [1,"tiered","Wrist Blade (3)"], _ ; [j55 ] [1,"tiered","Wrist Blade (4)"], _ ; [j72 ] [1,"tiered","Wrist Blade (5)"], _ ; [j89 ] [1,"tiered","Wrist Blade (6)"], _ ; [o16 ] [1,"sacred","Wrist Blade (Sacred)"], _ ; [91@ ] [1,"tiered","Yew Wand (1)"], _ ; [l11 ] [1,"tiered","Yew Wand (2)"], _ ; [l15 ] [1,"tiered","Yew Wand (3)"], _ ; [l19 ] [1,"tiered","Yew Wand (4)"], _ ; [l23 ] [1,"tiered","Yew Wand (5)"], _ ; [l27 ] [1,"tiered","Yew Wand (6)"], _ ; [l31 ] [1,"sacred","Yew Wand (Sacred)"], _ ; [70@ ] [1,"tiered","Sacred Bow"], _ ; [v#X ] [1,"tiered","Mystical Blade"], _ ; [Ysh3] [1,"tiered","Crown"], _ ; [crn ] [1,"tiered","Field Plate"], _ ; [fld ] [1,"tiered","Greaves"], _ ; [hbt ] [1,"tiered","Gauntlets"], _ ; [hgl ] [1,"tiered","Tower Shield"], _ ; [tow ] [1,"tiered","Aerin Shield (1)"], _ ; [w23 ] [1,"tiered","Aerin Shield (2)"], _ ; [w43 ] [1,"tiered","Aerin Shield (3)"], _ ; [w63 ] [1,"tiered","Aerin Shield (4)"], _ ; [w83 ] [1,"tiered","Aerin Shield (5)"], _ ; [e13 ] [1,"tiered","Aerin Shield (6)"], _ ; [e33 ] [1,"sacred","Aerin Shield (Sacred)"], _ ; [@60 ] [1,"tiered","Ancient Armor (1)"], _ ; [614 ] [1,"tiered","Ancient Armor (2)"], _ ; [660 ] [1,"tiered","Ancient Armor (3)"], _ ; [706 ] [1,"tiered","Ancient Armor (4)"], _ ; [752 ] [1,"tiered","Ancient Armor (5)"], _ ; [798 ] [1,"tiered","Ancient Armor (6)"], _ ; [844 ] [1,"sacred","Ancient Armor (Sacred)"], _ ; [@15 ] [1,"tiered","Antlers (1)"], _ ; [w12 ] [1,"tiered","Antlers (2)"], _ ; [w32 ] [1,"tiered","Antlers (3)"], _ ; [w52 ] [1,"tiered","Antlers (4)"], _ ; [w72 ] [1,"tiered","Antlers (5)"], _ ; [w92 ] [1,"tiered","Antlers (6)"], _ ; [e22 ] [1,"sacred","Antlers (Sacred)"], _ ; [@49 ] [1,"tiered","Aspis (1)"], _ ; [8@N ] [1,"tiered","Aspis (2)"], _ ; [9@N ] [1,"tiered","Aspis (3)"], _ ; [1@O ] [1,"tiered","Aspis (4)"], _ ; [2@O ] [1,"tiered","Aspis (5)"], _ ; [3@O ] [1,"tiered","Aspis (6)"], _ ; [4@O ] [1,"sacred","Aspis (Sacred)"], _ ; [5@O ] [1,"tiered","Assault Helmet (1)"], _ ; [w18 ] [1,"tiered","Assault Helmet (2)"], _ ; [w38 ] [1,"tiered","Assault Helmet (3)"], _ ; [w58 ] [1,"tiered","Assault Helmet (4)"], _ ; [w78 ] [1,"tiered","Assault Helmet (5)"], _ ; [w98 ] [1,"tiered","Assault Helmet (6)"], _ ; [e28 ] [1,"sacred","Assault Helmet (Sacred)"], _ ; [@55 ] [1,"tiered","Athulua's Hand (1)"], _ ; [01! ] [1,"tiered","Athulua's Hand (2)"], _ ; [02! ] [1,"tiered","Athulua's Hand (3)"], _ ; [03! ] [1,"tiered","Athulua's Hand (4)"], _ ; [04! ] [1,"tiered","Athulua's Hand (5)"], _ ; [05! ] [1,"tiered","Athulua's Hand (6)"], _ ; [06! ] [1,"sacred","Athulua's Hand (Sacred)"], _ ; [07! ] [1,"tiered","Avenger Guard (1)"], _ ; [w19 ] [1,"tiered","Avenger Guard (2)"], _ ; [w39 ] [1,"tiered","Avenger Guard (3)"], _ ; [w59 ] [1,"tiered","Avenger Guard (4)"], _ ; [w79 ] [1,"tiered","Avenger Guard (5)"], _ ; [w99 ] [1,"tiered","Avenger Guard (6)"], _ ; [e29 ] [1,"sacred","Avenger Guard (Sacred)"], _ ; [@56 ] [1,"tiered","Banded Plate (1)"], _ ; [4@I ] [1,"tiered","Banded Plate (2)"], _ ; [5@I ] [1,"tiered","Banded Plate (3)"], _ ; [6@I ] [1,"tiered","Banded Plate (4)"], _ ; [7@I ] [1,"tiered","Banded Plate (5)"], _ ; [8@I ] [1,"tiered","Banded Plate (6)"], _ ; [9@I ] [1,"sacred","Banded Plate (Sacred)"], _ ; [1@J ] [1,"tiered","Belt (1)"], _ ; [629 ] [1,"tiered","Belt (2)"], _ ; [675 ] [1,"tiered","Belt (3)"], _ ; [721 ] [1,"tiered","Belt (4)"], _ ; [767 ] [1,"tiered","Belt (5)"], _ ; [813 ] [1,"tiered","Belt (6)"], _ ; [859 ] [1,"sacred","Belt (Sacred)"], _ ; [@30 ] [1,"tiered","Blackguard Helm (1)"], _ ; [50! ] [1,"tiered","Blackguard Helm (2)"], _ ; [51! ] [1,"tiered","Blackguard Helm (3)"], _ ; [52! ] [1,"tiered","Blackguard Helm (4)"], _ ; [53! ] [1,"tiered","Blackguard Helm (5)"], _ ; [54! ] [1,"tiered","Blackguard Helm (6)"], _ ; [55! ] [1,"sacred","Blackguard Helm (Sacred)"], _ ; [56! ] [1,"tiered","Bladed Shield (1)"], _ ; [4@P ] [1,"tiered","Bladed Shield (2)"], _ ; [5@P ] [1,"tiered","Bladed Shield (3)"], _ ; [6@P ] [1,"tiered","Bladed Shield (4)"], _ ; [7@P ] [1,"tiered","Bladed Shield (5)"], _ ; [8@P ] [1,"tiered","Bladed Shield (6)"], _ ; [9@P ] [1,"sacred","Bladed Shield (Sacred)"], _ ; [1@Q ] [1,"tiered","Bone Helm (1)"], _ ; [645 ] [1,"tiered","Bone Helm (2)"], _ ; [691 ] [1,"tiered","Bone Helm (3)"], _ ; [737 ] [1,"tiered","Bone Helm (4)"], _ ; [783 ] [1,"tiered","Bone Helm (5)"], _ ; [829 ] [1,"tiered","Bone Helm (6)"], _ ; [875 ] [1,"sacred","Bone Helm (Sacred)"], _ ; [@46 ] [1,"tiered","Bone Shield (1)"], _ ; [642 ] [1,"tiered","Bone Shield (2)"], _ ; [688 ] [1,"tiered","Bone Shield (3)"], _ ; [734 ] [1,"tiered","Bone Shield (4)"], _ ; [780 ] [1,"tiered","Bone Shield (5)"], _ ; [826 ] [1,"tiered","Bone Shield (6)"], _ ; [872 ] [1,"sacred","Bone Shield (Sacred)"], _ ; [@43 ] [1,"tiered","Boots (1)"], _ ; [637 ] [1,"tiered","Boots (2)"], _ ; [683 ] [1,"tiered","Boots (3)"], _ ; [729 ] [1,"tiered","Boots (4)"], _ ; [775 ] [1,"tiered","Boots (5)"], _ ; [821 ] [1,"tiered","Boots (6)"], _ ; [867 ] [1,"sacred","Boots (Sacred)"], _ ; [@38 ] [1,"tiered","Breast Plate (1)"], _ ; [607 ] [1,"tiered","Breast Plate (2)"], _ ; [653 ] [1,"tiered","Breast Plate (3)"], _ ; [699 ] [1,"tiered","Breast Plate (4)"], _ ; [745 ] [1,"tiered","Breast Plate (5)"], _ ; [791 ] [1,"tiered","Breast Plate (6)"], _ ; [837 ] [1,"sacred","Breast Plate (Sacred)"], _ ; [@08 ] [1,"tiered","Bronze Shield (1)"], _ ; [29! ] [1,"tiered","Bronze Shield (2)"], _ ; [30! ] [1,"tiered","Bronze Shield (3)"], _ ; [31! ] [1,"tiered","Bronze Shield (4)"], _ ; [32! ] [1,"tiered","Bronze Shield (5)"], _ ; [33! ] [1,"tiered","Bronze Shield (6)"], _ ; [34! ] [1,"sacred","Bronze Shield (Sacred)"], _ ; [35! ] [1,"tiered","Buckler (1)"], _ ; [621 ] [1,"tiered","Buckler (2)"], _ ; [667 ] [1,"tiered","Buckler (3)"], _ ; [713 ] [1,"tiered","Buckler (4)"], _ ; [759 ] [1,"tiered","Buckler (5)"], _ ; [805 ] [1,"tiered","Buckler (6)"], _ ; [851 ] [1,"sacred","Buckler (Sacred)"], _ ; [@22 ] [1,"tiered","Bull Shield (1)"], _ ; [22! ] [1,"tiered","Bull Shield (2)"], _ ; [23! ] [1,"tiered","Bull Shield (3)"], _ ; [24! ] [1,"tiered","Bull Shield (4)"], _ ; [25! ] [1,"tiered","Bull Shield (5)"], _ ; [26! ] [1,"tiered","Bull Shield (6)"], _ ; [27! ] [1,"sacred","Bull Shield (Sacred)"], _ ; [28! ] [1,"tiered","Cap (1)"], _ ; [615 ] [1,"tiered","Cap (2)"], _ ; [661 ] [1,"tiered","Cap (3)"], _ ; [707 ] [1,"tiered","Cap (4)"], _ ; [753 ] [1,"tiered","Cap (5)"], _ ; [799 ] [1,"tiered","Cap (6)"], _ ; [845 ] [1,"sacred","Cap (Sacred)"], _ ; [@16 ] [1,"tiered","Ceremonial Armor (1)"], _ ; [2@J ] [1,"tiered","Ceremonial Armor (2)"], _ ; [3@J ] [1,"tiered","Ceremonial Armor (3)"], _ ; [4@J ] [1,"tiered","Ceremonial Armor (4)"], _ ; [5@J ] [1,"tiered","Ceremonial Armor (5)"], _ ; [6@J ] [1,"tiered","Ceremonial Armor (6)"], _ ; [7@J ] [1,"sacred","Ceremonial Armor (Sacred)"], _ ; [8@J ] [1,"tiered","Cervelliere (1)"], _ ; [7@K ] [1,"tiered","Cervelliere (2)"], _ ; [8@K ] [1,"tiered","Cervelliere (3)"], _ ; [9@K ] [1,"tiered","Cervelliere (4)"], _ ; [1@L ] [1,"tiered","Cervelliere (5)"], _ ; [2@L ] [1,"tiered","Cervelliere (6)"], _ ; [3@L ] [1,"sacred","Cervelliere (Sacred)"], _ ; [4@L ] [1,"tiered","Chain Boots (1)"], _ ; [639 ] [1,"tiered","Chain Boots (2)"], _ ; [685 ] [1,"tiered","Chain Boots (3)"], _ ; [731 ] [1,"tiered","Chain Boots (4)"], _ ; [777 ] [1,"tiered","Chain Boots (5)"], _ ; [823 ] [1,"tiered","Chain Boots (6)"], _ ; [869 ] [1,"sacred","Chain Boots (Sacred)"], _ ; [@40 ] [1,"tiered","Chain Gloves (1)"], _ ; [634 ] [1,"tiered","Chain Gloves (2)"], _ ; [680 ] [1,"tiered","Chain Gloves (3)"], _ ; [726 ] [1,"tiered","Chain Gloves (4)"], _ ; [772 ] [1,"tiered","Chain Gloves (5)"], _ ; [818 ] [1,"tiered","Chain Gloves (6)"], _ ; [864 ] [1,"sacred","Chain Gloves (Sacred)"], _ ; [@35 ] [1,"tiered","Chain Mail (1)"], _ ; [606 ] [1,"tiered","Chain Mail (2)"], _ ; [652 ] [1,"tiered","Chain Mail (3)"], _ ; [698 ] [1,"tiered","Chain Mail (4)"], _ ; [744 ] [1,"tiered","Chain Mail (5)"], _ ; [790 ] [1,"tiered","Chain Mail (6)"], _ ; [836 ] [1,"sacred","Chain Mail (Sacred)"], _ ; [@07 ] [1,"tiered","Circlet (1)"], _ ; [k01 ] [1,"tiered","Circlet (2)"], _ ; [k05 ] [1,"tiered","Circlet (3)"], _ ; [k09 ] [1,"tiered","Circlet (4)"], _ ; [k13 ] [1,"tiered","Circlet (5)"], _ ; [k17 ] [1,"tiered","Circlet (6)"], _ ; [k21 ] [1,"sacred","Circlet (Sacred)"], _ ; [@67 ] [1,"tiered","Coronet (1)"], _ ; [k02 ] [1,"tiered","Coronet (2)"], _ ; [k06 ] [1,"tiered","Coronet (3)"], _ ; [k10 ] [1,"tiered","Coronet (4)"], _ ; [k14 ] [1,"tiered","Coronet (5)"], _ ; [k18 ] [1,"tiered","Coronet (6)"], _ ; [k22 ] [1,"sacred","Coronet (Sacred)"], _ ; [@68 ] [1,"tiered","Crown (1)"], _ ; [620 ] [1,"tiered","Crown (2)"], _ ; [666 ] [1,"tiered","Crown (3)"], _ ; [712 ] [1,"tiered","Crown (4)"], _ ; [758 ] [1,"tiered","Crown (5)"], _ ; [804 ] [1,"tiered","Crown (6)"], _ ; [850 ] [1,"sacred","Crown (Sacred)"], _ ; [@21 ] [1,"tiered","Crown Shield (1)"], _ ; [w24 ] [1,"tiered","Crown Shield (2)"], _ ; [w44 ] [1,"tiered","Crown Shield (3)"], _ ; [w64 ] [1,"tiered","Crown Shield (4)"], _ ; [w84 ] [1,"tiered","Crown Shield (5)"], _ ; [e14 ] [1,"tiered","Crown Shield (6)"], _ ; [e34 ] [1,"sacred","Crown Shield (Sacred)"], _ ; [@61 ] [1,"tiered","Demon Head (1)"], _ ; [w29 ] [1,"tiered","Demon Head (2)"], _ ; [w49 ] [1,"tiered","Demon Head (3)"], _ ; [w69 ] [1,"tiered","Demon Head (4)"], _ ; [w89 ] [1,"tiered","Demon Head (5)"], _ ; [e19 ] [1,"tiered","Demon Head (6)"], _ ; [e39 ] [1,"sacred","Demon Head (Sacred)"], _ ; [@66 ] [1,"tiered","Diadem (1)"], _ ; [k04 ] [1,"tiered","Diadem (2)"], _ ; [k08 ] [1,"tiered","Diadem (3)"], _ ; [k12 ] [1,"tiered","Diadem (4)"], _ ; [k16 ] [1,"tiered","Diadem (5)"], _ ; [k20 ] [1,"tiered","Diadem (6)"], _ ; [k24 ] [1,"sacred","Diadem (Sacred)"], _ ; [@70 ] [1,"tiered","Einherjar Helm (1)"], _ ; [5@L ] [1,"tiered","Einherjar Helm (2)"], _ ; [6@L ] [1,"tiered","Einherjar Helm (3)"], _ ; [7@L ] [1,"tiered","Einherjar Helm (4)"], _ ; [8@L ] [1,"tiered","Einherjar Helm (5)"], _ ; [9@L ] [1,"tiered","Einherjar Helm (6)"], _ ; [1@M ] [1,"sacred","Einherjar Helm (Sacred)"], _ ; [2@M ] [1,"tiered","Falcon Mask (1)"], _ ; [w13 ] [1,"tiered","Falcon Mask (2)"], _ ; [w33 ] [1,"tiered","Falcon Mask (3)"], _ ; [w53 ] [1,"tiered","Falcon Mask (4)"], _ ; [w73 ] [1,"tiered","Falcon Mask (5)"], _ ; [w93 ] [1,"tiered","Falcon Mask (6)"], _ ; [e23 ] [1,"sacred","Falcon Mask (Sacred)"], _ ; [@50 ] [1,"tiered","Fanged Helm (1)"], _ ; [w16 ] [1,"tiered","Fanged Helm (2)"], _ ; [w36 ] [1,"tiered","Fanged Helm (3)"], _ ; [w56 ] [1,"tiered","Fanged Helm (4)"], _ ; [w76 ] [1,"tiered","Fanged Helm (5)"], _ ; [w96 ] [1,"tiered","Fanged Helm (6)"], _ ; [e26 ] [1,"sacred","Fanged Helm (Sacred)"], _ ; [@53 ] [1,"tiered","Field Plate (1)"], _ ; [610 ] [1,"tiered","Field Plate (2)"], _ ; [656 ] [1,"tiered","Field Plate (3)"], _ ; [702 ] [1,"tiered","Field Plate (4)"], _ ; [748 ] [1,"tiered","Field Plate (5)"], _ ; [794 ] [1,"tiered","Field Plate (6)"], _ ; [840 ] [1,"sacred","Field Plate (Sacred)"], _ ; [@11 ] [1,"tiered","Full Helm (1)"], _ ; [618 ] [1,"tiered","Full Helm (2)"], _ ; [664 ] [1,"tiered","Full Helm (3)"], _ ; [710 ] [1,"tiered","Full Helm (4)"], _ ; [756 ] [1,"tiered","Full Helm (5)"], _ ; [802 ] [1,"tiered","Full Helm (6)"], _ ; [848 ] [1,"sacred","Full Helm (Sacred)"], _ ; [@19 ] [1,"tiered","Full Plate Mail (1)"], _ ; [613 ] [1,"tiered","Full Plate Mail (2)"], _ ; [659 ] [1,"tiered","Full Plate Mail (3)"], _ ; [705 ] [1,"tiered","Full Plate Mail (4)"], _ ; [751 ] [1,"tiered","Full Plate Mail (5)"], _ ; [797 ] [1,"tiered","Full Plate Mail (6)"], _ ; [843 ] [1,"sacred","Full Plate Mail (Sacred)"], _ ; [@14 ] [1,"tiered","Gambeson (1)"], _ ; [1@G ] [1,"tiered","Gambeson (2)"], _ ; [2@G ] [1,"tiered","Gambeson (3)"], _ ; [3@G ] [1,"tiered","Gambeson (4)"], _ ; [4@G ] [1,"tiered","Gambeson (5)"], _ ; [5@G ] [1,"tiered","Gambeson (6)"], _ ; [6@G ] [1,"sacred","Gambeson (Sacred)"], _ ; [7@G ] [1,"tiered","Gargoyle Head (1)"], _ ; [w28 ] [1,"tiered","Gargoyle Head (2)"], _ ; [w48 ] [1,"tiered","Gargoyle Head (3)"], _ ; [w68 ] [1,"tiered","Gargoyle Head (4)"], _ ; [w88 ] [1,"tiered","Gargoyle Head (5)"], _ ; [e18 ] [1,"tiered","Gargoyle Head (6)"], _ ; [e38 ] [1,"sacred","Gargoyle Head (Sacred)"], _ ; [@65 ] [1,"tiered","Gauntlets (1)"], _ ; [636 ] [1,"tiered","Gauntlets (2)"], _ ; [682 ] [1,"tiered","Gauntlets (3)"], _ ; [728 ] [1,"tiered","Gauntlets (4)"], _ ; [774 ] [1,"tiered","Gauntlets (5)"], _ ; [820 ] [1,"tiered","Gauntlets (6)"], _ ; [866 ] [1,"sacred","Gauntlets (Sacred)"], _ ; [@37 ] [1,"tiered","Gilded Shield (1)"], _ ; [36! ] [1,"tiered","Gilded Shield (2)"], _ ; [37! ] [1,"tiered","Gilded Shield (3)"], _ ; [38! ] [1,"tiered","Gilded Shield (4)"], _ ; [39! ] [1,"tiered","Gilded Shield (5)"], _ ; [40! ] [1,"tiered","Gilded Shield (6)"], _ ; [41! ] [1,"sacred","Gilded Shield (Sacred)"], _ ; [42! ] [1,"tiered","Gothic Plate (1)"], _ ; [612 ] [1,"tiered","Gothic Plate (2)"], _ ; [658 ] [1,"tiered","Gothic Plate (3)"], _ ; [704 ] [1,"tiered","Gothic Plate (4)"], _ ; [750 ] [1,"tiered","Gothic Plate (5)"], _ ; [796 ] [1,"tiered","Gothic Plate (6)"], _ ; [842 ] [1,"sacred","Gothic Plate (Sacred)"], _ ; [@13 ] [1,"tiered","Gothic Shield (1)"], _ ; [626 ] [1,"tiered","Gothic Shield (2)"], _ ; [672 ] [1,"tiered","Gothic Shield (3)"], _ ; [718 ] [1,"tiered","Gothic Shield (4)"], _ ; [764 ] [1,"tiered","Gothic Shield (5)"], _ ; [810 ] [1,"tiered","Gothic Shield (6)"], _ ; [856 ] [1,"sacred","Gothic Shield (Sacred)"], _ ; [@27 ] [1,"tiered","Great Helm (1)"], _ ; [619 ] [1,"tiered","Great Helm (2)"], _ ; [665 ] [1,"tiered","Great Helm (3)"], _ ; [711 ] [1,"tiered","Great Helm (4)"], _ ; [757 ] [1,"tiered","Great Helm (5)"], _ ; [803 ] [1,"tiered","Great Helm (6)"], _ ; [849 ] [1,"sacred","Great Helm (Sacred)"], _ ; [@20 ] [1,"tiered","Greaves (1)"], _ ; [641 ] [1,"tiered","Greaves (2)"], _ ; [687 ] [1,"tiered","Greaves (3)"], _ ; [733 ] [1,"tiered","Greaves (4)"], _ ; [779 ] [1,"tiered","Greaves (5)"], _ ; [825 ] [1,"tiered","Greaves (6)"], _ ; [871 ] [1,"sacred","Greaves (Sacred)"], _ ; [@42 ] [1,"tiered","Hard Leather Armor (1)"], _ ; [602 ] [1,"tiered","Hard Leather Armor (2)"], _ ; [648 ] [1,"tiered","Hard Leather Armor (3)"], _ ; [694 ] [1,"tiered","Hard Leather Armor (4)"], _ ; [740 ] [1,"tiered","Hard Leather Armor (5)"], _ ; [786 ] [1,"tiered","Hard Leather Armor (6)"], _ ; [832 ] [1,"sacred","Hard Leather Armor (Sacred)"], _ ; [@03 ] [1,"tiered","Hawk Helm (1)"], _ ; [w11 ] [1,"tiered","Hawk Helm (2)"], _ ; [w31 ] [1,"tiered","Hawk Helm (3)"], _ ; [w51 ] [1,"tiered","Hawk Helm (4)"], _ ; [w71 ] [1,"tiered","Hawk Helm (5)"], _ ; [w91 ] [1,"tiered","Hawk Helm (6)"], _ ; [e21 ] [1,"sacred","Hawk Helm (Sacred)"], _ ; [@48 ] [1,"tiered","Heavy Belt (1)"], _ ; [630 ] [1,"tiered","Heavy Belt (2)"], _ ; [676 ] [1,"tiered","Heavy Belt (3)"], _ ; [722 ] [1,"tiered","Heavy Belt (4)"], _ ; [768 ] [1,"tiered","Heavy Belt (5)"], _ ; [814 ] [1,"tiered","Heavy Belt (6)"], _ ; [860 ] [1,"sacred","Heavy Belt (Sacred)"], _ ; [@31 ] [1,"tiered","Heavy Boots (1)"], _ ; [638 ] [1,"tiered","Heavy Boots (2)"], _ ; [684 ] [1,"tiered","Heavy Boots (3)"], _ ; [730 ] [1,"tiered","Heavy Boots (4)"], _ ; [776 ] [1,"tiered","Heavy Boots (5)"], _ ; [822 ] [1,"tiered","Heavy Boots (6)"], _ ; [868 ] [1,"sacred","Heavy Boots (Sacred)"], _ ; [@39 ] [1,"tiered","Heavy Gloves (1)"], _ ; [633 ] [1,"tiered","Heavy Gloves (2)"], _ ; [679 ] [1,"tiered","Heavy Gloves (3)"], _ ; [725 ] [1,"tiered","Heavy Gloves (4)"], _ ; [771 ] [1,"tiered","Heavy Gloves (5)"], _ ; [817 ] [1,"tiered","Heavy Gloves (6)"], _ ; [863 ] [1,"sacred","Heavy Gloves (Sacred)"], _ ; [@34 ] [1,"tiered","Helm (1)"], _ ; [617 ] [1,"tiered","Helm (2)"], _ ; [663 ] [1,"tiered","Helm (3)"], _ ; [709 ] [1,"tiered","Helm (4)"], _ ; [755 ] [1,"tiered","Helm (5)"], _ ; [801 ] [1,"tiered","Helm (6)"], _ ; [847 ] [1,"sacred","Helm (Sacred)"], _ ; [@18 ] [1,"tiered","Heraldic Shield (1)"], _ ; [w22 ] [1,"tiered","Heraldic Shield (2)"], _ ; [w42 ] [1,"tiered","Heraldic Shield (3)"], _ ; [w62 ] [1,"tiered","Heraldic Shield (4)"], _ ; [w82 ] [1,"tiered","Heraldic Shield (5)"], _ ; [e12 ] [1,"tiered","Heraldic Shield (6)"], _ ; [e32 ] [1,"sacred","Heraldic Shield (Sacred)"], _ ; [@59 ] [1,"tiered","Horned Helm (1)"], _ ; [w17 ] [1,"tiered","Horned Helm (2)"], _ ; [w37 ] [1,"tiered","Horned Helm (3)"], _ ; [w57 ] [1,"tiered","Horned Helm (4)"], _ ; [w77 ] [1,"tiered","Horned Helm (5)"], _ ; [w97 ] [1,"tiered","Horned Helm (6)"], _ ; [e27 ] [1,"sacred","Horned Helm (Sacred)"], _ ; [@54 ] [1,"tiered","Hundsgugel (1)"], _ ; [43! ] [1,"tiered","Hundsgugel (2)"], _ ; [44! ] [1,"tiered","Hundsgugel (3)"], _ ; [45! ] [1,"tiered","Hundsgugel (4)"], _ ; [46! ] [1,"tiered","Hundsgugel (5)"], _ ; [47! ] [1,"tiered","Hundsgugel (6)"], _ ; [48! ] [1,"sacred","Hundsgugel (Sacred)"], _ ; [49! ] [1,"tiered","Jawbone Cap (1)"], _ ; [w15 ] [1,"tiered","Jawbone Cap (2)"], _ ; [w35 ] [1,"tiered","Jawbone Cap (3)"], _ ; [w55 ] [1,"tiered","Jawbone Cap (4)"], _ ; [w75 ] [1,"tiered","Jawbone Cap (5)"], _ ; [w95 ] [1,"tiered","Jawbone Cap (6)"], _ ; [e25 ] [1,"sacred","Jawbone Cap (Sacred)"], _ ; [@52 ] [1,"tiered","Kazarghand (1)"], _ ; [6@H ] [1,"tiered","Kazarghand (2)"], _ ; [7@H ] [1,"tiered","Kazarghand (3)"], _ ; [8@H ] [1,"tiered","Kazarghand (4)"], _ ; [9@H ] [1,"tiered","Kazarghand (5)"], _ ; [1@I ] [1,"tiered","Kazarghand (6)"], _ ; [2@I ] [1,"sacred","Kazarghand (Sacred)"], _ ; [3@I ] [1,"tiered","Kite Shield (1)"], _ ; [624 ] [1,"tiered","Kite Shield (2)"], _ ; [670 ] [1,"tiered","Kite Shield (3)"], _ ; [716 ] [1,"tiered","Kite Shield (4)"], _ ; [762 ] [1,"tiered","Kite Shield (5)"], _ ; [808 ] [1,"tiered","Kite Shield (6)"], _ ; [854 ] [1,"sacred","Kite Shield (Sacred)"], _ ; [@25 ] [1,"tiered","Lamellar Armor (1)"], _ ; [8@G ] [1,"tiered","Lamellar Armor (2)"], _ ; [9@G ] [1,"tiered","Lamellar Armor (3)"], _ ; [1@H ] [1,"tiered","Lamellar Armor (4)"], _ ; [2@H ] [1,"tiered","Lamellar Armor (5)"], _ ; [3@H ] [1,"tiered","Lamellar Armor (6)"], _ ; [4@H ] [1,"sacred","Lamellar Armor (Sacred)"], _ ; [5@H ] [1,"tiered","Large Shield (1)"], _ ; [623 ] [1,"tiered","Large Shield (2)"], _ ; [669 ] [1,"tiered","Large Shield (3)"], _ ; [715 ] [1,"tiered","Large Shield (4)"], _ ; [761 ] [1,"tiered","Large Shield (5)"], _ ; [807 ] [1,"tiered","Large Shield (6)"], _ ; [853 ] [1,"sacred","Large Shield (Sacred)"], _ ; [@24 ] [1,"tiered","Leather Armor (1)"], _ ; [601 ] [1,"tiered","Leather Armor (2)"], _ ; [647 ] [1,"tiered","Leather Armor (3)"], _ ; [693 ] [1,"tiered","Leather Armor (4)"], _ ; [739 ] [1,"tiered","Leather Armor (5)"], _ ; [785 ] [1,"tiered","Leather Armor (6)"], _ ; [831 ] [1,"sacred","Leather Armor (Sacred)"], _ ; [@02 ] [1,"tiered","Leather Gloves (1)"], _ ; [632 ] [1,"tiered","Leather Gloves (2)"], _ ; [678 ] [1,"tiered","Leather Gloves (3)"], _ ; [724 ] [1,"tiered","Leather Gloves (4)"], _ ; [770 ] [1,"tiered","Leather Gloves (5)"], _ ; [816 ] [1,"tiered","Leather Gloves (6)"], _ ; [862 ] [1,"sacred","Leather Gloves (Sacred)"], _ ; [@33 ] [1,"tiered","Light Belt (1)"], _ ; [628 ] [1,"tiered","Light Belt (2)"], _ ; [674 ] [1,"tiered","Light Belt (3)"], _ ; [720 ] [1,"tiered","Light Belt (4)"], _ ; [766 ] [1,"tiered","Light Belt (5)"], _ ; [812 ] [1,"tiered","Light Belt (6)"], _ ; [858 ] [1,"sacred","Light Belt (Sacred)"], _ ; [@29 ] [1,"tiered","Light Gauntlets (1)"], _ ; [635 ] [1,"tiered","Light Gauntlets (2)"], _ ; [681 ] [1,"tiered","Light Gauntlets (3)"], _ ; [727 ] [1,"tiered","Light Gauntlets (4)"], _ ; [773 ] [1,"tiered","Light Gauntlets (5)"], _ ; [819 ] [1,"tiered","Light Gauntlets (6)"], _ ; [865 ] [1,"sacred","Light Gauntlets (Sacred)"], _ ; [@36 ] [1,"tiered","Light Plate (1)"], _ ; [611 ] [1,"tiered","Light Plate (2)"], _ ; [657 ] [1,"tiered","Light Plate (3)"], _ ; [703 ] [1,"tiered","Light Plate (4)"], _ ; [749 ] [1,"tiered","Light Plate (5)"], _ ; [795 ] [1,"tiered","Light Plate (6)"], _ ; [841 ] [1,"sacred","Light Plate (Sacred)"], _ ; [@12 ] [1,"tiered","Light Plated Boots (1)"], _ ; [640 ] [1,"tiered","Light Plated Boots (2)"], _ ; [686 ] [1,"tiered","Light Plated Boots (3)"], _ ; [732 ] [1,"tiered","Light Plated Boots (4)"], _ ; [778 ] [1,"tiered","Light Plated Boots (5)"], _ ; [824 ] [1,"tiered","Light Plated Boots (6)"], _ ; [870 ] [1,"sacred","Light Plated Boots (Sacred)"], _ ; [@41 ] [1,"tiered","Mask (1)"], _ ; [644 ] [1,"tiered","Mask (2)"], _ ; [690 ] [1,"tiered","Mask (3)"], _ ; [736 ] [1,"tiered","Mask (4)"], _ ; [782 ] [1,"tiered","Mask (5)"], _ ; [828 ] [1,"tiered","Mask (6)"], _ ; [874 ] [1,"sacred","Mask (Sacred)"], _ ; [@45 ] [1,"tiered","Morion (1)"], _ ; [9@J ] [1,"tiered","Morion (2)"], _ ; [1@K ] [1,"tiered","Morion (3)"], _ ; [2@K ] [1,"tiered","Morion (4)"], _ ; [3@K ] [1,"tiered","Morion (5)"], _ ; [4@K ] [1,"tiered","Morion (6)"], _ ; [5@K ] [1,"sacred","Morion (Sacred)"], _ ; [6@K ] [1,"tiered","Parma (1)"], _ ; [1@N ] [1,"tiered","Parma (2)"], _ ; [2@N ] [1,"tiered","Parma (3)"], _ ; [3@N ] [1,"tiered","Parma (4)"], _ ; [4@N ] [1,"tiered","Parma (5)"], _ ; [5@N ] [1,"tiered","Parma (6)"], _ ; [6@N ] [1,"sacred","Parma (Sacred)"], _ ; [7@N ] [1,"tiered","Phoenix Shield (1)"], _ ; [08! ] [1,"tiered","Phoenix Shield (2)"], _ ; [09! ] [1,"tiered","Phoenix Shield (3)"], _ ; [10! ] [1,"tiered","Phoenix Shield (4)"], _ ; [11! ] [1,"tiered","Phoenix Shield (5)"], _ ; [12! ] [1,"tiered","Phoenix Shield (6)"], _ ; [13! ] [1,"sacred","Phoenix Shield (Sacred)"], _ ; [14! ] [1,"tiered","Plate Mail (1)"], _ ; [609 ] [1,"tiered","Plate Mail (2)"], _ ; [655 ] [1,"tiered","Plate Mail (3)"], _ ; [701 ] [1,"tiered","Plate Mail (4)"], _ ; [747 ] [1,"tiered","Plate Mail (5)"], _ ; [793 ] [1,"tiered","Plate Mail (6)"], _ ; [839 ] [1,"sacred","Plate Mail (Sacred)"], _ ; [@10 ] [1,"tiered","Plated Belt (1)"], _ ; [631 ] [1,"tiered","Plated Belt (2)"], _ ; [677 ] [1,"tiered","Plated Belt (3)"], _ ; [723 ] [1,"tiered","Plated Belt (4)"], _ ; [769 ] [1,"tiered","Plated Belt (5)"], _ ; [815 ] [1,"tiered","Plated Belt (6)"], _ ; [861 ] [1,"sacred","Plated Belt (Sacred)"], _ ; [@32 ] [1,"tiered","Preserved Head (1)"], _ ; [w25 ] [1,"tiered","Preserved Head (2)"], _ ; [w45 ] [1,"tiered","Preserved Head (3)"], _ ; [w65 ] [1,"tiered","Preserved Head (4)"], _ ; [w85 ] [1,"tiered","Preserved Head (5)"], _ ; [e15 ] [1,"tiered","Preserved Head (6)"], _ ; [e35 ] [1,"sacred","Preserved Head (Sacred)"], _ ; [@62 ] [1,"tiered","Quilted Armor (1)"], _ ; [600 ] [1,"tiered","Quilted Armor (2)"], _ ; [646 ] [1,"tiered","Quilted Armor (3)"], _ ; [692 ] [1,"tiered","Quilted Armor (4)"], _ ; [738 ] [1,"tiered","Quilted Armor (5)"], _ ; [784 ] [1,"tiered","Quilted Armor (6)"], _ ; [830 ] [1,"sacred","Quilted Armor (Sacred)"], _ ; [@01 ] [1,"tiered","Ring Mail (1)"], _ ; [604 ] [1,"tiered","Ring Mail (2)"], _ ; [650 ] [1,"tiered","Ring Mail (3)"], _ ; [696 ] [1,"tiered","Ring Mail (4)"], _ ; [742 ] [1,"tiered","Ring Mail (5)"], _ ; [788 ] [1,"tiered","Ring Mail (6)"], _ ; [834 ] [1,"sacred","Ring Mail (Sacred)"], _ ; [@05 ] [1,"tiered","Rondache (1)"], _ ; [w21 ] [1,"tiered","Rondache (2)"], _ ; [w41 ] [1,"tiered","Rondache (3)"], _ ; [w61 ] [1,"tiered","Rondache (4)"], _ ; [w81 ] [1,"tiered","Rondache (5)"], _ ; [e11 ] [1,"tiered","Rondache (6)"], _ ; [e31 ] [1,"sacred","Rondache (Sacred)"], _ ; [@58 ] [1,"tiered","Sash (1)"], _ ; [627 ] [1,"tiered","Sash (2)"], _ ; [673 ] [1,"tiered","Sash (3)"], _ ; [719 ] [1,"tiered","Sash (4)"], _ ; [765 ] [1,"tiered","Sash (5)"], _ ; [811 ] [1,"tiered","Sash (6)"], _ ; [857 ] [1,"sacred","Sash (Sacred)"], _ ; [@28 ] [1,"tiered","Scale Mail (1)"], _ ; [605 ] [1,"tiered","Scale Mail (2)"], _ ; [651 ] [1,"tiered","Scale Mail (3)"], _ ; [697 ] [1,"tiered","Scale Mail (4)"], _ ; [743 ] [1,"tiered","Scale Mail (5)"], _ ; [789 ] [1,"tiered","Scale Mail (6)"], _ ; [835 ] [1,"sacred","Scale Mail (Sacred)"], _ ; [@06 ] [1,"tiered","Setzschild (1)"], _ ; [15! ] [1,"tiered","Setzschild (2)"], _ ; [16! ] [1,"tiered","Setzschild (3)"], _ ; [17! ] [1,"tiered","Setzschild (4)"], _ ; [18! ] [1,"tiered","Setzschild (5)"], _ ; [19! ] [1,"tiered","Setzschild (6)"], _ ; [20! ] [1,"sacred","Setzschild (Sacred)"], _ ; [21! ] [1,"tiered","Skull Cap (1)"], _ ; [616 ] [1,"tiered","Skull Cap (2)"], _ ; [662 ] [1,"tiered","Skull Cap (3)"], _ ; [708 ] [1,"tiered","Skull Cap (4)"], _ ; [754 ] [1,"tiered","Skull Cap (5)"], _ ; [800 ] [1,"tiered","Skull Cap (6)"], _ ; [846 ] [1,"sacred","Skull Cap (Sacred)"], _ ; [@17 ] [1,"tiered","Small Shield (1)"], _ ; [622 ] [1,"tiered","Small Shield (2)"], _ ; [668 ] [1,"tiered","Small Shield (3)"], _ ; [714 ] [1,"tiered","Small Shield (4)"], _ ; [760 ] [1,"tiered","Small Shield (5)"], _ ; [806 ] [1,"tiered","Small Shield (6)"], _ ; [852 ] [1,"sacred","Small Shield (Sacred)"], _ ; [@23 ] [1,"tiered","Spangenhelm (1)"], _ ; [3@M ] [1,"tiered","Spangenhelm (2)"], _ ; [4@M ] [1,"tiered","Spangenhelm (3)"], _ ; [5@M ] [1,"tiered","Spangenhelm (4)"], _ ; [6@M ] [1,"tiered","Spangenhelm (5)"], _ ; [7@M ] [1,"tiered","Spangenhelm (6)"], _ ; [8@M ] [1,"sacred","Spangenhelm (Sacred)"], _ ; [9@M ] [1,"tiered","Spiked Shield (1)"], _ ; [643 ] [1,"tiered","Spiked Shield (2)"], _ ; [689 ] [1,"tiered","Spiked Shield (3)"], _ ; [735 ] [1,"tiered","Spiked Shield (4)"], _ ; [781 ] [1,"tiered","Spiked Shield (5)"], _ ; [827 ] [1,"tiered","Spiked Shield (6)"], _ ; [873 ] [1,"sacred","Spiked Shield (Sacred)"], _ ; [@44 ] [1,"tiered","Spirit Mask (1)"], _ ; [w14 ] [1,"tiered","Spirit Mask (2)"], _ ; [w34 ] [1,"tiered","Spirit Mask (3)"], _ ; [w54 ] [1,"tiered","Spirit Mask (4)"], _ ; [w74 ] [1,"tiered","Spirit Mask (5)"], _ ; [w94 ] [1,"tiered","Spirit Mask (6)"], _ ; [e24 ] [1,"sacred","Spirit Mask (Sacred)"], _ ; [@51 ] [1,"tiered","Splint Mail (1)"], _ ; [608 ] [1,"tiered","Splint Mail (2)"], _ ; [654 ] [1,"tiered","Splint Mail (3)"], _ ; [700 ] [1,"tiered","Splint Mail (4)"], _ ; [746 ] [1,"tiered","Splint Mail (5)"], _ ; [792 ] [1,"tiered","Divine Guard"], _ ; [Ysh5] [1,"tiered","Splint Mail (6)"], _ ; [838 ] [1,"sacred","Splint Mail (Sacred)"], _ ; [@09 ] [1,"tiered","Studded Leather (1)"], _ ; [603 ] [1,"tiered","Studded Leather (2)"], _ ; [649 ] [1,"tiered","Studded Leather (3)"], _ ; [695 ] [1,"tiered","Studded Leather (4)"], _ ; [741 ] [1,"tiered","Studded Leather (5)"], _ ; [787 ] [1,"tiered","Studded Leather (6)"], _ ; [833 ] [1,"sacred","Studded Leather (Sacred)"], _ ; [@04 ] [1,"tiered","Targe (1)"], _ ; [w20 ] [1,"tiered","Targe (2)"], _ ; [w40 ] [1,"tiered","Targe (3)"], _ ; [w60 ] [1,"tiered","Targe (4)"], _ ; [w80 ] [1,"tiered","Targe (5)"], _ ; [e10 ] [1,"tiered","Targe (6)"], _ ; [e30 ] [1,"sacred","Targe (Sacred)"], _ ; [@57 ] [1,"tiered","Tiara (1)"], _ ; [k03 ] [1,"tiered","Tiara (2)"], _ ; [k07 ] [1,"tiered","Tiara (3)"], _ ; [k11 ] [1,"tiered","Tiara (4)"], _ ; [k15 ] [1,"tiered","Tiara (5)"], _ ; [k19 ] [1,"tiered","Tiara (6)"], _ ; [k23 ] [1,"sacred","Tiara (Sacred)"], _ ; [@69 ] [1,"tiered","Totem Shield (1)"], _ ; [6@O ] [1,"tiered","Warkeepers"], _ ; [Ysh8] [1,"tiered","Winged Feet"], _ ; [Ysh9] [1,"tiered","Totem Shield (2)"], _ ; [7@O ] [1,"tiered","Totem Shield (3)"], _ ; [8@O ] [1,"tiered","Totem Shield (4)"], _ ; [9@O ] [1,"tiered","Totem Shield (5)"], _ ; [1@P ] [1,"tiered","Mage's Plate"], _ ; [Ysh4] [1,"tiered","Mana Belt"], _ ; [Ysh7] [1,"tiered","Totem Shield (6)"], _ ; [2@P ] [1,"sacred","Totem Shield (Sacred)"], _ ; [3@P ] [1,"tiered","Tower Shield (1)"], _ ; [625 ] [1,"tiered","Tower Shield (2)"], _ ; [671 ] [1,"tiered","Tower Shield (3)"], _ ; [717 ] [1,"tiered","Tower Shield (4)"], _ ; [763 ] [1,"tiered","Tower Shield (5)"], _ ; [809 ] [1,"tiered","Tower Shield (6)"], _ ; [855 ] [1,"sacred","Tower Shield (Sacred)"], _ ; [@26 ] [1,"tiered","Unraveller Head (1)"], _ ; [w27 ] [1,"tiered","Unraveller Head (2)"], _ ; [w47 ] [1,"tiered","Unraveller Head (3)"], _ ; [w67 ] [1,"tiered","Unraveller Head (4)"], _ ; [w87 ] [1,"tiered","Unraveller Head (5)"], _ ; [e17 ] [1,"tiered","Unraveller Head (6)"], _ ; [e37 ] [1,"sacred","Unraveller Head (Sacred)"], _ ; [@64 ] [1,"tiered","Wolf Head (1)"], _ ; [w10 ] [1,"tiered","Wolf Head (2)"], _ ; [w30 ] [1,"tiered","Wolf Head (3)"], _ ; [w50 ] [1,"tiered","Wolf Head (4)"], _ ; [w70 ] [1,"tiered","Wolf Head (5)"], _ ; [w90 ] [1,"tiered","Wolf Head (6)"], _ ; [e20 ] [1,"sacred","Wolf Head (Sacred)"], _ ; [@47 ] [1,"tiered","Zombie Head (1)"], _ ; [w26 ] [1,"tiered","Zombie Head (2)"], _ ; [w46 ] [1,"tiered","Zombie Head (3)"], _ ; [w66 ] [1,"tiered","Zombie Head (4)"], _ ; [w86 ] [1,"tiered","Zombie Head (5)"], _ ; [e16 ] [1,"tiered","Zombie Head (6)"], _ ; [e36 ] [1,"sacred","Zombie Head (Sacred)"], _ ; [@63 ] [1,"tiered","Sorcerer's Mask"], _ ; [Ysh6] [0,"",""], _ ; [elx ] [0,"",""], _ ; [hpo ] [0,"",""], _ ; [mpo ] [0,"",""], _ ; [hpf ] [0,"",""], _ ; [mpf ] [0,"",""], _ ; [vps ] [0,"",""], _ ; [yps ] [0,"",""], _ ; [rvs ] [0,"",""], _ ; [rvl ] [0,"",""], _ ; [wms ] [0,"",""], _ ; [tbk ] [0,"",""], _ ; [ibk ] [1,"sacred","Amulet"], _ ; [amu ] [0,"",""], _ ; [vip ] [1,"sacred","Ring"], _ ; [rin ] [0,"",""], _ ; [gld ] [0,"",""], _ ; [bks ] [0,"",""], _ ; [bkd ] [1,"sacred","Arrow Quiver"], _ ; [aqv ] [0,"",""], _ ; [tch ] [1,"sacred","Bolt Quiver"], _ ; [cqv ] [0,"",""], _ ; [tsc ] [0,"",""], _ ; [isc ] [0,"",""], _ ; [hrt ] [0,"",""], _ ; [brz ] [0,"",""], _ ; [jaw ] [0,"",""], _ ; [eyz ] [0,"",""], _ ; [hrn ] [0,"",""], _ ; [tal ] [0,"",""], _ ; [flg ] [0,"",""], _ ; [fng ] [0,"",""], _ ; [qll ] [0,"",""], _ ; [sol ] [0,"",""], _ ; [scz ] [0,"",""], _ ; [spe ] [0,"",""], _ ; [key ] [0,"",""], _ ; [luv ] [0,"",""], _ ; [xyz ] [0,"",""], _ ; [j34 ] [0,"",""], _ ; [g34 ] [0,"",""], _ ; [bbb ] [0,"",""], _ ; [box ] [0,"",""], _ ; [tr1 ] [0,"",""], _ ; [mss ] [0,"",""], _ ; [ass ] [0,"",""], _ ; [qey ] [0,"",""], _ ; [qhr ] [0,"",""], _ ; [qbr ] [0,"",""], _ ; [ear ] [0,"",""], _ ; [gcv ] [0,"",""], _ ; [gfv ] [0,"",""], _ ; [gsv ] [0,"",""], _ ; [gzv ] [0,"",""], _ ; [gpv ] [0,"",""], _ ; [gcy ] [0,"",""], _ ; [gfy ] [0,"",""], _ ; [gsy ] [0,"",""], _ ; [gly ] [0,"",""], _ ; [gpy ] [0,"",""], _ ; [gcb ] [0,"",""], _ ; [gfb ] [0,"",""], _ ; [gsb ] [0,"",""], _ ; [glb ] [0,"",""], _ ; [gpb ] [0,"",""], _ ; [gcg ] [0,"",""], _ ; [gfg ] [0,"",""], _ ; [gsg ] [0,"",""], _ ; [glg ] [0,"",""], _ ; [gpg ] [0,"",""], _ ; [gcr ] [0,"",""], _ ; [gfr ] [0,"",""], _ ; [gsr ] [0,"",""], _ ; [glr ] [0,"",""], _ ; [gpr ] [0,"",""], _ ; [gcw ] [0,"",""], _ ; [gfw ] [0,"",""], _ ; [gsw ] [0,"",""], _ ; [glw ] [0,"",""], _ ; [gpw ] [0,"",""], _ ; [hp1 ] [0,"",""], _ ; [hp2 ] [0,"",""], _ ; [hp3 ] [0,"",""], _ ; [hp4 ] [0,"",""], _ ; [hp5 ] [0,"",""], _ ; [mp1 ] [0,"",""], _ ; [mp2 ] [0,"",""], _ ; [mp3 ] [0,"",""], _ ; [mp4 ] [0,"",""], _ ; [mp5 ] [0,"",""], _ ; [skc ] [0,"",""], _ ; [skf ] [0,"",""], _ ; [sku ] [0,"",""], _ ; [skl ] [0,"",""], _ ; [skz ] [0,"",""], _ ; [hrb ] [1,"","Cycle"], _ ; [cm1 ] [1,"","Cycle"], _ ; [cm2 ] [1,"","Cycle"], _ ; [cm3 ] [0,"",""], _ ; [rps ] [0,"",""], _ ; [rpl ] [0,"",""], _ ; [bps ] [0,"",""], _ ; [bpl ] [0,"",""], _ ; [r01 ] [0,"",""], _ ; [r02 ] [0,"",""], _ ; [r03 ] [0,"",""], _ ; [r04 ] [0,"",""], _ ; [r05 ] [0,"",""], _ ; [r06 ] [0,"",""], _ ; [r07 ] [0,"",""], _ ; [r08 ] [0,"",""], _ ; [r09 ] [0,"",""], _ ; [r10 ] [0,"",""], _ ; [r11 ] [0,"",""], _ ; [r12 ] [0,"",""], _ ; [r13 ] [0,"",""], _ ; [r14 ] [0,"",""], _ ; [r15 ] [0,"",""], _ ; [r16 ] [0,"",""], _ ; [r17 ] [0,"",""], _ ; [r18 ] [0,"",""], _ ; [r19 ] [0,"",""], _ ; [r20 ] [0,"",""], _ ; [r21 ] [0,"",""], _ ; [r22 ] [0,"",""], _ ; [r23 ] [0,"",""], _ ; [r24 ] [0,"",""], _ ; [r25 ] [0,"",""], _ ; [r26 ] [0,"",""], _ ; [r27 ] [0,"",""], _ ; [r28 ] [0,"",""], _ ; [r29 ] [0,"",""], _ ; [r30 ] [0,"",""], _ ; [r31 ] [0,"",""], _ ; [r32 ] [0,"",""], _ ; [r33 ] [1,"sacred","Jewel"], _ ; [jew ] [0,"",""], _ ; [ice ] [0,"",""], _ ; [0sc ] [0,"",""], _ ; [tr2 ] [1,"sacred","Amulet"], _ ; [dr1 ] [1,"sacred","Amulet"], _ ; [dr2 ] [1,"sacred","Amulet"], _ ; [dr3 ] [1,"sacred","Amulet"], _ ; [dr4 ] [1,"sacred","Amulet"], _ ; [dr5 ] [1,"sacred","Amulet"], _ ; [ba1 ] [1,"sacred","Amulet"], _ ; [ba2 ] [1,"sacred","Amulet"], _ ; [ba3 ] [1,"sacred","Amulet"], _ ; [ba4 ] [1,"sacred","Amulet"], _ ; [ba5 ] [1,"sacred","Amulet"], _ ; [pa1 ] [1,"sacred","Amulet"], _ ; [pa2 ] [1,"sacred","Amulet"], _ ; [pa3 ] [1,"sacred","Amulet"], _ ; [pa4 ] [1,"sacred","Amulet"], _ ; [pa5 ] [1,"sacred","Amulet"], _ ; [ne1 ] [1,"sacred","Amulet"], _ ; [ne2 ] [1,"sacred","Amulet"], _ ; [ne3 ] [1,"sacred","Amulet"], _ ; [ne4 ] [1,"sacred","Amulet"], _ ; [ne5 ] [1,"sacred","Amulet"], _ ; [dr6 ] [1,"sacred","Amulet"], _ ; [dr7 ] [1,"sacred","Amulet"], _ ; [dr8 ] [1,"sacred","Amulet"], _ ; [dr9 ] [1,"sacred","Amulet"], _ ; [dra ] [1,"sacred","Amulet"], _ ; [ba6 ] [1,"sacred","Amulet"], _ ; [ba7 ] [1,"sacred","Amulet"], _ ; [ba8 ] [1,"sacred","Amulet"], _ ; [ba9 ] [1,"sacred","Amulet"], _ ; [baa ] [1,"sacred","Amulet"], _ ; [pa6 ] [1,"sacred","Amulet"], _ ; [pa7 ] [1,"sacred","Amulet"], _ ; [pa8 ] [1,"sacred","Amulet"], _ ; [pa9 ] [1,"sacred","Amulet"], _ ; [paa ] [1,"sacred","Amulet"], _ ; [ne6 ] [1,"sacred","Amulet"], _ ; [ne7 ] [1,"sacred","Amulet"], _ ; [ne8 ] [1,"sacred","Amulet"], _ ; [ne9 ] [1,"sacred","Amulet"], _ ; [nea ] [1,"sacred","Amulet"], _ ; [drb ] [1,"sacred","Amulet"], _ ; [drc ] [1,"sacred","Amulet"], _ ; [drd ] [1,"sacred","Amulet"], _ ; [dre ] [1,"sacred","Amulet"], _ ; [drf ] [1,"sacred","Amulet"], _ ; [bab ] [1,"sacred","Amulet"], _ ; [bac ] [1,"sacred","Amulet"], _ ; [bad ] [1,"sacred","Amulet"], _ ; [bae ] [1,"sacred","Amulet"], _ ; [baf ] [1,"sacred","Amulet"], _ ; [pab ] [1,"sacred","Amulet"], _ ; [pac ] [1,"sacred","Amulet"], _ ; [pad ] [1,"sacred","Amulet"], _ ; [pae ] [1,"sacred","Amulet"], _ ; [paf ] [1,"sacred","Amulet"], _ ; [neb ] [1,"sacred","Amulet"], _ ; [neg ] [1,"sacred","Amulet"], _ ; [ned ] [1,"sacred","Amulet"], _ ; [nee ] [1,"sacred","Amulet"], _ ; [nef ] [1,"sacred","Amulet"], _ ; [ktr ] [1,"sacred","Amulet"], _ ; [wrb ] [1,"sacred","Amulet"], _ ; [axf ] [1,"sacred","Amulet"], _ ; [ces ] [1,"sacred","Amulet"], _ ; [clw ] [1,"sacred","Amulet"], _ ; [btl ] [1,"sacred","Amulet"], _ ; [skr ] [1,"sacred","Amulet"], _ ; [9ar ] [1,"sacred","Amulet"], _ ; [9wb ] [1,"sacred","Amulet"], _ ; [9xf ] [1,"sacred","Amulet"], _ ; [9cs ] [1,"sacred","Amulet"], _ ; [9lw ] [1,"sacred","Amulet"], _ ; [9tw ] [1,"sacred","Amulet"], _ ; [9qr ] [1,"sacred","Amulet"], _ ; [7ar ] [1,"sacred","Amulet"], _ ; [7wb ] [1,"sacred","Amulet"], _ ; [7xf ] [1,"sacred","Amulet"], _ ; [7cs ] [1,"sacred","Amulet"], _ ; [7lw ] [1,"sacred","Amulet"], _ ; [7tw ] [1,"sacred","Amulet"], _ ; [7qr ] [1,"sacred","Amulet"], _ ; [ob1 ] [1,"sacred","Amulet"], _ ; [ob2 ] [1,"sacred","Amulet"], _ ; [ob3 ] [1,"sacred","Amulet"], _ ; [ob4 ] [1,"sacred","Amulet"], _ ; [ob5 ] [1,"sacred","Amulet"], _ ; [am1 ] [1,"sacred","Amulet"], _ ; [am2 ] [1,"sacred","Amulet"], _ ; [am3 ] [1,"sacred","Amulet"], _ ; [am4 ] [1,"sacred","Amulet"], _ ; [am5 ] [1,"sacred","Amulet"], _ ; [ob6 ] [1,"sacred","Amulet"], _ ; [ob7 ] [1,"sacred","Amulet"], _ ; [ob8 ] [1,"sacred","Amulet"], _ ; [ob9 ] [1,"sacred","Amulet"], _ ; [oba ] [1,"sacred","Amulet"], _ ; [am6 ] [1,"sacred","Amulet"], _ ; [am7 ] [1,"sacred","Amulet"], _ ; [am8 ] [1,"sacred","Amulet"], _ ; [am9 ] [1,"sacred","Amulet"], _ ; [ama ] [1,"sacred","Amulet"], _ ; [obb ] [1,"sacred","Amulet"], _ ; [obc ] [1,"sacred","Amulet"], _ ; [obd ] [1,"sacred","Amulet"], _ ; [obe ] [1,"sacred","Amulet"], _ ; [obf ] [1,"sacred","Amulet"], _ ; [amb ] [1,"sacred","Amulet"], _ ; [amc ] [1,"sacred","Amulet"], _ ; [amd ] [1,"sacred","Amulet"], _ ; [ame ] [1,"sacred","Amulet"], _ ; [amf ] [1,"","Hello!"], _ ; [zen ] [0,"",""], _ ; [ey2 ] [0,"",""], _ ; [ey3 ] [0,"",""], _ ; [ey4 ] [0,"",""], _ ; [ey9 ] [0,"",""], _ ; [et1 ] [0,"",""], _ ; [0g7 ] [0,"",""], _ ; [0g8 ] [0,"",""], _ ; [0g0 ] [0,"",""], _ ; [0g1 ] [0,"",""], _ ; [0g2 ] [0,"",""], _ ; [vic ] [0,"",""], _ ; [mec ] [0,"",""], _ ; [abu ] [0,"",""], _ ; [s0m ] [0,"",""], _ ; [a55 ] [0,"",""], _ ; [a56 ] [0,"",""], _ ; [a57 ] [0,"",""], _ ; [a58 ] [0,"",""], _ ; [a59 ] [0,"",""], _ ; [a60 ] [0,"",""], _ ; [a61 ] [0,"",""], _ ; [a66 ] [0,"",""], _ ; [a67 ] [0,"",""], _ ; [a68 ] [0,"",""], _ ; [yq1 ] [0,"",""], _ ; [yq2 ] [0,"",""], _ ; [yq7 ] [0,"",""], _ ; [yq8 ] [0,"",""], _ ; [yqx ] [0,"",""], _ ; [yqe ] [0,"",""], _ ; [x0x ] [0,"",""], _ ; [x1x ] [0,"",""], _ ; [x2x ] [0,"",""], _ ; [x3x ] [0,"",""], _ ; [x4x ] [0,"",""], _ ; [2x5 ] [0,"",""], _ ; [2x6 ] [0,"",""], _ ; [2x7 ] [0,"",""], _ ; [2x8 ] [0,"",""], _ ; [2x9 ] [0,"",""], _ ; [adi ] [0,"",""], _ ; [0u1 ] [0,"",""], _ ; [x01 ] [0,"",""], _ ; [x02 ] [0,"",""], _ ; [x03 ] [0,"",""], _ ; [x04 ] [0,"",""], _ ; [x05 ] [0,"",""], _ ; [x06 ] [0,"",""], _ ; [x07 ] [0,"",""], _ ; [yo1 ] [0,"",""], _ ; [yo2 ] [0,"",""], _ ; [yo3 ] [0,"",""], _ ; [yo4 ] [0,"",""], _ ; [yo5 ] [0,"",""], _ ; [r34 ] [0,"",""], _ ; [r35 ] [0,"",""], _ ; [r36 ] [0,"",""], _ ; [r37 ] [0,"",""], _ ; [r38 ] [0,"",""], _ ; [r39 ] [0,"",""], _ ; [r40 ] [0,"",""], _ ; [r41 ] [0,"",""], _ ; [r42 ] [0,"",""], _ ; [r43 ] [0,"",""], _ ; [r44 ] [0,"",""], _ ; [r45 ] [0,"",""], _ ; [r46 ] [0,"",""], _ ; [r47 ] [0,"",""], _ ; [r48 ] [0,"",""], _ ; [r49 ] [0,"",""], _ ; [r50 ] [1,"","Taha Rune"], _ ; [r51 ] [1,"","Ghal Rune"], _ ; [r52 ] [1,"","Qor Rune"], _ ; [r53 ] [0,"",""], _ ; [qus ] [0,"",""], _ ; [qut ] [0,"",""], _ ; [qux ] [0,"",""], _ ; [quy ] [1,"shrine","Creepy Shrine"], _ ; [A0+ ] [0,"",""], _ ; [A1+ ] [0,"",""], _ ; [A2+ ] [0,"",""], _ ; [A3+ ] [0,"",""], _ ; [A4+ ] [0,"",""], _ ; [A5+ ] [0,"",""], _ ; [A6+ ] [0,"",""], _ ; [A7+ ] [0,"",""], _ ; [A8+ ] [0,"",""], _ ; [A9+ ] [1,"shrine","Abandoned Shrine"], _ ; [B0+ ] [0,"",""], _ ; [B1+ ] [0,"",""], _ ; [B2+ ] [0,"",""], _ ; [B3+ ] [0,"",""], _ ; [B4+ ] [0,"",""], _ ; [B5+ ] [0,"",""], _ ; [B6+ ] [0,"",""], _ ; [B7+ ] [0,"",""], _ ; [B8+ ] [0,"",""], _ ; [B9+ ] [1,"shrine","Quiet Shrine"], _ ; [C0+ ] [0,"",""], _ ; [C1+ ] [0,"",""], _ ; [C2+ ] [0,"",""], _ ; [C3+ ] [0,"",""], _ ; [C4+ ] [0,"",""], _ ; [C5+ ] [0,"",""], _ ; [C6+ ] [0,"",""], _ ; [C7+ ] [0,"",""], _ ; [C8+ ] [0,"",""], _ ; [C9+ ] [1,"shrine","Eerie Shrine"], _ ; [D0+ ] [0,"",""], _ ; [D1+ ] [0,"",""], _ ; [D2+ ] [0,"",""], _ ; [D3+ ] [0,"",""], _ ; [D4+ ] [0,"",""], _ ; [D5+ ] [0,"",""], _ ; [D6+ ] [0,"",""], _ ; [D7+ ] [0,"",""], _ ; [D8+ ] [0,"",""], _ ; [D9+ ] [1,"shrine","Weird Shrine"], _ ; [E0+ ] [0,"",""], _ ; [E1+ ] [0,"",""], _ ; [E2+ ] [0,"",""], _ ; [E3+ ] [0,"",""], _ ; [E4+ ] [0,"",""], _ ; [E5+ ] [0,"",""], _ ; [E6+ ] [0,"",""], _ ; [E7+ ] [0,"",""], _ ; [E8+ ] [0,"",""], _ ; [E9+ ] [1,"shrine","Intimidating Shrine"], _ ; [F0+ ] [0,"",""], _ ; [F1+ ] [0,"",""], _ ; [F2+ ] [0,"",""], _ ; [F3+ ] [0,"",""], _ ; [F4+ ] [0,"",""], _ ; [F5+ ] [0,"",""], _ ; [F6+ ] [0,"",""], _ ; [F7+ ] [0,"",""], _ ; [F8+ ] [0,"",""], _ ; [F9+ ] [1,"shrine","Tainted Shrine"], _ ; [G0+ ] [0,"",""], _ ; [G1+ ] [0,"",""], _ ; [G2+ ] [0,"",""], _ ; [G3+ ] [0,"",""], _ ; [G4+ ] [0,"",""], _ ; [G5+ ] [0,"",""], _ ; [G6+ ] [0,"",""], _ ; [G7+ ] [0,"",""], _ ; [G8+ ] [0,"",""], _ ; [G9+ ] [1,"shrine","Fascinating Shrine"], _ ; [H0+ ] [0,"",""], _ ; [H1+ ] [0,"",""], _ ; [H2+ ] [0,"",""], _ ; [H3+ ] [0,"",""], _ ; [H4+ ] [0,"",""], _ ; [H5+ ] [0,"",""], _ ; [H6+ ] [0,"",""], _ ; [H7+ ] [0,"",""], _ ; [H8+ ] [0,"",""], _ ; [H9+ ] [1,"shrine","Ornate Shrine"], _ ; [I0+ ] [0,"",""], _ ; [I1+ ] [0,"",""], _ ; [I2+ ] [0,"",""], _ ; [I3+ ] [0,"",""], _ ; [I4+ ] [0,"",""], _ ; [I5+ ] [0,"",""], _ ; [I6+ ] [0,"",""], _ ; [I7+ ] [0,"",""], _ ; [I8+ ] [0,"",""], _ ; [I9+ ] [1,"shrine","Sacred Shrine"], _ ; [J0+ ] [0,"",""], _ ; [J1+ ] [0,"",""], _ ; [J2+ ] [0,"",""], _ ; [J3+ ] [0,"",""], _ ; [J4+ ] [0,"",""], _ ; [J5+ ] [0,"",""], _ ; [J6+ ] [0,"",""], _ ; [J7+ ] [0,"",""], _ ; [J8+ ] [0,"",""], _ ; [J9+ ] [1,"shrine","Shimmering Shrine"], _ ; [K0+ ] [0,"",""], _ ; [K1+ ] [0,"",""], _ ; [K2+ ] [0,"",""], _ ; [K3+ ] [0,"",""], _ ; [K4+ ] [0,"",""], _ ; [K5+ ] [0,"",""], _ ; [K6+ ] [0,"",""], _ ; [K7+ ] [0,"",""], _ ; [K8+ ] [0,"",""], _ ; [K9+ ] [1,"shrine","Spiritual Shrine"], _ ; [M0+ ] [0,"",""], _ ; [M1+ ] [0,"",""], _ ; [M2+ ] [0,"",""], _ ; [M3+ ] [0,"",""], _ ; [M4+ ] [0,"",""], _ ; [M5+ ] [0,"",""], _ ; [M6+ ] [0,"",""], _ ; [M7+ ] [0,"",""], _ ; [M8+ ] [0,"",""], _ ; [M9+ ] [1,"shrine","Magical Shrine"], _ ; [N0+ ] [0,"",""], _ ; [N1+ ] [0,"",""], _ ; [N2+ ] [0,"",""], _ ; [N3+ ] [0,"",""], _ ; [N4+ ] [0,"",""], _ ; [N5+ ] [0,"",""], _ ; [N6+ ] [0,"",""], _ ; [N7+ ] [0,"",""], _ ; [N8+ ] [0,"",""], _ ; [N9+ ] [1,"shrine","Enchanted Shrine"], _ ; [O0+ ] [0,"",""], _ ; [O1+ ] [0,"",""], _ ; [O2+ ] [0,"",""], _ ; [O3+ ] [0,"",""], _ ; [O4+ ] [0,"",""], _ ; [O5+ ] [0,"",""], _ ; [O6+ ] [0,"",""], _ ; [O7+ ] [0,"",""], _ ; [O8+ ] [0,"",""], _ ; [O9+ ] [1,"shrine","Hidden Shrine"], _ ; [Q0+ ] [0,"",""], _ ; [Q1+ ] [0,"",""], _ ; [Q2+ ] [0,"",""], _ ; [Q3+ ] [0,"",""], _ ; [Q4+ ] [0,"",""], _ ; [Q5+ ] [0,"",""], _ ; [Q6+ ] [0,"",""], _ ; [Q7+ ] [0,"",""], _ ; [Q8+ ] [0,"",""], _ ; [Q9+ ] [1,"shrine","Trinity Shrine"], _ ; [R0+ ] [0,"",""], _ ; [R1+ ] [0,"",""], _ ; [R2+ ] [0,"",""], _ ; [R3+ ] [0,"",""], _ ; [R4+ ] [0,"",""], _ ; [R5+ ] [0,"",""], _ ; [R6+ ] [0,"",""], _ ; [R7+ ] [0,"",""], _ ; [R8+ ] [0,"",""], _ ; [R9+ ] [0,"",""], _ ; [qmu ] [0,"",""], _ ; [qin ] [1,"sacred","Arrow Quiver (Sacred)"], _ ; [qqv ] [1,"sacred","Bolt Quiver (Sacred)"], _ ; [qqc ] [0,"",""], _ ; [zkw ] [0,"",""], _ ; [zku ] [0,"",""], _ ; [zkq ] [0,"",""], _ ; [zkx ] [0,"",""], _ ; [zky ] [0,"",""], _ ; [zkr ] [0,"",""], _ ; [zka ] [0,"",""], _ ; [zkb ] [0,"",""], _ ; [zkc ] [0,"",""], _ ; [zkd ] [0,"",""], _ ; [zke ] [0,"",""], _ ; [zkf ] [0,"",""], _ ; [38+ ] [0,"",""], _ ; [61+ ] [0,"",""], _ ; [31+ ] [0,"",""], _ ; [51+ ] [0,"",""], _ ; [48+ ] [0,"",""], _ ; [25+ ] [0,"",""], _ ; [17+ ] [0,"",""], _ ; [20+ ] [0,"",""], _ ; [09+ ] [0,"",""], _ ; [14+ ] [0,"",""], _ ; [39+ ] [0,"",""], _ ; [60+ ] [0,"",""], _ ; [35+ ] [0,"",""], _ ; [50+ ] [0,"",""], _ ; [47+ ] [0,"",""], _ ; [03+ ] [0,"",""], _ ; [18+ ] [0,"",""], _ ; [24+ ] [0,"",""], _ ; [08+ ] [0,"",""], _ ; [12+ ] [0,"",""], _ ; [37+ ] [0,"",""], _ ; [40+ ] [0,"",""], _ ; [62+ ] [0,"",""], _ ; [52+ ] [0,"",""], _ ; [30+ ] [0,"",""], _ ; [04+ ] [0,"",""], _ ; [11+ ] [0,"",""], _ ; [23+ ] [0,"",""], _ ; [07+ ] [0,"",""], _ ; [13+ ] [0,"",""], _ ; [63+ ] [0,"",""], _ ; [33+ ] [0,"",""], _ ; [64+ ] [0,"",""], _ ; [27+ ] [0,"",""], _ ; [53+ ] [0,"",""], _ ; [02+ ] [0,"",""], _ ; [10+ ] [0,"",""], _ ; [22+ ] [0,"",""], _ ; [06+ ] [0,"",""], _ ; [15+ ] [0,"",""], _ ; [36+ ] [0,"",""], _ ; [32+ ] [0,"",""], _ ; [65+ ] [0,"",""], _ ; [26+ ] [0,"",""], _ ; [46+ ] [0,"",""], _ ; [01+ ] [0,"",""], _ ; [19+ ] [0,"",""], _ ; [21+ ] [0,"",""], _ ; [05+ ] [0,"",""], _ ; [16+ ] [0,"",""], _ ; [qul ] [0,"",""], _ ; [quz ] [1,"","Kara's Trinket"], _ ; [&66 ] [1,"","Monsterball"], _ ; [&67 ] [1,"","Heart of Frost"], _ ; [&68 ] [1,"","Relic of Yaerius"], _ ; [&69 ] [1,"","The Endless Light"], _ ; [&70 ] [1,"","Marksman's Eye"], _ ; [&71 ] [1,"","Farnham's Lost Marble"], _ ; [&72 ] [1,"","Zayl's Soul Orb"], _ ; [&73 ] [1,"","Eye of Malic"], _ ; [&74 ] [1,"","Apple of Discord"], _ ; [&75 ] [1,"","Idol of Stars"], _ ; [&76 ] [1,"","Nagapearl"], _ ; [&77 ] [1,"","The Moon Crystal"], _ ; [&78 ] [1,"","Auriel's Focus"], _ ; [&79 ] [1,"","Solitude"], _ ; [&80 ] [1,"","Larzuk's Round Shot"], _ ; [&81 ] [1,"","Vizjun's Ball Bearing"], _ ; [&82 ] [1,"","Nor Tiraj's Flaming Sphere"], _ ; [&83 ] [1,"","The Demon Core"], _ ; [&84 ] [1,"","Uldyssian's Spirit"], _ ; [&85 ] [0,"",""], _ ; [lok ] [0,"",""], _ ; [g$a ] [0,"",""], _ ; [g$b ] [0,"",""], _ ; [g$c ] [0,"",""], _ ; [g$d ] [0,"",""], _ ; [g$e ] [0,"",""], _ ; [9$a ] [0,"",""], _ ; [9$b ] [0,"",""], _ ; [9$c ] [0,"",""], _ ; [9$d ] [0,"",""], _ ; [9$e ] [0,"",""], _ ; [7$a ] [0,"",""], _ ; [7$b ] [0,"",""], _ ; [7$c ] [0,"",""], _ ; [7$d ] [0,"",""], _ ; [7$e ] [0,"",""], _ ; [5$a ] [0,"",""], _ ; [5$b ] [0,"",""], _ ; [5$c ] [0,"",""], _ ; [5$d ] [0,"",""], _ ; [5$e ] [0,"",""], _ ; [az! ] [0,"",""], _ ; [aq! ] [0,"",""], _ ; [ab! ] [0,"",""], _ ; [qum ] [0,"",""], _ ; [k@k ] [0,"",""], _ ; [l@l ] [0,"",""], _ ; [m@m ] [0,"",""], _ ; [o@o ] [0,"",""], _ ; [p@p ] [0,"",""], _ ; [q@q ] [0,"",""], _ ; [r@r ] [0,"",""], _ ; [s@s ] [0,"",""], _ ; [t@t ] [0,"",""], _ ; [u@v ] [0,"",""], _ ; [b@b ] [1,"","Lord Aldric Jitan Trophy"], _ ; [µ01 ] [1,"","Legacy of Blood Trophy"], _ ; [µ02 ] [1,"","Judgement Day Trophy"], _ ; [µ03 ] [1,"","Akarat Trophy"], _ ; [µ04 ] [1,"","Kingdom of Shadow Trophy"], _ ; [µ05 ] [1,"","Duncraig Trophy"], _ ; [µ06 ] [1,"","Rathma Square Trophy"], _ ; [µ07 ] [1,"","Cathedral of Light Trophy"], _ ; [µ08 ] [1,"","Tran Athulua Trophy"], _ ; [µ09 ] [1,"","Quov Tsin Trophy"], _ ; [µ10 ] [1,"","Astrogha Trophy"], _ ; [µ11 ] [1,"","Heart of Sin Trophy"], _ ; [µ12 ] [1,"","Viz-jun Trophy"], _ ; [µ13 ] [1,"","Archbishop Lazarus Trophy"], _ ; [µ14 ] [0,"",""], _ ; [w@w ] [0,"",""], _ ; [x@x ] [1,"","Krys Rune"], _ ; [r54 ] [1,"","Auhe Rune"], _ ; [r55 ] [1,"","Sha'ad Rune"], _ ; [r56 ] [0,"",""], _ ; [zog ] [0,"",""], _ ; [zoh ] [0,"",""], _ ; [c@c ] [1,"respec","Belladonna Extract"], _ ; [toa ] [0,"",""], _ ; [!@1 ] [0,"",""], _ ; [!@2 ] [0,"",""], _ ; [!@3 ] [0,"",""], _ ; [!@4 ] [0,"",""], _ ; [!@5 ] [0,"",""], _ ; [!@6 ] [0,"",""], _ ; [!@7 ] [0,"",""], _ ; [!@8 ] [0,"",""], _ ; [!@9 ] [0,"",""], _ ; [!@A ] [0,"",""], _ ; [!@B ] [0,"",""], _ ; [6oµ ] [0,"",""], _ ; [2oµ ] [0,"",""], _ ; [4oµ ] [0,"",""], _ ; [5oµ ] [0,"",""], _ ; [1oµ ] [0,"",""], _ ; [7oµ ] [0,"",""], _ ; [8oµ ] [0,"",""], _ ; [0oµ ] [0,"",""], _ ; [3oµ ] [0,"",""], _ ; [9oµ ] [0,"",""], _ ; [u@+ ] [0,"",""], _ ; [dog ] [1,"","Orb of Annihilation"], _ ; [&86 ] [1,"","Warbringer"], _ ; [&87 ] [1,"","Ten Pin Striker"], _ ; [&88 ] [1,"","Wrathspirit"], _ ; [&89 ] [1,"","Crystal of Tears"], _ ; [&90 ] [1,"","Essence of Itherael"], _ ; [&91 ] [1,"","Periapt of Life"], _ ; [&92 ] [1,"","Lodestone"], _ ; [&93 ] [1,"","Explorer's Globe"], _ ; [&94 ] [1,"","The Perfect Sphere"], _ ; [&95 ] [0,"",""], _ ; [yq9 ] [0,"",""], _ ; [brx ] [1,"","Black Road Trophy"], _ ; [bxt ] [0,"",""], _ ; [bxa ] [1,"","Runestone"], _ ; [r99 ] [0,"",""], _ ; [>.< ] [0,"",""], _ ; [r58 ] [0,"",""], _ ; [r59 ] [0,"",""], _ ; [r60 ] [0,"",""], _ ; [r61 ] [0,"",""], _ ; [r62 ] [0,"",""], _ ; [r57 ] [1,"","Earth Essence"], _ ; [Kx1 ] [1,"","Magic Essence"], _ ; [Kx2 ] [1,"","Venomous Essence"], _ ; [Kx3 ] [1,"","Lightning Essence"], _ ; [Kx4 ] [1,"","Icy Essence"], _ ; [Kx5 ] [1,"","Fiery Essence"], _ ; [Kx6 ] [0,"",""], _ ; [r98 ] <(Can't be Unsocketed)|Legendary Rune|Kabraxis' Stone> [0,"",""], _ ; [k.Z ] [0,"",""], _ ; [kZ8 ] [0,"",""], _ ; [x#x ] [0,"",""], _ ; [##. ] [1,"","Uldyssian's Trophy"], _ ; [##/ ] [0,"",""], _ ; [@## ] [1,"","Emblem of Suffering"], _ ; [#X1 ] [1,"","Emblem of Pain"], _ ; [#X2 ] [1,"","Emblem of Hatred"], _ ; [#X3 ] [1,"","Emblem of Terror"], _ ; [#X4 ] [1,"","Emblem of Destruction"], _ ; [#X5 ] [1,"","Emblem of Lies"], _ ; [#X6 ] [0,"",""], _ ; [zk# ] [0,"",""], _ ; [#X7 ] [0,"",""], _ ; [#X8 ] [0,"",""], _ ; [#X9 ] [0,"",""], _ ; [#X0 ] [0,"",""], _ ; [02^ ] [0,"",""], _ ; [03^ ] [0,"",""], _ ; [04^ ] [0,"",""], _ ; [06^ ] [0,"",""], _ ; [07^ ] [0,"",""], _ ; [08^ ] [0,"",""], _ ; [09^ ] [0,"",""], _ ; [10^ ] [0,"",""], _ ; [11^ ] [0,"",""], _ ; [12^ ] [0,"",""], _ ; [13^ ] [0,"",""], _ ; [14^ ] [0,"",""], _ ; [15^ ] [0,"",""], _ ; [16^ ] [0,"",""], _ ; [17^ ] [0,"",""], _ ; [18^ ] [0,"",""], _ ; [19^ ] [0,"",""], _ ; [20^ ] [0,"",""], _ ; [21^ ] [0,"",""], _ ; [22^ ] [0,"",""], _ ; [23^ ] [0,"",""], _ ; [24^ ] [1,"","Diablo's Essence"], _ ; [#1^ ] [0,"",""], _ ; [#2^ ] [0,"",""], _ ; [#3^ ] [0,"",""], _ ; [#4^ ] [0,"",""], _ ; [#5^ ] [0,"",""], _ ; [#Y^ ] [0,"",""], _ ; [`^` ] [1,"","Runestone"], _ ; [r97 ] [0,"",""], _ ; [`^# ] [0,"",""], _ ; [`|# ] [1,"","Learn to Read Trophy"], _ ; [µ99 ] [1,"","Cleanup Trophy"], _ ; [µ98 ] [0,"",""], _ ; [||_ ] [0,"",""], _ ; [||. ] [0,"",""], _ ; [||` ] [0,"",""], _ ; [||l ] [0,"",""], _ ; [||# ] [0,"",""], _ ; [||* ] [0,"",""], _ ; [||; ] <> [0,"",""], _ ; [|\\ ] [0,"",""], _ ; [|\# ] [0,"",""], _ ; [*\+ ] [0,"",""], _ ; [\\1 ] [0,"",""], _ ; [\\2 ] [0,"",""], _ ; [\\3 ] [0,"",""], _ ; [\\4 ] [0,"",""], _ ; [\\5 ] [0,"",""], _ ; [lawl] [0,"",""], _ ; [\\8 ] [1,"","Triune Trophy"], _ ; [µ15 ] [0,"",""], _ ; [\\7 ] [1,"","Cycle"], _ ; [\\6 ] [0,"",""], _ ; [voi1] [0,"",""], _ ; [voi2] [0,"",""], _ ; [voi3] [0,"",""], _ ; [voi4] [0,"",""], _ ; [voi5] [0,"",""], _ ; [voi6] [0,"",""], _ ; [vor1] [0,"",""], _ ; [vor2] [1,"","Enchanting Crystal"], _ ; [voDX] [0,"",""], _ ; [voXX] [0,"",""], _ ; [A0+S] [0,"",""], _ ; [B0+S] [0,"",""], _ ; [C0+S] [0,"",""], _ ; [D0+S] [0,"",""], _ ; [E0+S] [0,"",""], _ ; [F0+S] [0,"",""], _ ; [G0+S] [0,"",""], _ ; [H0+S] [0,"",""], _ ; [I0+S] [0,"",""], _ ; [J0+S] [0,"",""], _ ; [K0+S] [0,"",""], _ ; [M0+S] [0,"",""], _ ; [N0+S] [0,"",""], _ ; [O0+S] [0,"",""], _ ; [Q0+S] [0,"",""], _ ; [R0+S] [0,"",""], _ ; [Ysh1] [0,"",""], _ ; [Ysh2] [0,"",""], _ ; [mnx1] [0,"",""], _ ; [mnx2] [0,"",""], _ ; [hnrx] [1,"","Wings of the Departed"], _ ; [ripx] [0,"",""], _ ; [slc1] [0,"",""], _ ; [slc2] [0,"",""], _ ; [senn] [0,"",""], _ ; [brc1] [0,"",""], _ ; [brc2] [0,"",""], _ ; [brc3] [0,"",""], _ ; [brc4] [0,"",""], _ ; [brc5] [0,"",""], _ ; [brc6] [0,"",""], _ ; [smi1] [0,"",""], _ ; [smi2] [0,"",""], _ ; [sofd] [0,"",""], _ ; [kvoi] -[] ] \ No newline at end of file diff --git a/notifier/run.bat b/notifier/run.bat deleted file mode 100644 index cc59b13..0000000 --- a/notifier/run.bat +++ /dev/null @@ -1 +0,0 @@ -lua53.exe notify.lua \ No newline at end of file