CELua[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти
    1. Главная
    2. MasterGH
    3. Сообщения
    Не в сети
    • Профиль
    • Подписки 1
    • Подписчики 1
    • Темы 129
    • Сообщения 252
    • Группы 4

    Сообщения

    Последние Лучшие сообщения Спорные
    • Как менять цвет текста

      Теперь можно изменить %(#d20f0f)[цвет сообщения].

      9ccbc3dd-9c59-401a-a0ee-461954eee688-image.png

      написал в Новости
      MasterGHM
      MasterGH
    • Как делать Spoilers и д.р.

      Для компактности можно скрывать под спойлером .

      ||Сообщение под спойлером||

      Еще возможности...

      написал в Новости
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Lua Enable & Disable AA.CT

      Последняя версия шаблона будет здесь

      Должно работать на Cheat Engine 7.5 (cheatengine-x86_64-SSE4-AVX2.exe)

      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Посмотрю, как будет время

      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Может так

      InfiniteHealthScript = [[
      [Enabled]
      {$lua}
      Print("enabled")
      {$asm}
      
      [Dissable]
      {$lua}
      Print("disabled")
      {$asm}
      ]]
      
      
      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: CE Plugin: AA Maker 2.4.2

      ☺ ок

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • RE: CE Plugin: AA Maker 2.4.2

      На следующей неделе, если не забуду буду разбираться.
      Скачай с gamehacklab пока, если есть доступ.

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • RE: Обновление форума

      Да, нет, наверное. Вчера, что обсуждали.

      написал в Новости
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Пожалуйста

      написал в Вопросы
      MasterGHM
      MasterGH
    • Обновление форума

      Несколько последний сообщений в результате обновления и восстановления пропали, к сожалению.

      написал в Новости
      MasterGHM
      MasterGH
    • RE: CE Action Logger 1.0 Beta

      Отправил

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      @Pitronic нет

      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Заходишь в документацию

      CheckBox Class: (Inheritance: ButtonControl->WinControl->Control->Component->Object)
      createCheckBox(owner): Creates a CheckBox class object which belongs to the given owner. Owner can be any object inherited from WinControl
      
      properties
        Checked: boolean - True if checked
        AllowGrayed: boolean - True if it can have 3 states. True/False/None
        State: checkboxstate - The state. (cbUnchecked=0, cbChecked=1, cbGrayed=2)
        OnChange: function - Function to call when the state it changed
      
      methods
        getAllowGrayed()
        setAllowGrayed(boolean)
        getState(): Returns a state for the checkbox. (cbUnchecked, cbChecked, cbGrayed)
        setState(boolean): Sets the state of the checkbox
        onChange(function)
      

      По ней пишешь что-то вроде этого.

      checkBox.onChange = function onChangeState(sender)
        local state = sender.Checked
        if state then
          enableInfiniteHealthCheat()
        else
          disableInfiniteHealthCheat()
        end
      end
      
      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Checkbox

      local form = createForm( true );
      
      local checkBoxes = {};
      checkBoxes[1] = createCheckBox( form );
      checkBoxes[2] = createCheckBox( form );
      checkBoxes[3] = createCheckBox( form );
      checkBoxes[4] = createCheckBox( form );
      checkBoxes[5] = createCheckBox( form );
      
      for x = 1, #checkBoxes do
          checkBoxes[x].Caption="This is checkbox " .. tostring( x )
          checkBoxes[x].setPosition(10, x * 20)
      end 
      
      checkBoxes[1].State=0  -- Sets checkboxes[1] to unchecked state.
      checkBoxes[2].State=1  -- Sets checkboxes[2] to checked state.
      checkBoxes[3].State=2  -- Sets checkboxes[3] to the gray state
      
      if checkBoxes[4].Checked then  -- if checkboxes[4] is checked then the function returns true otherwise false.
         print "true"
      else
         print "false"
      end
      

      Здесь как привязать обработчик
      https://www.cheatengine.org/forum/viewtopic.php?p=5773901&sid=af88fa13b70a7208d528cc5aef5bba3f

      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Выполнение команды lua на кнопках формы

      Кнопка

      \--- create a form
      MyForm = createForm()
      
      \--- create a button (as a object) inside that form
      MyButton = createButton(MyForm) -- object name for button = MyButton
      MyButton.Left = 10
      MyButton.Top = 10
      MyButton.Width = 100
      MyButton.Height = 40
      MyButton.Caption = 'Open Link'  -- Put text on the button
      
      \--- create a function which will bne execute by MyButton Click
      \--- provide a correct web site link
      function openWebsite()
       shellExecute('https://forum.cheatengine.org/viewtopic.php?t=608340')
      end
      
      \--- Execute that function with MyButton Click
      MyButton.onClick = openWebsite
      
      \--- show MyForm
      MyForm.show()
      
      
      написал в Вопросы
      MasterGHM
      MasterGH
    • RE: Ваши группы пользователей

      👍 👍

      написал в Новости
      MasterGHM
      MasterGH
    • RE: CE Action Logger 1.0 Beta

      Ок. Поправлю. Спасибо

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • Опрос. На чем создаю читы?
      написал в Новости
      MasterGHM
      MasterGH
    • RE: CE Dissect Data Scaner 1.0.2 (4 hardware breakpoints)

      Охота на структуры и удивительное путешествие в мир структур в L4D2

      1. Игру L4D2 в оконный режим

      2. Установка плагина (позже)

      3. Установка VEH отладчика, иначе вылеты

      4. Первая миссия. Ищем адрес патронов. Бряк на адрес. Нашли инструкцию
        4f3f9116-b3d2-4c56-bc7d-bbb2ce839ef2-image.png
        Красным показано, что я не всю структуру проанализирую позже. Долго было ждать. Структура больше 5К байт...

      5. Делаем сигнатуру любой инструкции при работе с патронами на всякий случай, если игра вылетит.

      server.dll,83 BE 14 14 00 00 00 7F 4D
      6. Переходим в код и ищем проскакивающие адреса на инструкции. Там один адрес нашего пистолета. Клик на него и переносим адрес начала будущей структуры в окно Dissect Window. Можно не создавать структуру (отказываемся). Кликаем "Scanner" (он будет на всех окнах dissrct data)
      415be144-f67e-4d9b-8cda-8a0f14a99a45-image.png
      7. Далее работает сканирование.
      3c3caa73-8292-4d83-8267-958f805de5d0-image.png
      В игре можно что-то делать, можно ничего не делать. Долго ждать..

      Меняю опции. Чувствительность как была так и осталась минимальная (это время ожидания прерывания на адресе умноженное на коэфициент чувсвительности и на 100 мс). Размер структуры меняю, до 1100
      7e7ac546-2b8a-4c07-a0fe-5d973df7fa15-image.png
      b005e43b-17ad-4c98-a58d-ed9c8bffd9d4-image.png
      Наконец ~30 секунд дождался без вылетов (иногда бывают, возможно из-за VEH). Появился результат
      c3cf4da1-c639-4471-a4e3-4cd3d372e291-image.png
      Самые интересны это байтовые и float значения. и инструкции чтения. Их определит можно пока только по логам...

      Меняю первый байт на 1 и пистолет стал очень быстро стрелять.
      b111bcbd-d82c-4d72-9822-7bed532b87e7-image.png
      Ради чего это все и делалось, чтобы похожие адреса искать...

      Если сравнить дефолтную расструктуризацию, она слева
      7281f3f1-038c-4901-8a50-7d11f173cb5c-image.png
      Логи (для меня и для желающих) по определению типа по опкодам

      \+0 (2F3B49B0): vtDword 64FC73CB  -  mov edx,[ecx]
      \+28 (2F3B49D8): vtDword 6530433E  -  mov eax,[esi+28]
      \+4C (2F3B49FC): vtDword 651169A3  -  cmp dword ptr [esi+30],00
      \+4F (2F3B49FF): vtDword 651169B6  -  mov eax,[esi+30]
      \+53 (2F3B4A03): vtDword 65116C60  -  mov eax,[ecx+34]
      \+64 (2F3B4A14): vtByte 64F8627D  -  cmp byte ptr [esi+64],00
      \+84 (2F3B4A34): vtDword 64F861F0  -  movss xmm0,[esi+00000084]
      \+88 (2F3B4A38): vtDword 64F86215  -  movss xmm2,[esi+00000088]
      \+8C (2F3B4A3C): vtDword 64F9F9A6  -  movss xmm0,[eax+0000008C]
      \+90 (2F3B4A40): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+C8 (2F3B4A78): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+CC (2F3B4A7C): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+E0 (2F3B4A90): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+104 (2F3B4AB4): vtDword 651141FA  -  mov eax,[eax]
      \+10C (2F3B4ABC): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+10D (2F3B4ABD): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+10E (2F3B4ABE): vtWord 64FF2D96  -  movsx ecx,word ptr [eax]
      \+110 (2F3B4AC0): vtDword 64FF2DB6  -  mov ecx,[eax]
      \+138 (2F3B4AE8): vtDword 64FBB772  -  or [esi+00000138],edi
      \+171 (2F3B4B21): vtByte 64FBB7D4  -  cmp byte ptr [esi+00000171],00
      \+172 (2F3B4B22): vtByte 64FA6572  -  cmp byte ptr [esi+00000172],03
      \+173 (2F3B4B23): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+174 (2F3B4B24): vtDword 651141FA  -  mov eax,[eax]
      \+178 (2F3B4B28): vtDword 64FBB79D  -  mov eax,[esi+00000178]
      \+17C (2F3B4B2C): vtDword 64FBB7E8  -  mov eax,[esi+0000017C]
      \+180 (2F3B4B30): vtDword 64FDD9A6  -  mov eax,[ecx]
      \+188 (2F3B4B38): vtDword 64FF2D66  -  fld dword ptr [eax]
      \+18C (2F3B4B3C): vtDword 64FF2D6D  -  fld dword ptr [eax+04]
      \+190 (2F3B4B40): vtDword 64FF2D73  -  fld dword ptr [eax+08]
      \+194 (2F3B4B44): vtDword 64FF2D66  -  fld dword ptr [eax]
      \+198 (2F3B4B48): vtDword 64FF2D6D  -  fld dword ptr [eax+04]
      \+19C (2F3B4B4C): vtDword 64FF2D73  -  fld dword ptr [eax+08]
      \+1A0 (2F3B4B50): vtByte 64F9FD30  -  movzx eax,word ptr [ecx+20]
      \+1A1 (2F3B4B51): vtByte 64F9FD30  -  movzx eax,word ptr [ecx+20]
      \+1A2 (2F3B4B52): vtByte 64FDDBB0  -  movzx eax,byte ptr [ecx+22]
      \+1A3 (2F3B4B53): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+1AA (2F3B4B5A): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+1AC (2F3B4B5C): vtDword 64FF2D66  -  fld dword ptr [eax]
      \+1B0 (2F3B4B60): vtDword 64FF2D6D  -  fld dword ptr [eax+04]
      \+1B4 (2F3B4B64): vtDword 64FF2D73  -  fld dword ptr [eax+08]
      \+1B8 (2F3B4B68): vtDword 64FF2D66  -  fld dword ptr [eax]
      \+1BC (2F3B4B6C): vtDword 64FF2D6D  -  fld dword ptr [eax+04]
      \+1C0 (2F3B4B70): vtDword 64FF2D73  -  fld dword ptr [eax+08]
      \+1E0 (2F3B4B90): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+1E4 (2F3B4B94): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+1E8 (2F3B4B98): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+1EC (2F3B4B9C): vtDword 64FF2DB6  -  mov ecx,[eax]
      \+1F0 (2F3B4BA0): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+20C (2F3B4BBC): vtDword 651141FA  -  mov eax,[eax]
      \+210 (2F3B4BC0): vtDword 651141FA  -  mov eax,[eax]
      \+214 (2F3B4BC4): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+218 (2F3B4BC8): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+21C (2F3B4BCC): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+220 (2F3B4BD0): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+22C (2F3B4BDC): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+238 (2F3B4BE8): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+2B4 (2F3B4C64): vtDword 64FF2CC6  -  fld dword ptr [eax]
      \+2E4 (2F3B4C94): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2E5 (2F3B4C95): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2E6 (2F3B4C96): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2E7 (2F3B4C97): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2E8 (2F3B4C98): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2E9 (2F3B4C99): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2EA (2F3B4C9A): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2EB (2F3B4C9B): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+2EC (2F3B4C9C): vtByte 64FF2DC6  -  movzx ecx,byte ptr [eax]
      \+374 (2F3B4D24): vtDword 64FA65AC  -  mov edi,[esi+00000374]
      \+378 (2F3B4D28): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+37C (2F3B4D2C): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+380 (2F3B4D30): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+384 (2F3B4D34): vtDword 64FF2DE6  -  mov ecx,[eax]
      \+388 (2F3B4D38): vtDword 64FA65B8  -  movss xmm1,[ecx]
      \+38C (2F3B4D3C): vtDword 64FA660B  -  movss xmm1,[ecx+04]
      \+390 (2F3B4D40): vtDword 64FA6653  -  movss xmm1,[ecx+08]
      \+394 (2F3B4D44): vtDword 64FA68AD  -  movss xmm1,[eax]
      \+398 (2F3B4D48): vtDword 64FA68E1  -  movss xmm2,[eax+04]
      \+39C (2F3B4D4C): vtDword 64FA6904  -  movss xmm2,[eax+08]
      \+3A0 (2F3B4D50): vtDword 64FDEC3A  -  mov ecx,[edi]
      \+3B8 (2F3B4D68): vtDword 6508F54F  -  test [eax+000003B8],edx
      \+42C (2F3B4DDC): vtDword 64F84E81  -  fstp dword ptr [esi+0000042C]
      \+434 (2F3B4DE4): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+438 (2F3B4DE8): vtDword 64FF2D66  -  fld dword ptr [eax]
      \+43C (2F3B4DEC): vtDword 64FF2D6D  -  fld dword ptr [eax+04]
      \+440 (2F3B4DF0): vtDword 64FF2D73  -  fld dword ptr [eax+08]
      \+444 (2F3B4DF4): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+448 (2F3B4DF8): vtDword 64FF2DA6  -  mov ecx,[eax]
      \+44C (2F3B4DFC): vtDword 64FF2DE6  -  mov ecx,[eax]
      

      Плагин выложу позже. Надо еще доработать и потестить.

      Вот к примеру float распознал как Pointer и там где fst тоже по +42C тоже фигня. Это ошибки. Это быстро поправить, но могут быть еще ошибки.
      1a48dcb3-c1d8-4132-aca1-cca4bef03aa4-image.png

      Не менее интересны еще вложенные структурки, которые удается раскрыть (не все). Вот одна из них и усеяна параметрами, которые можно покрутить
      abdc2308-5907-4d18-ae78-24abc521b91a-image.png

      Вложенные структуры пока отдельно можно создавать в окнах, чистить сканером, потом подставлять их в основную структуру по имени. В общем пока рано об этом писать.

      Больше всего меня волнует польза, т.е. что можно с этим сделать. Пока только сразу вышел на скорострельность. Еще шесть параметров покрутил байтовых, ничего не дало. Надо еще попробовать выводить только смещения, которые работают на инструкцияъ чтения, а не "чтении и записи". Запись скорее всего не нужна. Значения просто активно перезаписываются в структуре. А вот оставлять смещения, с которыми работает только "чтение" скорее всего даст куда больше вероятности найти параметр настройки.

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • CE Dissect Data Scaner 1.0.2 (4 hardware breakpoints)
      Функции плагина:

      1. Точное определение типа данных на смещениях структуры (те которые срабатывают на аппаратных брейкпоинтах);
      2. Показать в имени элемента структуры один из опкодов чтения или его часть (с регистрами и смещением);
      3. Найти такие смещения, с которыми работают только инструкции чтения за указанное время равное Accuracy * 10мс на байт в структуре. Чем выше Accuracy, тем выше вероятность убрать больше лишний смещений;

      Плагин пока не планируется развивать из-за его особенности работы с 4мя аппаратными брейкпоинтами. С одной стороны это не тормозит игру, но с другой стороны нужно в игре совершать одни и те же действия чтобы по 4 байта в структуре срабатывали друг за другом до конца структуры.

      Есть другие способы снимать показания на любой размер структур установкой брейкпоинта на большую область памяти указанного размера (в другом плагине, который я пока не выложил). При этом чем структура больше и чем больше в ней прерываний тем сильнее тормозит, но оно того стоит, потому что показания снимаются практически одновременно.

      b385f695-a526-46df-89eb-c82298547404-image.png

      Это тестовая версия, поэтому могут быть ошибки при сканировании. О них можно написать мне в личку с названием игры, сигнатуры инструкции.

      Если плагин вдруг заключил и пишет что-то в консоли, то нажать на кнопку Stop или для остановки ввести Lua команду

      stopDissectDataScanner()
      Установка

      Распаковать в основную директорию с программой. В архиве форма, файл настроек и lua исходник.

      Как работать с плагином

      1. Ищем параметр в игре
      2. Ставим "точку останова на доступ"(брейкпоинт) или "на запись"
      3. Находим одну из инструкций. Например, в игре Кредо Убийцы 3 это инструкция
      AC3SP.exe+11BAEEB - 66 89 4E 5C           - mov [esi+5C],cx
      
      1. Можно пойти двумя способами по переносу базового адреса в окно структур

      4.1 На инструкции смотрим например базовый адрес ESI, он будет началом структуры. Его переносим в окно Dissect Data (открывается в отладчике). Отказываемся от всех диалогов, чтобы не получать структуру, которую создает Cheat Engine.

      4.2 Определить адреса например на "[esi+5c]" в дизассемблере и на любом вызвать контекстное меню и перебросить базовый адрес в Dissect Data

      1. В окне Dissect Data запускаем "Scanner" нажав на эту надпись и вводим имя структуры, размер в hex, и чувствительность поиска от 1 до 10

      2. Идем как можно быстрее в игру, а она уже должна быть активна и в оконном режиме, и не в меню. Ждем пока завершится сканирование, что-то делая в игре или простоя стоим там. Если очень долго, можно уменьшить чувствительность или размер структуры в hex-е

      3. После того как структура получена, мы основывать на своем опыте, ищем в структуре такие данные, которые могут повлиять на игровой процесс. Т.е. меняем что-то в структуре в байтовых, сингловых типах и смотрим в игру. Очень редко 4-х байтовые что-то дают,а поинтеры менять не надо их можно по аналогии смотреть в новых окнах.

      Результаты

      Нет 100% гарантии сразу найти все рабочие адреса, в которых что-то будет интересное. Большая часть может себя не проявить в игре или привести к вылетам. После определенного количества вылетов, вы поймете какие типы данных и как менять и вылетов будет меньше.

      Перед потенциальными вылетами делаем сигнатуры, чтобы вернуться на инструкцию.

      Вызов Lua кода после crash-а вернет адрес инструкции

      local sign = 'F3 0F 11 80 EC 00 00 00'
      function GetAddress(signature)
        local t = AOBScan(signature, '+X-C-W',0)
        local s = t[0]
        t.destroy()
        return s
      end
      print(GetAddress(sign))
      

      ...Много зависит от ползания по структуре и внутри структур (об этом в блоге) и соответственно, нужно время.

      Если времени мало. Получаем около 20 параметров структуре байтовых и сингловых. Безопасней всего менять сингловые. Их можно увеличить все в 2 раза и зайти в игру и увидеть, что там происходит. Не забываем перед правками сделать копию структуры и нажать на Lock, чтобы сравнить и откатить изменения. За тем уже правим по байтикам на ноль или на единицу. Редко бывают вылеты. Каждый адрес отмечаем, что его проверяли или удаляем. Если интересные, то меняем название. Сохраняем структуру.

      Ищем так несколько структур. Все их сохраняем. Не забываем делать сигнатурки для каждой структуры, чтобы получить базовый адрес.

      Собрали структуры. Ищем связи между ними. Об этом я скриншотил в блоге (ссылка выше). Опять сохраняем структуры.

      На три игры я находил 1-3 полезных параметра и до 6 каких-то забавных или баговых. Например, я нашел коэффициент скольжения персонажей в структуре с координатами и там же гравитацию. Попадались адреса, которые запрещали двигаться, т.е. можно морозить ботов. Попадались байтовые адреса, меняющие руки с оружием в L4D2.

      Структуры сохраняются в файл таблицы или экспортируются в отдельный файл.

      Далее делаем читы, как обычно. Либо меняем код, либо меняем данные по базовому указателю через скрипты Аutoasembler

      1. Исправлены ошибки с определением смещения и типов данных. Это позволил сделать новый алгоритм, который анализирует все опкоды работающие с адресом и выбирает наиболее подходящие для определения смещения адреса в структуре и для определения типа данных в структуре.

      Выбор лучшего опкода для определения типа данных:

      - опкоды с перезаписываемыми регистрами не выбираются;

      - опкоды работающие с float приоритетнее чем dword;

      - опкоды без квадратных скобок пока пропускаются: всякие repe, movsd и другие

      - опкоды с не правильным дизассемблированием пропускаются (невозможно получить адрес в скобках)

      1. Много новых данных в логах, после формирования структуры. С его помощью можно просмотреть все опкоды, которые сработали на смещении структуры.

      На скриншоте пример структуры, после работы плагина

      c8279a93-2615-4122-bcfe-6d2d8b9a7933-image.png

      написал в Плагин-строй
      MasterGHM
      MasterGH
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 12
    • 13
    • 4 / 13