diff options
52 files changed, 883 insertions, 996 deletions
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 500eb21e3..e48137080 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt | |||
| @@ -139,6 +139,9 @@ if (YUZU_USE_EXTERNAL_VULKAN_HEADERS) | |||
| 139 | add_subdirectory(Vulkan-Headers) | 139 | add_subdirectory(Vulkan-Headers) |
| 140 | endif() | 140 | endif() |
| 141 | 141 | ||
| 142 | # TZDB (Time Zone Database) | ||
| 143 | add_subdirectory(nx_tzdb) | ||
| 144 | |||
| 142 | if (NOT TARGET LLVM::Demangle) | 145 | if (NOT TARGET LLVM::Demangle) |
| 143 | add_library(demangle demangle/ItaniumDemangle.cpp) | 146 | add_library(demangle demangle/ItaniumDemangle.cpp) |
| 144 | target_include_directories(demangle PUBLIC ./demangle) | 147 | target_include_directories(demangle PUBLIC ./demangle) |
diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt new file mode 100644 index 000000000..2f625c108 --- /dev/null +++ b/externals/nx_tzdb/CMakeLists.txt | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | # SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | # SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | set(NX_TZDB_VERSION "220816") | ||
| 5 | set(NX_TZDB_DOWNLOAD_URL "https://github.com/lat9nq/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip") | ||
| 6 | |||
| 7 | set(NX_TZDB_ARCHIVE "${CMAKE_CURRENT_BINARY_DIR}/${NX_TZDB_VERSION}.zip") | ||
| 8 | set(NX_TZDB_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx_tzdb") | ||
| 9 | |||
| 10 | set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") | ||
| 11 | |||
| 12 | if (NOT EXISTS ${NX_TZDB_ARCHIVE}) | ||
| 13 | file(DOWNLOAD ${NX_TZDB_DOWNLOAD_URL} ${NX_TZDB_ARCHIVE}) | ||
| 14 | file(ARCHIVE_EXTRACT | ||
| 15 | INPUT | ||
| 16 | ${NX_TZDB_ARCHIVE} | ||
| 17 | DESTINATION | ||
| 18 | ${NX_TZDB_DIR}) | ||
| 19 | endif() | ||
| 20 | |||
| 21 | add_library(nx_tzdb INTERFACE) | ||
| 22 | target_include_directories(nx_tzdb | ||
| 23 | INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include | ||
| 24 | INTERFACE ${NX_TZDB_INCLUDE_DIR}) | ||
| 25 | |||
| 26 | function(CreateHeader ZONE_PATH HEADER_NAME) | ||
| 27 | set(HEADER_PATH "${NX_TZDB_INCLUDE_DIR}/nx_tzdb/${HEADER_NAME}.h") | ||
| 28 | add_custom_command( | ||
| 29 | OUTPUT | ||
| 30 | ${NX_TZDB_INCLUDE_DIR}/nx_tzdb/${HEADER_NAME}.h | ||
| 31 | COMMAND | ||
| 32 | ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/NxTzdbCreateHeader.cmake | ||
| 33 | ${ZONE_PATH} | ||
| 34 | ${HEADER_NAME} | ||
| 35 | ${NX_TZDB_INCLUDE_DIR} | ||
| 36 | ${CMAKE_CURRENT_SOURCE_DIR} | ||
| 37 | DEPENDS | ||
| 38 | tzdb_template.h.in | ||
| 39 | NxTzdbCreateHeader.cmake) | ||
| 40 | |||
| 41 | target_sources(nx_tzdb PRIVATE ${HEADER_PATH}) | ||
| 42 | endfunction() | ||
| 43 | |||
| 44 | CreateHeader(${NX_TZDB_DIR} base) | ||
| 45 | CreateHeader(${NX_TZDB_DIR}/zoneinfo zoneinfo) | ||
| 46 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Africa africa) | ||
| 47 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/America america) | ||
| 48 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Argentina america_argentina) | ||
| 49 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Indiana america_indiana) | ||
| 50 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/Kentucky america_kentucky) | ||
| 51 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/America/North_Dakota america_north_dakota) | ||
| 52 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Antartica antartica) | ||
| 53 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Arctic arctic) | ||
| 54 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Asia asia) | ||
| 55 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Atlantic atlantic) | ||
| 56 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Australia australia) | ||
| 57 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Brazil brazil) | ||
| 58 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Canada canada) | ||
| 59 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Chile chile) | ||
| 60 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Etc etc) | ||
| 61 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Europe europe) | ||
| 62 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Indian indian) | ||
| 63 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Mexico mexico) | ||
| 64 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/Pacific pacific) | ||
| 65 | CreateHeader(${NX_TZDB_DIR}/zoneinfo/US us) | ||
diff --git a/externals/nx_tzdb/ListFilesInDirectory.cmake b/externals/nx_tzdb/ListFilesInDirectory.cmake new file mode 100644 index 000000000..35a9e726a --- /dev/null +++ b/externals/nx_tzdb/ListFilesInDirectory.cmake | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | # SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | # SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | # CMake does not have a way to list the files in a specific directory, | ||
| 5 | # so we need this script to do that for us in a platform-agnostic fashion | ||
| 6 | |||
| 7 | file(GLOB FILE_LIST LIST_DIRECTORIES false RELATIVE ${CMAKE_SOURCE_DIR} "*") | ||
| 8 | execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${FILE_LIST};") | ||
diff --git a/externals/nx_tzdb/NxTzdbCreateHeader.cmake b/externals/nx_tzdb/NxTzdbCreateHeader.cmake new file mode 100644 index 000000000..69166aa5b --- /dev/null +++ b/externals/nx_tzdb/NxTzdbCreateHeader.cmake | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | # SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | # SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | set(ZONE_PATH ${CMAKE_ARGV3}) | ||
| 5 | set(HEADER_NAME ${CMAKE_ARGV4}) | ||
| 6 | set(NX_TZDB_INCLUDE_DIR ${CMAKE_ARGV5}) | ||
| 7 | set(NX_TZDB_SOURCE_DIR ${CMAKE_ARGV6}) | ||
| 8 | |||
| 9 | execute_process( | ||
| 10 | COMMAND ${CMAKE_COMMAND} -P ${NX_TZDB_SOURCE_DIR}/ListFilesInDirectory.cmake | ||
| 11 | WORKING_DIRECTORY ${ZONE_PATH} | ||
| 12 | OUTPUT_VARIABLE FILE_LIST) | ||
| 13 | |||
| 14 | set(DIRECTORY_NAME ${HEADER_NAME}) | ||
| 15 | |||
| 16 | set(FILE_DATA "") | ||
| 17 | foreach(ZONE_FILE ${FILE_LIST}) | ||
| 18 | if ("${ZONE_FILE}" STREQUAL "\n") | ||
| 19 | continue() | ||
| 20 | endif() | ||
| 21 | |||
| 22 | string(APPEND FILE_DATA "{\"${ZONE_FILE}\",\n{") | ||
| 23 | |||
| 24 | file(READ ${ZONE_PATH}/${ZONE_FILE} ZONE_DATA HEX) | ||
| 25 | string(LENGTH "${ZONE_DATA}" ZONE_DATA_LEN) | ||
| 26 | foreach(I RANGE 0 ${ZONE_DATA_LEN} 2) | ||
| 27 | math(EXPR BREAK_LINE "(${I} + 2) % 38") | ||
| 28 | |||
| 29 | string(SUBSTRING "${ZONE_DATA}" "${I}" "2" HEX_DATA) | ||
| 30 | if ("${HEX_DATA}" STREQUAL "") | ||
| 31 | break() | ||
| 32 | endif() | ||
| 33 | |||
| 34 | string(APPEND FILE_DATA "0x${HEX_DATA},") | ||
| 35 | if ("${BREAK_LINE}" STREQUAL "0") | ||
| 36 | string(APPEND FILE_DATA "\n") | ||
| 37 | else() | ||
| 38 | string(APPEND FILE_DATA " ") | ||
| 39 | endif() | ||
| 40 | endforeach() | ||
| 41 | |||
| 42 | string(APPEND FILE_DATA "}},\n") | ||
| 43 | endforeach() | ||
| 44 | |||
| 45 | file(READ ${NX_TZDB_SOURCE_DIR}/tzdb_template.h.in NX_TZDB_TEMPLATE_H_IN) | ||
| 46 | file(CONFIGURE OUTPUT ${NX_TZDB_INCLUDE_DIR}/nx_tzdb/${HEADER_NAME}.h CONTENT "${NX_TZDB_TEMPLATE_H_IN}") | ||
diff --git a/externals/nx_tzdb/include/nx_tzdb.h b/externals/nx_tzdb/include/nx_tzdb.h new file mode 100644 index 000000000..d7b1e4304 --- /dev/null +++ b/externals/nx_tzdb/include/nx_tzdb.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "nx_tzdb/africa.h" | ||
| 7 | #include "nx_tzdb/america.h" | ||
| 8 | #include "nx_tzdb/america_argentina.h" | ||
| 9 | #include "nx_tzdb/america_indiana.h" | ||
| 10 | #include "nx_tzdb/america_kentucky.h" | ||
| 11 | #include "nx_tzdb/america_north_dakota.h" | ||
| 12 | #include "nx_tzdb/antartica.h" | ||
| 13 | #include "nx_tzdb/arctic.h" | ||
| 14 | #include "nx_tzdb/asia.h" | ||
| 15 | #include "nx_tzdb/atlantic.h" | ||
| 16 | #include "nx_tzdb/australia.h" | ||
| 17 | #include "nx_tzdb/base.h" | ||
| 18 | #include "nx_tzdb/brazil.h" | ||
| 19 | #include "nx_tzdb/canada.h" | ||
| 20 | #include "nx_tzdb/chile.h" | ||
| 21 | #include "nx_tzdb/etc.h" | ||
| 22 | #include "nx_tzdb/europe.h" | ||
| 23 | #include "nx_tzdb/indian.h" | ||
| 24 | #include "nx_tzdb/mexico.h" | ||
| 25 | #include "nx_tzdb/pacific.h" | ||
| 26 | #include "nx_tzdb/us.h" | ||
| 27 | #include "nx_tzdb/zoneinfo.h" | ||
diff --git a/externals/nx_tzdb/tzdb_template.h.in b/externals/nx_tzdb/tzdb_template.h.in new file mode 100644 index 000000000..289d002ea --- /dev/null +++ b/externals/nx_tzdb/tzdb_template.h.in | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include <cstdint> | ||
| 7 | #include <map> | ||
| 8 | #include <vector> | ||
| 9 | |||
| 10 | namespace NxTzdb { | ||
| 11 | |||
| 12 | // clang-format off | ||
| 13 | const static std::map<const char*, const std::vector<uint8_t>> @DIRECTORY_NAME@ = | ||
| 14 | { | ||
| 15 | @FILE_DATA@}; | ||
| 16 | // clang-format on | ||
| 17 | |||
| 18 | } // namespace NxTzdb | ||
diff --git a/externals/vcpkg b/externals/vcpkg | |||
| Subproject 656fcc6ab2b05c6d999b7eaca717027ac3738f7 | Subproject a487471068f4cb1cbb4eeb340763cdcc0a75fd6 | ||
diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index fe613d339..a637db78a 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts | |||
| @@ -9,6 +9,7 @@ plugins { | |||
| 9 | id("org.jetbrains.kotlin.android") | 9 | id("org.jetbrains.kotlin.android") |
| 10 | id("kotlin-parcelize") | 10 | id("kotlin-parcelize") |
| 11 | kotlin("plugin.serialization") version "1.8.21" | 11 | kotlin("plugin.serialization") version "1.8.21" |
| 12 | id("androidx.navigation.safeargs.kotlin") | ||
| 12 | } | 13 | } |
| 13 | 14 | ||
| 14 | /** | 15 | /** |
diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 1e92098ec..b474ddb0b 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml | |||
| @@ -24,6 +24,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | |||
| 24 | android:hasFragileUserData="true" | 24 | android:hasFragileUserData="true" |
| 25 | android:supportsRtl="true" | 25 | android:supportsRtl="true" |
| 26 | android:isGame="true" | 26 | android:isGame="true" |
| 27 | android:localeConfig="@xml/locales_config" | ||
| 27 | android:banner="@drawable/tv_banner" | 28 | android:banner="@drawable/tv_banner" |
| 28 | android:extractNativeLibs="true" | 29 | android:extractNativeLibs="true" |
| 29 | android:fullBackupContent="@xml/data_extraction_rules" | 30 | android:fullBackupContent="@xml/data_extraction_rules" |
| @@ -52,7 +53,6 @@ SPDX-License-Identifier: GPL-3.0-or-later | |||
| 52 | <activity | 53 | <activity |
| 53 | android:name="org.yuzu.yuzu_emu.activities.EmulationActivity" | 54 | android:name="org.yuzu.yuzu_emu.activities.EmulationActivity" |
| 54 | android:theme="@style/Theme.Yuzu.Main" | 55 | android:theme="@style/Theme.Yuzu.Main" |
| 55 | android:launchMode="singleTop" | ||
| 56 | android:screenOrientation="userLandscape" | 56 | android:screenOrientation="userLandscape" |
| 57 | android:exported="true"> | 57 | android:exported="true"> |
| 58 | 58 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 20a0394f5..caf660348 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt | |||
| @@ -23,30 +23,25 @@ import androidx.appcompat.app.AppCompatActivity | |||
| 23 | import androidx.core.view.WindowCompat | 23 | import androidx.core.view.WindowCompat |
| 24 | import androidx.core.view.WindowInsetsCompat | 24 | import androidx.core.view.WindowInsetsCompat |
| 25 | import androidx.core.view.WindowInsetsControllerCompat | 25 | import androidx.core.view.WindowInsetsControllerCompat |
| 26 | import androidx.lifecycle.Lifecycle | 26 | import androidx.navigation.fragment.NavHostFragment |
| 27 | import androidx.lifecycle.lifecycleScope | ||
| 28 | import androidx.lifecycle.repeatOnLifecycle | ||
| 29 | import androidx.window.layout.WindowInfoTracker | ||
| 30 | import kotlinx.coroutines.Dispatchers | ||
| 31 | import kotlinx.coroutines.launch | ||
| 32 | import org.yuzu.yuzu_emu.NativeLibrary | 27 | import org.yuzu.yuzu_emu.NativeLibrary |
| 33 | import org.yuzu.yuzu_emu.R | 28 | import org.yuzu.yuzu_emu.R |
| 29 | import org.yuzu.yuzu_emu.databinding.ActivityEmulationBinding | ||
| 34 | import org.yuzu.yuzu_emu.features.settings.model.SettingsViewModel | 30 | import org.yuzu.yuzu_emu.features.settings.model.SettingsViewModel |
| 35 | import org.yuzu.yuzu_emu.fragments.EmulationFragment | ||
| 36 | import org.yuzu.yuzu_emu.model.Game | 31 | import org.yuzu.yuzu_emu.model.Game |
| 37 | import org.yuzu.yuzu_emu.utils.ControllerMappingHelper | 32 | import org.yuzu.yuzu_emu.utils.ControllerMappingHelper |
| 38 | import org.yuzu.yuzu_emu.utils.ForegroundService | 33 | import org.yuzu.yuzu_emu.utils.ForegroundService |
| 39 | import org.yuzu.yuzu_emu.utils.InputHandler | 34 | import org.yuzu.yuzu_emu.utils.InputHandler |
| 40 | import org.yuzu.yuzu_emu.utils.NfcReader | 35 | import org.yuzu.yuzu_emu.utils.NfcReader |
| 41 | import org.yuzu.yuzu_emu.utils.SerializableHelper.parcelable | ||
| 42 | import org.yuzu.yuzu_emu.utils.ThemeHelper | 36 | import org.yuzu.yuzu_emu.utils.ThemeHelper |
| 43 | import kotlin.math.roundToInt | 37 | import kotlin.math.roundToInt |
| 44 | 38 | ||
| 45 | class EmulationActivity : AppCompatActivity(), SensorEventListener { | 39 | class EmulationActivity : AppCompatActivity(), SensorEventListener { |
| 40 | private lateinit var binding: ActivityEmulationBinding | ||
| 41 | |||
| 46 | private var controllerMappingHelper: ControllerMappingHelper? = null | 42 | private var controllerMappingHelper: ControllerMappingHelper? = null |
| 47 | 43 | ||
| 48 | var isActivityRecreated = false | 44 | var isActivityRecreated = false |
| 49 | private var emulationFragment: EmulationFragment? = null | ||
| 50 | private lateinit var nfcReader: NfcReader | 45 | private lateinit var nfcReader: NfcReader |
| 51 | private lateinit var inputHandler: InputHandler | 46 | private lateinit var inputHandler: InputHandler |
| 52 | 47 | ||
| @@ -55,8 +50,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 55 | private var motionTimestamp: Long = 0 | 50 | private var motionTimestamp: Long = 0 |
| 56 | private var flipMotionOrientation: Boolean = false | 51 | private var flipMotionOrientation: Boolean = false |
| 57 | 52 | ||
| 58 | private lateinit var game: Game | ||
| 59 | |||
| 60 | private val settingsViewModel: SettingsViewModel by viewModels() | 53 | private val settingsViewModel: SettingsViewModel by viewModels() |
| 61 | 54 | ||
| 62 | override fun onDestroy() { | 55 | override fun onDestroy() { |
| @@ -70,47 +63,31 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 70 | settingsViewModel.settings.loadSettings() | 63 | settingsViewModel.settings.loadSettings() |
| 71 | 64 | ||
| 72 | super.onCreate(savedInstanceState) | 65 | super.onCreate(savedInstanceState) |
| 73 | if (savedInstanceState == null) { | 66 | |
| 74 | // Get params we were passed | 67 | binding = ActivityEmulationBinding.inflate(layoutInflater) |
| 75 | game = intent.parcelable(EXTRA_SELECTED_GAME)!! | 68 | setContentView(binding.root) |
| 76 | isActivityRecreated = false | 69 | |
| 77 | } else { | 70 | val navHostFragment = |
| 78 | isActivityRecreated = true | 71 | supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment |
| 79 | restoreState(savedInstanceState) | 72 | val navController = navHostFragment.navController |
| 80 | } | 73 | navController |
| 74 | .setGraph(R.navigation.emulation_navigation, intent.extras) | ||
| 75 | |||
| 76 | isActivityRecreated = savedInstanceState != null | ||
| 77 | |||
| 81 | controllerMappingHelper = ControllerMappingHelper() | 78 | controllerMappingHelper = ControllerMappingHelper() |
| 82 | 79 | ||
| 83 | // Set these options now so that the SurfaceView the game renders into is the right size. | 80 | // Set these options now so that the SurfaceView the game renders into is the right size. |
| 84 | enableFullscreenImmersive() | 81 | enableFullscreenImmersive() |
| 85 | 82 | ||
| 86 | setContentView(R.layout.activity_emulation) | ||
| 87 | window.decorView.setBackgroundColor(getColor(android.R.color.black)) | 83 | window.decorView.setBackgroundColor(getColor(android.R.color.black)) |
| 88 | 84 | ||
| 89 | // Find or create the EmulationFragment | ||
| 90 | emulationFragment = | ||
| 91 | supportFragmentManager.findFragmentById(R.id.frame_emulation_fragment) as EmulationFragment? | ||
| 92 | if (emulationFragment == null) { | ||
| 93 | emulationFragment = EmulationFragment.newInstance(game) | ||
| 94 | supportFragmentManager.beginTransaction() | ||
| 95 | .add(R.id.frame_emulation_fragment, emulationFragment!!) | ||
| 96 | .commit() | ||
| 97 | } | ||
| 98 | title = game.title | ||
| 99 | |||
| 100 | nfcReader = NfcReader(this) | 85 | nfcReader = NfcReader(this) |
| 101 | nfcReader.initialize() | 86 | nfcReader.initialize() |
| 102 | 87 | ||
| 103 | inputHandler = InputHandler() | 88 | inputHandler = InputHandler() |
| 104 | inputHandler.initialize() | 89 | inputHandler.initialize() |
| 105 | 90 | ||
| 106 | lifecycleScope.launch(Dispatchers.Main) { | ||
| 107 | lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { | ||
| 108 | WindowInfoTracker.getOrCreate(this@EmulationActivity) | ||
| 109 | .windowLayoutInfo(this@EmulationActivity) | ||
| 110 | .collect { emulationFragment?.updateCurrentLayout(this@EmulationActivity, it) } | ||
| 111 | } | ||
| 112 | } | ||
| 113 | |||
| 114 | // Start a foreground service to prevent the app from getting killed in the background | 91 | // Start a foreground service to prevent the app from getting killed in the background |
| 115 | val startIntent = Intent(this, ForegroundService::class.java) | 92 | val startIntent = Intent(this, ForegroundService::class.java) |
| 116 | startForegroundService(startIntent) | 93 | startForegroundService(startIntent) |
| @@ -157,11 +134,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 157 | nfcReader.onNewIntent(intent) | 134 | nfcReader.onNewIntent(intent) |
| 158 | } | 135 | } |
| 159 | 136 | ||
| 160 | override fun onSaveInstanceState(outState: Bundle) { | ||
| 161 | outState.putParcelable(EXTRA_SELECTED_GAME, game) | ||
| 162 | super.onSaveInstanceState(outState) | ||
| 163 | } | ||
| 164 | |||
| 165 | override fun dispatchKeyEvent(event: KeyEvent): Boolean { | 137 | override fun dispatchKeyEvent(event: KeyEvent): Boolean { |
| 166 | if (event.source and InputDevice.SOURCE_JOYSTICK != InputDevice.SOURCE_JOYSTICK && | 138 | if (event.source and InputDevice.SOURCE_JOYSTICK != InputDevice.SOURCE_JOYSTICK && |
| 167 | event.source and InputDevice.SOURCE_GAMEPAD != InputDevice.SOURCE_GAMEPAD | 139 | event.source and InputDevice.SOURCE_GAMEPAD != InputDevice.SOURCE_GAMEPAD |
| @@ -248,10 +220,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 248 | 220 | ||
| 249 | override fun onAccuracyChanged(sensor: Sensor, i: Int) {} | 221 | override fun onAccuracyChanged(sensor: Sensor, i: Int) {} |
| 250 | 222 | ||
| 251 | private fun restoreState(savedInstanceState: Bundle) { | ||
| 252 | game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!! | ||
| 253 | } | ||
| 254 | |||
| 255 | private fun enableFullscreenImmersive() { | 223 | private fun enableFullscreenImmersive() { |
| 256 | WindowCompat.setDecorFitsSystemWindows(window, false) | 224 | WindowCompat.setDecorFitsSystemWindows(window, false) |
| 257 | 225 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt index 7f9e2e2d4..83d08841b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt | |||
| @@ -16,6 +16,7 @@ import androidx.appcompat.app.AppCompatActivity | |||
| 16 | import androidx.documentfile.provider.DocumentFile | 16 | import androidx.documentfile.provider.DocumentFile |
| 17 | import androidx.lifecycle.ViewModelProvider | 17 | import androidx.lifecycle.ViewModelProvider |
| 18 | import androidx.lifecycle.lifecycleScope | 18 | import androidx.lifecycle.lifecycleScope |
| 19 | import androidx.navigation.findNavController | ||
| 19 | import androidx.preference.PreferenceManager | 20 | import androidx.preference.PreferenceManager |
| 20 | import androidx.recyclerview.widget.AsyncDifferConfig | 21 | import androidx.recyclerview.widget.AsyncDifferConfig |
| 21 | import androidx.recyclerview.widget.DiffUtil | 22 | import androidx.recyclerview.widget.DiffUtil |
| @@ -23,6 +24,7 @@ import androidx.recyclerview.widget.ListAdapter | |||
| 23 | import androidx.recyclerview.widget.RecyclerView | 24 | import androidx.recyclerview.widget.RecyclerView |
| 24 | import coil.load | 25 | import coil.load |
| 25 | import kotlinx.coroutines.launch | 26 | import kotlinx.coroutines.launch |
| 27 | import org.yuzu.yuzu_emu.HomeNavigationDirections | ||
| 26 | import org.yuzu.yuzu_emu.NativeLibrary | 28 | import org.yuzu.yuzu_emu.NativeLibrary |
| 27 | import org.yuzu.yuzu_emu.R | 29 | import org.yuzu.yuzu_emu.R |
| 28 | import org.yuzu.yuzu_emu.YuzuApplication | 30 | import org.yuzu.yuzu_emu.YuzuApplication |
| @@ -78,7 +80,8 @@ class GameAdapter(private val activity: AppCompatActivity) : | |||
| 78 | ) | 80 | ) |
| 79 | .apply() | 81 | .apply() |
| 80 | 82 | ||
| 81 | EmulationActivity.launch(activity, holder.game) | 83 | val action = HomeNavigationDirections.actionGlobalEmulationActivity(holder.game) |
| 84 | view.findNavController().navigate(action) | ||
| 82 | } | 85 | } |
| 83 | 86 | ||
| 84 | inner class GameViewHolder(val binding: CardGameBinding) : | 87 | inner class GameViewHolder(val binding: CardGameBinding) : |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 9523381cd..02bfcdb1e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt | |||
| @@ -26,11 +26,18 @@ import androidx.core.view.ViewCompat | |||
| 26 | import androidx.core.view.WindowInsetsCompat | 26 | import androidx.core.view.WindowInsetsCompat |
| 27 | import androidx.core.view.updatePadding | 27 | import androidx.core.view.updatePadding |
| 28 | import androidx.fragment.app.Fragment | 28 | import androidx.fragment.app.Fragment |
| 29 | import androidx.lifecycle.Lifecycle | ||
| 30 | import androidx.lifecycle.lifecycleScope | ||
| 31 | import androidx.lifecycle.repeatOnLifecycle | ||
| 32 | import androidx.navigation.fragment.navArgs | ||
| 29 | import androidx.preference.PreferenceManager | 33 | import androidx.preference.PreferenceManager |
| 30 | import androidx.window.layout.FoldingFeature | 34 | import androidx.window.layout.FoldingFeature |
| 35 | import androidx.window.layout.WindowInfoTracker | ||
| 31 | import androidx.window.layout.WindowLayoutInfo | 36 | import androidx.window.layout.WindowLayoutInfo |
| 32 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 37 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 33 | import com.google.android.material.slider.Slider | 38 | import com.google.android.material.slider.Slider |
| 39 | import kotlinx.coroutines.Dispatchers | ||
| 40 | import kotlinx.coroutines.launch | ||
| 34 | import org.yuzu.yuzu_emu.NativeLibrary | 41 | import org.yuzu.yuzu_emu.NativeLibrary |
| 35 | import org.yuzu.yuzu_emu.R | 42 | import org.yuzu.yuzu_emu.R |
| 36 | import org.yuzu.yuzu_emu.YuzuApplication | 43 | import org.yuzu.yuzu_emu.YuzuApplication |
| @@ -41,9 +48,7 @@ import org.yuzu.yuzu_emu.features.settings.model.IntSetting | |||
| 41 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 48 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 42 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity | 49 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity |
| 43 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | 50 | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile |
| 44 | import org.yuzu.yuzu_emu.model.Game | ||
| 45 | import org.yuzu.yuzu_emu.utils.* | 51 | import org.yuzu.yuzu_emu.utils.* |
| 46 | import org.yuzu.yuzu_emu.utils.SerializableHelper.parcelable | ||
| 47 | 52 | ||
| 48 | class EmulationFragment : Fragment(), SurfaceHolder.Callback { | 53 | class EmulationFragment : Fragment(), SurfaceHolder.Callback { |
| 49 | private lateinit var preferences: SharedPreferences | 54 | private lateinit var preferences: SharedPreferences |
| @@ -54,7 +59,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 54 | private var _binding: FragmentEmulationBinding? = null | 59 | private var _binding: FragmentEmulationBinding? = null |
| 55 | private val binding get() = _binding!! | 60 | private val binding get() = _binding!! |
| 56 | 61 | ||
| 57 | private lateinit var game: Game | 62 | val args by navArgs<EmulationFragmentArgs>() |
| 58 | 63 | ||
| 59 | override fun onAttach(context: Context) { | 64 | override fun onAttach(context: Context) { |
| 60 | super.onAttach(context) | 65 | super.onAttach(context) |
| @@ -75,8 +80,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 75 | // So this fragment doesn't restart on configuration changes; i.e. rotation. | 80 | // So this fragment doesn't restart on configuration changes; i.e. rotation. |
| 76 | retainInstance = true | 81 | retainInstance = true |
| 77 | preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) | 82 | preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) |
| 78 | game = requireArguments().parcelable(EmulationActivity.EXTRA_SELECTED_GAME)!! | 83 | emulationState = EmulationState(args.game.path) |
| 79 | emulationState = EmulationState(game.path) | ||
| 80 | } | 84 | } |
| 81 | 85 | ||
| 82 | /** | 86 | /** |
| @@ -100,7 +104,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 100 | updateShowFpsOverlay() | 104 | updateShowFpsOverlay() |
| 101 | 105 | ||
| 102 | binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text = | 106 | binding.inGameMenu.getHeaderView(0).findViewById<TextView>(R.id.text_game_title).text = |
| 103 | game.title | 107 | args.game.title |
| 104 | binding.inGameMenu.setNavigationItemSelectedListener { | 108 | binding.inGameMenu.setNavigationItemSelectedListener { |
| 105 | when (it.itemId) { | 109 | when (it.itemId) { |
| 106 | R.id.menu_pause_emulation -> { | 110 | R.id.menu_pause_emulation -> { |
| @@ -153,6 +157,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 153 | if (binding.drawerLayout.isOpen) binding.drawerLayout.close() else binding.drawerLayout.open() | 157 | if (binding.drawerLayout.isOpen) binding.drawerLayout.close() else binding.drawerLayout.open() |
| 154 | } | 158 | } |
| 155 | }) | 159 | }) |
| 160 | |||
| 161 | viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) { | ||
| 162 | lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { | ||
| 163 | WindowInfoTracker.getOrCreate(requireContext()) | ||
| 164 | .windowLayoutInfo(requireActivity()) | ||
| 165 | .collect { updateCurrentLayout(requireActivity() as EmulationActivity, it) } | ||
| 166 | } | ||
| 167 | } | ||
| 156 | } | 168 | } |
| 157 | 169 | ||
| 158 | override fun onResume() { | 170 | override fun onResume() { |
| @@ -601,13 +613,5 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 601 | 613 | ||
| 602 | companion object { | 614 | companion object { |
| 603 | private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) | 615 | private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) |
| 604 | |||
| 605 | fun newInstance(game: Game): EmulationFragment { | ||
| 606 | val args = Bundle() | ||
| 607 | args.putParcelable(EmulationActivity.EXTRA_SELECTED_GAME, game) | ||
| 608 | val fragment = EmulationFragment() | ||
| 609 | fragment.arguments = args | ||
| 610 | return fragment | ||
| 611 | } | ||
| 612 | } | 616 | } |
| 613 | } | 617 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt index c8ef8c1fd..d89a89983 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt | |||
| @@ -38,9 +38,11 @@ class FixedRatioSurfaceView @JvmOverloads constructor( | |||
| 38 | newWidth = width | 38 | newWidth = width |
| 39 | newHeight = (width / aspectRatio).roundToInt() | 39 | newHeight = (width / aspectRatio).roundToInt() |
| 40 | } | 40 | } |
| 41 | setMeasuredDimension(newWidth, newHeight) | 41 | val left = (width - newWidth) / 2; |
| 42 | val top = (height - newHeight) / 2; | ||
| 43 | setLeftTopRightBottom(left, top, left + newWidth, top + newHeight) | ||
| 42 | } else { | 44 | } else { |
| 43 | setMeasuredDimension(width, height) | 45 | setLeftTopRightBottom(0, 0, width, height) |
| 44 | } | 46 | } |
| 45 | } | 47 | } |
| 46 | } | 48 | } |
diff --git a/src/android/app/src/main/res/layout/activity_emulation.xml b/src/android/app/src/main/res/layout/activity_emulation.xml index f6360a65b..139065d3d 100644 --- a/src/android/app/src/main/res/layout/activity_emulation.xml +++ b/src/android/app/src/main/res/layout/activity_emulation.xml | |||
| @@ -1,13 +1,9 @@ | |||
| 1 | <FrameLayout | 1 | <androidx.fragment.app.FragmentContainerView |
| 2 | xmlns:android="http://schemas.android.com/apk/res/android" | 2 | xmlns:android="http://schemas.android.com/apk/res/android" |
| 3 | android:id="@+id/frame_content" | 3 | xmlns:app="http://schemas.android.com/apk/res-auto" |
| 4 | android:id="@+id/fragment_container" | ||
| 5 | android:name="androidx.navigation.fragment.NavHostFragment" | ||
| 4 | android:layout_width="match_parent" | 6 | android:layout_width="match_parent" |
| 5 | android:layout_height="match_parent" | 7 | android:layout_height="match_parent" |
| 6 | android:keepScreenOn="true"> | 8 | android:keepScreenOn="true" |
| 7 | 9 | app:defaultNavHost="true" /> | |
| 8 | <FrameLayout | ||
| 9 | android:id="@+id/frame_emulation_fragment" | ||
| 10 | android:layout_width="match_parent" | ||
| 11 | android:layout_height="match_parent" /> | ||
| 12 | |||
| 13 | </FrameLayout> | ||
diff --git a/src/android/app/src/main/res/navigation/emulation_navigation.xml b/src/android/app/src/main/res/navigation/emulation_navigation.xml new file mode 100644 index 000000000..8208f4c2c --- /dev/null +++ b/src/android/app/src/main/res/navigation/emulation_navigation.xml | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <navigation xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 3 | xmlns:app="http://schemas.android.com/apk/res-auto" | ||
| 4 | xmlns:tools="http://schemas.android.com/tools" | ||
| 5 | android:id="@+id/emulation_navigation" | ||
| 6 | app:startDestination="@id/emulationFragment"> | ||
| 7 | |||
| 8 | <fragment | ||
| 9 | android:id="@+id/emulationFragment" | ||
| 10 | android:name="org.yuzu.yuzu_emu.fragments.EmulationFragment" | ||
| 11 | android:label="fragment_emulation" | ||
| 12 | tools:layout="@layout/fragment_emulation" > | ||
| 13 | <argument | ||
| 14 | android:name="game" | ||
| 15 | app:argType="org.yuzu.yuzu_emu.model.Game" /> | ||
| 16 | </fragment> | ||
| 17 | |||
| 18 | </navigation> | ||
diff --git a/src/android/app/src/main/res/navigation/home_navigation.xml b/src/android/app/src/main/res/navigation/home_navigation.xml index 48072683e..fcebba726 100644 --- a/src/android/app/src/main/res/navigation/home_navigation.xml +++ b/src/android/app/src/main/res/navigation/home_navigation.xml | |||
| @@ -56,4 +56,18 @@ | |||
| 56 | android:name="org.yuzu.yuzu_emu.fragments.LicensesFragment" | 56 | android:name="org.yuzu.yuzu_emu.fragments.LicensesFragment" |
| 57 | android:label="LicensesFragment" /> | 57 | android:label="LicensesFragment" /> |
| 58 | 58 | ||
| 59 | <activity | ||
| 60 | android:id="@+id/emulationActivity" | ||
| 61 | android:name="org.yuzu.yuzu_emu.activities.EmulationActivity" | ||
| 62 | android:label="EmulationActivity"> | ||
| 63 | <argument | ||
| 64 | android:name="game" | ||
| 65 | app:argType="org.yuzu.yuzu_emu.model.Game" /> | ||
| 66 | </activity> | ||
| 67 | |||
| 68 | <action | ||
| 69 | android:id="@+id/action_global_emulationActivity" | ||
| 70 | app:destination="@id/emulationActivity" | ||
| 71 | app:launchSingleTop="true" /> | ||
| 72 | |||
| 59 | </navigation> | 73 | </navigation> |
diff --git a/src/android/app/src/main/res/xml/locales_config.xml b/src/android/app/src/main/res/xml/locales_config.xml new file mode 100644 index 000000000..51b88d9dc --- /dev/null +++ b/src/android/app/src/main/res/xml/locales_config.xml | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <locale-config xmlns:android="http://schemas.android.com/apk/res/android"> | ||
| 3 | <locale android:name="en" /> <!-- English (default) --> | ||
| 4 | <locale android:name="de" /> <!-- German --> | ||
| 5 | <locale android:name="es" /> <!-- Spanish --> | ||
| 6 | <locale android:name="fr" /> <!-- French --> | ||
| 7 | <locale android:name="it" /> <!-- Italian --> | ||
| 8 | <locale android:name="ja" /> <!-- Japanese --> | ||
| 9 | <locale android:name="nb" /> <!-- Norwegian Bokmal --> | ||
| 10 | <locale android:name="pl" /> <!-- Polish --> | ||
| 11 | <locale android:name="pt-rBR" /> <!-- Portuguese (Brazil) --> | ||
| 12 | <locale android:name="pt-RPT" /> <!-- Portuguese (Portugal) --> | ||
| 13 | <locale android:name="ru" /> <!-- Russian --> | ||
| 14 | <locale android:name="uk" /> <!-- Ukranian --> | ||
| 15 | <locale android:name="zh-rCN" /> <!-- Chinese (China) --> | ||
| 16 | <locale android:name="zh-rTW" /> <!-- Chinese (Taiwan) --> | ||
| 17 | </locale-config> | ||
diff --git a/src/android/build.gradle.kts b/src/android/build.gradle.kts index e19e8ce58..80f370c16 100644 --- a/src/android/build.gradle.kts +++ b/src/android/build.gradle.kts | |||
| @@ -11,3 +11,12 @@ plugins { | |||
| 11 | tasks.register("clean").configure { | 11 | tasks.register("clean").configure { |
| 12 | delete(rootProject.buildDir) | 12 | delete(rootProject.buildDir) |
| 13 | } | 13 | } |
| 14 | |||
| 15 | buildscript { | ||
| 16 | repositories { | ||
| 17 | google() | ||
| 18 | } | ||
| 19 | dependencies { | ||
| 20 | classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.6.0") | ||
| 21 | } | ||
| 22 | } | ||
diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 9ff3edabb..66dffc9bf 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp | |||
| @@ -1,12 +1,16 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #if __cpp_lib_chrono >= 201907L | ||
| 5 | #include <chrono> | ||
| 6 | #endif | ||
| 4 | #include <string_view> | 7 | #include <string_view> |
| 5 | 8 | ||
| 6 | #include "common/assert.h" | 9 | #include "common/assert.h" |
| 7 | #include "common/fs/path_util.h" | 10 | #include "common/fs/path_util.h" |
| 8 | #include "common/logging/log.h" | 11 | #include "common/logging/log.h" |
| 9 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "common/time_zone.h" | ||
| 10 | 14 | ||
| 11 | namespace Settings { | 15 | namespace Settings { |
| 12 | 16 | ||
| @@ -14,18 +18,23 @@ Values values; | |||
| 14 | static bool configuring_global = true; | 18 | static bool configuring_global = true; |
| 15 | 19 | ||
| 16 | std::string GetTimeZoneString() { | 20 | std::string GetTimeZoneString() { |
| 17 | static constexpr std::array timezones{ | ||
| 18 | "auto", "default", "CET", "CST6CDT", "Cuba", "EET", "Egypt", "Eire", | ||
| 19 | "EST", "EST5EDT", "GB", "GB-Eire", "GMT", "GMT+0", "GMT-0", "GMT0", | ||
| 20 | "Greenwich", "Hongkong", "HST", "Iceland", "Iran", "Israel", "Jamaica", "Japan", | ||
| 21 | "Kwajalein", "Libya", "MET", "MST", "MST7MDT", "Navajo", "NZ", "NZ-CHAT", | ||
| 22 | "Poland", "Portugal", "PRC", "PST8PDT", "ROC", "ROK", "Singapore", "Turkey", | ||
| 23 | "UCT", "Universal", "UTC", "W-SU", "WET", "Zulu", | ||
| 24 | }; | ||
| 25 | |||
| 26 | const auto time_zone_index = static_cast<std::size_t>(values.time_zone_index.GetValue()); | 21 | const auto time_zone_index = static_cast<std::size_t>(values.time_zone_index.GetValue()); |
| 27 | ASSERT(time_zone_index < timezones.size()); | 22 | ASSERT(time_zone_index < Common::TimeZone::GetTimeZoneStrings().size()); |
| 28 | return timezones[time_zone_index]; | 23 | |
| 24 | std::string location_name; | ||
| 25 | if (time_zone_index == 0) { // Auto | ||
| 26 | #if __cpp_lib_chrono >= 201907L | ||
| 27 | const struct std::chrono::tzdb& time_zone_data = std::chrono::get_tzdb(); | ||
| 28 | const std::chrono::time_zone* current_zone = time_zone_data.current_zone(); | ||
| 29 | std::string_view current_zone_name = current_zone->name(); | ||
| 30 | location_name = current_zone_name; | ||
| 31 | #else | ||
| 32 | location_name = Common::TimeZone::FindSystemTimeZone(); | ||
| 33 | #endif | ||
| 34 | } else { | ||
| 35 | location_name = Common::TimeZone::GetTimeZoneStrings()[time_zone_index]; | ||
| 36 | } | ||
| 37 | return location_name; | ||
| 29 | } | 38 | } |
| 30 | 39 | ||
| 31 | void LogSettings() { | 40 | void LogSettings() { |
diff --git a/src/common/time_zone.cpp b/src/common/time_zone.cpp index 126836b01..d8d7896c6 100644 --- a/src/common/time_zone.cpp +++ b/src/common/time_zone.cpp | |||
| @@ -2,14 +2,33 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include <chrono> | 4 | #include <chrono> |
| 5 | #include <exception> | ||
| 5 | #include <iomanip> | 6 | #include <iomanip> |
| 6 | #include <sstream> | 7 | #include <sstream> |
| 8 | #include <stdexcept> | ||
| 9 | #include <fmt/chrono.h> | ||
| 10 | #include <fmt/core.h> | ||
| 7 | 11 | ||
| 8 | #include "common/logging/log.h" | 12 | #include "common/logging/log.h" |
| 13 | #include "common/settings.h" | ||
| 9 | #include "common/time_zone.h" | 14 | #include "common/time_zone.h" |
| 10 | 15 | ||
| 11 | namespace Common::TimeZone { | 16 | namespace Common::TimeZone { |
| 12 | 17 | ||
| 18 | // Time zone strings | ||
| 19 | constexpr std::array timezones{ | ||
| 20 | "GMT", "GMT", "CET", "CST6CDT", "Cuba", "EET", "Egypt", "Eire", | ||
| 21 | "EST", "EST5EDT", "GB", "GB-Eire", "GMT", "GMT+0", "GMT-0", "GMT0", | ||
| 22 | "Greenwich", "Hongkong", "HST", "Iceland", "Iran", "Israel", "Jamaica", "Japan", | ||
| 23 | "Kwajalein", "Libya", "MET", "MST", "MST7MDT", "Navajo", "NZ", "NZ-CHAT", | ||
| 24 | "Poland", "Portugal", "PRC", "PST8PDT", "ROC", "ROK", "Singapore", "Turkey", | ||
| 25 | "UCT", "Universal", "UTC", "W-SU", "WET", "Zulu", | ||
| 26 | }; | ||
| 27 | |||
| 28 | const std::array<const char*, 46>& GetTimeZoneStrings() { | ||
| 29 | return timezones; | ||
| 30 | } | ||
| 31 | |||
| 13 | std::string GetDefaultTimeZone() { | 32 | std::string GetDefaultTimeZone() { |
| 14 | return "GMT"; | 33 | return "GMT"; |
| 15 | } | 34 | } |
| @@ -18,10 +37,7 @@ static std::string GetOsTimeZoneOffset() { | |||
| 18 | const std::time_t t{std::time(nullptr)}; | 37 | const std::time_t t{std::time(nullptr)}; |
| 19 | const std::tm tm{*std::localtime(&t)}; | 38 | const std::tm tm{*std::localtime(&t)}; |
| 20 | 39 | ||
| 21 | std::stringstream ss; | 40 | return fmt::format("{:%z}", tm); |
| 22 | ss << std::put_time(&tm, "%z"); // Get the current timezone offset, e.g. "-400", as a string | ||
| 23 | |||
| 24 | return ss.str(); | ||
| 25 | } | 41 | } |
| 26 | 42 | ||
| 27 | static int ConvertOsTimeZoneOffsetToInt(const std::string& timezone) { | 43 | static int ConvertOsTimeZoneOffsetToInt(const std::string& timezone) { |
| @@ -45,4 +61,43 @@ std::chrono::seconds GetCurrentOffsetSeconds() { | |||
| 45 | return std::chrono::seconds{seconds}; | 61 | return std::chrono::seconds{seconds}; |
| 46 | } | 62 | } |
| 47 | 63 | ||
| 64 | // Key is [Hours * 100 + Minutes], multiplied by 100 if DST | ||
| 65 | const static std::map<s64, const char*> off_timezones = { | ||
| 66 | {530, "Asia/Calcutta"}, {930, "Australia/Darwin"}, {845, "Australia/Eucla"}, | ||
| 67 | {103000, "Australia/Adelaide"}, {1030, "Australia/Lord_Howe"}, {630, "Indian/Cocos"}, | ||
| 68 | {1245, "Pacific/Chatham"}, {134500, "Pacific/Chatham"}, {-330, "Canada/Newfoundland"}, | ||
| 69 | {-23000, "Canada/Newfoundland"}, {430, "Asia/Kabul"}, {330, "Asia/Tehran"}, | ||
| 70 | {43000, "Asia/Tehran"}, {545, "Asia/Kathmandu"}, {-930, "Asia/Marquesas"}, | ||
| 71 | }; | ||
| 72 | |||
| 73 | std::string FindSystemTimeZone() { | ||
| 74 | #if defined(MINGW) | ||
| 75 | // MinGW has broken strftime -- https://sourceforge.net/p/mingw-w64/bugs/793/ | ||
| 76 | // e.g. fmt::format("{:%z}") -- returns "Eastern Daylight Time" when it should be "-0400" | ||
| 77 | return timezones[0]; | ||
| 78 | #else | ||
| 79 | const s64 seconds = static_cast<s64>(GetCurrentOffsetSeconds().count()); | ||
| 80 | |||
| 81 | const s64 minutes = seconds / 60; | ||
| 82 | const s64 hours = minutes / 60; | ||
| 83 | |||
| 84 | const s64 minutes_off = minutes - hours * 60; | ||
| 85 | |||
| 86 | if (minutes_off != 0) { | ||
| 87 | const auto the_time = std::time(nullptr); | ||
| 88 | const struct std::tm& local = *std::localtime(&the_time); | ||
| 89 | const bool is_dst = local.tm_isdst != 0; | ||
| 90 | |||
| 91 | const s64 tz_index = (hours * 100 + minutes_off) * (is_dst ? 100 : 1); | ||
| 92 | |||
| 93 | try { | ||
| 94 | return off_timezones.at(tz_index); | ||
| 95 | } catch (std::out_of_range&) { | ||
| 96 | LOG_ERROR(Common, "Time zone {} not handled, defaulting to hour offset.", tz_index); | ||
| 97 | } | ||
| 98 | } | ||
| 99 | return fmt::format("Etc/GMT{:s}{:d}", hours > 0 ? "-" : "+", std::abs(hours)); | ||
| 100 | #endif | ||
| 101 | } | ||
| 102 | |||
| 48 | } // namespace Common::TimeZone | 103 | } // namespace Common::TimeZone |
diff --git a/src/common/time_zone.h b/src/common/time_zone.h index 99cae6ef2..f574d5c04 100644 --- a/src/common/time_zone.h +++ b/src/common/time_zone.h | |||
| @@ -3,15 +3,21 @@ | |||
| 3 | 3 | ||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include <array> | ||
| 6 | #include <chrono> | 7 | #include <chrono> |
| 7 | #include <string> | 8 | #include <string> |
| 8 | 9 | ||
| 9 | namespace Common::TimeZone { | 10 | namespace Common::TimeZone { |
| 10 | 11 | ||
| 12 | [[nodiscard]] const std::array<const char*, 46>& GetTimeZoneStrings(); | ||
| 13 | |||
| 11 | /// Gets the default timezone, i.e. "GMT" | 14 | /// Gets the default timezone, i.e. "GMT" |
| 12 | [[nodiscard]] std::string GetDefaultTimeZone(); | 15 | [[nodiscard]] std::string GetDefaultTimeZone(); |
| 13 | 16 | ||
| 14 | /// Gets the offset of the current timezone (from the default), in seconds | 17 | /// Gets the offset of the current timezone (from the default), in seconds |
| 15 | [[nodiscard]] std::chrono::seconds GetCurrentOffsetSeconds(); | 18 | [[nodiscard]] std::chrono::seconds GetCurrentOffsetSeconds(); |
| 16 | 19 | ||
| 20 | /// Searches time zone offsets for the closest offset to the system time zone | ||
| 21 | [[nodiscard]] std::string FindSystemTimeZone(); | ||
| 22 | |||
| 17 | } // namespace Common::TimeZone | 23 | } // namespace Common::TimeZone |
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 99602699a..227c431bc 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -4,8 +4,6 @@ | |||
| 4 | add_library(core STATIC | 4 | add_library(core STATIC |
| 5 | arm/arm_interface.h | 5 | arm/arm_interface.h |
| 6 | arm/arm_interface.cpp | 6 | arm/arm_interface.cpp |
| 7 | arm/dynarmic/arm_exclusive_monitor.cpp | ||
| 8 | arm/dynarmic/arm_exclusive_monitor.h | ||
| 9 | arm/exclusive_monitor.cpp | 7 | arm/exclusive_monitor.cpp |
| 10 | arm/exclusive_monitor.h | 8 | arm/exclusive_monitor.h |
| 11 | arm/symbols.cpp | 9 | arm/symbols.cpp |
| @@ -836,7 +834,7 @@ endif() | |||
| 836 | 834 | ||
| 837 | create_target_directory_groups(core) | 835 | create_target_directory_groups(core) |
| 838 | 836 | ||
| 839 | target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core) | 837 | target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core nx_tzdb) |
| 840 | target_link_libraries(core PUBLIC Boost::headers PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::opus) | 838 | target_link_libraries(core PUBLIC Boost::headers PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::opus) |
| 841 | if (MINGW) | 839 | if (MINGW) |
| 842 | target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY}) | 840 | target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY}) |
| @@ -849,12 +847,15 @@ endif() | |||
| 849 | 847 | ||
| 850 | if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) | 848 | if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) |
| 851 | target_sources(core PRIVATE | 849 | target_sources(core PRIVATE |
| 850 | arm/dynarmic/arm_dynarmic.h | ||
| 852 | arm/dynarmic/arm_dynarmic_64.cpp | 851 | arm/dynarmic/arm_dynarmic_64.cpp |
| 853 | arm/dynarmic/arm_dynarmic_64.h | 852 | arm/dynarmic/arm_dynarmic_64.h |
| 854 | arm/dynarmic/arm_dynarmic_32.cpp | 853 | arm/dynarmic/arm_dynarmic_32.cpp |
| 855 | arm/dynarmic/arm_dynarmic_32.h | 854 | arm/dynarmic/arm_dynarmic_32.h |
| 856 | arm/dynarmic/arm_dynarmic_cp15.cpp | 855 | arm/dynarmic/dynarmic_cp15.cpp |
| 857 | arm/dynarmic/arm_dynarmic_cp15.h | 856 | arm/dynarmic/dynarmic_cp15.h |
| 857 | arm/dynarmic/dynarmic_exclusive_monitor.cpp | ||
| 858 | arm/dynarmic/dynarmic_exclusive_monitor.h | ||
| 858 | hle/service/jit/jit_context.cpp | 859 | hle/service/jit/jit_context.cpp |
| 859 | hle/service/jit/jit_context.h | 860 | hle/service/jit/jit_context.h |
| 860 | hle/service/jit/jit.cpp | 861 | hle/service/jit/jit.cpp |
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp index d30914b7a..beaea64b3 100644 --- a/src/core/arm/arm_interface.cpp +++ b/src/core/arm/arm_interface.cpp | |||
| @@ -13,25 +13,68 @@ | |||
| 13 | #include "core/core.h" | 13 | #include "core/core.h" |
| 14 | #include "core/debugger/debugger.h" | 14 | #include "core/debugger/debugger.h" |
| 15 | #include "core/hle/kernel/k_process.h" | 15 | #include "core/hle/kernel/k_process.h" |
| 16 | #include "core/hle/kernel/k_thread.h" | ||
| 16 | #include "core/hle/kernel/svc.h" | 17 | #include "core/hle/kernel/svc.h" |
| 17 | #include "core/loader/loader.h" | 18 | #include "core/loader/loader.h" |
| 18 | #include "core/memory.h" | 19 | #include "core/memory.h" |
| 19 | 20 | ||
| 20 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | ||
| 21 | #include "core/arm/dynarmic/arm_dynarmic_64.h" | ||
| 22 | |||
| 23 | namespace Core { | 21 | namespace Core { |
| 24 | 22 | ||
| 25 | constexpr u64 SEGMENT_BASE = 0x7100000000ull; | 23 | constexpr u64 SEGMENT_BASE = 0x7100000000ull; |
| 26 | 24 | ||
| 27 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( | 25 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( |
| 28 | Core::System& system, const ARM_Interface::ThreadContext32& ctx) { | 26 | Core::System& system, const ARM_Interface::ThreadContext32& ctx) { |
| 29 | return ARM_Dynarmic_32::GetBacktraceFromContext(system, ctx); | 27 | std::vector<BacktraceEntry> out; |
| 28 | auto& memory = system.ApplicationMemory(); | ||
| 29 | |||
| 30 | const auto& reg = ctx.cpu_registers; | ||
| 31 | u32 pc = reg[15], lr = reg[14], fp = reg[11]; | ||
| 32 | out.push_back({"", 0, pc, 0, ""}); | ||
| 33 | |||
| 34 | // fp (= r11) points to the last frame record. | ||
| 35 | // Frame records are two words long: | ||
| 36 | // fp+0 : pointer to previous frame record | ||
| 37 | // fp+4 : value of lr for frame | ||
| 38 | for (size_t i = 0; i < 256; i++) { | ||
| 39 | out.push_back({"", 0, lr, 0, ""}); | ||
| 40 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | lr = memory.Read32(fp + 4); | ||
| 44 | fp = memory.Read32(fp); | ||
| 45 | } | ||
| 46 | |||
| 47 | SymbolicateBacktrace(system, out); | ||
| 48 | |||
| 49 | return out; | ||
| 30 | } | 50 | } |
| 31 | 51 | ||
| 32 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( | 52 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( |
| 33 | Core::System& system, const ARM_Interface::ThreadContext64& ctx) { | 53 | Core::System& system, const ARM_Interface::ThreadContext64& ctx) { |
| 34 | return ARM_Dynarmic_64::GetBacktraceFromContext(system, ctx); | 54 | std::vector<BacktraceEntry> out; |
| 55 | auto& memory = system.ApplicationMemory(); | ||
| 56 | |||
| 57 | const auto& reg = ctx.cpu_registers; | ||
| 58 | u64 pc = ctx.pc, lr = reg[30], fp = reg[29]; | ||
| 59 | |||
| 60 | out.push_back({"", 0, pc, 0, ""}); | ||
| 61 | |||
| 62 | // fp (= x29) points to the previous frame record. | ||
| 63 | // Frame records are two words long: | ||
| 64 | // fp+0 : pointer to previous frame record | ||
| 65 | // fp+8 : value of lr for frame | ||
| 66 | for (size_t i = 0; i < 256; i++) { | ||
| 67 | out.push_back({"", 0, lr, 0, ""}); | ||
| 68 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { | ||
| 69 | break; | ||
| 70 | } | ||
| 71 | lr = memory.Read64(fp + 8); | ||
| 72 | fp = memory.Read64(fp); | ||
| 73 | } | ||
| 74 | |||
| 75 | SymbolicateBacktrace(system, out); | ||
| 76 | |||
| 77 | return out; | ||
| 35 | } | 78 | } |
| 36 | 79 | ||
| 37 | void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { | 80 | void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { |
| @@ -76,6 +119,18 @@ void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<Backt | |||
| 76 | } | 119 | } |
| 77 | } | 120 | } |
| 78 | 121 | ||
| 122 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const { | ||
| 123 | if (GetArchitecture() == Architecture::Aarch64) { | ||
| 124 | ThreadContext64 ctx; | ||
| 125 | SaveContext(ctx); | ||
| 126 | return GetBacktraceFromContext(system, ctx); | ||
| 127 | } else { | ||
| 128 | ThreadContext32 ctx; | ||
| 129 | SaveContext(ctx); | ||
| 130 | return GetBacktraceFromContext(system, ctx); | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 79 | void ARM_Interface::LogBacktrace() const { | 134 | void ARM_Interface::LogBacktrace() const { |
| 80 | const VAddr sp = GetSP(); | 135 | const VAddr sp = GetSP(); |
| 81 | const VAddr pc = GetPC(); | 136 | const VAddr pc = GetPC(); |
| @@ -83,7 +138,6 @@ void ARM_Interface::LogBacktrace() const { | |||
| 83 | LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", | 138 | LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", |
| 84 | "Offset", "Symbol"); | 139 | "Offset", "Symbol"); |
| 85 | LOG_ERROR(Core_ARM, ""); | 140 | LOG_ERROR(Core_ARM, ""); |
| 86 | |||
| 87 | const auto backtrace = GetBacktrace(); | 141 | const auto backtrace = GetBacktrace(); |
| 88 | for (const auto& entry : backtrace) { | 142 | for (const auto& entry : backtrace) { |
| 89 | LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, | 143 | LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, |
| @@ -97,7 +151,7 @@ void ARM_Interface::Run() { | |||
| 97 | 151 | ||
| 98 | while (true) { | 152 | while (true) { |
| 99 | Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; | 153 | Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; |
| 100 | Dynarmic::HaltReason hr{}; | 154 | HaltReason hr{}; |
| 101 | 155 | ||
| 102 | // Notify the debugger and go to sleep if a step was performed | 156 | // Notify the debugger and go to sleep if a step was performed |
| 103 | // and this thread has been scheduled again. | 157 | // and this thread has been scheduled again. |
| @@ -108,17 +162,17 @@ void ARM_Interface::Run() { | |||
| 108 | } | 162 | } |
| 109 | 163 | ||
| 110 | // Otherwise, run the thread. | 164 | // Otherwise, run the thread. |
| 111 | system.EnterDynarmicProfile(); | 165 | system.EnterCPUProfile(); |
| 112 | if (current_thread->GetStepState() == StepState::StepPending) { | 166 | if (current_thread->GetStepState() == StepState::StepPending) { |
| 113 | hr = StepJit(); | 167 | hr = StepJit(); |
| 114 | 168 | ||
| 115 | if (Has(hr, step_thread)) { | 169 | if (True(hr & HaltReason::StepThread)) { |
| 116 | current_thread->SetStepState(StepState::StepPerformed); | 170 | current_thread->SetStepState(StepState::StepPerformed); |
| 117 | } | 171 | } |
| 118 | } else { | 172 | } else { |
| 119 | hr = RunJit(); | 173 | hr = RunJit(); |
| 120 | } | 174 | } |
| 121 | system.ExitDynarmicProfile(); | 175 | system.ExitCPUProfile(); |
| 122 | 176 | ||
| 123 | // If the thread is scheduled for termination, exit the thread. | 177 | // If the thread is scheduled for termination, exit the thread. |
| 124 | if (current_thread->HasDpc()) { | 178 | if (current_thread->HasDpc()) { |
| @@ -130,8 +184,8 @@ void ARM_Interface::Run() { | |||
| 130 | 184 | ||
| 131 | // Notify the debugger and go to sleep if a breakpoint was hit, | 185 | // Notify the debugger and go to sleep if a breakpoint was hit, |
| 132 | // or if the thread is unable to continue for any reason. | 186 | // or if the thread is unable to continue for any reason. |
| 133 | if (Has(hr, breakpoint) || Has(hr, no_execute)) { | 187 | if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) { |
| 134 | if (!Has(hr, no_execute)) { | 188 | if (!True(hr & HaltReason::InstructionBreakpoint)) { |
| 135 | RewindBreakpointInstruction(); | 189 | RewindBreakpointInstruction(); |
| 136 | } | 190 | } |
| 137 | if (system.DebuggerEnabled()) { | 191 | if (system.DebuggerEnabled()) { |
| @@ -144,7 +198,7 @@ void ARM_Interface::Run() { | |||
| 144 | } | 198 | } |
| 145 | 199 | ||
| 146 | // Notify the debugger and go to sleep if a watchpoint was hit. | 200 | // Notify the debugger and go to sleep if a watchpoint was hit. |
| 147 | if (Has(hr, watchpoint)) { | 201 | if (True(hr & HaltReason::DataAbort)) { |
| 148 | if (system.DebuggerEnabled()) { | 202 | if (system.DebuggerEnabled()) { |
| 149 | system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint()); | 203 | system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint()); |
| 150 | } | 204 | } |
| @@ -153,11 +207,11 @@ void ARM_Interface::Run() { | |||
| 153 | } | 207 | } |
| 154 | 208 | ||
| 155 | // Handle syscalls and scheduling (this may change the current thread/core) | 209 | // Handle syscalls and scheduling (this may change the current thread/core) |
| 156 | if (Has(hr, svc_call)) { | 210 | if (True(hr & HaltReason::SupervisorCall)) { |
| 157 | Kernel::Svc::Call(system, GetSvcNumber()); | 211 | Kernel::Svc::Call(system, GetSvcNumber()); |
| 158 | break; | 212 | break; |
| 159 | } | 213 | } |
| 160 | if (Has(hr, break_loop) || !uses_wall_clock) { | 214 | if (True(hr & HaltReason::BreakLoop) || !uses_wall_clock) { |
| 161 | break; | 215 | break; |
| 162 | } | 216 | } |
| 163 | } | 217 | } |
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 8e40702cc..d5f2fa09a 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -8,8 +8,6 @@ | |||
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <vector> | 9 | #include <vector> |
| 10 | 10 | ||
| 11 | #include <dynarmic/interface/halt_reason.h> | ||
| 12 | |||
| 13 | #include "common/common_funcs.h" | 11 | #include "common/common_funcs.h" |
| 14 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 15 | #include "core/hardware_properties.h" | 13 | #include "core/hardware_properties.h" |
| @@ -30,6 +28,22 @@ class CPUInterruptHandler; | |||
| 30 | 28 | ||
| 31 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; | 29 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; |
| 32 | 30 | ||
| 31 | // NOTE: these values match the HaltReason enum in Dynarmic | ||
| 32 | enum class HaltReason : u64 { | ||
| 33 | StepThread = 0x00000001, | ||
| 34 | DataAbort = 0x00000004, | ||
| 35 | BreakLoop = 0x02000000, | ||
| 36 | SupervisorCall = 0x04000000, | ||
| 37 | InstructionBreakpoint = 0x08000000, | ||
| 38 | PrefetchAbort = 0x20000000, | ||
| 39 | }; | ||
| 40 | DECLARE_ENUM_FLAG_OPERATORS(HaltReason); | ||
| 41 | |||
| 42 | enum class Architecture { | ||
| 43 | Aarch32, | ||
| 44 | Aarch64, | ||
| 45 | }; | ||
| 46 | |||
| 33 | /// Generic ARMv8 CPU interface | 47 | /// Generic ARMv8 CPU interface |
| 34 | class ARM_Interface { | 48 | class ARM_Interface { |
| 35 | public: | 49 | public: |
| @@ -167,8 +181,9 @@ public: | |||
| 167 | */ | 181 | */ |
| 168 | virtual void SetTPIDR_EL0(u64 value) = 0; | 182 | virtual void SetTPIDR_EL0(u64 value) = 0; |
| 169 | 183 | ||
| 170 | virtual void SaveContext(ThreadContext32& ctx) = 0; | 184 | virtual Architecture GetArchitecture() const = 0; |
| 171 | virtual void SaveContext(ThreadContext64& ctx) = 0; | 185 | virtual void SaveContext(ThreadContext32& ctx) const = 0; |
| 186 | virtual void SaveContext(ThreadContext64& ctx) const = 0; | ||
| 172 | virtual void LoadContext(const ThreadContext32& ctx) = 0; | 187 | virtual void LoadContext(const ThreadContext32& ctx) = 0; |
| 173 | virtual void LoadContext(const ThreadContext64& ctx) = 0; | 188 | virtual void LoadContext(const ThreadContext64& ctx) = 0; |
| 174 | void LoadWatchpointArray(const WatchpointArray& wp); | 189 | void LoadWatchpointArray(const WatchpointArray& wp); |
| @@ -195,17 +210,9 @@ public: | |||
| 195 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | 210 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, |
| 196 | const ThreadContext64& ctx); | 211 | const ThreadContext64& ctx); |
| 197 | 212 | ||
| 198 | virtual std::vector<BacktraceEntry> GetBacktrace() const = 0; | 213 | std::vector<BacktraceEntry> GetBacktrace() const; |
| 199 | |||
| 200 | void LogBacktrace() const; | 214 | void LogBacktrace() const; |
| 201 | 215 | ||
| 202 | static constexpr Dynarmic::HaltReason step_thread = Dynarmic::HaltReason::Step; | ||
| 203 | static constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2; | ||
| 204 | static constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3; | ||
| 205 | static constexpr Dynarmic::HaltReason breakpoint = Dynarmic::HaltReason::UserDefined4; | ||
| 206 | static constexpr Dynarmic::HaltReason watchpoint = Dynarmic::HaltReason::MemoryAbort; | ||
| 207 | static constexpr Dynarmic::HaltReason no_execute = Dynarmic::HaltReason::UserDefined6; | ||
| 208 | |||
| 209 | protected: | 216 | protected: |
| 210 | /// System context that this ARM interface is running under. | 217 | /// System context that this ARM interface is running under. |
| 211 | System& system; | 218 | System& system; |
| @@ -216,8 +223,8 @@ protected: | |||
| 216 | const Kernel::DebugWatchpoint* MatchingWatchpoint( | 223 | const Kernel::DebugWatchpoint* MatchingWatchpoint( |
| 217 | u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; | 224 | u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; |
| 218 | 225 | ||
| 219 | virtual Dynarmic::HaltReason RunJit() = 0; | 226 | virtual HaltReason RunJit() = 0; |
| 220 | virtual Dynarmic::HaltReason StepJit() = 0; | 227 | virtual HaltReason StepJit() = 0; |
| 221 | virtual u32 GetSvcNumber() const = 0; | 228 | virtual u32 GetSvcNumber() const = 0; |
| 222 | virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0; | 229 | virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0; |
| 223 | virtual void RewindBreakpointInstruction() = 0; | 230 | virtual void RewindBreakpointInstruction() = 0; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h new file mode 100644 index 000000000..eef7c3116 --- /dev/null +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include <dynarmic/interface/halt_reason.h> | ||
| 5 | |||
| 6 | #include "core/arm/arm_interface.h" | ||
| 7 | |||
| 8 | namespace Core { | ||
| 9 | |||
| 10 | constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step; | ||
| 11 | constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort; | ||
| 12 | constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2; | ||
| 13 | constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3; | ||
| 14 | constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4; | ||
| 15 | constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6; | ||
| 16 | |||
| 17 | constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { | ||
| 18 | static_assert(static_cast<u64>(HaltReason::StepThread) == static_cast<u64>(StepThread)); | ||
| 19 | static_assert(static_cast<u64>(HaltReason::DataAbort) == static_cast<u64>(DataAbort)); | ||
| 20 | static_assert(static_cast<u64>(HaltReason::BreakLoop) == static_cast<u64>(BreakLoop)); | ||
| 21 | static_assert(static_cast<u64>(HaltReason::SupervisorCall) == static_cast<u64>(SupervisorCall)); | ||
| 22 | static_assert(static_cast<u64>(HaltReason::InstructionBreakpoint) == | ||
| 23 | static_cast<u64>(InstructionBreakpoint)); | ||
| 24 | static_assert(static_cast<u64>(HaltReason::PrefetchAbort) == static_cast<u64>(PrefetchAbort)); | ||
| 25 | |||
| 26 | return static_cast<HaltReason>(hr); | ||
| 27 | } | ||
| 28 | |||
| 29 | } // namespace Core | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index dfdcbe35a..5acf9008d 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -10,9 +10,10 @@ | |||
| 10 | #include "common/logging/log.h" | 10 | #include "common/logging/log.h" |
| 11 | #include "common/page_table.h" | 11 | #include "common/page_table.h" |
| 12 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "core/arm/dynarmic/arm_dynarmic.h" | ||
| 13 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | 14 | #include "core/arm/dynarmic/arm_dynarmic_32.h" |
| 14 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 15 | #include "core/arm/dynarmic/dynarmic_cp15.h" |
| 15 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 16 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 16 | #include "core/core.h" | 17 | #include "core/core.h" |
| 17 | #include "core/core_timing.h" | 18 | #include "core/core_timing.h" |
| 18 | #include "core/debugger/debugger.h" | 19 | #include "core/debugger/debugger.h" |
| @@ -104,11 +105,11 @@ public: | |||
| 104 | switch (exception) { | 105 | switch (exception) { |
| 105 | case Dynarmic::A32::Exception::NoExecuteFault: | 106 | case Dynarmic::A32::Exception::NoExecuteFault: |
| 106 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); | 107 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); |
| 107 | ReturnException(pc, ARM_Interface::no_execute); | 108 | ReturnException(pc, PrefetchAbort); |
| 108 | return; | 109 | return; |
| 109 | default: | 110 | default: |
| 110 | if (debugger_enabled) { | 111 | if (debugger_enabled) { |
| 111 | ReturnException(pc, ARM_Interface::breakpoint); | 112 | ReturnException(pc, InstructionBreakpoint); |
| 112 | return; | 113 | return; |
| 113 | } | 114 | } |
| 114 | 115 | ||
| @@ -121,7 +122,7 @@ public: | |||
| 121 | 122 | ||
| 122 | void CallSVC(u32 swi) override { | 123 | void CallSVC(u32 swi) override { |
| 123 | parent.svc_swi = swi; | 124 | parent.svc_swi = swi; |
| 124 | parent.jit.load()->HaltExecution(ARM_Interface::svc_call); | 125 | parent.jit.load()->HaltExecution(SupervisorCall); |
| 125 | } | 126 | } |
| 126 | 127 | ||
| 127 | void AddTicks(u64 ticks) override { | 128 | void AddTicks(u64 ticks) override { |
| @@ -162,7 +163,7 @@ public: | |||
| 162 | if (!memory.IsValidVirtualAddressRange(addr, size)) { | 163 | if (!memory.IsValidVirtualAddressRange(addr, size)) { |
| 163 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", | 164 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", |
| 164 | addr); | 165 | addr); |
| 165 | parent.jit.load()->HaltExecution(ARM_Interface::no_execute); | 166 | parent.jit.load()->HaltExecution(PrefetchAbort); |
| 166 | return false; | 167 | return false; |
| 167 | } | 168 | } |
| 168 | 169 | ||
| @@ -173,7 +174,7 @@ public: | |||
| 173 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; | 174 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; |
| 174 | if (match) { | 175 | if (match) { |
| 175 | parent.halted_watchpoint = match; | 176 | parent.halted_watchpoint = match; |
| 176 | parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); | 177 | parent.jit.load()->HaltExecution(DataAbort); |
| 177 | return false; | 178 | return false; |
| 178 | } | 179 | } |
| 179 | 180 | ||
| @@ -329,12 +330,12 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 329 | return std::make_unique<Dynarmic::A32::Jit>(config); | 330 | return std::make_unique<Dynarmic::A32::Jit>(config); |
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | Dynarmic::HaltReason ARM_Dynarmic_32::RunJit() { | 333 | HaltReason ARM_Dynarmic_32::RunJit() { |
| 333 | return jit.load()->Run(); | 334 | return TranslateHaltReason(jit.load()->Run()); |
| 334 | } | 335 | } |
| 335 | 336 | ||
| 336 | Dynarmic::HaltReason ARM_Dynarmic_32::StepJit() { | 337 | HaltReason ARM_Dynarmic_32::StepJit() { |
| 337 | return jit.load()->Step(); | 338 | return TranslateHaltReason(jit.load()->Step()); |
| 338 | } | 339 | } |
| 339 | 340 | ||
| 340 | u32 ARM_Dynarmic_32::GetSvcNumber() const { | 341 | u32 ARM_Dynarmic_32::GetSvcNumber() const { |
| @@ -408,7 +409,7 @@ void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) { | |||
| 408 | cp15->uprw = static_cast<u32>(value); | 409 | cp15->uprw = static_cast<u32>(value); |
| 409 | } | 410 | } |
| 410 | 411 | ||
| 411 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { | 412 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) const { |
| 412 | Dynarmic::A32::Jit* j = jit.load(); | 413 | Dynarmic::A32::Jit* j = jit.load(); |
| 413 | ctx.cpu_registers = j->Regs(); | 414 | ctx.cpu_registers = j->Regs(); |
| 414 | ctx.extension_registers = j->ExtRegs(); | 415 | ctx.extension_registers = j->ExtRegs(); |
| @@ -425,11 +426,11 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) { | |||
| 425 | } | 426 | } |
| 426 | 427 | ||
| 427 | void ARM_Dynarmic_32::SignalInterrupt() { | 428 | void ARM_Dynarmic_32::SignalInterrupt() { |
| 428 | jit.load()->HaltExecution(break_loop); | 429 | jit.load()->HaltExecution(BreakLoop); |
| 429 | } | 430 | } |
| 430 | 431 | ||
| 431 | void ARM_Dynarmic_32::ClearInterrupt() { | 432 | void ARM_Dynarmic_32::ClearInterrupt() { |
| 432 | jit.load()->ClearHalt(break_loop); | 433 | jit.load()->ClearHalt(BreakLoop); |
| 433 | } | 434 | } |
| 434 | 435 | ||
| 435 | void ARM_Dynarmic_32::ClearInstructionCache() { | 436 | void ARM_Dynarmic_32::ClearInstructionCache() { |
| @@ -462,39 +463,4 @@ void ARM_Dynarmic_32::PageTableChanged(Common::PageTable& page_table, | |||
| 462 | jit_cache.emplace(key, std::move(new_jit)); | 463 | jit_cache.emplace(key, std::move(new_jit)); |
| 463 | } | 464 | } |
| 464 | 465 | ||
| 465 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace(Core::System& system, | ||
| 466 | u64 fp, u64 lr, u64 pc) { | ||
| 467 | std::vector<BacktraceEntry> out; | ||
| 468 | auto& memory = system.ApplicationMemory(); | ||
| 469 | |||
| 470 | out.push_back({"", 0, pc, 0, ""}); | ||
| 471 | |||
| 472 | // fp (= r11) points to the last frame record. | ||
| 473 | // Frame records are two words long: | ||
| 474 | // fp+0 : pointer to previous frame record | ||
| 475 | // fp+4 : value of lr for frame | ||
| 476 | for (size_t i = 0; i < 256; i++) { | ||
| 477 | out.push_back({"", 0, lr, 0, ""}); | ||
| 478 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { | ||
| 479 | break; | ||
| 480 | } | ||
| 481 | lr = memory.Read32(fp + 4); | ||
| 482 | fp = memory.Read32(fp); | ||
| 483 | } | ||
| 484 | |||
| 485 | SymbolicateBacktrace(system, out); | ||
| 486 | |||
| 487 | return out; | ||
| 488 | } | ||
| 489 | |||
| 490 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktraceFromContext( | ||
| 491 | System& system, const ThreadContext32& ctx) { | ||
| 492 | const auto& reg = ctx.cpu_registers; | ||
| 493 | return GetBacktrace(system, reg[11], reg[14], reg[15]); | ||
| 494 | } | ||
| 495 | |||
| 496 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace() const { | ||
| 497 | return GetBacktrace(system, GetReg(11), GetReg(14), GetReg(15)); | ||
| 498 | } | ||
| 499 | |||
| 500 | } // namespace Core | 466 | } // namespace Core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index bce695daf..a990845cb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -50,8 +50,11 @@ public: | |||
| 50 | return (GetPSTATE() & 0x20) != 0; | 50 | return (GetPSTATE() & 0x20) != 0; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | void SaveContext(ThreadContext32& ctx) override; | 53 | Architecture GetArchitecture() const override { |
| 54 | void SaveContext(ThreadContext64& ctx) override {} | 54 | return Architecture::Aarch32; |
| 55 | } | ||
| 56 | void SaveContext(ThreadContext32& ctx) const override; | ||
| 57 | void SaveContext(ThreadContext64& ctx) const override {} | ||
| 55 | void LoadContext(const ThreadContext32& ctx) override; | 58 | void LoadContext(const ThreadContext32& ctx) override; |
| 56 | void LoadContext(const ThreadContext64& ctx) override {} | 59 | void LoadContext(const ThreadContext64& ctx) override {} |
| 57 | 60 | ||
| @@ -64,14 +67,9 @@ public: | |||
| 64 | void PageTableChanged(Common::PageTable& new_page_table, | 67 | void PageTableChanged(Common::PageTable& new_page_table, |
| 65 | std::size_t new_address_space_size_in_bits) override; | 68 | std::size_t new_address_space_size_in_bits) override; |
| 66 | 69 | ||
| 67 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | ||
| 68 | const ThreadContext32& ctx); | ||
| 69 | |||
| 70 | std::vector<BacktraceEntry> GetBacktrace() const override; | ||
| 71 | |||
| 72 | protected: | 70 | protected: |
| 73 | Dynarmic::HaltReason RunJit() override; | 71 | HaltReason RunJit() override; |
| 74 | Dynarmic::HaltReason StepJit() override; | 72 | HaltReason StepJit() override; |
| 75 | u32 GetSvcNumber() const override; | 73 | u32 GetSvcNumber() const override; |
| 76 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; | 74 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; |
| 77 | void RewindBreakpointInstruction() override; | 75 | void RewindBreakpointInstruction() override; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index bbbcb4f9d..bb97ed5bc 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -10,8 +10,9 @@ | |||
| 10 | #include "common/logging/log.h" | 10 | #include "common/logging/log.h" |
| 11 | #include "common/page_table.h" | 11 | #include "common/page_table.h" |
| 12 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "core/arm/dynarmic/arm_dynarmic.h" | ||
| 13 | #include "core/arm/dynarmic/arm_dynarmic_64.h" | 14 | #include "core/arm/dynarmic/arm_dynarmic_64.h" |
| 14 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 15 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 15 | #include "core/core.h" | 16 | #include "core/core.h" |
| 16 | #include "core/core_timing.h" | 17 | #include "core/core_timing.h" |
| 17 | #include "core/debugger/debugger.h" | 18 | #include "core/debugger/debugger.h" |
| @@ -113,7 +114,7 @@ public: | |||
| 113 | LOG_ERROR(Core_ARM, | 114 | LOG_ERROR(Core_ARM, |
| 114 | "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, | 115 | "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, |
| 115 | num_instructions, memory.Read32(pc)); | 116 | num_instructions, memory.Read32(pc)); |
| 116 | ReturnException(pc, ARM_Interface::no_execute); | 117 | ReturnException(pc, PrefetchAbort); |
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, | 120 | void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, |
| @@ -148,11 +149,11 @@ public: | |||
| 148 | return; | 149 | return; |
| 149 | case Dynarmic::A64::Exception::NoExecuteFault: | 150 | case Dynarmic::A64::Exception::NoExecuteFault: |
| 150 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); | 151 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); |
| 151 | ReturnException(pc, ARM_Interface::no_execute); | 152 | ReturnException(pc, PrefetchAbort); |
| 152 | return; | 153 | return; |
| 153 | default: | 154 | default: |
| 154 | if (debugger_enabled) { | 155 | if (debugger_enabled) { |
| 155 | ReturnException(pc, ARM_Interface::breakpoint); | 156 | ReturnException(pc, InstructionBreakpoint); |
| 156 | return; | 157 | return; |
| 157 | } | 158 | } |
| 158 | 159 | ||
| @@ -164,7 +165,7 @@ public: | |||
| 164 | 165 | ||
| 165 | void CallSVC(u32 swi) override { | 166 | void CallSVC(u32 swi) override { |
| 166 | parent.svc_swi = swi; | 167 | parent.svc_swi = swi; |
| 167 | parent.jit.load()->HaltExecution(ARM_Interface::svc_call); | 168 | parent.jit.load()->HaltExecution(SupervisorCall); |
| 168 | } | 169 | } |
| 169 | 170 | ||
| 170 | void AddTicks(u64 ticks) override { | 171 | void AddTicks(u64 ticks) override { |
| @@ -207,7 +208,7 @@ public: | |||
| 207 | if (!memory.IsValidVirtualAddressRange(addr, size)) { | 208 | if (!memory.IsValidVirtualAddressRange(addr, size)) { |
| 208 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", | 209 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", |
| 209 | addr); | 210 | addr); |
| 210 | parent.jit.load()->HaltExecution(ARM_Interface::no_execute); | 211 | parent.jit.load()->HaltExecution(PrefetchAbort); |
| 211 | return false; | 212 | return false; |
| 212 | } | 213 | } |
| 213 | 214 | ||
| @@ -218,7 +219,7 @@ public: | |||
| 218 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; | 219 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; |
| 219 | if (match) { | 220 | if (match) { |
| 220 | parent.halted_watchpoint = match; | 221 | parent.halted_watchpoint = match; |
| 221 | parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); | 222 | parent.jit.load()->HaltExecution(DataAbort); |
| 222 | return false; | 223 | return false; |
| 223 | } | 224 | } |
| 224 | 225 | ||
| @@ -383,12 +384,12 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 383 | return std::make_shared<Dynarmic::A64::Jit>(config); | 384 | return std::make_shared<Dynarmic::A64::Jit>(config); |
| 384 | } | 385 | } |
| 385 | 386 | ||
| 386 | Dynarmic::HaltReason ARM_Dynarmic_64::RunJit() { | 387 | HaltReason ARM_Dynarmic_64::RunJit() { |
| 387 | return jit.load()->Run(); | 388 | return TranslateHaltReason(jit.load()->Run()); |
| 388 | } | 389 | } |
| 389 | 390 | ||
| 390 | Dynarmic::HaltReason ARM_Dynarmic_64::StepJit() { | 391 | HaltReason ARM_Dynarmic_64::StepJit() { |
| 391 | return jit.load()->Step(); | 392 | return TranslateHaltReason(jit.load()->Step()); |
| 392 | } | 393 | } |
| 393 | 394 | ||
| 394 | u32 ARM_Dynarmic_64::GetSvcNumber() const { | 395 | u32 ARM_Dynarmic_64::GetSvcNumber() const { |
| @@ -464,7 +465,7 @@ void ARM_Dynarmic_64::SetTPIDR_EL0(u64 value) { | |||
| 464 | cb->tpidr_el0 = value; | 465 | cb->tpidr_el0 = value; |
| 465 | } | 466 | } |
| 466 | 467 | ||
| 467 | void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) { | 468 | void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) const { |
| 468 | Dynarmic::A64::Jit* j = jit.load(); | 469 | Dynarmic::A64::Jit* j = jit.load(); |
| 469 | ctx.cpu_registers = j->GetRegisters(); | 470 | ctx.cpu_registers = j->GetRegisters(); |
| 470 | ctx.sp = j->GetSP(); | 471 | ctx.sp = j->GetSP(); |
| @@ -489,11 +490,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) { | |||
| 489 | } | 490 | } |
| 490 | 491 | ||
| 491 | void ARM_Dynarmic_64::SignalInterrupt() { | 492 | void ARM_Dynarmic_64::SignalInterrupt() { |
| 492 | jit.load()->HaltExecution(break_loop); | 493 | jit.load()->HaltExecution(BreakLoop); |
| 493 | } | 494 | } |
| 494 | 495 | ||
| 495 | void ARM_Dynarmic_64::ClearInterrupt() { | 496 | void ARM_Dynarmic_64::ClearInterrupt() { |
| 496 | jit.load()->ClearHalt(break_loop); | 497 | jit.load()->ClearHalt(BreakLoop); |
| 497 | } | 498 | } |
| 498 | 499 | ||
| 499 | void ARM_Dynarmic_64::ClearInstructionCache() { | 500 | void ARM_Dynarmic_64::ClearInstructionCache() { |
| @@ -526,39 +527,4 @@ void ARM_Dynarmic_64::PageTableChanged(Common::PageTable& page_table, | |||
| 526 | jit_cache.emplace(key, std::move(new_jit)); | 527 | jit_cache.emplace(key, std::move(new_jit)); |
| 527 | } | 528 | } |
| 528 | 529 | ||
| 529 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace(Core::System& system, | ||
| 530 | u64 fp, u64 lr, u64 pc) { | ||
| 531 | std::vector<BacktraceEntry> out; | ||
| 532 | auto& memory = system.ApplicationMemory(); | ||
| 533 | |||
| 534 | out.push_back({"", 0, pc, 0, ""}); | ||
| 535 | |||
| 536 | // fp (= x29) points to the previous frame record. | ||
| 537 | // Frame records are two words long: | ||
| 538 | // fp+0 : pointer to previous frame record | ||
| 539 | // fp+8 : value of lr for frame | ||
| 540 | for (size_t i = 0; i < 256; i++) { | ||
| 541 | out.push_back({"", 0, lr, 0, ""}); | ||
| 542 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { | ||
| 543 | break; | ||
| 544 | } | ||
| 545 | lr = memory.Read64(fp + 8); | ||
| 546 | fp = memory.Read64(fp); | ||
| 547 | } | ||
| 548 | |||
| 549 | SymbolicateBacktrace(system, out); | ||
| 550 | |||
| 551 | return out; | ||
| 552 | } | ||
| 553 | |||
| 554 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktraceFromContext( | ||
| 555 | System& system, const ThreadContext64& ctx) { | ||
| 556 | const auto& reg = ctx.cpu_registers; | ||
| 557 | return GetBacktrace(system, reg[29], reg[30], ctx.pc); | ||
| 558 | } | ||
| 559 | |||
| 560 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace() const { | ||
| 561 | return GetBacktrace(system, GetReg(29), GetReg(30), GetPC()); | ||
| 562 | } | ||
| 563 | |||
| 564 | } // namespace Core | 530 | } // namespace Core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index e83599e82..af2aa1f1c 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -43,8 +43,11 @@ public: | |||
| 43 | void SetTPIDR_EL0(u64 value) override; | 43 | void SetTPIDR_EL0(u64 value) override; |
| 44 | u64 GetTPIDR_EL0() const override; | 44 | u64 GetTPIDR_EL0() const override; |
| 45 | 45 | ||
| 46 | void SaveContext(ThreadContext32& ctx) override {} | 46 | Architecture GetArchitecture() const override { |
| 47 | void SaveContext(ThreadContext64& ctx) override; | 47 | return Architecture::Aarch64; |
| 48 | } | ||
| 49 | void SaveContext(ThreadContext32& ctx) const override {} | ||
| 50 | void SaveContext(ThreadContext64& ctx) const override; | ||
| 48 | void LoadContext(const ThreadContext32& ctx) override {} | 51 | void LoadContext(const ThreadContext32& ctx) override {} |
| 49 | void LoadContext(const ThreadContext64& ctx) override; | 52 | void LoadContext(const ThreadContext64& ctx) override; |
| 50 | 53 | ||
| @@ -57,14 +60,9 @@ public: | |||
| 57 | void PageTableChanged(Common::PageTable& new_page_table, | 60 | void PageTableChanged(Common::PageTable& new_page_table, |
| 58 | std::size_t new_address_space_size_in_bits) override; | 61 | std::size_t new_address_space_size_in_bits) override; |
| 59 | 62 | ||
| 60 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | ||
| 61 | const ThreadContext64& ctx); | ||
| 62 | |||
| 63 | std::vector<BacktraceEntry> GetBacktrace() const override; | ||
| 64 | |||
| 65 | protected: | 63 | protected: |
| 66 | Dynarmic::HaltReason RunJit() override; | 64 | HaltReason RunJit() override; |
| 67 | Dynarmic::HaltReason StepJit() override; | 65 | HaltReason StepJit() override; |
| 68 | u32 GetSvcNumber() const override; | 66 | u32 GetSvcNumber() const override; |
| 69 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; | 67 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; |
| 70 | void RewindBreakpointInstruction() override; | 68 | void RewindBreakpointInstruction() override; |
| @@ -73,8 +71,6 @@ private: | |||
| 73 | std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table, | 71 | std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table, |
| 74 | std::size_t address_space_bits) const; | 72 | std::size_t address_space_bits) const; |
| 75 | 73 | ||
| 76 | static std::vector<BacktraceEntry> GetBacktrace(Core::System& system, u64 fp, u64 lr, u64 pc); | ||
| 77 | |||
| 78 | using JitCacheKey = std::pair<Common::PageTable*, std::size_t>; | 74 | using JitCacheKey = std::pair<Common::PageTable*, std::size_t>; |
| 79 | using JitCacheType = | 75 | using JitCacheType = |
| 80 | std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>; | 76 | std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp index 5a4eba3eb..92c548db0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <fmt/format.h> | 4 | #include <fmt/format.h> |
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | 6 | #include "core/arm/dynarmic/arm_dynarmic_32.h" |
| 7 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 7 | #include "core/arm/dynarmic/dynarmic_cp15.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/core_timing.h" | 9 | #include "core/core_timing.h" |
| 10 | 10 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/dynarmic_cp15.h index d90b3e568..d90b3e568 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h +++ b/src/core/arm/dynarmic/dynarmic_cp15.h | |||
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp index fa0c48b25..b5c9c43c4 100644 --- a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp +++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 4 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 5 | #include "core/memory.h" | 5 | #include "core/memory.h" |
| 6 | 6 | ||
| 7 | namespace Core { | 7 | namespace Core { |
diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.h b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h index 57e6dd0d0..57e6dd0d0 100644 --- a/src/core/arm/dynarmic/arm_exclusive_monitor.h +++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h | |||
diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp index 20550faeb..6d9a862e1 100644 --- a/src/core/arm/exclusive_monitor.cpp +++ b/src/core/arm/exclusive_monitor.cpp | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) | 4 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) |
| 5 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 5 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 6 | #endif | 6 | #endif |
| 7 | #include "core/arm/exclusive_monitor.h" | 7 | #include "core/arm/exclusive_monitor.h" |
| 8 | #include "core/memory.h" | 8 | #include "core/memory.h" |
diff --git a/src/core/core.cpp b/src/core/core.cpp index 7ba704f18..b74fd0a58 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -54,10 +54,10 @@ | |||
| 54 | #include "video_core/renderer_base.h" | 54 | #include "video_core/renderer_base.h" |
| 55 | #include "video_core/video_core.h" | 55 | #include "video_core/video_core.h" |
| 56 | 56 | ||
| 57 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU0, "ARM JIT", "Dynarmic CPU 0", MP_RGB(255, 64, 64)); | 57 | MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64)); |
| 58 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU1, "ARM JIT", "Dynarmic CPU 1", MP_RGB(255, 64, 64)); | 58 | MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64)); |
| 59 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU2, "ARM JIT", "Dynarmic CPU 2", MP_RGB(255, 64, 64)); | 59 | MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64)); |
| 60 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU3, "ARM JIT", "Dynarmic CPU 3", MP_RGB(255, 64, 64)); | 60 | MICROPROFILE_DEFINE(ARM_CPU3, "ARM", "CPU 3", MP_RGB(255, 64, 64)); |
| 61 | 61 | ||
| 62 | namespace Core { | 62 | namespace Core { |
| 63 | 63 | ||
| @@ -259,10 +259,10 @@ struct System::Impl { | |||
| 259 | is_powered_on = true; | 259 | is_powered_on = true; |
| 260 | exit_lock = false; | 260 | exit_lock = false; |
| 261 | 261 | ||
| 262 | microprofile_dynarmic[0] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU0); | 262 | microprofile_cpu[0] = MICROPROFILE_TOKEN(ARM_CPU0); |
| 263 | microprofile_dynarmic[1] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU1); | 263 | microprofile_cpu[1] = MICROPROFILE_TOKEN(ARM_CPU1); |
| 264 | microprofile_dynarmic[2] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU2); | 264 | microprofile_cpu[2] = MICROPROFILE_TOKEN(ARM_CPU2); |
| 265 | microprofile_dynarmic[3] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU3); | 265 | microprofile_cpu[3] = MICROPROFILE_TOKEN(ARM_CPU3); |
| 266 | 266 | ||
| 267 | LOG_DEBUG(Core, "Initialized OK"); | 267 | LOG_DEBUG(Core, "Initialized OK"); |
| 268 | 268 | ||
| @@ -539,7 +539,7 @@ struct System::Impl { | |||
| 539 | ExitCallback exit_callback; | 539 | ExitCallback exit_callback; |
| 540 | 540 | ||
| 541 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; | 541 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; |
| 542 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; | 542 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; |
| 543 | }; | 543 | }; |
| 544 | 544 | ||
| 545 | System::System() : impl{std::make_unique<Impl>(*this)} {} | 545 | System::System() : impl{std::make_unique<Impl>(*this)} {} |
| @@ -927,14 +927,14 @@ void System::RegisterHostThread() { | |||
| 927 | impl->kernel.RegisterHostThread(); | 927 | impl->kernel.RegisterHostThread(); |
| 928 | } | 928 | } |
| 929 | 929 | ||
| 930 | void System::EnterDynarmicProfile() { | 930 | void System::EnterCPUProfile() { |
| 931 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); | 931 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); |
| 932 | impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_dynarmic[core]); | 932 | impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_cpu[core]); |
| 933 | } | 933 | } |
| 934 | 934 | ||
| 935 | void System::ExitDynarmicProfile() { | 935 | void System::ExitCPUProfile() { |
| 936 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); | 936 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); |
| 937 | MicroProfileLeave(impl->microprofile_dynarmic[core], impl->dynarmic_ticks[core]); | 937 | MicroProfileLeave(impl->microprofile_cpu[core], impl->dynarmic_ticks[core]); |
| 938 | } | 938 | } |
| 939 | 939 | ||
| 940 | bool System::IsMulticore() const { | 940 | bool System::IsMulticore() const { |
diff --git a/src/core/core.h b/src/core/core.h index ff2e4bd30..93afc9303 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -412,11 +412,11 @@ public: | |||
| 412 | /// Register a host thread as an auxiliary thread. | 412 | /// Register a host thread as an auxiliary thread. |
| 413 | void RegisterHostThread(); | 413 | void RegisterHostThread(); |
| 414 | 414 | ||
| 415 | /// Enter Dynarmic Microprofile | 415 | /// Enter CPU Microprofile |
| 416 | void EnterDynarmicProfile(); | 416 | void EnterCPUProfile(); |
| 417 | 417 | ||
| 418 | /// Exit Dynarmic Microprofile | 418 | /// Exit CPU Microprofile |
| 419 | void ExitDynarmicProfile(); | 419 | void ExitCPUProfile(); |
| 420 | 420 | ||
| 421 | /// Tells if system is running on multicore. | 421 | /// Tells if system is running on multicore. |
| 422 | [[nodiscard]] bool IsMulticore() const; | 422 | [[nodiscard]] bool IsMulticore() const; |
diff --git a/src/core/file_sys/system_archive/time_zone_binary.cpp b/src/core/file_sys/system_archive/time_zone_binary.cpp index 85383998d..ceb0b41c6 100644 --- a/src/core/file_sys/system_archive/time_zone_binary.cpp +++ b/src/core/file_sys/system_archive/time_zone_binary.cpp | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include <array> | ||
| 5 | #include <vector> | 4 | #include <vector> |
| 6 | 5 | ||
| 7 | #include "common/swap.h" | 6 | #include "common/swap.h" |
| @@ -9,656 +8,79 @@ | |||
| 9 | #include "core/file_sys/vfs_vector.h" | 8 | #include "core/file_sys/vfs_vector.h" |
| 10 | #include "core/hle/service/time/time_zone_types.h" | 9 | #include "core/hle/service/time/time_zone_types.h" |
| 11 | 10 | ||
| 12 | namespace FileSys::SystemArchive { | 11 | #include "nx_tzdb.h" |
| 13 | |||
| 14 | static constexpr std::array<u8, 9633> LOCATION_NAMES{ | ||
| 15 | 0x43, 0x45, 0x54, 0x0d, 0x0a, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0d, 0x0a, 0x43, 0x75, | ||
| 16 | 0x62, 0x61, 0x0d, 0x0a, 0x45, 0x45, 0x54, 0x0d, 0x0a, 0x45, 0x67, 0x79, 0x70, 0x74, 0x0d, 0x0a, | ||
| 17 | 0x45, 0x69, 0x72, 0x65, 0x0d, 0x0a, 0x45, 0x53, 0x54, 0x0d, 0x0a, 0x45, 0x53, 0x54, 0x35, 0x45, | ||
| 18 | 0x44, 0x54, 0x0d, 0x0a, 0x47, 0x42, 0x0d, 0x0a, 0x47, 0x42, 0x2d, 0x45, 0x69, 0x72, 0x65, 0x0d, | ||
| 19 | 0x0a, 0x47, 0x4d, 0x54, 0x0d, 0x0a, 0x47, 0x4d, 0x54, 0x2b, 0x30, 0x0d, 0x0a, 0x47, 0x4d, 0x54, | ||
| 20 | 0x2d, 0x30, 0x0d, 0x0a, 0x47, 0x4d, 0x54, 0x30, 0x0d, 0x0a, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x77, | ||
| 21 | 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x48, 0x6f, 0x6e, 0x67, 0x6b, 0x6f, 0x6e, 0x67, 0x0d, 0x0a, 0x48, | ||
| 22 | 0x53, 0x54, 0x0d, 0x0a, 0x49, 0x63, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x49, 0x72, 0x61, | ||
| 23 | 0x6e, 0x0d, 0x0a, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x0d, 0x0a, 0x4a, 0x61, 0x6d, 0x61, 0x69, | ||
| 24 | 0x63, 0x61, 0x0d, 0x0a, 0x4a, 0x61, 0x70, 0x61, 0x6e, 0x0d, 0x0a, 0x4b, 0x77, 0x61, 0x6a, 0x61, | ||
| 25 | 0x6c, 0x65, 0x69, 0x6e, 0x0d, 0x0a, 0x4c, 0x69, 0x62, 0x79, 0x61, 0x0d, 0x0a, 0x4d, 0x45, 0x54, | ||
| 26 | 0x0d, 0x0a, 0x4d, 0x53, 0x54, 0x0d, 0x0a, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0d, 0x0a, | ||
| 27 | 0x4e, 0x61, 0x76, 0x61, 0x6a, 0x6f, 0x0d, 0x0a, 0x4e, 0x5a, 0x0d, 0x0a, 0x4e, 0x5a, 0x2d, 0x43, | ||
| 28 | 0x48, 0x41, 0x54, 0x0d, 0x0a, 0x50, 0x6f, 0x6c, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x50, 0x6f, 0x72, | ||
| 29 | 0x74, 0x75, 0x67, 0x61, 0x6c, 0x0d, 0x0a, 0x50, 0x52, 0x43, 0x0d, 0x0a, 0x50, 0x53, 0x54, 0x38, | ||
| 30 | 0x50, 0x44, 0x54, 0x0d, 0x0a, 0x52, 0x4f, 0x43, 0x0d, 0x0a, 0x52, 0x4f, 0x4b, 0x0d, 0x0a, 0x53, | ||
| 31 | 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0d, 0x0a, 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79, | ||
| 32 | 0x0d, 0x0a, 0x55, 0x43, 0x54, 0x0d, 0x0a, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, | ||
| 33 | 0x0d, 0x0a, 0x55, 0x54, 0x43, 0x0d, 0x0a, 0x57, 0x2d, 0x53, 0x55, 0x0d, 0x0a, 0x57, 0x45, 0x54, | ||
| 34 | 0x0d, 0x0a, 0x5a, 0x75, 0x6c, 0x75, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, | ||
| 35 | 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, | ||
| 36 | 0x63, 0x63, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, | ||
| 37 | 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, | ||
| 38 | 0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, | ||
| 39 | 0x2f, 0x41, 0x73, 0x6d, 0x61, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 40 | 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, | ||
| 41 | 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, | ||
| 42 | 0x6e, 0x67, 0x75, 0x69, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, | ||
| 43 | 0x6a, 0x75, 0x6c, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, | ||
| 44 | 0x61, 0x75, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, | ||
| 45 | 0x79, 0x72, 0x65, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, | ||
| 46 | 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 47 | 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, | ||
| 48 | 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 49 | 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, | ||
| 50 | 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, | ||
| 51 | 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, | ||
| 52 | 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, | ||
| 53 | 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0d, 0x0a, 0x41, 0x66, | ||
| 54 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0d, 0x0a, 0x41, | ||
| 55 | 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x66, | ||
| 56 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0d, 0x0a, 0x41, | ||
| 57 | 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0d, 0x0a, | ||
| 58 | 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0d, | ||
| 59 | 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0d, 0x0a, | ||
| 60 | 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, | ||
| 61 | 0x75, 0x72, 0x67, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, | ||
| 62 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, | ||
| 63 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, | ||
| 64 | 0x6d, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, | ||
| 65 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, | ||
| 66 | 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0d, | ||
| 67 | 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, | ||
| 68 | 0x6c, 0x65, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0d, | ||
| 69 | 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0d, 0x0a, | ||
| 70 | 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x68, | ||
| 71 | 0x69, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, | ||
| 72 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0d, | ||
| 73 | 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, 0x0d, 0x0a, | ||
| 74 | 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0d, 0x0a, 0x41, | ||
| 75 | 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0d, 0x0a, 0x41, | ||
| 76 | 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0d, | ||
| 77 | 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, | ||
| 78 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, | ||
| 79 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, | ||
| 80 | 0x61, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, | ||
| 81 | 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, | ||
| 82 | 0x6f, 0x74, 0x74, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, | ||
| 83 | 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 84 | 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, | ||
| 85 | 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0d, 0x0a, 0x41, 0x66, 0x72, | ||
| 86 | 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6d, 0x62, 0x75, 0x6b, 0x74, 0x75, 0x0d, 0x0a, 0x41, 0x66, | ||
| 87 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0d, 0x0a, 0x41, 0x66, | ||
| 88 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0d, 0x0a, 0x41, 0x66, 0x72, 0x69, | ||
| 89 | 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 90 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x61, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 91 | 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 92 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x0d, 0x0a, | ||
| 93 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0d, | ||
| 94 | 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, | ||
| 95 | 0x6e, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, | ||
| 96 | 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, | ||
| 97 | 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x74, 0x69, | ||
| 98 | 0x6b, 0x6f, 0x6b, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, | ||
| 99 | 0x74, 0x6b, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, | ||
| 100 | 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, | ||
| 101 | 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 102 | 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 103 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x65, 0x6d, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 104 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 105 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, | ||
| 106 | 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, 0x56, | ||
| 107 | 0x69, 0x73, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, | ||
| 108 | 0x67, 0x6f, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, | ||
| 109 | 0x69, 0x73, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, | ||
| 110 | 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 111 | 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, | ||
| 112 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x6f, 0x5f, | ||
| 113 | 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 114 | 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 115 | 0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 116 | 0x2f, 0x43, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 117 | 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 118 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 119 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 120 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x0d, | ||
| 121 | 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, | ||
| 122 | 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 123 | 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 124 | 0x2f, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 125 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 126 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 127 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0d, 0x0a, 0x41, | ||
| 128 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x68, | ||
| 129 | 0x61, 0x76, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, | ||
| 130 | 0x73, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, | ||
| 131 | 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72, 0x65, 0x65, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 132 | 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 133 | 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 134 | 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 135 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x0d, 0x0a, | ||
| 136 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, | ||
| 137 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x53, 0x61, 0x6c, | ||
| 138 | 0x76, 0x61, 0x64, 0x6f, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, | ||
| 139 | 0x6e, 0x73, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 140 | 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 141 | 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0d, | ||
| 142 | 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x57, 0x61, | ||
| 143 | 0x79, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6c, 0x61, | ||
| 144 | 0x63, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 145 | 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 146 | 0x2f, 0x47, 0x6f, 0x6f, 0x73, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 147 | 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0d, 0x0a, | ||
| 148 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x0d, | ||
| 149 | 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, | ||
| 150 | 0x75, 0x70, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, | ||
| 151 | 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 152 | 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 153 | 0x63, 0x61, 0x2f, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 154 | 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 155 | 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 156 | 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0d, 0x0a, | ||
| 157 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, | ||
| 158 | 0x6f, 0x6c, 0x69, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, | ||
| 159 | 0x75, 0x76, 0x69, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, | ||
| 160 | 0x61, 0x6c, 0x75, 0x69, 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, | ||
| 161 | 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 162 | 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, | ||
| 163 | 0x75, 0x6e, 0x65, 0x61, 0x75, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, | ||
| 164 | 0x6e, 0x6f, 0x78, 0x5f, 0x49, 0x4e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 165 | 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 166 | 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 167 | 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 168 | 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0d, 0x0a, 0x41, | ||
| 169 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, | ||
| 170 | 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, | ||
| 171 | 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 172 | 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 173 | 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 174 | 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 175 | 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 176 | 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0d, 0x0a, | ||
| 177 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x72, 0x6f, | ||
| 178 | 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, | ||
| 179 | 0x6c, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, | ||
| 180 | 0x64, 0x6f, 0x7a, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, | ||
| 181 | 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 182 | 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 183 | 0x2f, 0x4d, 0x65, 0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 184 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, | ||
| 185 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, | ||
| 186 | 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x63, | ||
| 187 | 0x74, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, | ||
| 188 | 0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 189 | 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 190 | 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 191 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, | ||
| 192 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, | ||
| 193 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, | ||
| 194 | 0x72, 0x6b, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x70, 0x69, | ||
| 195 | 0x67, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d, | ||
| 196 | 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, | ||
| 197 | 0x68, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, | ||
| 198 | 0x61, 0x67, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, | ||
| 199 | 0x61, 0x6d, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, | ||
| 200 | 0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 201 | 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 202 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0d, 0x0a, 0x41, | ||
| 203 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, 0x50, | ||
| 204 | 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, | ||
| 205 | 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x41, 0x63, 0x72, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 206 | 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0d, 0x0a, | ||
| 207 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66, 0x5f, | ||
| 208 | 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, | ||
| 209 | 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 210 | 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, 0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, | ||
| 211 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, | ||
| 212 | 0x52, 0x69, 0x76, 0x65, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, | ||
| 213 | 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65, 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 214 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x63, 0x69, 0x66, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 215 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 216 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x41, | ||
| 217 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, | ||
| 218 | 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x73, 0x61, 0x72, | ||
| 219 | 0x69, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, | ||
| 220 | 0x61, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, | ||
| 221 | 0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 222 | 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 223 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, | ||
| 224 | 0x6e, 0x67, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, | ||
| 225 | 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 226 | 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x73, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 227 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x68, 0x69, 0x70, 0x72, 0x6f, 0x63, 0x6b, 0x0d, 0x0a, | ||
| 228 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x0d, 0x0a, 0x41, | ||
| 229 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74, 0x68, 0x65, | ||
| 230 | 0x6c, 0x65, 0x6d, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, | ||
| 231 | 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 232 | 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 233 | 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 234 | 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0d, 0x0a, 0x41, | ||
| 235 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, | ||
| 236 | 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, | ||
| 237 | 0x5f, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 238 | 0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0d, 0x0a, 0x41, | ||
| 239 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c, 0x65, 0x0d, 0x0a, 0x41, 0x6d, | ||
| 240 | 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, | ||
| 241 | 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, | ||
| 242 | 0x6e, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, | ||
| 243 | 0x6e, 0x74, 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, | ||
| 244 | 0x74, 0x6f, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, | ||
| 245 | 0x6e, 0x63, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 246 | 0x2f, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 247 | 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, | ||
| 248 | 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67, 0x0d, 0x0a, 0x41, | ||
| 249 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x74, 0x0d, 0x0a, | ||
| 250 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, | ||
| 251 | 0x69, 0x66, 0x65, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, | ||
| 252 | 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, | ||
| 253 | 0x72, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, | ||
| 254 | 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x43, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x61, | ||
| 255 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, | ||
| 256 | 0x69, 0x6e, 0x61, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x64, 0x52, 0x69, 0x76, 0x61, 0x64, 0x61, 0x76, | ||
| 257 | 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, | ||
| 258 | 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x0d, 0x0a, 0x41, | ||
| 259 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, | ||
| 260 | 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 261 | 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x52, 0x69, 0x6f, | ||
| 262 | 0x6a, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, | ||
| 263 | 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0d, 0x0a, 0x41, | ||
| 264 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, | ||
| 265 | 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x0d, 0x0a, 0x41, | ||
| 266 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, | ||
| 267 | 0x2f, 0x53, 0x61, 0x6c, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, | ||
| 268 | 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4a, 0x75, | ||
| 269 | 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, | ||
| 270 | 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x0d, 0x0a, | ||
| 271 | 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, | ||
| 272 | 0x61, 0x2f, 0x54, 0x75, 0x63, 0x75, 0x6d, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, | ||
| 273 | 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x55, 0x73, 0x68, | ||
| 274 | 0x75, 0x61, 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, | ||
| 275 | 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, | ||
| 276 | 0x69, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, | ||
| 277 | 0x61, 0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 278 | 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, | ||
| 279 | 0x6f, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, | ||
| 280 | 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0d, 0x0a, 0x41, | ||
| 281 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x54, | ||
| 282 | 0x65, 0x6c, 0x6c, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, | ||
| 283 | 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, 0x76, 0x61, 0x79, 0x0d, | ||
| 284 | 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, | ||
| 285 | 0x2f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 286 | 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, | ||
| 287 | 0x6d, 0x61, 0x63, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x65, 0x6e, | ||
| 288 | 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, | ||
| 289 | 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, | ||
| 290 | 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x0d, 0x0a, 0x41, | ||
| 291 | 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, | ||
| 292 | 0x6f, 0x74, 0x61, 0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, | ||
| 293 | 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, | ||
| 294 | 0x2f, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, | ||
| 295 | 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e, 0x65, | ||
| 296 | 0x77, 0x5f, 0x53, 0x61, 0x6c, 0x65, 0x6d, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, | ||
| 297 | 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, | ||
| 298 | 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0d, 0x0a, 0x41, 0x6e, 0x74, | ||
| 299 | 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, | ||
| 300 | 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, | ||
| 301 | 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0d, 0x0a, 0x41, 0x6e, | ||
| 302 | 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0d, | ||
| 303 | 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x63, 0x4d, 0x75, | ||
| 304 | 0x72, 0x64, 0x6f, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, | ||
| 305 | 0x50, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, | ||
| 306 | 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, | ||
| 307 | 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x50, 0x6f, 0x6c, | ||
| 308 | 0x65, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, | ||
| 309 | 0x6f, 0x77, 0x61, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, | ||
| 310 | 0x54, 0x72, 0x6f, 0x6c, 0x6c, 0x0d, 0x0a, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, | ||
| 311 | 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0d, 0x0a, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, | ||
| 312 | 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0d, 0x0a, 0x41, | ||
| 313 | 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, | ||
| 314 | 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, | ||
| 315 | 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0d, 0x0a, | ||
| 316 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x61, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 317 | 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, | ||
| 318 | 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, | ||
| 319 | 0x6b, 0x68, 0x61, 0x62, 0x61, 0x64, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x74, 0x79, | ||
| 320 | 0x72, 0x61, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, | ||
| 321 | 0x64, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x0d, | ||
| 322 | 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 323 | 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, | ||
| 324 | 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, | ||
| 325 | 0x72, 0x75, 0x74, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, | ||
| 326 | 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x0d, 0x0a, | ||
| 327 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0d, 0x0a, 0x41, | ||
| 328 | 0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, | ||
| 329 | 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 330 | 0x2f, 0x43, 0x68, 0x6f, 0x6e, 0x67, 0x71, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 331 | 0x2f, 0x43, 0x68, 0x75, 0x6e, 0x67, 0x6b, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 332 | 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, | ||
| 333 | 0x61, 0x63, 0x63, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, | ||
| 334 | 0x63, 0x75, 0x73, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0d, | ||
| 335 | 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 336 | 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, | ||
| 337 | 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, | ||
| 338 | 0x67, 0x75, 0x73, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, 0x7a, 0x61, | ||
| 339 | 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x62, 0x69, 0x6e, 0x0d, 0x0a, 0x41, | ||
| 340 | 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 341 | 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 342 | 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x5f, 0x43, | ||
| 343 | 0x68, 0x69, 0x5f, 0x4d, 0x69, 0x6e, 0x68, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, | ||
| 344 | 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x73, 0x74, 0x61, | ||
| 345 | 0x6e, 0x62, 0x75, 0x6c, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x6b, 0x61, 0x72, | ||
| 346 | 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, | ||
| 347 | 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, | ||
| 348 | 0x6d, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0d, 0x0a, 0x41, | ||
| 349 | 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x0d, 0x0a, 0x41, | ||
| 350 | 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0d, 0x0a, 0x41, 0x73, 0x69, | ||
| 351 | 0x61, 0x2f, 0x4b, 0x61, 0x73, 0x68, 0x67, 0x61, 0x72, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, | ||
| 352 | 0x4b, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, | ||
| 353 | 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, | ||
| 354 | 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x6f, | ||
| 355 | 0x6c, 0x6b, 0x61, 0x74, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, | ||
| 356 | 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, | ||
| 357 | 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 358 | 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, | ||
| 359 | 0x75, 0x77, 0x61, 0x69, 0x74, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, | ||
| 360 | 0x6f, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0d, 0x0a, 0x41, | ||
| 361 | 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, | ||
| 362 | 0x61, 0x2f, 0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 363 | 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, | ||
| 364 | 0x73, 0x63, 0x61, 0x74, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, | ||
| 365 | 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, | ||
| 366 | 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, | ||
| 367 | 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, | ||
| 368 | 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x41, | ||
| 369 | 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0d, 0x0a, | ||
| 370 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0d, 0x0a, | ||
| 371 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, 0x0d, 0x0a, | ||
| 372 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 373 | 0x2f, 0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 374 | 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, | ||
| 375 | 0x69, 0x79, 0x61, 0x64, 0x68, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, | ||
| 376 | 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, | ||
| 377 | 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, | ||
| 378 | 0x64, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0d, 0x0a, 0x41, | ||
| 379 | 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x0d, 0x0a, 0x41, 0x73, | ||
| 380 | 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0d, 0x0a, 0x41, 0x73, | ||
| 381 | 0x69, 0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, | ||
| 382 | 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0d, 0x0a, 0x41, | ||
| 383 | 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x41, 0x73, | ||
| 384 | 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, | ||
| 385 | 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, | ||
| 386 | 0x6c, 0x5f, 0x41, 0x76, 0x69, 0x76, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, | ||
| 387 | 0x6d, 0x62, 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, 0x6d, 0x70, 0x68, | ||
| 388 | 0x75, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0d, 0x0a, 0x41, | ||
| 389 | 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, | ||
| 390 | 0x55, 0x6a, 0x75, 0x6e, 0x67, 0x5f, 0x50, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x67, 0x0d, 0x0a, 0x41, | ||
| 391 | 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x0d, | ||
| 392 | 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x6e, 0x5f, 0x42, 0x61, 0x74, 0x6f, 0x72, | ||
| 393 | 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71, 0x69, 0x0d, 0x0a, 0x41, | ||
| 394 | 0x73, 0x69, 0x61, 0x2f, 0x55, 0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x73, | ||
| 395 | 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x73, | ||
| 396 | 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0d, 0x0a, | ||
| 397 | 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0d, 0x0a, 0x41, 0x73, | ||
| 398 | 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6e, 0x67, 0x6f, 0x6e, 0x0d, 0x0a, 0x41, 0x73, 0x69, 0x61, 0x2f, | ||
| 399 | 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0d, 0x0a, 0x41, | ||
| 400 | 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x74, 0x6c, | ||
| 401 | 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x74, | ||
| 402 | 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0d, 0x0a, | ||
| 403 | 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0d, | ||
| 404 | 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, | ||
| 405 | 0x65, 0x72, 0x64, 0x65, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, | ||
| 406 | 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, | ||
| 407 | 0x46, 0x61, 0x72, 0x6f, 0x65, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, | ||
| 408 | 0x4a, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x79, 0x65, 0x6e, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, | ||
| 409 | 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x0d, 0x0a, 0x41, 0x74, 0x6c, | ||
| 410 | 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0d, | ||
| 411 | 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, | ||
| 412 | 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, | ||
| 413 | 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0d, 0x0a, 0x41, 0x74, 0x6c, 0x61, 0x6e, | ||
| 414 | 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0d, 0x0a, 0x41, | ||
| 415 | 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41, 0x43, 0x54, 0x0d, 0x0a, 0x41, 0x75, | ||
| 416 | 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, | ||
| 417 | 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, | ||
| 418 | 0x62, 0x61, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, | ||
| 419 | 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0d, 0x0a, 0x41, 0x75, 0x73, | ||
| 420 | 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x62, 0x65, 0x72, 0x72, 0x61, 0x0d, | ||
| 421 | 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, | ||
| 422 | 0x65, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x72, | ||
| 423 | 0x77, 0x69, 0x6e, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x45, | ||
| 424 | 0x75, 0x63, 0x6c, 0x61, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, | ||
| 425 | 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, | ||
| 426 | 0x61, 0x2f, 0x4c, 0x48, 0x49, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, | ||
| 427 | 0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, | ||
| 428 | 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48, 0x6f, 0x77, 0x65, 0x0d, 0x0a, | ||
| 429 | 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4d, 0x65, 0x6c, 0x62, 0x6f, 0x75, | ||
| 430 | 0x72, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4e, | ||
| 431 | 0x6f, 0x72, 0x74, 0x68, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, | ||
| 432 | 0x4e, 0x53, 0x57, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, | ||
| 433 | 0x65, 0x72, 0x74, 0x68, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, | ||
| 434 | 0x51, 0x75, 0x65, 0x65, 0x6e, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, | ||
| 435 | 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x0d, 0x0a, 0x41, 0x75, 0x73, | ||
| 436 | 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x0d, 0x0a, 0x41, | ||
| 437 | 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x6d, 0x61, 0x6e, 0x69, | ||
| 438 | 0x61, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x63, | ||
| 439 | 0x74, 0x6f, 0x72, 0x69, 0x61, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, | ||
| 440 | 0x2f, 0x57, 0x65, 0x73, 0x74, 0x0d, 0x0a, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, | ||
| 441 | 0x2f, 0x59, 0x61, 0x6e, 0x63, 0x6f, 0x77, 0x69, 0x6e, 0x6e, 0x61, 0x0d, 0x0a, 0x42, 0x72, 0x61, | ||
| 442 | 0x7a, 0x69, 0x6c, 0x2f, 0x41, 0x63, 0x72, 0x65, 0x0d, 0x0a, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, | ||
| 443 | 0x2f, 0x44, 0x65, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0d, 0x0a, 0x42, 0x72, 0x61, 0x7a, | ||
| 444 | 0x69, 0x6c, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x0d, 0x0a, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x2f, | ||
| 445 | 0x57, 0x65, 0x73, 0x74, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x41, 0x74, 0x6c, | ||
| 446 | 0x61, 0x6e, 0x74, 0x69, 0x63, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x43, 0x65, | ||
| 447 | 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x45, 0x61, | ||
| 448 | 0x73, 0x74, 0x2d, 0x53, 0x61, 0x73, 0x6b, 0x61, 0x74, 0x63, 0x68, 0x65, 0x77, 0x61, 0x6e, 0x0d, | ||
| 449 | 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x0d, | ||
| 450 | 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, | ||
| 451 | 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x66, 0x6f, 0x75, 0x6e, | ||
| 452 | 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x50, 0x61, | ||
| 453 | 0x63, 0x69, 0x66, 0x69, 0x63, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x2f, 0x53, 0x61, | ||
| 454 | 0x73, 0x6b, 0x61, 0x74, 0x63, 0x68, 0x65, 0x77, 0x61, 0x6e, 0x0d, 0x0a, 0x43, 0x61, 0x6e, 0x61, | ||
| 455 | 0x64, 0x61, 0x2f, 0x59, 0x75, 0x6b, 0x6f, 0x6e, 0x0d, 0x0a, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x2f, | ||
| 456 | 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x0d, 0x0a, 0x43, 0x68, 0x69, | ||
| 457 | 0x6c, 0x65, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x0d, | ||
| 458 | 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, | ||
| 459 | 0x54, 0x2b, 0x30, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0d, 0x0a, | ||
| 460 | 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, | ||
| 461 | 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, | ||
| 462 | 0x31, 0x32, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x32, 0x0d, 0x0a, 0x45, | ||
| 463 | 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, | ||
| 464 | 0x54, 0x2b, 0x34, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0d, 0x0a, | ||
| 465 | 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x36, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, | ||
| 466 | 0x4d, 0x54, 0x2b, 0x37, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0d, | ||
| 467 | 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, | ||
| 468 | 0x47, 0x4d, 0x54, 0x2d, 0x30, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, | ||
| 469 | 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0d, 0x0a, 0x45, 0x74, | ||
| 470 | 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, | ||
| 471 | 0x54, 0x2d, 0x31, 0x32, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, | ||
| 472 | 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0d, 0x0a, 0x45, 0x74, | ||
| 473 | 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, | ||
| 474 | 0x2d, 0x33, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0d, 0x0a, 0x45, | ||
| 475 | 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, | ||
| 476 | 0x54, 0x2d, 0x36, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 0x0d, 0x0a, | ||
| 477 | 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, | ||
| 478 | 0x4d, 0x54, 0x2d, 0x39, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x30, 0x0d, 0x0a, | ||
| 479 | 0x45, 0x74, 0x63, 0x2f, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x77, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x45, | ||
| 480 | 0x74, 0x63, 0x2f, 0x55, 0x43, 0x54, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x6e, 0x69, 0x76, | ||
| 481 | 0x65, 0x72, 0x73, 0x61, 0x6c, 0x0d, 0x0a, 0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0d, 0x0a, | ||
| 482 | 0x45, 0x74, 0x63, 0x2f, 0x5a, 0x75, 0x6c, 0x75, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 483 | 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, | ||
| 484 | 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, | ||
| 485 | 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x0d, 0x0a, 0x45, 0x75, | ||
| 486 | 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0d, 0x0a, 0x45, 0x75, 0x72, | ||
| 487 | 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x66, 0x61, 0x73, 0x74, 0x0d, 0x0a, 0x45, 0x75, 0x72, | ||
| 488 | 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0d, 0x0a, 0x45, 0x75, | ||
| 489 | 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, | ||
| 490 | 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x0d, 0x0a, | ||
| 491 | 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0d, | ||
| 492 | 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, | ||
| 493 | 0x74, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, | ||
| 494 | 0x73, 0x74, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, 0x69, 0x6e, | ||
| 495 | 0x67, 0x65, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, | ||
| 496 | 0x69, 0x6e, 0x61, 0x75, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x6f, 0x70, | ||
| 497 | 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 498 | 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, | ||
| 499 | 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 500 | 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, | ||
| 501 | 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, | ||
| 502 | 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0d, 0x0a, | ||
| 503 | 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0d, | ||
| 504 | 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x0d, 0x0a, | ||
| 505 | 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, | ||
| 506 | 0x61, 0x64, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0d, | ||
| 507 | 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x0d, 0x0a, 0x45, | ||
| 508 | 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x0d, 0x0a, 0x45, 0x75, | ||
| 509 | 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0d, 0x0a, | ||
| 510 | 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0d, 0x0a, 0x45, | ||
| 511 | 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, | ||
| 512 | 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x0d, | ||
| 513 | 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0d, 0x0a, 0x45, | ||
| 514 | 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, 0x0d, | ||
| 515 | 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, 0x6b, 0x0d, 0x0a, 0x45, | ||
| 516 | 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0d, 0x0a, 0x45, 0x75, | ||
| 517 | 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0d, 0x0a, 0x45, 0x75, 0x72, | ||
| 518 | 0x6f, 0x70, 0x65, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, | ||
| 519 | 0x6f, 0x70, 0x65, 0x2f, 0x4f, 0x73, 0x6c, 0x6f, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 520 | 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, | ||
| 521 | 0x6f, 0x64, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 522 | 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 523 | 0x52, 0x69, 0x67, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, | ||
| 524 | 0x65, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, | ||
| 525 | 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, | ||
| 526 | 0x69, 0x6e, 0x6f, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, | ||
| 527 | 0x6a, 0x65, 0x76, 0x6f, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, | ||
| 528 | 0x61, 0x74, 0x6f, 0x76, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, | ||
| 529 | 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 530 | 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, | ||
| 531 | 0x6f, 0x66, 0x69, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, | ||
| 532 | 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, | ||
| 533 | 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, | ||
| 534 | 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x69, | ||
| 535 | 0x72, 0x61, 0x73, 0x70, 0x6f, 0x6c, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, | ||
| 536 | 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 537 | 0x2f, 0x55, 0x7a, 0x68, 0x67, 0x6f, 0x72, 0x6f, 0x64, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, | ||
| 538 | 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 539 | 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 540 | 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, | ||
| 541 | 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, | ||
| 542 | 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, | ||
| 543 | 0x2f, 0x57, 0x61, 0x72, 0x73, 0x61, 0x77, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, | ||
| 544 | 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, | ||
| 545 | 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, 0x79, 0x65, 0x0d, 0x0a, 0x45, 0x75, 0x72, 0x6f, 0x70, | ||
| 546 | 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, | ||
| 547 | 0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0d, 0x0a, 0x49, | ||
| 548 | 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x0d, 0x0a, 0x49, 0x6e, | ||
| 549 | 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0d, 0x0a, | ||
| 550 | 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0d, 0x0a, 0x49, 0x6e, | ||
| 551 | 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0d, 0x0a, 0x49, 0x6e, 0x64, | ||
| 552 | 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, 0x65, 0x6e, 0x0d, 0x0a, 0x49, | ||
| 553 | 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, 0x0d, 0x0a, 0x49, 0x6e, 0x64, 0x69, | ||
| 554 | 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x0d, 0x0a, 0x49, 0x6e, 0x64, | ||
| 555 | 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0d, 0x0a, 0x49, | ||
| 556 | 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0d, 0x0a, 0x49, | ||
| 557 | 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x4d, | ||
| 558 | 0x65, 0x78, 0x69, 0x63, 0x6f, 0x2f, 0x42, 0x61, 0x6a, 0x61, 0x4e, 0x6f, 0x72, 0x74, 0x65, 0x0d, | ||
| 559 | 0x0a, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x2f, 0x42, 0x61, 0x6a, 0x61, 0x53, 0x75, 0x72, 0x0d, | ||
| 560 | 0x0a, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x2f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x0d, | ||
| 561 | 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0d, 0x0a, 0x50, | ||
| 562 | 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0d, | ||
| 563 | 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, | ||
| 564 | 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x43, | ||
| 565 | 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, | ||
| 566 | 0x43, 0x68, 0x75, 0x75, 0x6b, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, | ||
| 567 | 0x61, 0x73, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, | ||
| 568 | 0x66, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, | ||
| 569 | 0x64, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, | ||
| 570 | 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 571 | 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, | ||
| 572 | 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 573 | 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x0d, 0x0a, 0x50, 0x61, 0x63, | ||
| 574 | 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x0d, 0x0a, 0x50, 0x61, | ||
| 575 | 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, | ||
| 576 | 0x6c, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0d, | ||
| 577 | 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, | ||
| 578 | 0x75, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, | ||
| 579 | 0x74, 0x6f, 0x6e, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, | ||
| 580 | 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, | ||
| 581 | 0x2f, 0x4b, 0x6f, 0x73, 0x72, 0x61, 0x65, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, | ||
| 582 | 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, | ||
| 583 | 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, | ||
| 584 | 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 0x0d, 0x0a, 0x50, | ||
| 585 | 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0d, 0x0a, 0x50, | ||
| 586 | 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0d, 0x0a, 0x50, 0x61, | ||
| 587 | 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75, 0x65, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, | ||
| 588 | 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0d, 0x0a, 0x50, 0x61, 0x63, | ||
| 589 | 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0d, 0x0a, 0x50, 0x61, 0x63, | ||
| 590 | 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0d, 0x0a, | ||
| 591 | 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0d, 0x0a, 0x50, | ||
| 592 | 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x0d, | ||
| 593 | 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x68, 0x6e, 0x70, 0x65, 0x69, | ||
| 594 | 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x6e, 0x61, 0x70, 0x65, | ||
| 595 | 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, | ||
| 596 | 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, | ||
| 597 | 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, | ||
| 598 | 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, 0x70, 0x61, 0x6e, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, | ||
| 599 | 0x69, 0x63, 0x2f, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 600 | 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 601 | 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 602 | 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0d, 0x0a, 0x50, 0x61, 0x63, | ||
| 603 | 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, | ||
| 604 | 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, | ||
| 605 | 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0d, 0x0a, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, | ||
| 606 | 0x2f, 0x59, 0x61, 0x70, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61, 0x0d, | ||
| 607 | 0x0a, 0x55, 0x53, 0x2f, 0x41, 0x6c, 0x65, 0x75, 0x74, 0x69, 0x61, 0x6e, 0x0d, 0x0a, 0x55, 0x53, | ||
| 608 | 0x2f, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x43, 0x65, 0x6e, | ||
| 609 | 0x74, 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x2d, 0x49, 0x6e, | ||
| 610 | 0x64, 0x69, 0x61, 0x6e, 0x61, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, | ||
| 611 | 0x6e, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x0d, 0x0a, 0x55, 0x53, | ||
| 612 | 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2d, 0x53, 0x74, 0x61, 0x72, 0x6b, 0x65, 0x0d, | ||
| 613 | 0x0a, 0x55, 0x53, 0x2f, 0x4d, 0x69, 0x63, 0x68, 0x69, 0x67, 0x61, 0x6e, 0x0d, 0x0a, 0x55, 0x53, | ||
| 614 | 0x2f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x50, 0x61, | ||
| 615 | 0x63, 0x69, 0x66, 0x69, 0x63, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, | ||
| 616 | 0x63, 0x2d, 0x4e, 0x65, 0x77, 0x0d, 0x0a, 0x55, 0x53, 0x2f, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x0d, | ||
| 617 | 0x0a}; | ||
| 618 | 12 | ||
| 619 | static VirtualFile GenerateDefaultTimeZoneFile() { | 13 | namespace FileSys::SystemArchive { |
| 620 | struct TimeZoneInfo { | ||
| 621 | s64_be at; | ||
| 622 | std::array<u8, 7> padding1; | ||
| 623 | std::array<char, 4> time_zone_chars; | ||
| 624 | std::array<u8, 2> padding2; | ||
| 625 | std::array<char, 6> time_zone_name; | ||
| 626 | }; | ||
| 627 | 14 | ||
| 628 | VirtualFile file{std::make_shared<VectorVfsFile>( | 15 | const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&> |
| 629 | std::vector<u8>(sizeof(Service::Time::TimeZone::TzifHeader) + sizeof(TimeZoneInfo)), | 16 | tzdb_zoneinfo_dirs = {{"Africa", NxTzdb::africa}, |
| 630 | "GMT")}; | 17 | {"America", NxTzdb::america}, |
| 18 | {"Antartica", NxTzdb::antartica}, | ||
| 19 | {"Arctic", NxTzdb::arctic}, | ||
| 20 | {"Asia", NxTzdb::asia}, | ||
| 21 | {"Atlantic", NxTzdb::atlantic}, | ||
| 22 | {"Australia", NxTzdb::australia}, | ||
| 23 | {"Brazil", NxTzdb::brazil}, | ||
| 24 | {"Canada", NxTzdb::canada}, | ||
| 25 | {"Chile", NxTzdb::chile}, | ||
| 26 | {"Etc", NxTzdb::etc}, | ||
| 27 | {"Europe", NxTzdb::europe}, | ||
| 28 | {"Indian", NxTzdb::indian}, | ||
| 29 | {"Mexico", NxTzdb::mexico}, | ||
| 30 | {"Pacific", NxTzdb::pacific}, | ||
| 31 | {"US", NxTzdb::us}}; | ||
| 631 | 32 | ||
| 632 | const Service::Time::TimeZone::TzifHeader header{ | 33 | const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&> |
| 633 | .magic = 0x545a6966, | 34 | tzdb_america_dirs = {{"Argentina", NxTzdb::america_argentina}, |
| 634 | .version = 0x32, | 35 | {"Indiana", NxTzdb::america_indiana}, |
| 635 | .ttis_gmt_count = 1, | 36 | {"Kentucky", NxTzdb::america_kentucky}, |
| 636 | .ttis_std_count = 1, | 37 | {"North_Dakota", NxTzdb::america_north_dakota}}; |
| 637 | .time_count = 1, | ||
| 638 | .type_count = 1, | ||
| 639 | .char_count = 4, | ||
| 640 | }; | ||
| 641 | file->WriteObject(header, 0); | ||
| 642 | 38 | ||
| 643 | const TimeZoneInfo time_zone_info{ | 39 | static void GenerateFiles(std::vector<VirtualFile>& directory, |
| 644 | .at = 0xf8, | 40 | const std::map<const char*, const std::vector<u8>>& files) { |
| 645 | .padding1 = {}, | 41 | for (const auto& [filename, data] : files) { |
| 646 | .time_zone_chars = {'G', 'M', 'T', '\0'}, | 42 | const auto data_copy{data}; |
| 647 | .padding2 = {}, | 43 | const std::string filename_copy{filename}; |
| 648 | .time_zone_name = {'\n', 'G', 'M', 'T', '0', '\n'}, | 44 | VirtualFile file{ |
| 649 | }; | 45 | std::make_shared<VectorVfsFile>(std::move(data_copy), std::move(filename_copy))}; |
| 650 | file->WriteObject(time_zone_info, sizeof(Service::Time::TimeZone::TzifHeader)); | 46 | directory.push_back(file); |
| 47 | } | ||
| 48 | } | ||
| 651 | 49 | ||
| 652 | return file; | 50 | static std::vector<VirtualFile> GenerateZoneinfoFiles() { |
| 51 | std::vector<VirtualFile> zoneinfo_files; | ||
| 52 | GenerateFiles(zoneinfo_files, NxTzdb::zoneinfo); | ||
| 53 | return zoneinfo_files; | ||
| 653 | } | 54 | } |
| 654 | 55 | ||
| 655 | VirtualDir TimeZoneBinary() { | 56 | VirtualDir TimeZoneBinary() { |
| 656 | std::vector<VirtualDir> root_dirs{std::make_shared<VectorVfsDirectory>( | 57 | std::vector<VirtualDir> america_sub_dirs; |
| 657 | std::vector<VirtualFile>{GenerateDefaultTimeZoneFile()}, std::vector<VirtualDir>{}, | 58 | for (const auto& [dir_name, files] : tzdb_america_dirs) { |
| 658 | "zoneinfo")}; | 59 | std::vector<VirtualFile> vfs_files; |
| 659 | std::vector<VirtualFile> root_files{MakeArrayFile(LOCATION_NAMES, "binaryList.txt")}; | 60 | GenerateFiles(vfs_files, files); |
| 61 | america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>( | ||
| 62 | std::move(vfs_files), std::vector<VirtualDir>{}, dir_name)); | ||
| 63 | } | ||
| 64 | |||
| 65 | std::vector<VirtualDir> zoneinfo_sub_dirs; | ||
| 66 | for (const auto& [dir_name, files] : tzdb_zoneinfo_dirs) { | ||
| 67 | std::vector<VirtualFile> vfs_files; | ||
| 68 | GenerateFiles(vfs_files, files); | ||
| 69 | if (dir_name == "America") { | ||
| 70 | zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>( | ||
| 71 | std::move(vfs_files), std::move(america_sub_dirs), dir_name)); | ||
| 72 | } else { | ||
| 73 | zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>( | ||
| 74 | std::move(vfs_files), std::vector<VirtualDir>{}, dir_name)); | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | std::vector<VirtualDir> zoneinfo_dir{std::make_shared<VectorVfsDirectory>( | ||
| 79 | GenerateZoneinfoFiles(), std::move(zoneinfo_sub_dirs), "zoneinfo")}; | ||
| 80 | std::vector<VirtualFile> root_files; | ||
| 81 | GenerateFiles(root_files, NxTzdb::base); | ||
| 660 | 82 | ||
| 661 | return std::make_shared<VectorVfsDirectory>(std::move(root_files), std::move(root_dirs), | 83 | return std::make_shared<VectorVfsDirectory>(std::move(root_files), std::move(zoneinfo_dir), |
| 662 | "data"); | 84 | "data"); |
| 663 | } | 85 | } |
| 664 | 86 | ||
diff --git a/src/core/hle/service/time/time_manager.cpp b/src/core/hle/service/time/time_manager.cpp index 28667710e..fa0fd0531 100644 --- a/src/core/hle/service/time/time_manager.cpp +++ b/src/core/hle/service/time/time_manager.cpp | |||
| @@ -22,10 +22,6 @@ s64 GetSecondsSinceEpoch() { | |||
| 22 | return std::chrono::duration_cast<std::chrono::seconds>(time_since_epoch).count() + | 22 | return std::chrono::duration_cast<std::chrono::seconds>(time_since_epoch).count() + |
| 23 | Settings::values.custom_rtc_differential; | 23 | Settings::values.custom_rtc_differential; |
| 24 | } | 24 | } |
| 25 | |||
| 26 | s64 GetExternalRtcValue() { | ||
| 27 | return GetSecondsSinceEpoch() + TimeManager::GetExternalTimeZoneOffset(); | ||
| 28 | } | ||
| 29 | } // Anonymous namespace | 25 | } // Anonymous namespace |
| 30 | 26 | ||
| 31 | struct TimeManager::Impl final { | 27 | struct TimeManager::Impl final { |
| @@ -43,7 +39,7 @@ struct TimeManager::Impl final { | |||
| 43 | std::make_shared<Clock::EphemeralNetworkSystemClockContextWriter>()}, | 39 | std::make_shared<Clock::EphemeralNetworkSystemClockContextWriter>()}, |
| 44 | time_zone_content_manager{system} { | 40 | time_zone_content_manager{system} { |
| 45 | 41 | ||
| 46 | const auto system_time{Clock::TimeSpanType::FromSeconds(GetExternalRtcValue())}; | 42 | const auto system_time{Clock::TimeSpanType::FromSeconds(GetSecondsSinceEpoch())}; |
| 47 | SetupStandardSteadyClock(system, Common::UUID::MakeRandom(), system_time, {}, {}); | 43 | SetupStandardSteadyClock(system, Common::UUID::MakeRandom(), system_time, {}, {}); |
| 48 | SetupStandardLocalSystemClock(system, {}, system_time.ToSeconds()); | 44 | SetupStandardLocalSystemClock(system, {}, system_time.ToSeconds()); |
| 49 | 45 | ||
| @@ -107,7 +103,7 @@ struct TimeManager::Impl final { | |||
| 107 | 103 | ||
| 108 | void SetupTimeZoneManager(std::string location_name, | 104 | void SetupTimeZoneManager(std::string location_name, |
| 109 | Clock::SteadyClockTimePoint time_zone_updated_time_point, | 105 | Clock::SteadyClockTimePoint time_zone_updated_time_point, |
| 110 | std::size_t total_location_name_count, u128 time_zone_rule_version, | 106 | std::vector<std::string> location_names, u128 time_zone_rule_version, |
| 111 | FileSys::VirtualFile& vfs_file) { | 107 | FileSys::VirtualFile& vfs_file) { |
| 112 | if (time_zone_content_manager.GetTimeZoneManager().SetDeviceLocationNameWithTimeZoneRule( | 108 | if (time_zone_content_manager.GetTimeZoneManager().SetDeviceLocationNameWithTimeZoneRule( |
| 113 | location_name, vfs_file) != ResultSuccess) { | 109 | location_name, vfs_file) != ResultSuccess) { |
| @@ -117,20 +113,13 @@ struct TimeManager::Impl final { | |||
| 117 | 113 | ||
| 118 | time_zone_content_manager.GetTimeZoneManager().SetUpdatedTime(time_zone_updated_time_point); | 114 | time_zone_content_manager.GetTimeZoneManager().SetUpdatedTime(time_zone_updated_time_point); |
| 119 | time_zone_content_manager.GetTimeZoneManager().SetTotalLocationNameCount( | 115 | time_zone_content_manager.GetTimeZoneManager().SetTotalLocationNameCount( |
| 120 | total_location_name_count); | 116 | location_names.size()); |
| 117 | time_zone_content_manager.GetTimeZoneManager().SetLocationNames(location_names); | ||
| 121 | time_zone_content_manager.GetTimeZoneManager().SetTimeZoneRuleVersion( | 118 | time_zone_content_manager.GetTimeZoneManager().SetTimeZoneRuleVersion( |
| 122 | time_zone_rule_version); | 119 | time_zone_rule_version); |
| 123 | time_zone_content_manager.GetTimeZoneManager().MarkAsInitialized(); | 120 | time_zone_content_manager.GetTimeZoneManager().MarkAsInitialized(); |
| 124 | } | 121 | } |
| 125 | 122 | ||
| 126 | static s64 GetExternalTimeZoneOffset() { | ||
| 127 | // With "auto" timezone setting, we use the external system's timezone offset | ||
| 128 | if (Settings::GetTimeZoneString() == "auto") { | ||
| 129 | return Common::TimeZone::GetCurrentOffsetSeconds().count(); | ||
| 130 | } | ||
| 131 | return 0; | ||
| 132 | } | ||
| 133 | |||
| 134 | void SetupStandardSteadyClock(Core::System& system_, Common::UUID clock_source_id, | 123 | void SetupStandardSteadyClock(Core::System& system_, Common::UUID clock_source_id, |
| 135 | Clock::TimeSpanType setup_value, | 124 | Clock::TimeSpanType setup_value, |
| 136 | Clock::TimeSpanType internal_offset, bool is_rtc_reset_detected) { | 125 | Clock::TimeSpanType internal_offset, bool is_rtc_reset_detected) { |
| @@ -295,19 +284,10 @@ void TimeManager::UpdateLocalSystemClockTime(s64 posix_time) { | |||
| 295 | 284 | ||
| 296 | void TimeManager::SetupTimeZoneManager(std::string location_name, | 285 | void TimeManager::SetupTimeZoneManager(std::string location_name, |
| 297 | Clock::SteadyClockTimePoint time_zone_updated_time_point, | 286 | Clock::SteadyClockTimePoint time_zone_updated_time_point, |
| 298 | std::size_t total_location_name_count, | 287 | std::vector<std::string> location_names, |
| 299 | u128 time_zone_rule_version, | 288 | u128 time_zone_rule_version, |
| 300 | FileSys::VirtualFile& vfs_file) { | 289 | FileSys::VirtualFile& vfs_file) { |
| 301 | impl->SetupTimeZoneManager(location_name, time_zone_updated_time_point, | 290 | impl->SetupTimeZoneManager(location_name, time_zone_updated_time_point, location_names, |
| 302 | total_location_name_count, time_zone_rule_version, vfs_file); | 291 | time_zone_rule_version, vfs_file); |
| 303 | } | 292 | } |
| 304 | |||
| 305 | /*static*/ s64 TimeManager::GetExternalTimeZoneOffset() { | ||
| 306 | // With "auto" timezone setting, we use the external system's timezone offset | ||
| 307 | if (Settings::GetTimeZoneString() == "auto") { | ||
| 308 | return Common::TimeZone::GetCurrentOffsetSeconds().count(); | ||
| 309 | } | ||
| 310 | return 0; | ||
| 311 | } | ||
| 312 | |||
| 313 | } // namespace Service::Time | 293 | } // namespace Service::Time |
diff --git a/src/core/hle/service/time/time_manager.h b/src/core/hle/service/time/time_manager.h index 4f046f266..84572dbfa 100644 --- a/src/core/hle/service/time/time_manager.h +++ b/src/core/hle/service/time/time_manager.h | |||
| @@ -61,11 +61,9 @@ public: | |||
| 61 | 61 | ||
| 62 | void SetupTimeZoneManager(std::string location_name, | 62 | void SetupTimeZoneManager(std::string location_name, |
| 63 | Clock::SteadyClockTimePoint time_zone_updated_time_point, | 63 | Clock::SteadyClockTimePoint time_zone_updated_time_point, |
| 64 | std::size_t total_location_name_count, u128 time_zone_rule_version, | 64 | std::vector<std::string> location_names, u128 time_zone_rule_version, |
| 65 | FileSys::VirtualFile& vfs_file); | 65 | FileSys::VirtualFile& vfs_file); |
| 66 | 66 | ||
| 67 | static s64 GetExternalTimeZoneOffset(); | ||
| 68 | |||
| 69 | private: | 67 | private: |
| 70 | Core::System& system; | 68 | Core::System& system; |
| 71 | 69 | ||
diff --git a/src/core/hle/service/time/time_zone_content_manager.cpp b/src/core/hle/service/time/time_zone_content_manager.cpp index afbfe9715..5d60be67a 100644 --- a/src/core/hle/service/time/time_zone_content_manager.cpp +++ b/src/core/hle/service/time/time_zone_content_manager.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include <chrono> | ||
| 4 | #include <sstream> | 5 | #include <sstream> |
| 5 | 6 | ||
| 6 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| @@ -12,7 +13,11 @@ | |||
| 12 | #include "core/file_sys/registered_cache.h" | 13 | #include "core/file_sys/registered_cache.h" |
| 13 | #include "core/file_sys/romfs.h" | 14 | #include "core/file_sys/romfs.h" |
| 14 | #include "core/file_sys/system_archive/system_archive.h" | 15 | #include "core/file_sys/system_archive/system_archive.h" |
| 16 | #include "core/file_sys/vfs.h" | ||
| 17 | #include "core/file_sys/vfs_types.h" | ||
| 18 | #include "core/hle/result.h" | ||
| 15 | #include "core/hle/service/filesystem/filesystem.h" | 19 | #include "core/hle/service/filesystem/filesystem.h" |
| 20 | #include "core/hle/service/time/errors.h" | ||
| 16 | #include "core/hle/service/time/time_manager.h" | 21 | #include "core/hle/service/time/time_manager.h" |
| 17 | #include "core/hle/service/time/time_zone_content_manager.h" | 22 | #include "core/hle/service/time/time_zone_content_manager.h" |
| 18 | 23 | ||
| @@ -71,19 +76,13 @@ TimeZoneContentManager::TimeZoneContentManager(Core::System& system_) | |||
| 71 | : system{system_}, location_name_cache{BuildLocationNameCache(system)} {} | 76 | : system{system_}, location_name_cache{BuildLocationNameCache(system)} {} |
| 72 | 77 | ||
| 73 | void TimeZoneContentManager::Initialize(TimeManager& time_manager) { | 78 | void TimeZoneContentManager::Initialize(TimeManager& time_manager) { |
| 74 | std::string location_name; | ||
| 75 | const auto timezone_setting = Settings::GetTimeZoneString(); | 79 | const auto timezone_setting = Settings::GetTimeZoneString(); |
| 76 | if (timezone_setting == "auto" || timezone_setting == "default") { | ||
| 77 | location_name = Common::TimeZone::GetDefaultTimeZone(); | ||
| 78 | } else { | ||
| 79 | location_name = timezone_setting; | ||
| 80 | } | ||
| 81 | 80 | ||
| 82 | if (FileSys::VirtualFile vfs_file; | 81 | if (FileSys::VirtualFile vfs_file; |
| 83 | GetTimeZoneInfoFile(location_name, vfs_file) == ResultSuccess) { | 82 | GetTimeZoneInfoFile(timezone_setting, vfs_file) == ResultSuccess) { |
| 84 | const auto time_point{ | 83 | const auto time_point{ |
| 85 | time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(system)}; | 84 | time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(system)}; |
| 86 | time_manager.SetupTimeZoneManager(location_name, time_point, location_name_cache.size(), {}, | 85 | time_manager.SetupTimeZoneManager(timezone_setting, time_point, location_name_cache, {}, |
| 87 | vfs_file); | 86 | vfs_file); |
| 88 | } else { | 87 | } else { |
| 89 | time_zone_manager.MarkAsInitialized(); | 88 | time_zone_manager.MarkAsInitialized(); |
| @@ -126,8 +125,15 @@ Result TimeZoneContentManager::GetTimeZoneInfoFile(const std::string& location_n | |||
| 126 | 125 | ||
| 127 | vfs_file = zoneinfo_dir->GetFileRelative(location_name); | 126 | vfs_file = zoneinfo_dir->GetFileRelative(location_name); |
| 128 | if (!vfs_file) { | 127 | if (!vfs_file) { |
| 129 | LOG_ERROR(Service_Time, "{:016X} has no file \"{}\"! Using default timezone.", | 128 | LOG_WARNING(Service_Time, "{:016X} has no file \"{}\"! Using system timezone.", |
| 130 | time_zone_binary_titleid, location_name); | 129 | time_zone_binary_titleid, location_name); |
| 130 | const std::string system_time_zone{Common::TimeZone::FindSystemTimeZone()}; | ||
| 131 | vfs_file = zoneinfo_dir->GetFile(system_time_zone); | ||
| 132 | } | ||
| 133 | |||
| 134 | if (!vfs_file) { | ||
| 135 | LOG_WARNING(Service_Time, "{:016X} has no file \"{}\"! Using default timezone.", | ||
| 136 | time_zone_binary_titleid, location_name); | ||
| 131 | vfs_file = zoneinfo_dir->GetFile(Common::TimeZone::GetDefaultTimeZone()); | 137 | vfs_file = zoneinfo_dir->GetFile(Common::TimeZone::GetDefaultTimeZone()); |
| 132 | } | 138 | } |
| 133 | 139 | ||
diff --git a/src/core/hle/service/time/time_zone_manager.cpp b/src/core/hle/service/time/time_zone_manager.cpp index 973f7837a..e1728c06d 100644 --- a/src/core/hle/service/time/time_zone_manager.cpp +++ b/src/core/hle/service/time/time_zone_manager.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include <climits> | 4 | #include <climits> |
| 5 | #include <limits> | ||
| 5 | 6 | ||
| 6 | #include "common/assert.h" | 7 | #include "common/assert.h" |
| 7 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| @@ -9,6 +10,7 @@ | |||
| 9 | #include "core/file_sys/nca_metadata.h" | 10 | #include "core/file_sys/nca_metadata.h" |
| 10 | #include "core/file_sys/registered_cache.h" | 11 | #include "core/file_sys/registered_cache.h" |
| 11 | #include "core/hle/service/time/time_zone_manager.h" | 12 | #include "core/hle/service/time/time_zone_manager.h" |
| 13 | #include "core/hle/service/time/time_zone_types.h" | ||
| 12 | 14 | ||
| 13 | namespace Service::Time::TimeZone { | 15 | namespace Service::Time::TimeZone { |
| 14 | 16 | ||
| @@ -128,10 +130,10 @@ static constexpr int GetQZName(const char* name, int offset, char delimiter) { | |||
| 128 | } | 130 | } |
| 129 | 131 | ||
| 130 | static constexpr int GetTZName(const char* name, int offset) { | 132 | static constexpr int GetTZName(const char* name, int offset) { |
| 131 | for (char value{name[offset]}; | 133 | char c; |
| 132 | value != '\0' && !IsDigit(value) && value != ',' && value != '-' && value != '+'; | 134 | |
| 133 | offset++) { | 135 | while ((c = name[offset]) != '\0' && !IsDigit(c) && c != ',' && c != '-' && c != '+') { |
| 134 | value = name[offset]; | 136 | ++offset; |
| 135 | } | 137 | } |
| 136 | return offset; | 138 | return offset; |
| 137 | } | 139 | } |
| @@ -147,6 +149,7 @@ static constexpr bool GetInteger(const char* name, int& offset, int& value, int | |||
| 147 | if (value > max) { | 149 | if (value > max) { |
| 148 | return {}; | 150 | return {}; |
| 149 | } | 151 | } |
| 152 | offset++; | ||
| 150 | temp = name[offset]; | 153 | temp = name[offset]; |
| 151 | } while (IsDigit(temp)); | 154 | } while (IsDigit(temp)); |
| 152 | 155 | ||
| @@ -471,6 +474,13 @@ static bool ParsePosixName(const char* name, TimeZoneRule& rule) { | |||
| 471 | their_std_offset = their_offset; | 474 | their_std_offset = their_offset; |
| 472 | } | 475 | } |
| 473 | } | 476 | } |
| 477 | |||
| 478 | if (rule.time_count > 0) { | ||
| 479 | UNIMPLEMENTED(); | ||
| 480 | // TODO (lat9nq): Implement eggert/tz/localtime.c:tzparse:1329 | ||
| 481 | // Seems to be unused in yuzu for now: I never hit the UNIMPLEMENTED in testing | ||
| 482 | } | ||
| 483 | |||
| 474 | rule.ttis[0].gmt_offset = -std_offset; | 484 | rule.ttis[0].gmt_offset = -std_offset; |
| 475 | rule.ttis[0].is_dst = false; | 485 | rule.ttis[0].is_dst = false; |
| 476 | rule.ttis[0].abbreviation_list_index = 0; | 486 | rule.ttis[0].abbreviation_list_index = 0; |
| @@ -514,6 +524,7 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi | |||
| 514 | 524 | ||
| 515 | constexpr s32 time_zone_max_leaps{50}; | 525 | constexpr s32 time_zone_max_leaps{50}; |
| 516 | constexpr s32 time_zone_max_chars{50}; | 526 | constexpr s32 time_zone_max_chars{50}; |
| 527 | constexpr s32 time_zone_max_times{1000}; | ||
| 517 | if (!(0 <= header.leap_count && header.leap_count < time_zone_max_leaps && | 528 | if (!(0 <= header.leap_count && header.leap_count < time_zone_max_leaps && |
| 518 | 0 < header.type_count && header.type_count < s32(time_zone_rule.ttis.size()) && | 529 | 0 < header.type_count && header.type_count < s32(time_zone_rule.ttis.size()) && |
| 519 | 0 <= header.time_count && header.time_count < s32(time_zone_rule.ats.size()) && | 530 | 0 <= header.time_count && header.time_count < s32(time_zone_rule.ats.size()) && |
| @@ -546,7 +557,7 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi | |||
| 546 | for (int index{}; index < time_zone_rule.time_count; ++index) { | 557 | for (int index{}; index < time_zone_rule.time_count; ++index) { |
| 547 | const u8 type{*vfs_file->ReadByte(read_offset)}; | 558 | const u8 type{*vfs_file->ReadByte(read_offset)}; |
| 548 | read_offset += sizeof(u8); | 559 | read_offset += sizeof(u8); |
| 549 | if (time_zone_rule.time_count <= type) { | 560 | if (time_zone_rule.type_count <= type) { |
| 550 | return {}; | 561 | return {}; |
| 551 | } | 562 | } |
| 552 | if (time_zone_rule.types[index] != 0) { | 563 | if (time_zone_rule.types[index] != 0) { |
| @@ -624,16 +635,109 @@ static bool ParseTimeZoneBinary(TimeZoneRule& time_zone_rule, FileSys::VirtualFi | |||
| 624 | std::array<char, time_zone_name_max> name{}; | 635 | std::array<char, time_zone_name_max> name{}; |
| 625 | std::memcpy(name.data(), temp_name.data() + 1, std::size_t(bytes_read - 1)); | 636 | std::memcpy(name.data(), temp_name.data() + 1, std::size_t(bytes_read - 1)); |
| 626 | 637 | ||
| 638 | // Fill in computed transition times with temp rule | ||
| 627 | TimeZoneRule temp_rule; | 639 | TimeZoneRule temp_rule; |
| 628 | if (ParsePosixName(name.data(), temp_rule)) { | 640 | if (ParsePosixName(name.data(), temp_rule)) { |
| 629 | UNIMPLEMENTED(); | 641 | int have_abbreviation = 0; |
| 642 | int char_count = time_zone_rule.char_count; | ||
| 643 | |||
| 644 | for (int i = 0; i < temp_rule.type_count; i++) { | ||
| 645 | char* temp_abbreviation = | ||
| 646 | temp_rule.chars.data() + temp_rule.ttis[i].abbreviation_list_index; | ||
| 647 | int j; | ||
| 648 | for (j = 0; j < char_count; j++) { | ||
| 649 | if (std::strcmp(time_zone_rule.chars.data() + j, temp_abbreviation) == 0) { | ||
| 650 | temp_rule.ttis[i].abbreviation_list_index = j; | ||
| 651 | have_abbreviation++; | ||
| 652 | break; | ||
| 653 | } | ||
| 654 | } | ||
| 655 | if (j >= char_count) { | ||
| 656 | int temp_abbreviation_length = static_cast<int>(std::strlen(temp_abbreviation)); | ||
| 657 | if (j + temp_abbreviation_length < time_zone_max_chars) { | ||
| 658 | std::strcpy(time_zone_rule.chars.data() + j, temp_abbreviation); | ||
| 659 | char_count = j + temp_abbreviation_length + 1; | ||
| 660 | temp_rule.ttis[i].abbreviation_list_index = j; | ||
| 661 | have_abbreviation++; | ||
| 662 | } | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 666 | if (have_abbreviation == temp_rule.type_count) { | ||
| 667 | time_zone_rule.char_count = char_count; | ||
| 668 | |||
| 669 | // Original comment: | ||
| 670 | /* Ignore any trailing, no-op transitions generated | ||
| 671 | by zic as they don't help here and can run afoul | ||
| 672 | of bugs in zic 2016j or earlier. */ | ||
| 673 | // This is possibly unnecessary for yuzu, since Nintendo doesn't run zic | ||
| 674 | while (1 < time_zone_rule.time_count && | ||
| 675 | (time_zone_rule.types[time_zone_rule.time_count - 1] == | ||
| 676 | time_zone_rule.types[time_zone_rule.time_count - 2])) { | ||
| 677 | time_zone_rule.time_count--; | ||
| 678 | } | ||
| 679 | |||
| 680 | for (int i = 0; | ||
| 681 | i < temp_rule.time_count && time_zone_rule.time_count < time_zone_max_times; | ||
| 682 | i++) { | ||
| 683 | const s64 transition_time = temp_rule.ats[i]; | ||
| 684 | if (0 < time_zone_rule.time_count && | ||
| 685 | transition_time <= time_zone_rule.ats[time_zone_rule.time_count - 1]) { | ||
| 686 | continue; | ||
| 687 | } | ||
| 688 | |||
| 689 | time_zone_rule.ats[time_zone_rule.time_count] = transition_time; | ||
| 690 | time_zone_rule.types[time_zone_rule.time_count] = | ||
| 691 | static_cast<s8>(time_zone_rule.type_count + temp_rule.types[i]); | ||
| 692 | time_zone_rule.time_count++; | ||
| 693 | } | ||
| 694 | for (int i = 0; i < temp_rule.type_count; i++) { | ||
| 695 | time_zone_rule.ttis[time_zone_rule.type_count++] = temp_rule.ttis[i]; | ||
| 696 | } | ||
| 697 | } | ||
| 630 | } | 698 | } |
| 631 | } | 699 | } |
| 700 | |||
| 701 | const auto typesequiv = [](TimeZoneRule& rule, int a, int b) -> bool { | ||
| 702 | if (a < 0 || a >= rule.type_count || b < 0 || b >= rule.type_count) { | ||
| 703 | return {}; | ||
| 704 | } | ||
| 705 | |||
| 706 | const struct TimeTypeInfo* ap = &rule.ttis[a]; | ||
| 707 | const struct TimeTypeInfo* bp = &rule.ttis[b]; | ||
| 708 | |||
| 709 | return (ap->gmt_offset == bp->gmt_offset && ap->is_dst == bp->is_dst && | ||
| 710 | (std::strcmp(&rule.chars[ap->abbreviation_list_index], | ||
| 711 | &rule.chars[bp->abbreviation_list_index]) == 0)); | ||
| 712 | }; | ||
| 713 | |||
| 632 | if (time_zone_rule.type_count == 0) { | 714 | if (time_zone_rule.type_count == 0) { |
| 633 | return {}; | 715 | return {}; |
| 634 | } | 716 | } |
| 635 | if (time_zone_rule.time_count > 1) { | 717 | if (time_zone_rule.time_count > 1) { |
| 636 | UNIMPLEMENTED(); | 718 | if (time_zone_rule.ats[0] <= std::numeric_limits<s64>::max() - seconds_per_repeat) { |
| 719 | s64 repeatat = time_zone_rule.ats[0] + seconds_per_repeat; | ||
| 720 | int repeatattype = time_zone_rule.types[0]; | ||
| 721 | for (int i = 1; i < time_zone_rule.time_count; ++i) { | ||
| 722 | if (time_zone_rule.ats[i] == repeatat && | ||
| 723 | typesequiv(time_zone_rule, time_zone_rule.types[i], repeatattype)) { | ||
| 724 | time_zone_rule.go_back = true; | ||
| 725 | break; | ||
| 726 | } | ||
| 727 | } | ||
| 728 | } | ||
| 729 | if (std::numeric_limits<s64>::min() + seconds_per_repeat <= | ||
| 730 | time_zone_rule.ats[time_zone_rule.time_count - 1]) { | ||
| 731 | s64 repeatat = time_zone_rule.ats[time_zone_rule.time_count - 1] - seconds_per_repeat; | ||
| 732 | int repeatattype = time_zone_rule.types[time_zone_rule.time_count - 1]; | ||
| 733 | for (int i = time_zone_rule.time_count; i >= 0; --i) { | ||
| 734 | if (time_zone_rule.ats[i] == repeatat && | ||
| 735 | typesequiv(time_zone_rule, time_zone_rule.types[i], repeatattype)) { | ||
| 736 | time_zone_rule.go_ahead = true; | ||
| 737 | break; | ||
| 738 | } | ||
| 739 | } | ||
| 740 | } | ||
| 637 | } | 741 | } |
| 638 | 742 | ||
| 639 | s32 default_type{}; | 743 | s32 default_type{}; |
| @@ -1038,4 +1142,36 @@ Result TimeZoneManager::GetDeviceLocationName(LocationName& value) const { | |||
| 1038 | return ResultSuccess; | 1142 | return ResultSuccess; |
| 1039 | } | 1143 | } |
| 1040 | 1144 | ||
| 1145 | Result TimeZoneManager::GetTotalLocationNameCount(s32& count) const { | ||
| 1146 | if (!is_initialized) { | ||
| 1147 | return ERROR_UNINITIALIZED_CLOCK; | ||
| 1148 | } | ||
| 1149 | count = static_cast<u32>(total_location_name_count); | ||
| 1150 | |||
| 1151 | return ResultSuccess; | ||
| 1152 | } | ||
| 1153 | |||
| 1154 | Result TimeZoneManager::GetTimeZoneRuleVersion(u128& version) const { | ||
| 1155 | if (!is_initialized) { | ||
| 1156 | return ERROR_UNINITIALIZED_CLOCK; | ||
| 1157 | } | ||
| 1158 | version = time_zone_rule_version; | ||
| 1159 | |||
| 1160 | return ResultSuccess; | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | Result TimeZoneManager::LoadLocationNameList(std::vector<LocationName>& values) const { | ||
| 1164 | if (!is_initialized) { | ||
| 1165 | return ERROR_UNINITIALIZED_CLOCK; | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | for (const auto& name : total_location_names) { | ||
| 1169 | LocationName entry{}; | ||
| 1170 | std::memcpy(entry.data(), name.c_str(), name.size()); | ||
| 1171 | values.push_back(entry); | ||
| 1172 | } | ||
| 1173 | |||
| 1174 | return ResultSuccess; | ||
| 1175 | } | ||
| 1176 | |||
| 1041 | } // namespace Service::Time::TimeZone | 1177 | } // namespace Service::Time::TimeZone |
diff --git a/src/core/hle/service/time/time_zone_manager.h b/src/core/hle/service/time/time_zone_manager.h index 5ebd4035e..8664f28d1 100644 --- a/src/core/hle/service/time/time_zone_manager.h +++ b/src/core/hle/service/time/time_zone_manager.h | |||
| @@ -21,6 +21,10 @@ public: | |||
| 21 | total_location_name_count = value; | 21 | total_location_name_count = value; |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | void SetLocationNames(std::vector<std::string> location_names) { | ||
| 25 | total_location_names = location_names; | ||
| 26 | } | ||
| 27 | |||
| 24 | void SetTimeZoneRuleVersion(const u128& value) { | 28 | void SetTimeZoneRuleVersion(const u128& value) { |
| 25 | time_zone_rule_version = value; | 29 | time_zone_rule_version = value; |
| 26 | } | 30 | } |
| @@ -33,6 +37,9 @@ public: | |||
| 33 | FileSys::VirtualFile& vfs_file); | 37 | FileSys::VirtualFile& vfs_file); |
| 34 | Result SetUpdatedTime(const Clock::SteadyClockTimePoint& value); | 38 | Result SetUpdatedTime(const Clock::SteadyClockTimePoint& value); |
| 35 | Result GetDeviceLocationName(TimeZone::LocationName& value) const; | 39 | Result GetDeviceLocationName(TimeZone::LocationName& value) const; |
| 40 | Result GetTotalLocationNameCount(s32& count) const; | ||
| 41 | Result GetTimeZoneRuleVersion(u128& version) const; | ||
| 42 | Result LoadLocationNameList(std::vector<TimeZone::LocationName>& values) const; | ||
| 36 | Result ToCalendarTime(const TimeZoneRule& rules, s64 time, CalendarInfo& calendar) const; | 43 | Result ToCalendarTime(const TimeZoneRule& rules, s64 time, CalendarInfo& calendar) const; |
| 37 | Result ToCalendarTimeWithMyRules(s64 time, CalendarInfo& calendar) const; | 44 | Result ToCalendarTimeWithMyRules(s64 time, CalendarInfo& calendar) const; |
| 38 | Result ParseTimeZoneRuleBinary(TimeZoneRule& rules, FileSys::VirtualFile& vfs_file) const; | 45 | Result ParseTimeZoneRuleBinary(TimeZoneRule& rules, FileSys::VirtualFile& vfs_file) const; |
| @@ -46,6 +53,7 @@ private: | |||
| 46 | std::string device_location_name{"GMT"}; | 53 | std::string device_location_name{"GMT"}; |
| 47 | u128 time_zone_rule_version{}; | 54 | u128 time_zone_rule_version{}; |
| 48 | std::size_t total_location_name_count{}; | 55 | std::size_t total_location_name_count{}; |
| 56 | std::vector<std::string> total_location_names{}; | ||
| 49 | Clock::SteadyClockTimePoint time_zone_update_time_point{ | 57 | Clock::SteadyClockTimePoint time_zone_update_time_point{ |
| 50 | Clock::SteadyClockTimePoint::GetRandom()}; | 58 | Clock::SteadyClockTimePoint::GetRandom()}; |
| 51 | }; | 59 | }; |
diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp index cda8d8343..e8273e152 100644 --- a/src/core/hle/service/time/time_zone_service.cpp +++ b/src/core/hle/service/time/time_zone_service.cpp | |||
| @@ -15,10 +15,10 @@ ITimeZoneService::ITimeZoneService(Core::System& system_, | |||
| 15 | static const FunctionInfo functions[] = { | 15 | static const FunctionInfo functions[] = { |
| 16 | {0, &ITimeZoneService::GetDeviceLocationName, "GetDeviceLocationName"}, | 16 | {0, &ITimeZoneService::GetDeviceLocationName, "GetDeviceLocationName"}, |
| 17 | {1, nullptr, "SetDeviceLocationName"}, | 17 | {1, nullptr, "SetDeviceLocationName"}, |
| 18 | {2, nullptr, "GetTotalLocationNameCount"}, | 18 | {2, &ITimeZoneService::GetTotalLocationNameCount, "GetTotalLocationNameCount"}, |
| 19 | {3, nullptr, "LoadLocationNameList"}, | 19 | {3, &ITimeZoneService::LoadLocationNameList, "LoadLocationNameList"}, |
| 20 | {4, &ITimeZoneService::LoadTimeZoneRule, "LoadTimeZoneRule"}, | 20 | {4, &ITimeZoneService::LoadTimeZoneRule, "LoadTimeZoneRule"}, |
| 21 | {5, nullptr, "GetTimeZoneRuleVersion"}, | 21 | {5, &ITimeZoneService::GetTimeZoneRuleVersion, "GetTimeZoneRuleVersion"}, |
| 22 | {6, nullptr, "GetDeviceLocationNameAndUpdatedTime"}, | 22 | {6, nullptr, "GetDeviceLocationNameAndUpdatedTime"}, |
| 23 | {100, &ITimeZoneService::ToCalendarTime, "ToCalendarTime"}, | 23 | {100, &ITimeZoneService::ToCalendarTime, "ToCalendarTime"}, |
| 24 | {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, | 24 | {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, |
| @@ -45,6 +45,57 @@ void ITimeZoneService::GetDeviceLocationName(HLERequestContext& ctx) { | |||
| 45 | rb.PushRaw(location_name); | 45 | rb.PushRaw(location_name); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | void ITimeZoneService::GetTotalLocationNameCount(HLERequestContext& ctx) { | ||
| 49 | LOG_DEBUG(Service_Time, "called"); | ||
| 50 | |||
| 51 | s32 count{}; | ||
| 52 | if (const Result result{ | ||
| 53 | time_zone_content_manager.GetTimeZoneManager().GetTotalLocationNameCount(count)}; | ||
| 54 | result != ResultSuccess) { | ||
| 55 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 56 | rb.Push(result); | ||
| 57 | return; | ||
| 58 | } | ||
| 59 | |||
| 60 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 61 | rb.Push(ResultSuccess); | ||
| 62 | rb.Push(count); | ||
| 63 | } | ||
| 64 | |||
| 65 | void ITimeZoneService::LoadLocationNameList(HLERequestContext& ctx) { | ||
| 66 | LOG_DEBUG(Service_Time, "called"); | ||
| 67 | |||
| 68 | std::vector<TimeZone::LocationName> location_names{}; | ||
| 69 | if (const Result result{ | ||
| 70 | time_zone_content_manager.GetTimeZoneManager().LoadLocationNameList(location_names)}; | ||
| 71 | result != ResultSuccess) { | ||
| 72 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 73 | rb.Push(result); | ||
| 74 | return; | ||
| 75 | } | ||
| 76 | |||
| 77 | ctx.WriteBuffer(location_names); | ||
| 78 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 79 | rb.Push(ResultSuccess); | ||
| 80 | rb.Push(static_cast<s32>(location_names.size())); | ||
| 81 | } | ||
| 82 | void ITimeZoneService::GetTimeZoneRuleVersion(HLERequestContext& ctx) { | ||
| 83 | LOG_DEBUG(Service_Time, "called"); | ||
| 84 | |||
| 85 | u128 rule_version{}; | ||
| 86 | if (const Result result{ | ||
| 87 | time_zone_content_manager.GetTimeZoneManager().GetTimeZoneRuleVersion(rule_version)}; | ||
| 88 | result != ResultSuccess) { | ||
| 89 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 90 | rb.Push(result); | ||
| 91 | return; | ||
| 92 | } | ||
| 93 | |||
| 94 | IPC::ResponseBuilder rb{ctx, 6}; | ||
| 95 | rb.Push(ResultSuccess); | ||
| 96 | rb.PushRaw(rule_version); | ||
| 97 | } | ||
| 98 | |||
| 48 | void ITimeZoneService::LoadTimeZoneRule(HLERequestContext& ctx) { | 99 | void ITimeZoneService::LoadTimeZoneRule(HLERequestContext& ctx) { |
| 49 | IPC::RequestParser rp{ctx}; | 100 | IPC::RequestParser rp{ctx}; |
| 50 | const auto raw_location_name{rp.PopRaw<std::array<u8, 0x24>>()}; | 101 | const auto raw_location_name{rp.PopRaw<std::array<u8, 0x24>>()}; |
diff --git a/src/core/hle/service/time/time_zone_service.h b/src/core/hle/service/time/time_zone_service.h index ea83b5714..952fcb0e2 100644 --- a/src/core/hle/service/time/time_zone_service.h +++ b/src/core/hle/service/time/time_zone_service.h | |||
| @@ -22,6 +22,9 @@ public: | |||
| 22 | 22 | ||
| 23 | private: | 23 | private: |
| 24 | void GetDeviceLocationName(HLERequestContext& ctx); | 24 | void GetDeviceLocationName(HLERequestContext& ctx); |
| 25 | void GetTotalLocationNameCount(HLERequestContext& ctx); | ||
| 26 | void LoadLocationNameList(HLERequestContext& ctx); | ||
| 27 | void GetTimeZoneRuleVersion(HLERequestContext& ctx); | ||
| 25 | void LoadTimeZoneRule(HLERequestContext& ctx); | 28 | void LoadTimeZoneRule(HLERequestContext& ctx); |
| 26 | void ToCalendarTime(HLERequestContext& ctx); | 29 | void ToCalendarTime(HLERequestContext& ctx); |
| 27 | void ToCalendarTimeWithMyRule(HLERequestContext& ctx); | 30 | void ToCalendarTimeWithMyRule(HLERequestContext& ctx); |
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 251a4a880..9bafd8cc0 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -715,7 +715,7 @@ void BufferCache<P>::BindHostIndexBuffer() { | |||
| 715 | 715 | ||
| 716 | template <class P> | 716 | template <class P> |
| 717 | void BufferCache<P>::BindHostVertexBuffers() { | 717 | void BufferCache<P>::BindHostVertexBuffers() { |
| 718 | HostBindings host_bindings; | 718 | HostBindings<typename P::Buffer> host_bindings; |
| 719 | bool any_valid{false}; | 719 | bool any_valid{false}; |
| 720 | auto& flags = maxwell3d->dirty.flags; | 720 | auto& flags = maxwell3d->dirty.flags; |
| 721 | for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) { | 721 | for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) { |
| @@ -741,7 +741,7 @@ void BufferCache<P>::BindHostVertexBuffers() { | |||
| 741 | const u32 stride = maxwell3d->regs.vertex_streams[index].stride; | 741 | const u32 stride = maxwell3d->regs.vertex_streams[index].stride; |
| 742 | const u32 offset = buffer.Offset(binding.cpu_addr); | 742 | const u32 offset = buffer.Offset(binding.cpu_addr); |
| 743 | 743 | ||
| 744 | host_bindings.buffers.push_back(reinterpret_cast<void*>(&buffer)); | 744 | host_bindings.buffers.push_back(&buffer); |
| 745 | host_bindings.offsets.push_back(offset); | 745 | host_bindings.offsets.push_back(offset); |
| 746 | host_bindings.sizes.push_back(binding.size); | 746 | host_bindings.sizes.push_back(binding.size); |
| 747 | host_bindings.strides.push_back(stride); | 747 | host_bindings.strides.push_back(stride); |
| @@ -900,7 +900,7 @@ void BufferCache<P>::BindHostTransformFeedbackBuffers() { | |||
| 900 | if (maxwell3d->regs.transform_feedback_enabled == 0) { | 900 | if (maxwell3d->regs.transform_feedback_enabled == 0) { |
| 901 | return; | 901 | return; |
| 902 | } | 902 | } |
| 903 | HostBindings host_bindings; | 903 | HostBindings<typename P::Buffer> host_bindings; |
| 904 | for (u32 index = 0; index < NUM_TRANSFORM_FEEDBACK_BUFFERS; ++index) { | 904 | for (u32 index = 0; index < NUM_TRANSFORM_FEEDBACK_BUFFERS; ++index) { |
| 905 | const Binding& binding = channel_state->transform_feedback_buffers[index]; | 905 | const Binding& binding = channel_state->transform_feedback_buffers[index]; |
| 906 | if (maxwell3d->regs.transform_feedback.controls[index].varying_count == 0 && | 906 | if (maxwell3d->regs.transform_feedback.controls[index].varying_count == 0 && |
| @@ -913,7 +913,7 @@ void BufferCache<P>::BindHostTransformFeedbackBuffers() { | |||
| 913 | SynchronizeBuffer(buffer, binding.cpu_addr, size); | 913 | SynchronizeBuffer(buffer, binding.cpu_addr, size); |
| 914 | 914 | ||
| 915 | const u32 offset = buffer.Offset(binding.cpu_addr); | 915 | const u32 offset = buffer.Offset(binding.cpu_addr); |
| 916 | host_bindings.buffers.push_back(reinterpret_cast<void*>(&buffer)); | 916 | host_bindings.buffers.push_back(&buffer); |
| 917 | host_bindings.offsets.push_back(offset); | 917 | host_bindings.offsets.push_back(offset); |
| 918 | host_bindings.sizes.push_back(binding.size); | 918 | host_bindings.sizes.push_back(binding.size); |
| 919 | } | 919 | } |
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index cf359e241..63a120f7a 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h | |||
| @@ -105,8 +105,9 @@ static constexpr Binding NULL_BINDING{ | |||
| 105 | .buffer_id = NULL_BUFFER_ID, | 105 | .buffer_id = NULL_BUFFER_ID, |
| 106 | }; | 106 | }; |
| 107 | 107 | ||
| 108 | template <typename Buffer> | ||
| 108 | struct HostBindings { | 109 | struct HostBindings { |
| 109 | boost::container::small_vector<void*, NUM_VERTEX_BUFFERS> buffers; | 110 | boost::container::small_vector<Buffer*, NUM_VERTEX_BUFFERS> buffers; |
| 110 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> offsets; | 111 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> offsets; |
| 111 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> sizes; | 112 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> sizes; |
| 112 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> strides; | 113 | boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> strides; |
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 0cc546a3a..38d553d3c 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp | |||
| @@ -232,12 +232,12 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, Buffer& buffer, u32 offset, | |||
| 232 | } | 232 | } |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) { | 235 | void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings) { |
| 236 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | 236 | for (u32 index = 0; index < bindings.buffers.size(); ++index) { |
| 237 | BindVertexBuffer( | 237 | BindVertexBuffer(bindings.min_index + index, *bindings.buffers[index], |
| 238 | bindings.min_index + index, *reinterpret_cast<Buffer*>(bindings.buffers[index]), | 238 | static_cast<u32>(bindings.offsets[index]), |
| 239 | static_cast<u32>(bindings.offsets[index]), static_cast<u32>(bindings.sizes[index]), | 239 | static_cast<u32>(bindings.sizes[index]), |
| 240 | static_cast<u32>(bindings.strides[index])); | 240 | static_cast<u32>(bindings.strides[index])); |
| 241 | } | 241 | } |
| 242 | } | 242 | } |
| 243 | 243 | ||
| @@ -329,10 +329,9 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, Buffer& buffer, | |||
| 329 | static_cast<GLintptr>(offset), static_cast<GLsizeiptr>(size)); | 329 | static_cast<GLintptr>(offset), static_cast<GLsizeiptr>(size)); |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings) { | 332 | void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings) { |
| 333 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | 333 | for (u32 index = 0; index < bindings.buffers.size(); ++index) { |
| 334 | glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, index, | 334 | glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, index, bindings.buffers[index]->Handle(), |
| 335 | reinterpret_cast<Buffer*>(bindings.buffers[index])->Handle(), | ||
| 336 | static_cast<GLintptr>(bindings.offsets[index]), | 335 | static_cast<GLintptr>(bindings.offsets[index]), |
| 337 | static_cast<GLsizeiptr>(bindings.sizes[index])); | 336 | static_cast<GLsizeiptr>(bindings.sizes[index])); |
| 338 | } | 337 | } |
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index e4e000284..41b746f3b 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h | |||
| @@ -87,7 +87,8 @@ public: | |||
| 87 | void BindIndexBuffer(Buffer& buffer, u32 offset, u32 size); | 87 | void BindIndexBuffer(Buffer& buffer, u32 offset, u32 size); |
| 88 | 88 | ||
| 89 | void BindVertexBuffer(u32 index, Buffer& buffer, u32 offset, u32 size, u32 stride); | 89 | void BindVertexBuffer(u32 index, Buffer& buffer, u32 offset, u32 size, u32 stride); |
| 90 | void BindVertexBuffers(VideoCommon::HostBindings& bindings); | 90 | |
| 91 | void BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings); | ||
| 91 | 92 | ||
| 92 | void BindUniformBuffer(size_t stage, u32 binding_index, Buffer& buffer, u32 offset, u32 size); | 93 | void BindUniformBuffer(size_t stage, u32 binding_index, Buffer& buffer, u32 offset, u32 size); |
| 93 | 94 | ||
| @@ -100,7 +101,8 @@ public: | |||
| 100 | bool is_written); | 101 | bool is_written); |
| 101 | 102 | ||
| 102 | void BindTransformFeedbackBuffer(u32 index, Buffer& buffer, u32 offset, u32 size); | 103 | void BindTransformFeedbackBuffer(u32 index, Buffer& buffer, u32 offset, u32 size); |
| 103 | void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings); | 104 | |
| 105 | void BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings); | ||
| 104 | 106 | ||
| 105 | void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size, | 107 | void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size, |
| 106 | VideoCore::Surface::PixelFormat format); | 108 | VideoCore::Surface::PixelFormat format); |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index d72d99899..8c33722d3 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -501,11 +501,10 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset | |||
| 501 | } | 501 | } |
| 502 | } | 502 | } |
| 503 | 503 | ||
| 504 | void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) { | 504 | void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings) { |
| 505 | boost::container::small_vector<VkBuffer, 32> buffer_handles; | 505 | boost::container::small_vector<VkBuffer, 32> buffer_handles; |
| 506 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | 506 | for (u32 index = 0; index < bindings.buffers.size(); ++index) { |
| 507 | auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]); | 507 | auto handle = bindings.buffers[index]->Handle(); |
| 508 | auto handle = buffer.Handle(); | ||
| 509 | if (handle == VK_NULL_HANDLE) { | 508 | if (handle == VK_NULL_HANDLE) { |
| 510 | bindings.offsets[index] = 0; | 509 | bindings.offsets[index] = 0; |
| 511 | bindings.sizes[index] = VK_WHOLE_SIZE; | 510 | bindings.sizes[index] = VK_WHOLE_SIZE; |
| @@ -521,16 +520,13 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bindings) | |||
| 521 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | 520 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { |
| 522 | cmdbuf.BindVertexBuffers2EXT( | 521 | cmdbuf.BindVertexBuffers2EXT( |
| 523 | bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(), | 522 | bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(), |
| 524 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()), | 523 | bindings.offsets.data(), bindings.sizes.data(), bindings.strides.data()); |
| 525 | reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data()), | ||
| 526 | reinterpret_cast<const VkDeviceSize*>(bindings.strides.data())); | ||
| 527 | }); | 524 | }); |
| 528 | } else { | 525 | } else { |
| 529 | scheduler.Record([bindings = bindings, | 526 | scheduler.Record([bindings = bindings, |
| 530 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | 527 | buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { |
| 531 | cmdbuf.BindVertexBuffers( | 528 | cmdbuf.BindVertexBuffers(bindings.min_index, bindings.max_index - bindings.min_index, |
| 532 | bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(), | 529 | buffer_handles.data(), bindings.offsets.data()); |
| 533 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data())); | ||
| 534 | }); | 530 | }); |
| 535 | } | 531 | } |
| 536 | } | 532 | } |
| @@ -556,22 +552,20 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, | |||
| 556 | }); | 552 | }); |
| 557 | } | 553 | } |
| 558 | 554 | ||
| 559 | void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings) { | 555 | void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings) { |
| 560 | if (!device.IsExtTransformFeedbackSupported()) { | 556 | if (!device.IsExtTransformFeedbackSupported()) { |
| 561 | // Already logged in the rasterizer | 557 | // Already logged in the rasterizer |
| 562 | return; | 558 | return; |
| 563 | } | 559 | } |
| 564 | boost::container::small_vector<VkBuffer, 4> buffer_handles; | 560 | boost::container::small_vector<VkBuffer, 4> buffer_handles; |
| 565 | for (u32 index = 0; index < bindings.buffers.size(); index++) { | 561 | for (u32 index = 0; index < bindings.buffers.size(); ++index) { |
| 566 | auto& buffer = *reinterpret_cast<Buffer*>(bindings.buffers[index]); | 562 | buffer_handles.push_back(bindings.buffers[index]->Handle()); |
| 567 | buffer_handles.push_back(buffer.Handle()); | ||
| 568 | } | 563 | } |
| 569 | scheduler.Record( | 564 | scheduler.Record( |
| 570 | [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { | 565 | [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) { |
| 571 | cmdbuf.BindTransformFeedbackBuffersEXT( | 566 | cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()), |
| 572 | 0, static_cast<u32>(buffer_handles.size()), buffer_handles.data(), | 567 | buffer_handles.data(), bindings.offsets.data(), |
| 573 | reinterpret_cast<const VkDeviceSize*>(bindings.offsets.data()), | 568 | bindings.sizes.data()); |
| 574 | reinterpret_cast<const VkDeviceSize*>(bindings.sizes.data())); | ||
| 575 | }); | 569 | }); |
| 576 | } | 570 | } |
| 577 | 571 | ||
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 92d3e9f32..cdeef8846 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -97,10 +97,12 @@ public: | |||
| 97 | void BindQuadIndexBuffer(PrimitiveTopology topology, u32 first, u32 count); | 97 | void BindQuadIndexBuffer(PrimitiveTopology topology, u32 first, u32 count); |
| 98 | 98 | ||
| 99 | void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride); | 99 | void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride); |
| 100 | void BindVertexBuffers(VideoCommon::HostBindings& bindings); | 100 | |
| 101 | void BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings); | ||
| 101 | 102 | ||
| 102 | void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size); | 103 | void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size); |
| 103 | void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings); | 104 | |
| 105 | void BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings); | ||
| 104 | 106 | ||
| 105 | std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage, | 107 | std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage, |
| 106 | [[maybe_unused]] u32 binding_index, u32 size) { | 108 | [[maybe_unused]] u32 binding_index, u32 size) { |
diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp index 286ccc5cd..f1ae312c6 100644 --- a/src/yuzu/configuration/configure_system.cpp +++ b/src/yuzu/configuration/configure_system.cpp | |||
| @@ -144,8 +144,7 @@ void ConfigureSystem::ApplyConfiguration() { | |||
| 144 | if (ui->custom_rtc_checkbox->isChecked()) { | 144 | if (ui->custom_rtc_checkbox->isChecked()) { |
| 145 | Settings::values.custom_rtc = ui->custom_rtc_edit->dateTime().toSecsSinceEpoch(); | 145 | Settings::values.custom_rtc = ui->custom_rtc_edit->dateTime().toSecsSinceEpoch(); |
| 146 | if (system.IsPoweredOn()) { | 146 | if (system.IsPoweredOn()) { |
| 147 | const s64 posix_time{*Settings::values.custom_rtc + | 147 | const s64 posix_time{*Settings::values.custom_rtc}; |
| 148 | Service::Time::TimeManager::GetExternalTimeZoneOffset()}; | ||
| 149 | system.GetTimeManager().UpdateLocalSystemClockTime(posix_time); | 148 | system.GetTimeManager().UpdateLocalSystemClockTime(posix_time); |
| 150 | } | 149 | } |
| 151 | } else { | 150 | } else { |
diff --git a/vcpkg.json b/vcpkg.json index 26f545c6c..2fa2c80be 100644 --- a/vcpkg.json +++ b/vcpkg.json | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | { | 1 | { |
| 2 | "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", | 2 | "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", |
| 3 | "name": "yuzu", | 3 | "name": "yuzu", |
| 4 | "builtin-baseline": "656fcc6ab2b05c6d999b7eaca717027ac3738f71", | 4 | "builtin-baseline": "a487471068f4cb1cbb4eeb340763cdcc0a75fd68", |
| 5 | "version": "1.0", | 5 | "version": "1.0", |
| 6 | "dependencies": [ | 6 | "dependencies": [ |
| 7 | "boost-algorithm", | 7 | "boost-algorithm", |