diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fbf0fbf..8b083cb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ on: branches: - main - dev + - release env: CLANG_TIDY_VERSION: "15.0.2" @@ -85,6 +86,11 @@ jobs: gcovr: true opencppcoverage: true + - name: Install xrand + if: runner.os != 'Windows' + run: | + sudo apt-get install -y freeglut3-dev libfreetype6-dev libx11-dev libxrandr-dev libudev-dev libgl1-mesa-dev libflac-dev libogg-dev libvorbis-dev libvorbisenc2 libvorbisfile3 libopenal-dev libpthread-stubs0-dev xorg-dev + - name: Configure CMake run: | cmake -S . -B ./build -G "${{matrix.generator}}" -D${{ env.PROJECT_NAME }}_ENABLE_IPO=${{matrix.enable_ipo }} -DCMAKE_BUILD_TYPE:STRING=Release -D${{ env.PROJECT_NAME }}_PACKAGING_MAINTAINER_MODE:BOOL=False -D${{ env.PROJECT_NAME }}_ENABLE_COVERAGE:BOOL=True -DGIT_SHA:STRING=${{ github.sha }} -DR_Type_ENABLE_SANITIZER_ADDRESS=OFF -DR_Type_ENABLE_SANITIZER_UNDEFINED=OFF diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 62413ab2..897f5bbb 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -77,6 +77,12 @@ jobs: # make sure coverage is only enabled for Debug builds, since it sets -O0 to make sure coverage # has meaningful results + + - name: Install xrand + if: runner.os != 'Windows' + run: | + sudo apt-get install -y freeglut3-dev libfreetype6-dev libx11-dev libxrandr-dev libudev-dev libgl1-mesa-dev libflac-dev libogg-dev libvorbis-dev libvorbisenc2 libvorbisfile3 libopenal-dev libpthread-stubs0-dev xorg-dev + - name: Configure CMake run: | cmake -S . -B ./build -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE:STRING=${{matrix.build_type}} -D${{ env.PROJECT_NAME }}_PACKAGING_MAINTAINER_MODE:BOOL=${{matrix.packaging_maintainer_mode}} -D${{ env.PROJECT_NAME }}_ENABLE_COVERAGE:BOOL=${{ matrix.build_type == 'Debug' }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..16ab830f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extern/EwECS"] + path = extern/EwECS + url = https://github.com/UwUClub/EwECS.git diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..28fd61fe --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,35 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +# python: +# install: +# - requirements: docs/requirements.txt \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 297d009f..0fcdc435 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ cmake_minimum_required(VERSION 3.21) -find_package(SDL2 QUIET) # This template attempts to be "fetch_content"-able # so that it works well with tools like CPM or other @@ -10,11 +9,6 @@ if (NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 20) endif() -# strongly encouraged to enable this globally to avoid conflicts between -# -Wpedantic being enabled and -std=c++20 and -std=gnu++20 for example -# when compiling with PCH enabled -set(CMAKE_CXX_EXTENSIONS OFF) - # Set the project name and language project( R_Type @@ -23,59 +17,45 @@ project( HOMEPAGE_URL "https://github.com/UwUClub/R-Type" LANGUAGES CXX C) -include(cmake/PreventInSourceBuilds.cmake) -include(ProjectOptions.cmake) -if (NOT TARGET SDL2::SDL2) - set(SDL2_DOWNLOADED TRUE) -else() - set(SDL2_DOWNLOADED FALSE) -endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") -R_Type_setup_options() -R_Type_global_options() -include(Dependencies.cmake) -R_Type_setup_dependencies() +add_library(R_Type_warnings INTERFACE) -R_Type_local_options() +include(cmake/CompilerWarnings.cmake) +R_Type_set_project_warnings( + R_Type_warnings + FALSE + "" + "" + "" + "") -set(CMAKE_CXX_VISIBILITY_PRESET hidden) +include(Dependencies.cmake) +R_Type_setup_dependencies() -set(GIT_SHA - "Unknown" - CACHE STRING "SHA this build was generated from") -string( - SUBSTRING "${GIT_SHA}" - 0 - 8 - GIT_SHORT_SHA) +include(cmake/StandardProjectSettings.cmake) -target_compile_features(R_Type_options INTERFACE cxx_std_${CMAKE_CXX_STANDARD}) +# exec submodules init and update +execute_process(COMMAND git submodule update --init --recursive --remote) +add_subdirectory(extern) +# expose the includes folder of the submodules -add_library(R_Type::R_Type_options ALIAS R_Type_options) add_library(R_Type::R_Type_warnings ALIAS R_Type_warnings) -#add_library(R_Type::R_Type_options INTERFACE IMPORTED) -#add_library(R_Type::R_Type_warnings INTERFACE IMPORTED) - # Adding the src: add_subdirectory(src) -# Don't even look at tests if we're not top level -if(NOT PROJECT_IS_TOP_LEVEL) - return() -endif() - # Adding the tests: -#include(CTest) +# include(CTest) -#if(BUILD_TESTING) -# add_subdirectory(test) -#endif() +# if(BUILD_TESTING) +# add_subdirectory(test) +# endif() # If MSVC is being used, and ASAN is enabled, we need to set the debugger environment # so that it behaves well with MSVC's debugger, and we can run the target from visual studio if(MSVC) + include(cmake/Utilities.cmake) add_definitions(-D_CRT_SECURE_NO_WARNINGS) get_all_installable_targets(all_targets) message("all_targets=${all_targets}") @@ -83,30 +63,15 @@ if(MSVC) endif() file(COPY ${CMAKE_SOURCE_DIR}/assets DESTINATION ${CMAKE_BINARY_DIR}/bin) +file(COPY ${CMAKE_SOURCE_DIR}/config DESTINATION ${CMAKE_BINARY_DIR}/bin) # set the startup project for the "play" button in MSVC set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT server) -if(CMAKE_SKIP_INSTALL_RULES) - return() -endif() - -include(cmake/PackageProject.cmake) -find_package(Boost) - -# Add other targets that you want installed here, by default we just package the one executable -# we know we want to ship -R_Type_package_project( - TARGETS - server - client - R_Type_options - R_Type_warnings -) # Experience shows that explicit package naming can help make it easier to sort # out potential ABI related issues before they start, while helping you # track a build to a specific GIT SHA -install(TARGETS server client +install(TARGETS server client flappybird RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -130,5 +95,6 @@ else() endif() install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/assets" DESTINATION ${CMAKE_INSTALL_BINDIR}) +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/config" DESTINATION ${CMAKE_INSTALL_BINDIR}) -include(CPack) +include(CPack) \ No newline at end of file diff --git a/Dependencies.cmake b/Dependencies.cmake index e35d5d41..5eaf5c9d 100644 --- a/Dependencies.cmake +++ b/Dependencies.cmake @@ -1,6 +1,5 @@ include(cmake/CPM.cmake) include(FetchContent) -include(cmake/FindSDL2.cmake) # Done as a function so that updates to variables like # CMAKE_CXX_FLAGS don't propagate out to other @@ -8,9 +7,8 @@ include(cmake/FindSDL2.cmake) function(R_Type_setup_dependencies) #find_package(Catch2 QUIET) - find_package(Boost QUIET COMPONENTS system serialization align assert config core static_assert throw_exception array bind chrono integer move mpl predef asio ratio type_traits typeof utility coroutine date_time function regex smart_ptr preprocessor io uuid QUIET) - find_package(SDL2 QUIET) - find_package(SDL2_image QUIET) + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) #if(NOT TARGET Catch2::Catch2WithMain) # CPMAddPackage( @@ -22,708 +20,6 @@ function(R_Type_setup_dependencies) #) #endif() - if (NOT TARGET Boost::system) - CPMAddPackage( - NAME boost_system - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/system" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::serialization) - CPMAddPackage( - NAME boost_serialization - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/serialization" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::assert) - CPMAddPackage( - NAME boost_assert - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/assert" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::config) - CPMAddPackage( - NAME boost_config - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/config" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::core) - CPMAddPackage( - NAME boost_core - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/core" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::align) - CPMAddPackage( - NAME boost_align - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/align" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::static_assert) - CPMAddPackage( - NAME boost_static_assert - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/static_assert" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::throw_exception) - CPMAddPackage( - NAME boost_throw_exception - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/throw_exception" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::array) - CPMAddPackage( - NAME boost_array - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/array" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::bind) - CPMAddPackage( - NAME boost_bind - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/bind" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::chrono) - CPMAddPackage( - NAME boost_chrono - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/chrono" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::integer) - CPMAddPackage( - NAME boost_integer - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/integer" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::move) - CPMAddPackage( - NAME boost_move - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/move" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::mpl) - CPMAddPackage( - NAME boost_mpl - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/mpl" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::predef) - CPMAddPackage( - NAME boost_predef - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/predef" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::asio) - CPMAddPackage( - NAME boost_asio - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/asio" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::ratio) - CPMAddPackage( - NAME boost_ratio - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/ratio" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::type_traits) - CPMAddPackage( - NAME boost_type_traits - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/type_traits" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::typeof) - CPMAddPackage( - NAME boost_typeof - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/typeof" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::utility) - CPMAddPackage( - NAME boost_utility - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/utility" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::coroutine) - CPMAddPackage( - NAME boost_coroutine - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/coroutine" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::date_time) - CPMAddPackage( - NAME boost_date_time - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/date_time" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::function) - CPMAddPackage( - NAME boost_function - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/function" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::regex) - CPMAddPackage( - NAME boost_regex - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/regex" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::smart_ptr) - CPMAddPackage( - NAME boost_smart_ptr - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/smart_ptr" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::preprocessor) - CPMAddPackage( - NAME boost_preprocessor - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/preprocessor" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::io) - CPMAddPackage( - NAME boost_io - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/io" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::uuid) - CPMAddPackage( - NAME boost_uuid - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/uuid" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::container_hash) - CPMAddPackage( - NAME boost_container_hash - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/container_hash" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::describe) - CPMAddPackage( - NAME boost_describe - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/describe" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::numeric_conversion) - CPMAddPackage( - NAME boost_numeric_conversion - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/numeric_conversion" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::mp11) - CPMAddPackage( - NAME boost_mp11 - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/mp11" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::random) - CPMAddPackage( - NAME boost_random - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/random" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::conversion) - CPMAddPackage( - NAME boost_conversion - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/conversion" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::dynamic_bitset) - CPMAddPackage( - NAME boost_dynamic_bitset - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/dynamic_bitset" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::tti) - CPMAddPackage( - NAME boost_tti - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/tti" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::function_types) - CPMAddPackage( - NAME boost_function_types - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/function_types" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::winapi) - CPMAddPackage( - NAME boost_winapi - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/winapi" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::detail) - CPMAddPackage( - NAME boost_detail - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/detail" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::range) - CPMAddPackage( - NAME boost_range - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/range" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::concept_check) - CPMAddPackage( - NAME boost_concept_check - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/concept_check" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::iterator) - CPMAddPackage( - NAME boost_iterator - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/iterator" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::fusion) - CPMAddPackage( - NAME boost_fusion - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/fusion" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::optional) - CPMAddPackage( - NAME boost_optional - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/optional" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::tuple) - CPMAddPackage( - NAME boost_tuple - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/tuple" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::functional) - CPMAddPackage( - NAME boost_functional - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/functional" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::variant2) - CPMAddPackage( - NAME boost_variant2 - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/variant2" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::spirit) - CPMAddPackage( - NAME boost_spirit - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/spirit" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::rational) - CPMAddPackage( - NAME boost_rational - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/rational" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::context) - CPMAddPackage( - NAME boost_context - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/context" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::algorithm) - CPMAddPackage( - NAME boost_algorithm - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/algorithm" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::exception) - CPMAddPackage( - NAME boost_exception - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/exception" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::lexical_cast) - CPMAddPackage( - NAME boost_lexical_cast - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/lexical_cast" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::endian) - CPMAddPackage( - NAME boost_endian - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/endian" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if(NOT TARGET Boost::pool) - CPMAddPackage( - NAME boost_pool - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/pool" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::exception) - CPMAddPackage( - NAME boost_exception - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/exception" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::unordered) - CPMAddPackage( - NAME boost_unordered - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/unordered" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::tokenizer) - CPMAddPackage( - NAME boost_tokenizer - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/tokenizer" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::phoenix) - CPMAddPackage( - NAME boost_phoenix - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/phoenix" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::unordered) - CPMAddPackage( - NAME boost_unordered - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/unordered" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::container) - CPMAddPackage( - NAME boost_container - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/container" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::variant) - CPMAddPackage( - NAME boost_variant - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/variant" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::proto) - CPMAddPackage( - NAME boost_proto - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/proto" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::intrusive) - CPMAddPackage( - NAME boost_intrusive - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/intrusive" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::thread) - CPMAddPackage( - NAME boost_thread - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/thread" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::type_index) - CPMAddPackage( - NAME boost_type_index - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/type_index" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - if (NOT TARGET Boost::atomic) - CPMAddPackage( - NAME boost_atomic - VERSION 1.83.0 - GITHUB_REPOSITORY "boostorg/atomic" - GIT_TAG "boost-1.83.0" - GIT_SHALLOW TRUE - ) - endif() - - - if (NOT TARGET SDL2) - FetchContent_Declare( - SDL2 - GIT_REPOSITORY https://github.com/libsdl-org/SDL.git - GIT_TAG release-2.28.3 - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DSDL_STATIC=ON - ) - endif() - FetchContent_MakeAvailable(SDL2) - install(TARGETS SDL2-static - EXPORT SDL2Targets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - INCLUDES DESTINATION include - PUBLIC_HEADER DESTINATION include - ) - - if (NOT TARGET SDL2_image::SDL2_image) - FetchContent_Declare( - SDL2_image - GIT_REPOSITORY https://github.com/libsdl-org/SDL_image.git - GIT_TAG release-2.6.3 - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DSDL_STATIC=ON - ) - set(SDL2IMAGE_INSTALL OFF) - FetchContent_MakeAvailable(SDL2_image) - endif() + set(FETCHCONTENT_QUIET FALSE) endfunction() diff --git a/ECS_archi.mdj b/ECS_archi.mdj deleted file mode 100644 index 51d60d69..00000000 --- a/ECS_archi.mdj +++ /dev/null @@ -1,24850 +0,0 @@ -{ - "_type": "Project", - "_id": "AAAAAAFElm5XMFNoGY0=", - "name": "Untitled", - "ownedElements": [ - { - "_type": "UMLModel", - "_id": "AAAAAAFElm6BOFNpegQ=", - "_parent": { - "$ref": "AAAAAAFElm5XMFNoGY0=" - }, - "name": "Model", - "ownedElements": [ - { - "_type": "UMLClassDiagram", - "_id": "AAAAAAFElm65HFNt33E=", - "_parent": { - "$ref": "AAAAAAFElm6BOFNpegQ=" - }, - "name": "Main", - "defaultDiagram": true, - "ownedViews": [ - { - "_type": "UMLClassView", - "_id": "AAAAAAGKy44fAOauFrk=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy44fAOavMHQ=", - "_parent": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy44fAOaw+u0=", - "_parent": { - "$ref": "AAAAAAGKy44fAOavMHQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": 64, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy44fAOax5sE=", - "_parent": { - "$ref": "AAAAAAGKy44fAOavMHQ=" - }, - "font": "Arial;13;1", - "left": 173, - "top": 87, - "width": 479, - "height": 13, - "text": "EventManager" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy44fAOayE6Q=", - "_parent": { - "$ref": "AAAAAAGKy44fAOavMHQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": 64, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy44fAOaziCc=", - "_parent": { - "$ref": "AAAAAAGKy44fAOavMHQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": 64, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 168, - "top": 80, - "width": 489, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKy44fAOaw+u0=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy44fAOax5sE=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy44fAOayE6Q=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy44fAOaziCc=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy44fAOa02pU=", - "_parent": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy4+Z++cU2gQ=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa02pU=" - }, - "model": { - "$ref": "AAAAAAGKy4+Z8+cReg0=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 110, - "width": 479, - "height": 13, - "text": "-list of events events", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy5GckOcc5Fs=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa02pU=" - }, - "model": { - "$ref": "AAAAAAGKy5GcjecZ3VU=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 125, - "width": 479, - "height": 13, - "underline": true, - "text": "-instance", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 168, - "top": 105, - "width": 489, - "height": 38 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy44fAOa1+Hg=", - "_parent": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5HF1eckmJ0=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa1+Hg=" - }, - "model": { - "$ref": "AAAAAAGKy5HF0ech514=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 148, - "width": 479, - "height": 13, - "underline": true, - "text": "+getInstance(): EventManager", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5LhW+cwkuI=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa1+Hg=" - }, - "model": { - "$ref": "AAAAAAGKy5LhVuctYi8=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 163, - "width": 479, - "height": 13, - "text": "+pushEvent(Event): void", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5RSQOc+Meg=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa1+Hg=" - }, - "model": { - "$ref": "AAAAAAGKy5RSPec7wNA=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 178, - "width": 479, - "height": 13, - "text": "+getEvents(): list of all the events", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5SI3edH1tc=", - "_parent": { - "$ref": "AAAAAAGKy44fAOa1+Hg=" - }, - "model": { - "$ref": "AAAAAAGKy5SI2udEokA=" - }, - "font": "Arial;13;0", - "left": 173, - "top": 193, - "width": 479, - "height": 13, - "text": "+getEventsByType(EventType): list of events with the same type", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 168, - "top": 143, - "width": 489, - "height": 68 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy44fAOa2tnk=", - "_parent": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": 32, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy44fAOa3VZw=", - "_parent": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "model": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": 32, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 168, - "top": 80, - "width": 489, - "height": 465, - "nameCompartment": { - "$ref": "AAAAAAGKy44fAOavMHQ=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKy44fAOa02pU=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy44fAOa1+Hg=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy44fAOa2tnk=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy44fAOa3VZw=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKy5UtWudRRVo=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy5UtWudSYKg=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy5UtWudTaFQ=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudSYKg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -112, - "top": 52, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5UtWudUGws=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudSYKg=" - }, - "font": "Arial;13;1", - "left": 117, - "top": 647, - "width": 287, - "height": 13, - "text": "EventManagerException" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5UtW+dVJ5k=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudSYKg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -112, - "top": 52, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5UtW+dWRc0=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudSYKg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -112, - "top": 52, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 112, - "top": 640, - "width": 297, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKy5UtWudTaFQ=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy5UtWudUGws=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy5UtW+dVJ5k=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy5UtW+dWRc0=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy5UtW+dXXWE=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy5YIQOeYZ4E=", - "_parent": { - "$ref": "AAAAAAGKy5UtW+dXXWE=" - }, - "model": { - "$ref": "AAAAAAGKy5YIPOeVci8=" - }, - "font": "Arial;13;0", - "left": 117, - "top": 670, - "width": 287, - "height": 13, - "text": "-string _message", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 112, - "top": 665, - "width": 297, - "height": 23 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy5UtW+dY1QI=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5XPj+ePW8Y=", - "_parent": { - "$ref": "AAAAAAGKy5UtW+dY1QI=" - }, - "model": { - "$ref": "AAAAAAGKy5XPieeM7D4=" - }, - "font": "Arial;13;0", - "left": 117, - "top": 693, - "width": 287, - "height": 13, - "text": "+EventManagerException(string message)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5YaQOefbVU=", - "_parent": { - "$ref": "AAAAAAGKy5UtW+dY1QI=" - }, - "model": { - "$ref": "AAAAAAGKy5YaPeecCso=" - }, - "font": "Arial;13;0", - "left": 117, - "top": 708, - "width": 287, - "height": 13, - "text": "+get(): char *", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 112, - "top": 688, - "width": 297, - "height": 38 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy5UtW+dZuY0=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -56, - "top": 26, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy5UtW+dan5U=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "model": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -56, - "top": 26, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 112, - "top": 640, - "width": 297, - "height": 169, - "nameCompartment": { - "$ref": "AAAAAAGKy5UtWudSYKg=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKy5UtW+dXXWE=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy5UtW+dY1QI=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy5UtW+dZuY0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy5UtW+dan5U=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKy5dDNOet6Rw=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy5dDNOeu5y8=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy5dDNOevFNA=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeu5y8=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 109, - "width": 86.72802734375, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5dDNOew/pg=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeu5y8=" - }, - "font": "Arial;13;1", - "left": 805, - "top": 124, - "width": 86.72802734375, - "height": 13, - "text": "EventType" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5dDNOexFa0=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeu5y8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -1854.5439453125, - "top": 64, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5dDNOey51k=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeu5y8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -1854.5439453125, - "top": 64, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 800, - "top": 104, - "width": 96.72802734375, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKy5dDNOevFNA=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy5dDNOew/pg=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy5dDNOexFa0=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy5dDNOey51k=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy5dDNOezZmg=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -927.27197265625, - "top": 32, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy5dDNOe0C9E=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -927.27197265625, - "top": 32, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy5dDNOe1YC4=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -927.27197265625, - "top": 32, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy5dDNOe2XaQ=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -927.27197265625, - "top": 32, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKy5dDNOe3xS4=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "model": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5d9p+fdt08=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5d9n+faXQc=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 147, - "width": 86.72802734375, - "height": 13, - "text": "Keyboard", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5eVw+fkecc=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5eVv+fhKO0=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 162, - "width": 86.72802734375, - "height": 13, - "text": "Mouse", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5egvefr5dY=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5eguufoe90=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 177, - "width": 86.72802734375, - "height": 13, - "text": "Window", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5ez7ufy4EQ=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5ez6ufvz18=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 192, - "width": 86.72802734375, - "height": 13, - "text": "Game", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5fJjuf5RNs=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5fJi+f2WU0=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 207, - "width": 86.72802734375, - "height": 13, - "text": "Other", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy5feHegACm4=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - }, - "model": { - "$ref": "AAAAAAGKy5feGef9Zk8=" - }, - "font": "Arial;13;0", - "left": 805, - "top": 222, - "width": 86.72802734375, - "height": 13, - "text": "None", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 800, - "top": 142, - "width": 96.72802734375, - "height": 98 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 800, - "top": 104, - "width": 96.72802734375, - "height": 137, - "nameCompartment": { - "$ref": "AAAAAAGKy5dDNOeu5y8=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKy5dDNOezZmg=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy5dDNOe0C9E=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy5dDNOe1YC4=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy5dDNOe2XaQ=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKy5dDNOe3xS4=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKy5hcwugLSnM=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy5hcwugMB18=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy5hcwugNhmk=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugMB18=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 80, - "top": 352, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5hcwugO3rk=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugMB18=" - }, - "font": "Arial;13;3", - "left": 973, - "top": 295, - "width": 175, - "height": 13, - "text": "Event" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5hcwugP2HM=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugMB18=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 80, - "top": 352, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy5hcwugQmF8=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugMB18=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 80, - "top": 352, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 968, - "top": 288, - "width": 185, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKy5hcwugNhmk=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy5hcwugO3rk=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy5hcwugP2HM=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy5hcwugQmF8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy5hcwugRj5w=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy6FBG+89uFM=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugRj5w=" - }, - "model": { - "$ref": "AAAAAAGKy6FBFO86nZs=" - }, - "font": "Arial;13;0", - "left": 973, - "top": 318, - "width": 175, - "height": 13, - "text": "#EventType _type", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 968, - "top": 313, - "width": 185, - "height": 23 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy5hcwugSF40=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy5h5Peg2KnE=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugSF40=" - }, - "model": { - "$ref": "AAAAAAGKy5h5Nugz5q8=" - }, - "font": "Arial;13;0", - "left": 973, - "top": 341, - "width": 175, - "height": 13, - "text": "+Event(EventType type)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy6G4W/IPNII=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugSF40=" - }, - "model": { - "$ref": "AAAAAAGKy6G4V/IMoqQ=" - }, - "font": "Arial;13;0", - "left": 973, - "top": 356, - "width": 175, - "height": 13, - "text": "+getType(): EventType", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 968, - "top": 336, - "width": 185, - "height": 38 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy5hcwugTE0Y=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 40, - "top": 176, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy5hcwugUvnY=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "model": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 40, - "top": 176, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 968, - "top": 288, - "width": 185, - "height": 97, - "nameCompartment": { - "$ref": "AAAAAAGKy5hcwugMB18=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKy5hcwugRj5w=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy5hcwugSF40=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy5hcwugTE0Y=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy5hcwugUvnY=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy5vm2OhBtYM=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhCmzQ=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 955, - "top": 230, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhDVOg=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 964, - "top": 218, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhEfzk=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 936, - "top": 253, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhFcIU=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og+B1Q=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 926, - "top": 208, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhGO74=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og+B1Q=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 936, - "top": 199, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhHDt8=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og+B1Q=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 906, - "top": 227, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhI/vs=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og/edw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 984, - "top": 253, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhJliM=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og/edw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 991, - "top": 241, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy5vm2OhKzaI=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og/edw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 971, - "top": 277, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy5vm2OhLTJ0=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og+B1Q=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy5vm2OhMNj4=", - "_parent": { - "$ref": "AAAAAAGKy5vm2OhBtYM=" - }, - "model": { - "$ref": "AAAAAAGKy5vm2Og/edw=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "tail": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "lineStyle": 1, - "points": "897:210;996:287", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy5vm2OhCmzQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy5vm2OhDVOg=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy5vm2OhEfzk=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy5vm2OhFcIU=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy5vm2OhGO74=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy5vm2OhHDt8=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy5vm2OhI/vs=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy5vm2OhJliM=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy5vm2OhKzaI=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy5vm2OhLTJ0=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy5vm2OhMNj4=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy6EpTOyxFEo=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOyyxGo=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 723, - "top": 189, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOyznZc=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 718, - "top": 175, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy03fQ=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 732, - "top": 218, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy1KZA=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yufN4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 677, - "top": 204, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy2mX8=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yufN4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 675, - "top": 191, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy3g0M=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yufN4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 681, - "top": 232, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy4zCw=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yv08g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 769, - "top": 174, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy5gN8=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yv08g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 763, - "top": 162, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6EpTOy6LIo=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yv08g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 782, - "top": 199, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6EpTOy7aps=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yufN4=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6EpTOy8Fi0=", - "_parent": { - "$ref": "AAAAAAGKy6EpTOyxFEo=" - }, - "model": { - "$ref": "AAAAAAGKy6EpS+yv08g=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy5dDNOet6Rw=" - }, - "tail": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "lineStyle": 1, - "points": "657:233;799:187", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy6EpTOyyxGo=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6EpTOyznZc=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6EpTOy03fQ=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy6EpTOy1KZA=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy6EpTOy2mX8=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy6EpTOy3g0M=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy6EpTOy4zCw=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy6EpTOy5gN8=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy6EpTOy6LIo=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy6EpTOy7aps=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy6EpTOy8Fi0=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy6MtYPq+AM8=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPq/ykQ=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 293, - "top": 580, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrAq/4=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 279, - "top": 575, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrBjSY=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 322, - "top": 591, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrCo+A=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq7YQw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 286, - "top": 603, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrDImI=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq7YQw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 274, - "top": 596, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrEcbc=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq7YQw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 310, - "top": 617, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYPrFKbg=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq83Xg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 302, - "top": 558, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYfrGX5k=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq83Xg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 289, - "top": 555, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6MtYfrHgzY=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq83Xg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 330, - "top": 563, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6MtYfrI4Rs=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq7YQw=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6MtYfrJtCw=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq+AM8=" - }, - "model": { - "$ref": "AAAAAAGKy6MtYPq83Xg=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy44fAOauFrk=" - }, - "tail": { - "$ref": "AAAAAAGKy5UtWudRRVo=" - }, - "lineStyle": 1, - "points": "291:639;326:545", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy6MtYPq/ykQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6MtYPrAq/4=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6MtYPrBjSY=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy6MtYPrCo+A=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy6MtYPrDImI=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy6MtYPrEcbc=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy6MtYPrFKbg=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy6MtYfrGX5k=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy6MtYfrHgzY=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy6MtYfrI4Rs=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy6MtYfrJtCw=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKy6NJevu/+WM=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy6NJevvAisI=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy6NJevvB1rk=", - "_parent": { - "$ref": "AAAAAAGKy6NJevvAisI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -464, - "top": -202, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6NJevvCze4=", - "_parent": { - "$ref": "AAAAAAGKy6NJevvAisI=" - }, - "font": "Arial;13;1", - "left": 741, - "top": 423, - "width": 159, - "height": 13, - "text": "KeyboardEvent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6NJevvDLhw=", - "_parent": { - "$ref": "AAAAAAGKy6NJevvAisI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -464, - "top": -202, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6NJe/vEcaw=", - "_parent": { - "$ref": "AAAAAAGKy6NJevvAisI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -464, - "top": -202, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 736, - "top": 416, - "width": 169, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6NJevvB1rk=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy6NJevvCze4=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy6NJevvDLhw=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6NJe/vEcaw=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy6NJe/vFpAE=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy6tfK4whsC4=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy6tfI4wVS/U=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 446, - "width": 159, - "height": 13, - "text": "+KeyState _state", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy6vxtY2Qsw0=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy6vxsY2EYx0=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 461, - "width": 159, - "height": 13, - "text": "+KeyIdentifier _id", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7GakveWE/Y=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy7Gai/eK4fY=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 476, - "width": 159, - "height": 13, - "text": "+bool _isShiftPressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7HeQ/jnVaA=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy7HeP/jbU4c=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 491, - "width": 159, - "height": 13, - "text": "+bool _isCtrlPressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7OjWfqhyvk=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy7OjVfqV/c4=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 506, - "width": 159, - "height": 13, - "text": "+bool _isAltPressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7O+qPtrE5k=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "model": { - "$ref": "AAAAAAGKy7O+o/tfyZc=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 521, - "width": 159, - "height": 13, - "text": "+bool _isSystemPressed", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 736, - "top": 441, - "width": 169, - "height": 98 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy6NJe/vGTVE=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKy6Q3vQHO6X0=", - "_parent": { - "$ref": "AAAAAAGKy6NJe/vGTVE=" - }, - "model": { - "$ref": "AAAAAAGKy6Q3twHCkjA=" - }, - "font": "Arial;13;0", - "left": 741, - "top": 544, - "width": 159, - "height": 13, - "text": "+KeyboardEvent()", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 736, - "top": 539, - "width": 169, - "height": 23 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy6NJe/vHKn8=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -232, - "top": -101, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy6NJe/vINsg=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "model": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -232, - "top": -101, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 736, - "top": 416, - "width": 169, - "height": 146, - "nameCompartment": { - "$ref": "AAAAAAGKy6NJevvAisI=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKy6NJe/vFpAE=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy6NJe/vGTVE=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy6NJe/vHKn8=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy6NJe/vINsg=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAGKy6NJlPwVnQ8=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6NJlPwT2lk=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6NJlPwWJRI=", - "_parent": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "model": { - "$ref": "AAAAAAGKy6NJlPwT2lk=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 936, - "top": 390, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6NJlPwXGvc=", - "_parent": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "model": { - "$ref": "AAAAAAGKy6NJlPwT2lk=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 928, - "top": 377, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6NJlPwYyME=", - "_parent": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "model": { - "$ref": "AAAAAAGKy6NJlPwT2lk=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 951, - "top": 415, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6NJlPwVnQ8=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "tail": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "lineStyle": 1, - "points": "905:434;983:385", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy6NJlPwWJRI=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6NJlPwXGvc=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6NJlPwYyME=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKy6R26AOoAPU=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy6R26AOptKg=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy6R26AOqTic=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOptKg=" - }, - "font": "Arial;13;0", - "left": 581, - "top": 613, - "width": 86.72802734375, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6R26AOr6FM=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOptKg=" - }, - "font": "Arial;13;1", - "left": 581, - "top": 628, - "width": 86.72802734375, - "height": 13, - "text": "KeyState" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6R26AOs2js=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOptKg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -496, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6R26AOtCmI=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOptKg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -496, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 576, - "top": 608, - "width": 96.72802734375, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6R26AOqTic=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy6R26AOr6FM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy6R26AOs2js=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6R26AOtCmI=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy6R26AOuEKs=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -8, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy6R26AOvgqk=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -8, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy6R26AOwlV0=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -8, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy6R26AOx0N0=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -8, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKy6R26AOypdw=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "model": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6SWIQSmxzo=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOypdw=" - }, - "model": { - "$ref": "AAAAAAGKy6SWGgSa6zA=" - }, - "font": "Arial;13;0", - "left": 581, - "top": 651, - "width": 86.72802734375, - "height": 13, - "text": "Pressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6Sm4wVzCy4=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOypdw=" - }, - "model": { - "$ref": "AAAAAAGKy6Sm3wVnx3c=" - }, - "font": "Arial;13;0", - "left": 581, - "top": 666, - "width": 86.72802734375, - "height": 13, - "text": "Released", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 576, - "top": 646, - "width": 96.72802734375, - "height": 38 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 576, - "top": 608, - "width": 96.72802734375, - "height": 81, - "nameCompartment": { - "$ref": "AAAAAAGKy6R26AOptKg=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKy6R26AOuEKs=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy6R26AOvgqk=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy6R26AOwlV0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy6R26AOx0N0=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKy6R26AOypdw=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy6TRhwtJ6hc=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtK4vE=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 694, - "top": 564, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtLaTQ=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 685, - "top": 552, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtMLeg=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 713, - "top": 587, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtNExA=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtGcpg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 683, - "top": 573, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtOmKg=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtGcpg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 676, - "top": 562, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtP3nM=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtGcpg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 697, - "top": 597, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtQAjo=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtHrA0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 705, - "top": 555, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtR+cI=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtHrA0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 695, - "top": 547, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6TRhwtS8JE=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtHrA0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 726, - "top": 574, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6TRhwtTiDM=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtGcpg=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6TRhwtU26k=", - "_parent": { - "$ref": "AAAAAAGKy6TRhwtJ6hc=" - }, - "model": { - "$ref": "AAAAAAGKy6TRhgtHrA0=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "tail": { - "$ref": "AAAAAAGKy6R26AOoAPU=" - }, - "lineStyle": 1, - "points": "673:608;735:557", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy6TRhwtK4vE=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6TRhwtLaTQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6TRhwtMLeg=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy6TRhwtNExA=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy6TRhwtOmKg=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy6TRhwtP3nM=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy6TRhwtQAjo=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy6TRhwtR+cI=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy6TRhwtS8JE=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy6TRhwtTiDM=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy6TRhwtU26k=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKy6UGNw4z7uA=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy6UGNw40jCc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy6UGNw41Aq4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw40jCc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 613, - "width": 174, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6UGNw42dMM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw40jCc=" - }, - "font": "Arial;13;1", - "left": 709, - "top": 628, - "width": 174, - "height": 13, - "text": "KeyIdentifier" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6UGNw430rs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw40jCc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": -496, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy6UGNw44A6c=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw40jCc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": -496, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 704, - "top": 608, - "width": 184, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6UGNw41Aq4=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy6UGNw42dMM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy6UGNw430rs=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6UGNw44A6c=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy6UGNw45C2o=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy6UGNw46veM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy6UGNw47lt0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy6UGNw48SWg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -248, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKy6UGNw490v4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "model": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6UdMw+OJ0U=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6UdKw9//bc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 651, - "width": 174, - "height": 13, - "text": "A", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6UldBCd5kQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6UlbxCOw54=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 666, - "width": 174, - "height": 13, - "text": "B", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6U7OxEowec=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6U7NhEZwbQ=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 681, - "width": 174, - "height": 13, - "text": "C", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VBLhGzNvQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VBKhGkP7Y=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 696, - "width": 174, - "height": 13, - "text": "D", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VFpxJWiP8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VFoxJHPFU=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 711, - "width": 174, - "height": 13, - "text": "E", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VK9BL5ND4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VK8BLqtVo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 726, - "width": 174, - "height": 13, - "text": "F", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VPrxOcJYA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VPqxONUlg=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 741, - "width": 174, - "height": 13, - "text": "G", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VUYRQ/Jv4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VUXRQwbLw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 756, - "width": 174, - "height": 13, - "text": "H", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6Vlthhy9BQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VlshhjgHM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 771, - "width": 174, - "height": 13, - "text": "I", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6VtVRkV1wQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VtUhkGCEY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 786, - "width": 174, - "height": 13, - "text": "J", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6Vxahm4tg8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6VxZhmpDJQ=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 801, - "width": 174, - "height": 13, - "text": "K", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WDrRrfsk0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WDqBrQqHw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 816, - "width": 174, - "height": 13, - "text": "L", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WSuRuCDdE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WStRtzk3E=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 831, - "width": 174, - "height": 13, - "text": "M", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WXChwlSPw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WXBhwWXGQ=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 846, - "width": 174, - "height": 13, - "text": "N", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WcUBzIu+4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WcTBy52Ic=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 861, - "width": 174, - "height": 13, - "text": "O", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WpOB3vdZc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WpNB3gJWg=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 876, - "width": 174, - "height": 13, - "text": "P", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6WvbB6SecA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6WvZx6Dc/Y=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 891, - "width": 174, - "height": 13, - "text": "Q", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6W2kx81+1w=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6W2jx8mEOs=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 906, - "width": 174, - "height": 13, - "text": "R", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6W8/R/YqWo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6W8+R/JCNQ=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 921, - "width": 174, - "height": 13, - "text": "S", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XBiCB7+M4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XBhCBs/BM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 936, - "width": 174, - "height": 13, - "text": "T", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XIUiEey/E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XITiEPvCI=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 951, - "width": 174, - "height": 13, - "text": "U", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XMhiHBVoA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XMgiGyXEo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 966, - "width": 174, - "height": 13, - "text": "V", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XTRiJk6hw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XTQiJVU3E=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 981, - "width": 174, - "height": 13, - "text": "X", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XZQCMHFm0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XZPCL4k1U=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 996, - "width": 174, - "height": 13, - "text": "Y", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XciCOq3Rk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XchCObi0A=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1011, - "width": 174, - "height": 13, - "text": "Z", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6XkcyRNMy4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6XkbSQ+wlc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1026, - "width": 174, - "height": 13, - "text": "NUM_0", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6YHYSTwqIM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6YHXSThiGA=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1041, - "width": 174, - "height": 13, - "text": "NUM_1", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6YRciWT1JQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6YRbiWEEbY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1056, - "width": 174, - "height": 13, - "text": "NUM_2", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6YeQyY29PQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6YePiYnjzY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1071, - "width": 174, - "height": 13, - "text": "NUM_3", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6Yo6ybZXo8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6Yo5ibKa4c=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1086, - "width": 174, - "height": 13, - "text": "NUM_4", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6ZqTivw9Fs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6ZqSivh0Mw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1101, - "width": 174, - "height": 13, - "text": "NUM_5", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6Z4OSyTG7c=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6Z4NSyEVBI=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1116, - "width": 174, - "height": 13, - "text": "NUM_6", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6aLJC32iDc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6aLIC3ndE8=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1131, - "width": 174, - "height": 13, - "text": "NUM_7", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6aTji6Z3Y0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6aTii6KE2I=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1146, - "width": 174, - "height": 13, - "text": "NUM_8", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6aani88shc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6aami8taiA=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1161, - "width": 174, - "height": 13, - "text": "NUM_9", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6a0DDCfViM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6a0CDCQHZI=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1176, - "width": 174, - "height": 13, - "text": "ESCAPE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6cH/T5XDyI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6cH+D5IHII=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1191, - "width": 174, - "height": 13, - "text": "LCONTROL", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6cdVT761ow=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6cdUT7rk4A=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1206, - "width": 174, - "height": 13, - "text": "LSHIFT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6cpgj+dUjI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6cpfj+OQEg=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1221, - "width": 174, - "height": 13, - "text": "LALT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6cwnkBABBg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6cwmkAxeJo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1236, - "width": 174, - "height": 13, - "text": "LSYSTEM", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6c9i0Djj7Q=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6c9h0DU5yg=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1251, - "width": 174, - "height": 13, - "text": "RCONTROL", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6dNFEYG2FU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6dNDkX32XM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1266, - "width": 174, - "height": 13, - "text": "RSHIFT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6dXFUapS+U=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6dXEEaaix0=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1281, - "width": 174, - "height": 13, - "text": "RALT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6diWEdMRaU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6diU0c9bs0=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1296, - "width": 174, - "height": 13, - "text": "RSYSTEM", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6dzokhzYKc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6dznkhkqDI=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1311, - "width": 174, - "height": 13, - "text": "MENU", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6eU8EoSvLY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6eU7EoDiis=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1326, - "width": 174, - "height": 13, - "text": "LBRACKET", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6escks5FyY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6esbksqKgc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1341, - "width": 174, - "height": 13, - "text": "RBRACKET", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6e2oUvc4Cc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6e2nUvN9Ok=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1356, - "width": 174, - "height": 13, - "text": "SEMICOLON", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6fNflHvGq4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6fNelHgLHo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1371, - "width": 174, - "height": 13, - "text": "COMMA", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6fc2lKSMiE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6fc1lKDhUA=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1386, - "width": 174, - "height": 13, - "text": "PERIOD", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6flCFM1sKM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6flBFMmYdo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1401, - "width": 174, - "height": 13, - "text": "QUOTE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6fsUFPYxs4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6fsTFPJC9s=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1416, - "width": 174, - "height": 13, - "text": "SLASH", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6fxEFR75lE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6fxDFRsU/E=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1431, - "width": 174, - "height": 13, - "text": "BACKSLASH", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6f5jVUeadk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6f5iVUPdQM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1446, - "width": 174, - "height": 13, - "text": "TILDE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6gBjlXBghU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6gBiVWybvc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1461, - "width": 174, - "height": 13, - "text": "EQUAL", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6gPUVZksso=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6gPTVZVyZU=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1476, - "width": 174, - "height": 13, - "text": "DASH", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6gk3lcHAaY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6gk2lb4a9s=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1491, - "width": 174, - "height": 13, - "text": "SPACE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6gth1eq2jY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6gtg1ebhY4=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1506, - "width": 174, - "height": 13, - "text": "RETURN", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6gyOlhN5bY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6gyNVg+JIc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1521, - "width": 174, - "height": 13, - "text": "BACKSPACE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6hBi1jwNVs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6hBh1jhDbE=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1536, - "width": 174, - "height": 13, - "text": "TAB", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6hNUlmTXt4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6hNTlmEG34=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1551, - "width": 174, - "height": 13, - "text": "PAGEUP", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6hUElo2/Qk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6hUDlonlUg=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1566, - "width": 174, - "height": 13, - "text": "PAGEDOWN", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6h/XlvilRA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6h/WlvTocw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1581, - "width": 174, - "height": 13, - "text": "END", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6iRBVyFVMQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6iRAFx2IxU=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1596, - "width": 174, - "height": 13, - "text": "HOME", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6iZ8F0ocgs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6iZ7F0ZLyY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1611, - "width": 174, - "height": 13, - "text": "INSERT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6ikB13LUDI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6ikAl28V5M=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1626, - "width": 174, - "height": 13, - "text": "DELETE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6irRF5uvU8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6irQF5f7/M=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1641, - "width": 174, - "height": 13, - "text": "ADD", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6i5SF8RTMg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6i5Q18CD/E=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1656, - "width": 174, - "height": 13, - "text": "SUBSTRACT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jCOl+0WQk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jCNV+lYS8=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1671, - "width": 174, - "height": 13, - "text": "MULTIPLY", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jQDmBX9bE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jQCmBIFZk=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1686, - "width": 174, - "height": 13, - "text": "DIVIDE", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jbFWD6IU8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jbEGDr94E=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1701, - "width": 174, - "height": 13, - "text": "LEFT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jkdmGdv6A=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jkcWGOYg0=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1716, - "width": 174, - "height": 13, - "text": "RIGHT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jog2JAtHk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jofmIxkuM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1731, - "width": 174, - "height": 13, - "text": "UP", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jwkWLjYZQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jwjGLUdvY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1746, - "width": 174, - "height": 13, - "text": "DOWN", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6jzzWOGVdY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6jzyGN3hGw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1761, - "width": 174, - "height": 13, - "text": "NUMPAD_0", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6kHO2n5074=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6kHNmnqrXU=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1776, - "width": 174, - "height": 13, - "text": "NUMPAD_1", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6lmy2zqRO0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6lmxmzbick=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1791, - "width": 174, - "height": 13, - "text": "NUMPAD_2", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6mD93IlQew=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6mD8nIWfoo=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1806, - "width": 174, - "height": 13, - "text": "NUMPAD_3", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6mSCHLIdrE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6mSBHK5i+g=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1821, - "width": 174, - "height": 13, - "text": "NUMPAD_4", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6mkrXNrtVo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6mkqHNc0YA=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1836, - "width": 174, - "height": 13, - "text": "NUMPAD_5", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6mvgXQOGQg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6mvfHP/nMw=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1851, - "width": 174, - "height": 13, - "text": "NUMPAD_6", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6m7qnSxX+U=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6m7pXSiwWM=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1866, - "width": 174, - "height": 13, - "text": "NUMPAD_7", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6nI43VUWDw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6nI3nVFbJs=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1881, - "width": 174, - "height": 13, - "text": "NUMPAD_8", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6naN3X3T5k=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6naMnXoBEE=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1896, - "width": 174, - "height": 13, - "text": "NUMPAD_9", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6nlQXaa3Y4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6nlPHaL8Fc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1911, - "width": 174, - "height": 13, - "text": "F1", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6n7RXc9VJ4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6n7QHcugbA=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1926, - "width": 174, - "height": 13, - "text": "F2", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oD3XfgHxg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oD2HfRJXY=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1941, - "width": 174, - "height": 13, - "text": "F3", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oQT3iDxQY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oQS3h0Jrk=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1956, - "width": 174, - "height": 13, - "text": "F4", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oXFHkmIQw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oXD3kXoVc=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1971, - "width": 174, - "height": 13, - "text": "F5", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oc2nnJ4QA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oc1Xm6UEE=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 1986, - "width": 174, - "height": 13, - "text": "F6", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oitHpsVZw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oirnpdqc4=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 2001, - "width": 174, - "height": 13, - "text": "F7", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6oqTXsPAsQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6oqSHsAQ3M=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 2016, - "width": 174, - "height": 13, - "text": "F8", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6owX3uyCLk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6owW3ujXn4=" - }, - "font": "Arial;13;0", - "left": 709, - "top": 2031, - "width": 174, - "height": 13, - "text": "F9", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy6o4EXxV6QM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw490v4=" - }, - "model": { - "$ref": "AAAAAAGKy6o4DHxGaTc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 693, - "top": 1798, - "width": 174, - "height": 13, - "text": "Literal1", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 704, - "top": 646, - "width": 184, - "height": 1403 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 704, - "top": 608, - "width": 184, - "height": 1441, - "nameCompartment": { - "$ref": "AAAAAAGKy6UGNw40jCc=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKy6UGNw45C2o=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy6UGNw46veM=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy6UGNw47lt0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy6UGNw48SWg=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKy6UGNw490v4=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy6sUXIpu4to=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIpvmnc=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 802, - "top": 577, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIpwHok=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 787, - "top": 576, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIpx3z0=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 831, - "top": 578, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIpyZlU=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIprmOc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 802, - "top": 574, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIpzXEw=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIprmOc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 788, - "top": 571, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIp0qoQ=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIprmOc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 829, - "top": 579, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIp1l4s=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpsoQM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 801, - "top": 581, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIp253g=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpsoQM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 788, - "top": 583, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy6sUXIp3lww=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpsoQM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 829, - "top": 578, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6sUXIp4D9Q=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIprmOc=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy6sUXIp5Z0E=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpu4to=" - }, - "model": { - "$ref": "AAAAAAGKy6sUXIpsoQM=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy6NJevu/+WM=" - }, - "tail": { - "$ref": "AAAAAAGKy6UGNw4z7uA=" - }, - "lineStyle": 1, - "points": "816:607;818:562", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy6sUXIpvmnc=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy6sUXIpwHok=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy6sUXIpx3z0=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy6sUXIpyZlU=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy6sUXIpzXEw=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy6sUXIp0qoQ=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy6sUXIp1l4s=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy6sUXIp253g=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy6sUXIp3lww=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy6sUXIp4D9Q=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy6sUXIp5Z0E=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKy7Ri5QV8rqY=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy7Ri5QV99EA=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy7Ri5QV+6G4=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV99EA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -4, - "top": -336, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7Ri5QV/5Q0=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV99EA=" - }, - "font": "Arial;13;1", - "left": 965, - "top": 479, - "width": 1383.9287109375, - "height": 13, - "text": "MouseEvent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7Ri5QWA0OE=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV99EA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -4, - "top": -336, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7Ri5QWBOQk=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV99EA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -4, - "top": -336, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 960, - "top": 472, - "width": 1393.9287109375, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7Ri5QV+6G4=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy7Ri5QV/5Q0=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy7Ri5QWA0OE=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7Ri5QWBOQk=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy7Ri5QWCAEY=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7c30zswX+I=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy7c3yjseke0=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 502, - "width": 1383.9287109375, - "height": 13, - "text": "+MousePosition _pos", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7dK6DwehLQ=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy7dK4jwMByE=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 517, - "width": 1383.9287109375, - "height": 13, - "text": "+MouseButton _button", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy7/Zyj02lfE=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy7/ZxD0k+qY=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 532, - "width": 1383.9287109375, - "height": 13, - "text": "+MouseState _state", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy8BYt0MUxzg=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy8BYsUMC2Nc=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 547, - "width": 1383.9287109375, - "height": 13, - "text": "+bool _isMoving", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy8BxuUQsGwA=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy8BxskQanGQ=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 562, - "width": 1383.9287109375, - "height": 13, - "text": "+bool _isAltPressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy8CJVUVEVi8=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy8CJUEUyHqg=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 577, - "width": 1383.9287109375, - "height": 13, - "text": "+bool _isShiftPressed", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKy8CcnkZcBr4=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "model": { - "$ref": "AAAAAAGKy8CcmUZKDQk=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 592, - "width": 1383.9287109375, - "height": 13, - "text": "+bool _isCtrolPressed", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 960, - "top": 497, - "width": 1393.9287109375, - "height": 113 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy7Ri5gWD9Gk=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzBT9x82ykSs=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5gWD9Gk=" - }, - "model": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "font": "Arial;13;0", - "left": 965, - "top": 615, - "width": 1383.9287109375, - "height": 13, - "text": "+MouseEvent(const int &aX, const int &aY, const MouseButton &aButton, const MouseState &aState, const bool &aIsMoving = false, const bool &aIsAltPressed = false, const bool &aIsShiftPressed = false, const bool &aIsCtrlPressed = false)", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 960, - "top": 610, - "width": 1393.9287109375, - "height": 23 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy7Ri5gWEddI=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -2, - "top": -168, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy7Ri5gWFMXk=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "model": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -2, - "top": -168, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 960, - "top": 472, - "width": 1393.9287109375, - "height": 161, - "nameCompartment": { - "$ref": "AAAAAAGKy7Ri5QV99EA=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKy7Ri5QWCAEY=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy7Ri5gWD9Gk=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy7Ri5gWEddI=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy7Ri5gWFMXk=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAGKy7RjEQXwhc0=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7RjEQXulj4=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7RjEQXxX6c=", - "_parent": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "model": { - "$ref": "AAAAAAGKy7RjEQXulj4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1287, - "top": 428, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7RjEQXyNs4=", - "_parent": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "model": { - "$ref": "AAAAAAGKy7RjEQXulj4=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1282, - "top": 442, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7RjEQXzlX8=", - "_parent": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "model": { - "$ref": "AAAAAAGKy7RjEQXulj4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1298, - "top": 399, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7RjEQXwhc0=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "tail": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "lineStyle": 1, - "points": "1433:471;1153:370", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy7RjEQXxX6c=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7RjEQXyNs4=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7RjEQXzlX8=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKy7TUGBb1LkU=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy7TUGBb2hB0=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy7TUGBb3jnQ=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb2hB0=" - }, - "font": "Arial;13;0", - "left": 997, - "top": 701, - "width": 86.72802734375, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7TUGBb4UYA=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb2hB0=" - }, - "font": "Arial;13;1", - "left": 997, - "top": 716, - "width": 86.72802734375, - "height": 13, - "text": "MouseButton" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7TUGBb5WYw=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb2hB0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -128, - "top": -384, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7TUGBb6dwo=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb2hB0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -128, - "top": -384, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 992, - "top": 696, - "width": 96.72802734375, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7TUGBb3jnQ=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy7TUGBb4UYA=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy7TUGBb5WYw=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7TUGBb6dwo=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy7TUGBb7PEw=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -64, - "top": -192, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy7TUGBb8o7A=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -64, - "top": -192, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy7TUGBb9etw=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -64, - "top": -192, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy7TUGBb+Wg0=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -64, - "top": -192, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKy7TUGBb/Nn0=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "model": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy7TyVBqaOW8=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb/Nn0=" - }, - "model": { - "$ref": "AAAAAAGKy7TySxqIXe8=" - }, - "font": "Arial;13;0", - "left": 997, - "top": 739, - "width": 86.72802734375, - "height": 13, - "text": "LEFT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy7UVMhvr2f4=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb/Nn0=" - }, - "model": { - "$ref": "AAAAAAGKy7UVLRvZVwU=" - }, - "font": "Arial;13;0", - "left": 997, - "top": 754, - "width": 86.72802734375, - "height": 13, - "text": "RIGHT", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy7Uc/ByX89c=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBb/Nn0=" - }, - "model": { - "$ref": "AAAAAAGKy7Uc9hyFJKo=" - }, - "font": "Arial;13;0", - "left": 997, - "top": 769, - "width": 86.72802734375, - "height": 13, - "text": "MIDDLE", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 992, - "top": 734, - "width": 96.72802734375, - "height": 53 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 992, - "top": 696, - "width": 96.72802734375, - "height": 91, - "nameCompartment": { - "$ref": "AAAAAAGKy7TUGBb2hB0=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKy7TUGBb7PEw=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy7TUGBb8o7A=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy7TUGBb9etw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy7TUGBb+Wg0=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKy7TUGBb/Nn0=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKy7WNIiR4r8U=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKy7WNIiR5iik=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKy7WNIiR6jFI=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR5iik=" - }, - "font": "Arial;13;0", - "left": 1189, - "top": 725, - "width": 94, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7WNIiR7PEk=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR5iik=" - }, - "font": "Arial;13;1", - "left": 1189, - "top": 740, - "width": 94, - "height": 13, - "text": "MouseState" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7WNIiR8c0M=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR5iik=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": -272, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKy7WNIiR9kHU=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR5iik=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -32, - "top": -272, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1184, - "top": 720, - "width": 104, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7WNIiR6jFI=" - }, - "nameLabel": { - "$ref": "AAAAAAGKy7WNIiR7PEk=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKy7WNIiR8c0M=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7WNIiR9kHU=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKy7WNIiR+JLs=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -136, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKy7WNIiR/tY0=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -136, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy7WNIiSAWiw=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -136, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKy7WNIiSBH2c=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -16, - "top": -136, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKy7WNIiSCxOE=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "model": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy7WjLSYA+bE=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiSCxOE=" - }, - "model": { - "$ref": "AAAAAAGKy7WjJCXuUbs=" - }, - "font": "Arial;13;0", - "left": 1189, - "top": 763, - "width": 94, - "height": 13, - "text": "RELEASED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKy7WyaCasAIA=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiSCxOE=" - }, - "model": { - "$ref": "AAAAAAGKy7WyYiaadOA=" - }, - "font": "Arial;13;0", - "left": 1189, - "top": 778, - "width": 94, - "height": 13, - "text": "PRESSED", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1184, - "top": 758, - "width": 104, - "height": 38 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1184, - "top": 720, - "width": 104, - "height": 76, - "nameCompartment": { - "$ref": "AAAAAAGKy7WNIiR5iik=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKy7WNIiR+JLs=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKy7WNIiR/tY0=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy7WNIiSAWiw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKy7WNIiSBH2c=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKy7WNIiSCxOE=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy7XM3Cj9cOo=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3Cj+4cE=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1235, - "top": 658, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3Cj/yD0=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1231, - "top": 644, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkAJMQ=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1244, - "top": 687, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkBah8=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj6G/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1109, - "top": 698, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkCT0M=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj6G/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1107, - "top": 684, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkDDo4=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj6G/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1113, - "top": 725, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkERPw=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj7YHc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1362, - "top": 620, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkFq7c=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj7YHc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1356, - "top": 608, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XM3CkGFm4=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj7YHc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1374, - "top": 645, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy7XM3CkHue4=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj6G/k=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy7XM3CkI8T4=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj9cOo=" - }, - "model": { - "$ref": "AAAAAAGKy7XM3Cj7YHc=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "tail": { - "$ref": "AAAAAAGKy7TUGBb1LkU=" - }, - "lineStyle": 1, - "points": "1089:726;1392:633", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy7XM3Cj+4cE=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7XM3Cj/yD0=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7XM3CkAJMQ=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy7XM3CkBah8=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy7XM3CkCT0M=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy7XM3CkDDo4=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy7XM3CkERPw=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy7XM3CkFq7c=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy7XM3CkGFm4=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy7XM3CkHue4=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy7XM3CkI8T4=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKy7XWKy0PQz0=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0QMVA=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1382, - "top": 662, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0Rvf0=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1375, - "top": 649, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0SlxA=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1395, - "top": 689, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0TYXc=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0MARM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1304, - "top": 700, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0Uf7I=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0MARM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1301, - "top": 687, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0V0bM=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0MARM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1312, - "top": 726, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0W5z4=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0NMWc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1460, - "top": 624, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0X3vM=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0NMWc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1452, - "top": 613, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKy7XWKy0YVWc=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0NMWc=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1475, - "top": 647, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy7XWKy0Z5N0=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0MARM=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKy7XWKy0a3j4=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0PQz0=" - }, - "model": { - "$ref": "AAAAAAGKy7XWKy0NMWc=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy7Ri5QV8rqY=" - }, - "tail": { - "$ref": "AAAAAAGKy7WNIiR4r8U=" - }, - "lineStyle": 1, - "points": "1288:731;1490:633", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKy7XWKy0QMVA=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKy7XWKy0Rvf0=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKy7XWKy0SlxA=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKy7XWKy0TYXc=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKy7XWKy0Uf7I=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKy7XWKy0V0bM=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKy7XWKy0W5z4=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKy7XWKy0X3vM=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKy7XWKy0YVWc=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKy7XWKy0Z5N0=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKy7XWKy0a3j4=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKzBhYMDuTjYE=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzBhYMDuUE1w=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzBhYMDuV6Qo=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuUE1w=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 480, - "top": -794, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBhYMDuW+Dc=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuUE1w=" - }, - "font": "Arial;13;1", - "left": 1213, - "top": 127, - "width": 239.53515625, - "height": 13, - "text": "WindowEvent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBhYMDuXbRQ=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuUE1w=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 480, - "top": -794, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBhYMDuYh/8=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuUE1w=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 480, - "top": -794, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1208, - "top": 120, - "width": 249.53515625, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBhYMDuV6Qo=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzBhYMDuW+Dc=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzBhYMDuXbRQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBhYMDuYh/8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzBhYMDuZh44=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzBxUXqGN8oU=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "model": { - "$ref": "AAAAAAGKzBxUVKF1qIw=" - }, - "font": "Arial;13;0", - "left": 1213, - "top": 150, - "width": 239.53515625, - "height": 13, - "text": "+WindowSize _size", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzBx3+6LeN2A=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "model": { - "$ref": "AAAAAAGKzBx38qLGtQg=" - }, - "font": "Arial;13;0", - "left": 1213, - "top": 165, - "width": 239.53515625, - "height": 13, - "text": "+WindowPosition _position", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzByT16RrH/o=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "model": { - "$ref": "AAAAAAGKzByT0KRTpQo=" - }, - "font": "Arial;13;0", - "left": 1213, - "top": 180, - "width": 239.53515625, - "height": 13, - "text": "+WindowDisplayState _windowState", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzBzJGqX4hOA=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "model": { - "$ref": "AAAAAAGKzBzJE6XgasI=" - }, - "font": "Arial;13;0", - "left": 1213, - "top": 195, - "width": 239.53515625, - "height": 13, - "text": "+WindowFocusState _windowFocusState", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzB0Rw6eFruA=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "model": { - "$ref": "AAAAAAGKzB0RvKdtpRY=" - }, - "font": "Arial;13;0", - "left": 1213, - "top": 210, - "width": 239.53515625, - "height": 13, - "text": "+WindowEventType _windowEventType", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1208, - "top": 145, - "width": 249.53515625, - "height": 83 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzBhYMDuaXjU=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "font": "Arial;13;0", - "left": 1208, - "top": 228, - "width": 249.53515625, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzBhYMDubq8s=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 240, - "top": -397, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzBhYMDuc504=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "model": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 240, - "top": -397, - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1208, - "top": 120, - "width": 249.53515625, - "height": 118, - "nameCompartment": { - "$ref": "AAAAAAGKzBhYMDuUE1w=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKzBhYMDuZh44=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzBhYMDuaXjU=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzBhYMDubq8s=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzBhYMDuc504=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAGKzBhYZjwlPV4=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBhYZjwjwZI=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBhYZjwmYUQ=", - "_parent": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "model": { - "$ref": "AAAAAAGKzBhYZjwjwZI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1193, - "top": 268, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBhYZjwnhXc=", - "_parent": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "model": { - "$ref": "AAAAAAGKzBhYZjwjwZI=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1201, - "top": 281, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBhYZjwo4ls=", - "_parent": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "model": { - "$ref": "AAAAAAGKzBhYZjwjwZI=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1178, - "top": 243, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBhYZjwlPV4=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKy5hcwugLSnM=" - }, - "tail": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "lineStyle": 1, - "points": "1229:238;1144:287", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKzBhYZjwmYUQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBhYZjwnhXc=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBhYZjwo4ls=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKzBkOn3Z8Yak=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzBkOn3Z9bjE=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzBkOn3Z+Q88=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z9bjE=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 29, - "width": 190, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBkOn3Z/UmQ=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z9bjE=" - }, - "font": "Arial;13;1", - "left": 1557, - "top": 44, - "width": 190, - "height": 13, - "text": "WindowFocusState" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBkOn3aAo9A=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z9bjE=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBkOn3aBgyQ=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z9bjE=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1552, - "top": 24, - "width": 200, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBkOn3Z+Q88=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzBkOn3Z/UmQ=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzBkOn3aAo9A=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBkOn3aBgyQ=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzBkOn3aCL4E=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzBkOn3aDwj0=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzBkOn3aEg2I=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzBkOn3aF+5Q=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKzBkOn3aGGaE=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "model": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBkvn3iOHpA=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3aGGaE=" - }, - "model": { - "$ref": "AAAAAAGKzBkvlnh2w8c=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 67, - "width": 190, - "height": 13, - "text": "FOCUSED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBk6Q3l8KYo=", - "_parent": { - "$ref": "AAAAAAGKzBkOn3aGGaE=" - }, - "model": { - "$ref": "AAAAAAGKzBk6O3lke7s=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 82, - "width": 190, - "height": 13, - "text": "UNFOCUSED", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1552, - "top": 62, - "width": 200, - "height": 38 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1552, - "top": 24, - "width": 200, - "height": 96, - "nameCompartment": { - "$ref": "AAAAAAGKzBkOn3Z9bjE=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKzBkOn3aCL4E=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzBkOn3aDwj0=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzBkOn3aEg2I=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzBkOn3aF+5Q=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKzBkOn3aGGaE=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKzBmXEo/AjY0=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/B1gI=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1508, - "top": 128, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/CKlQ=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1513, - "top": 142, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/DRS0=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1499, - "top": 99, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/Eo4U=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+98m4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1531, - "top": 121, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/FU0E=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+98m4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1533, - "top": 134, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/G/hg=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+98m4=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1526, - "top": 93, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/HTYE=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY++Dp0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1487, - "top": 136, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/IqYY=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY++Dp0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1493, - "top": 147, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBmXEo/JB4A=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY++Dp0=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1474, - "top": 111, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBmXEo/KxBs=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY+98m4=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBmXEo/Legg=", - "_parent": { - "$ref": "AAAAAAGKzBmXEo/AjY0=" - }, - "model": { - "$ref": "AAAAAAGKzBmXEY++Dp0=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "tail": { - "$ref": "AAAAAAGKzBkOn3Z8Yak=" - }, - "lineStyle": 1, - "points": "1551:105;1458:136", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKzBmXEo/B1gI=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBmXEo/CKlQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBmXEo/DRS0=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKzBmXEo/Eo4U=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKzBmXEo/FU0E=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKzBmXEo/G/hg=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKzBmXEo/HTYE=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKzBmXEo/IqYY=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKzBmXEo/JB4A=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKzBmXEo/KxBs=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKzBmXEo/Legg=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKzBm3kZiquiI=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzBm3kZir+rk=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzBm3kZisdAM=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZir+rk=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 141, - "width": 190, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBm3kZitCSg=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZir+rk=" - }, - "font": "Arial;13;1", - "left": 1557, - "top": 156, - "width": 190, - "height": 13, - "text": "WindowDisplayState" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBm3kZiu8Dc=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZir+rk=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBm3kZivnLk=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZir+rk=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1552, - "top": 136, - "width": 200, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBm3kZisdAM=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzBm3kZitCSg=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzBm3kZiu8Dc=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBm3kZivnLk=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzBm3kZiwEwY=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzBm3kZixqiE=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzBm3kpiy5HU=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzBm3kpizVDs=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKzBm3kpi0ofg=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "model": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBnrn5sBV4U=", - "_parent": { - "$ref": "AAAAAAGKzBm3kpi0ofg=" - }, - "model": { - "$ref": "AAAAAAGKzBnrlZrmABM=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 179, - "width": 190, - "height": 13, - "text": "FULLSCREEN", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBn6N5wQOMk=", - "_parent": { - "$ref": "AAAAAAGKzBm3kpi0ofg=" - }, - "model": { - "$ref": "AAAAAAGKzBn6L5v1kfs=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 194, - "width": 190, - "height": 13, - "text": "WINDOWED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBoHG51PYn4=", - "_parent": { - "$ref": "AAAAAAGKzBm3kpi0ofg=" - }, - "model": { - "$ref": "AAAAAAGKzBoHE5008A0=" - }, - "font": "Arial;13;0", - "left": 1557, - "top": 209, - "width": 190, - "height": 13, - "text": "MINIMIZED", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1552, - "top": 174, - "width": 200, - "height": 53 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1552, - "top": 136, - "width": 200, - "height": 91, - "nameCompartment": { - "$ref": "AAAAAAGKzBm3kZir+rk=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKzBm3kZiwEwY=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzBm3kZixqiE=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzBm3kpiy5HU=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzBm3kpizVDs=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKzBm3kpi0ofg=" - } - }, - { - "_type": "UMLEnumerationView", - "_id": "AAAAAAGKzBo7VqVNRn4=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzBo7VqVOCJw=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzBo7V6VPJZw=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVOCJw=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 269, - "width": 198, - "height": 13, - "text": "«enumeration»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBo7V6VQlec=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVOCJw=" - }, - "font": "Arial;13;1", - "left": 1549, - "top": 284, - "width": 198, - "height": 13, - "text": "WindowEventType" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBo7V6VRLoQ=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVOCJw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "width": 78.0126953125, - "height": 13, - "text": "(from Events)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzBo7V6VSOz8=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVOCJw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -608, - "top": -48, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1544, - "top": 264, - "width": 208, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBo7V6VPJZw=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzBo7V6VQlec=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzBo7V6VRLoQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBo7V6VSOz8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzBo7V6VTI+0=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzBo7V6VUlfQ=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzBo7V6VVgYc=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzBo7V6VWAQM=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -304, - "top": -24, - "width": 10, - "height": 10 - }, - { - "_type": "UMLEnumerationLiteralCompartmentView", - "_id": "AAAAAAGKzBo7V6VXDKI=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "model": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "subViews": [ - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBpbBqekygE=", - "_parent": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - }, - "model": { - "$ref": "AAAAAAGKzBpa+qeJhng=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 307, - "width": 198, - "height": 13, - "text": "RESIZING", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBpsHKizHq0=", - "_parent": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - }, - "model": { - "$ref": "AAAAAAGKzBpsFKiY2uY=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 322, - "width": 198, - "height": 13, - "text": "RESIZED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBp3oKnyoCo=", - "_parent": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - }, - "model": { - "$ref": "AAAAAAGKzBp3manXwrM=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 337, - "width": 198, - "height": 13, - "text": "CLOSED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBqEVqsx+5Y=", - "_parent": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - }, - "model": { - "$ref": "AAAAAAGKzBqETqsWPQQ=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 352, - "width": 198, - "height": 13, - "text": "FOCUSED", - "horizontalAlignment": 0 - }, - { - "_type": "UMLEnumerationLiteralView", - "_id": "AAAAAAGKzBqa9axwPR0=", - "_parent": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - }, - "model": { - "$ref": "AAAAAAGKzBqa7axVlmU=" - }, - "font": "Arial;13;0", - "left": 1549, - "top": 367, - "width": 198, - "height": 13, - "text": "UNFOCUSED", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1544, - "top": 302, - "width": 208, - "height": 83 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1544, - "top": 264, - "width": 208, - "height": 121, - "nameCompartment": { - "$ref": "AAAAAAGKzBo7VqVOCJw=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAGKzBo7V6VTI+0=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzBo7V6VUlfQ=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzBo7V6VVgYc=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzBo7V6VWAQM=" - }, - "enumerationLiteralCompartment": { - "$ref": "AAAAAAGKzBo7V6VXDKI=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKzBq7J7BQMA0=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BRrhQ=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1503, - "top": 188, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BSCGI=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1503, - "top": 203, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BTXdo=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1504, - "top": 158, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BUgaM=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BNkXM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1524, - "top": 188, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BVhbo=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BNkXM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1522, - "top": 201, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BWvto=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BNkXM=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1529, - "top": 161, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BXQHo=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BOfiU=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1483, - "top": 188, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BYmXo=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BOfiU=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1485, - "top": 201, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBq7J7BZXr4=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BOfiU=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1479, - "top": 160, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBq7J7BaL/A=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BNkXM=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBq7J7BbGmA=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BQMA0=" - }, - "model": { - "$ref": "AAAAAAGKzBq7J7BOfiU=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "tail": { - "$ref": "AAAAAAGKzBm3kZiquiI=" - }, - "lineStyle": 1, - "points": "1551:180;1458:179", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKzBq7J7BRrhQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBq7J7BSCGI=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBq7J7BTXdo=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKzBq7J7BUgaM=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKzBq7J7BVhbo=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKzBq7J7BWvto=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKzBq7J7BXQHo=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKzBq7J7BYmXo=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKzBq7J7BZXr4=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKzBq7J7BaL/A=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKzBq7J7BbGmA=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAGKzBrJabd6pNw=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJabd7RT0=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1493, - "top": 263, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJabd8fVA=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "visible": null, - "font": "Arial;13;0", - "left": 1487, - "top": 277, - "height": 13, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJabd9rB8=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1506, - "top": 236, - "height": 13, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJabd+UCw=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd3VKw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1513, - "top": 272, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJabd/J70=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd3VKw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1505, - "top": 283, - "height": 13, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJareAbrM=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd3VKw=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1528, - "top": 249, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "edgePosition": 2 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJareB9XE=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd4keA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1475, - "top": 254, - "height": 13, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJareCCjE=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd4keA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1471, - "top": 267, - "height": 13, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - } - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAGKzBrJareDbPg=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd4keA=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 1482, - "top": 227, - "height": 13, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - } - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBrJareEXwA=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd3VKw=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAGKzBrJareFjhQ=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd6pNw=" - }, - "model": { - "$ref": "AAAAAAGKzBrJabd4keA=" - }, - "visible": false, - "font": "Arial;13;0", - "width": 10, - "height": 10 - } - ], - "font": "Arial;13;0", - "head": { - "$ref": "AAAAAAGKzBhYMDuTjYE=" - }, - "tail": { - "$ref": "AAAAAAGKzBo7VqVNRn4=" - }, - "lineStyle": 1, - "points": "1543:276;1458:236", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAGKzBrJabd7RT0=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAGKzBrJabd8fVA=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzBrJabd9rB8=" - }, - "showEndOrder": "hide", - "tailRoleNameLabel": { - "$ref": "AAAAAAGKzBrJabd+UCw=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAGKzBrJabd/J70=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAGKzBrJareAbrM=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAGKzBrJareB9XE=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAGKzBrJareCCjE=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAGKzBrJareDbPg=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAGKzBrJareEXwA=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAGKzBrJareFjhQ=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKzCLAokDY9Gc=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzCLAokDZ8Ok=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDY9Gc=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzCLAokDaYvI=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDZ8Ok=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -2064, - "top": -80, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzCLAokDb1i8=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDZ8Ok=" - }, - "font": "Arial;13;1", - "left": 1925, - "top": 97, - "width": 391.7822265625, - "height": 13, - "text": "ResourcesManager" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzCLAokDcejg=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDZ8Ok=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -2064, - "top": -80, - "width": 73.67724609375, - "height": 13, - "text": "(from Model)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzCLAokDdoIo=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDZ8Ok=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -2064, - "top": -80, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 1920, - "top": 90, - "width": 401.7822265625, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKzCLAokDaYvI=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzCLAokDb1i8=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzCLAokDcejg=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzCLAokDdoIo=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzCLAokDezNY=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDY9Gc=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzCTTRE689N8=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDezNY=" - }, - "model": { - "$ref": "AAAAAAGKzCTTOE6bqCs=" - }, - "font": "Arial;13;0", - "left": 1925, - "top": 120, - "width": 391.7822265625, - "height": 13, - "text": "-container of resources loaded", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1920, - "top": 115, - "width": 401.7822265625, - "height": 23 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzCLAokDfpwY=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDY9Gc=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzCNstEO1K3w=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDfpwY=" - }, - "model": { - "$ref": "AAAAAAGKzCNsqEOUx6Y=" - }, - "font": "Arial;13;0", - "left": 1925, - "top": 143, - "width": 391.7822265625, - "height": 13, - "text": "+Resource loadResource(string path, function loader): Resource", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzCQDvUnEm2s=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDfpwY=" - }, - "model": { - "$ref": "AAAAAAGKzCQDtUmjNKs=" - }, - "font": "Arial;13;0", - "left": 1925, - "top": 158, - "width": 391.7822265625, - "height": 13, - "text": "+Resource getResource(string path): Resource", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzCUa5FN0EsA=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDfpwY=" - }, - "model": { - "$ref": "AAAAAAGKzCUa21NTLj4=" - }, - "font": "Arial;13;0", - "left": 1925, - "top": 173, - "width": 391.7822265625, - "height": 13, - "text": "+getInstance(): ResourcesManager", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 1920, - "top": 138, - "width": 401.7822265625, - "height": 53 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzCLAokDgzU4=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDY9Gc=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -1032, - "top": -40, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzCLAokDhhio=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDY9Gc=" - }, - "model": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "subViews": [ - { - "_type": "UMLTemplateParameterView", - "_id": "AAAAAAGKzCPuLEbtz4U=", - "_parent": { - "$ref": "AAAAAAGKzCLAokDhhio=" - }, - "model": { - "$ref": "AAAAAAGKzCPuIUbMCFQ=" - }, - "font": "Arial;13;0", - "left": 2270.14501953125, - "top": 77, - "width": 55.63720703125, - "height": 13, - "text": "Resource", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 2265.14501953125, - "top": 72, - "width": 65.63720703125, - "height": 23 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 1920, - "top": 72, - "width": 411.7822265625, - "height": 119, - "nameCompartment": { - "$ref": "AAAAAAGKzCLAokDZ8Ok=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKzCLAokDezNY=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzCLAokDfpwY=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzCLAokDgzU4=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzCLAokDhhio=" - } - }, - { - "_type": "UMLClassView", - "_id": "AAAAAAGKzC3uKsncQjs=", - "_parent": { - "$ref": "AAAAAAFElm65HFNt33E=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAGKzC3uKsnd554=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsncQjs=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAGKzC3uKsnemmU=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnd554=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -176, - "top": -96, - "height": 13 - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzC3uKsnfrG8=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnd554=" - }, - "font": "Arial;13;1", - "left": 2405, - "top": 111, - "width": 424.9931640625, - "height": 13, - "text": "World" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzC3uKsngS0I=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnd554=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -176, - "top": -96, - "width": 73.67724609375, - "height": 13, - "text": "(from Model)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAGKzC3uKsnhnr8=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnd554=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -176, - "top": -96, - "height": 13, - "horizontalAlignment": 1 - } - ], - "font": "Arial;13;0", - "left": 2400, - "top": 104, - "width": 434.9931640625, - "height": 25, - "stereotypeLabel": { - "$ref": "AAAAAAGKzC3uKsnemmU=" - }, - "nameLabel": { - "$ref": "AAAAAAGKzC3uKsnfrG8=" - }, - "namespaceLabel": { - "$ref": "AAAAAAGKzC3uKsngS0I=" - }, - "propertyLabel": { - "$ref": "AAAAAAGKzC3uKsnhnr8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAGKzC3uKsniFF0=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsncQjs=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzEU/Cz1VaXM=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "model": { - "$ref": "AAAAAAGKzEU/AD003Es=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 134, - "width": 424.9931640625, - "height": 13, - "text": "-size_t id", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzEVYlz6mp08=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "model": { - "$ref": "AAAAAAGKzEVYjj6FklM=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 149, - "width": 424.9931640625, - "height": 13, - "text": "-flat map components", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzEV3JkAz5V8=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "model": { - "$ref": "AAAAAAGKzEV3HkASyFs=" - }, - "visible": false, - "font": "Arial;13;0", - "left": 2389, - "top": 109, - "width": 424.9931640625, - "height": 13, - "text": "+Attribute1", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzEWaE0O+VCE=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "model": { - "$ref": "AAAAAAGKzEWaCkOdwbI=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 164, - "width": 424.9931640625, - "height": 13, - "text": "-list in reusableId", - "horizontalAlignment": 0 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAGKzEYBIEVL9Qs=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "model": { - "$ref": "AAAAAAGKzEYBCUUqTsM=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 179, - "width": 424.9931640625, - "height": 13, - "text": "-list of function*", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 2400, - "top": 129, - "width": 434.9931640625, - "height": 68 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAGKzC3uKsnj5rs=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsncQjs=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "subViews": [ - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzC7+l+1QIec=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzC7+je0vwrg=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 202, - "width": 424.9931640625, - "height": 13, - "text": "+getInstance(): World", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzC8jDfALwAc=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzC8jBe/q4jc=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 217, - "width": 424.9931640625, - "height": 13, - "text": "+Component registerComponent(): SparseArray Component", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzDInhR2b588=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzDInfB16qCM=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 232, - "width": 424.9931640625, - "height": 13, - "text": "+Component getComponent(): SparseArray Component", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzDNu+CSS4/g=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzDNu7yRxKDU=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 247, - "width": 424.9931640625, - "height": 13, - "text": "+killEntity(id)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzDOQjCdNLds=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzDOQgycsInQ=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 262, - "width": 424.9931640625, - "height": 13, - "text": "+createEntity(): size_t id", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzDz1GCr4l58=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzDz1DirXNws=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 277, - "width": 424.9931640625, - "height": 13, - "text": "+Component addEntityComponent(size_t id, Component component)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzD8LDC3T9eA=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzD8LAy2ycyc=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 292, - "width": 424.9931640625, - "height": 13, - "text": "+Component Args emplaceEntityComponent(size_t id, Args &&...args)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzEEi5DMllAk=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzEEi2zMEVpo=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 307, - "width": 424.9931640625, - "height": 13, - "text": "+...Components Function addsystem(Function function)", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzEGBUzXgcS0=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzEGBSTW/UsU=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 322, - "width": 424.9931640625, - "height": 13, - "text": "+runSystems()", - "horizontalAlignment": 0 - }, - { - "_type": "UMLOperationView", - "_id": "AAAAAAGKzEHFqzi3hUA=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "model": { - "$ref": "AAAAAAGKzEHFojiWYW4=" - }, - "font": "Arial;13;0", - "left": 2405, - "top": 337, - "width": 424.9931640625, - "height": 13, - "text": "-callSystem(Function function, World world)", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 2400, - "top": 197, - "width": 434.9931640625, - "height": 158 - }, - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKzC3uKsnkXE8=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsncQjs=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "visible": false, - "font": "Arial;13;0", - "left": -88, - "top": -48, - "width": 10, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAGKzC3uKsnlCdg=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsncQjs=" - }, - "model": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "subViews": [ - { - "_type": "UMLTemplateParameterView", - "_id": "AAAAAAGKzC9rmvZm5Ao=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnlCdg=" - }, - "model": { - "$ref": "AAAAAAGKzC9rj/ZFffA=" - }, - "font": "Arial;13;0", - "left": 2771.7841796875, - "top": 61, - "width": 67.208984375, - "height": 13, - "text": "Component", - "horizontalAlignment": 0 - }, - { - "_type": "UMLTemplateParameterView", - "_id": "AAAAAAGKzC+mHfppa5E=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnlCdg=" - }, - "model": { - "$ref": "AAAAAAGKzC+mFfpIL+U=" - }, - "font": "Arial;13;0", - "left": 2771.7841796875, - "top": 76, - "width": 67.208984375, - "height": 13, - "text": "...Args", - "horizontalAlignment": 0 - }, - { - "_type": "UMLTemplateParameterView", - "_id": "AAAAAAGKzEfNq1hUUA0=", - "_parent": { - "$ref": "AAAAAAGKzC3uKsnlCdg=" - }, - "model": { - "$ref": "AAAAAAGKzEfNnlgzMpc=" - }, - "font": "Arial;13;0", - "left": 2771.7841796875, - "top": 91, - "width": 67.208984375, - "height": 13, - "text": "Function", - "horizontalAlignment": 0 - } - ], - "font": "Arial;13;0", - "left": 2766.7841796875, - "top": 56, - "width": 77.208984375, - "height": 53 - } - ], - "font": "Arial;13;0", - "containerChangeable": true, - "left": 2400, - "top": 56, - "width": 444.9931640625, - "height": 299, - "nameCompartment": { - "$ref": "AAAAAAGKzC3uKsnd554=" - }, - "attributeCompartment": { - "$ref": "AAAAAAGKzC3uKsniFF0=" - }, - "operationCompartment": { - "$ref": "AAAAAAGKzC3uKsnj5rs=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKzC3uKsnkXE8=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAGKzC3uKsnlCdg=" - } - } - ] - }, - { - "_type": "UMLPackage", - "_id": "AAAAAAGKzB9uViYFR24=", - "_parent": { - "$ref": "AAAAAAFElm6BOFNpegQ=" - }, - "name": "Events", - "ownedElements": [ - { - "_type": "UMLClass", - "_id": "AAAAAAGKy44fAOasTWM=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "EventManager", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy6EpS+ytEr8=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6EpS+yufN4=", - "_parent": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "reference": { - "$ref": "AAAAAAGKy44fAOasTWM=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6EpS+yv08g=", - "_parent": { - "$ref": "AAAAAAGKy6EpS+ytEr8=" - }, - "reference": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - } - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy4+Z8+cReg0=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "list of events events", - "visibility": "private", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy5GcjecZ3VU=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "instance", - "visibility": "private", - "isStatic": true, - "type": "" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5HF0ech514=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "getInstance", - "isStatic": true, - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5Ji6uco8rY=", - "_parent": { - "$ref": "AAAAAAGKy5HF0ech514=" - }, - "type": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5LhVuctYi8=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "pushEvent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5N3Pec1tJw=", - "_parent": { - "$ref": "AAAAAAGKy5LhVuctYi8=" - }, - "name": "Event", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5N3Pec28N4=", - "_parent": { - "$ref": "AAAAAAGKy5LhVuctYi8=" - }, - "type": "void", - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5RSPec7wNA=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "getEvents", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5R+GudC9G0=", - "_parent": { - "$ref": "AAAAAAGKy5RSPec7wNA=" - }, - "type": "list of all the events", - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5SI2udEokA=", - "_parent": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "name": "getEventsByType", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5TOvedLriw=", - "_parent": { - "$ref": "AAAAAAGKy5SI2udEokA=" - }, - "name": "EventType", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5TOvedMmyg=", - "_parent": { - "$ref": "AAAAAAGKy5SI2udEokA=" - }, - "type": "list of events with the same type", - "direction": "return" - } - ] - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKy5UtWudPrQI=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "EventManagerException", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAGKy5Utc+d4I9U=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "source": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "target": { - "$ref": "AAAAAAGKy44fAOasTWM=" - } - }, - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy6MtYPq6F3Q=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6MtYPq7YQw=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "reference": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6MtYPq83Xg=", - "_parent": { - "$ref": "AAAAAAGKy6MtYPq6F3Q=" - }, - "reference": { - "$ref": "AAAAAAGKy44fAOasTWM=" - }, - "aggregation": "composite" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy5YIPOeVci8=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "name": "string _message", - "visibility": "private", - "type": "" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5XPieeM7D4=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "name": "EventManagerException", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5X9iOeTcnA=", - "_parent": { - "$ref": "AAAAAAGKy5XPieeM7D4=" - }, - "name": "string message", - "type": "" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5YaPeecCso=", - "_parent": { - "$ref": "AAAAAAGKy5UtWudPrQI=" - }, - "name": "get", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5YvnuejM6Q=", - "_parent": { - "$ref": "AAAAAAGKy5YaPeecCso=" - }, - "type": "char *", - "direction": "return" - } - ] - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKy5hcwugJ2uI=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "Event", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy6D3Ceie0qA=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6D3Ceifvfw=", - "_parent": { - "$ref": "AAAAAAGKy6D3Ceie0qA=" - }, - "reference": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6D3Ceigjjo=", - "_parent": { - "$ref": "AAAAAAGKy6D3Ceie0qA=" - }, - "reference": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "navigable": "navigable" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy6FBFO86nZs=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "name": "EventType _type", - "visibility": "protected", - "type": "" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy5h5Nugz5q8=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "name": "Event", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy5jSWeg62a0=", - "_parent": { - "$ref": "AAAAAAGKy5h5Nugz5q8=" - }, - "name": "EventType type", - "type": "" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy6G4V/IMoqQ=", - "_parent": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "name": "getType", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKy6LQz/JjNfw=", - "_parent": { - "$ref": "AAAAAAGKy6G4V/IMoqQ=" - }, - "type": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "direction": "return" - } - ] - } - ], - "isAbstract": true - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKy6NJevu9XSI=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "KeyboardEvent", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAGKy6NJlPwT2lk=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "source": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "target": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy6tfI4wVS/U=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "KeyState _state", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy6vxsY2EYx0=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "KeyIdentifier _id", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7Gai/eK4fY=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "bool _isShiftPressed", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7HeP/jbU4c=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "bool _isCtrlPressed", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7OjVfqV/c4=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "bool _isAltPressed", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7O+o/tfyZc=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "bool _isSystemPressed", - "type": "" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKy6Q3twHCkjA=", - "_parent": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "name": "KeyboardEvent" - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKy7Ri5QV6uiQ=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "MouseEvent", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAGKy7RjEQXulj4=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "source": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "target": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7c3yjseke0=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "MousePosition _pos", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7dK4jwMByE=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "MouseButton _button", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy7/ZxD0k+qY=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "MouseState _state", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy8BYsUMC2Nc=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "bool _isMoving", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy8BxskQanGQ=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "bool _isAltPressed", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy8CJUEUyHqg=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "bool _isShiftPressed", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKy8CcmUZKDQk=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "bool _isCtrolPressed", - "type": "" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzBT9ts2gM/0=", - "_parent": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "name": "MouseEvent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQw/WwT9E=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const int &aX", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQw/WxBMY=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const int &aY", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQw/Wy0Bg=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const MouseButton &aButton", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQw/Wz5RU=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const MouseState &aState", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQw/W0KNI=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const bool &aIsMoving", - "type": "", - "defaultValue": "false" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQxPW1oCw=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const bool &aIsAltPressed", - "type": "", - "defaultValue": "false" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQxPW2atc=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const bool &aIsShiftPressed", - "type": "", - "defaultValue": "false" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzBcQxPW31R8=", - "_parent": { - "$ref": "AAAAAAGKzBT9ts2gM/0=" - }, - "name": "const bool &aIsCtrlPressed", - "type": "", - "defaultValue": "false" - } - ] - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKzBhYMDuRyLQ=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "WindowEvent", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAGKzBhYZjwjwZI=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "source": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "target": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzBxUVKF1qIw=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "name": "WindowSize _size" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzBx38qLGtQg=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "name": "WindowPosition _position" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzByT0KRTpQo=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "name": "WindowDisplayState _windowState" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzBzJE6XgasI=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "name": "WindowFocusState _windowFocusState" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzB0RvKdtpRY=", - "_parent": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "name": "WindowEventType _windowEventType" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKy5dDNOeryZ4=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "EventType", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy5vm2Og9q/s=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy5vm2Og+B1Q=", - "_parent": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "reference": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy5vm2Og/edw=", - "_parent": { - "$ref": "AAAAAAGKy5vm2Og9q/s=" - }, - "reference": { - "$ref": "AAAAAAGKy5hcwugJ2uI=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5d9n+faXQc=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "Keyboard" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5eVv+fhKO0=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "Mouse" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5eguufoe90=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "Window" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5ez6ufvz18=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "Game" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5fJi+f2WU0=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "Other" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy5feGef9Zk8=", - "_parent": { - "$ref": "AAAAAAGKy5dDNOeryZ4=" - }, - "name": "None" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKy6R26AOmI2g=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "KeyState", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy6TRhgtFsIw=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6TRhgtGcpg=", - "_parent": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "reference": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6TRhgtHrA0=", - "_parent": { - "$ref": "AAAAAAGKy6TRhgtFsIw=" - }, - "reference": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6SWGgSa6zA=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "name": "Pressed" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6Sm3wVnx3c=", - "_parent": { - "$ref": "AAAAAAGKy6R26AOmI2g=" - }, - "name": "Released" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKy6UGNw4xfO4=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "KeyIdentifier", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy6sUXIpqSy0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6sUXIprmOc=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "reference": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy6sUXIpsoQM=", - "_parent": { - "$ref": "AAAAAAGKy6sUXIpqSy0=" - }, - "reference": { - "$ref": "AAAAAAGKy6NJevu9XSI=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6UdKw9//bc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "A" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6UlbxCOw54=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "B" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6U7NhEZwbQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "C" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VBKhGkP7Y=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "D" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VFoxJHPFU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "E" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VK8BLqtVo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VPqxONUlg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "G" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VUXRQwbLw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "H" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VlshhjgHM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "I" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VtUhkGCEY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "J" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6VxZhmpDJQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "K" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WDqBrQqHw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "L" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WStRtzk3E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "M" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WXBhwWXGQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "N" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WcTBy52Ic=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "O" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WpNB3gJWg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "P" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6WvZx6Dc/Y=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "Q" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6W2jx8mEOs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "R" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6W8+R/JCNQ=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "S" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XBhCBs/BM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "T" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XITiEPvCI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "U" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XMgiGyXEo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "V" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XTQiJVU3E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "X" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XZPCL4k1U=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "Y" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XchCObi0A=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "Z" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6XkbSQ+wlc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_0" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6YHXSThiGA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_1" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6YRbiWEEbY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_2" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6YePiYnjzY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_3" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6Yo5ibKa4c=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_4" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6ZqSivh0Mw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_5" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6Z4NSyEVBI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_6" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6aLIC3ndE8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_7" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6aTii6KE2I=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_8" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6aami8taiA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUM_9" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6a0CDCQHZI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "ESCAPE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6cH+D5IHII=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LCONTROL" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6cdUT7rk4A=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LSHIFT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6cpfj+OQEg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LALT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6cwmkAxeJo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LSYSTEM" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6c9h0DU5yg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RCONTROL" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6dNDkX32XM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RSHIFT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6dXEEaaix0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RALT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6diU0c9bs0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RSYSTEM" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6dznkhkqDI=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "MENU" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6eU7EoDiis=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LBRACKET" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6esbksqKgc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RBRACKET" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6e2nUvN9Ok=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "SEMICOLON" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6fNelHgLHo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "COMMA" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6fc1lKDhUA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "PERIOD" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6flBFMmYdo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "QUOTE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6fsTFPJC9s=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "SLASH" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6fxDFRsU/E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "BACKSLASH" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6f5iVUPdQM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "TILDE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6gBiVWybvc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "EQUAL" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6gPTVZVyZU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "DASH" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6gk2lb4a9s=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "SPACE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6gtg1ebhY4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RETURN" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6gyNVg+JIc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "BACKSPACE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6hBh1jhDbE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "TAB" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6hNTlmEG34=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "PAGEUP" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6hUDlonlUg=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "PAGEDOWN" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6h/WlvTocw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "END" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6iRAFx2IxU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "HOME" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6iZ7F0ZLyY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "INSERT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6ikAl28V5M=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "DELETE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6irQF5f7/M=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "ADD" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6i5Q18CD/E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "SUBSTRACT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jCNV+lYS8=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "MULTIPLY" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jQCmBIFZk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "DIVIDE" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jbEGDr94E=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "LEFT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jkcWGOYg0=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "RIGHT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jofmIxkuM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "UP" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jwjGLUdvY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "DOWN" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6jzyGN3hGw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_0" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6kHNmnqrXU=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_1" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6lmxmzbick=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_2" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6mD8nIWfoo=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_3" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6mSBHK5i+g=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_4" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6mkqHNc0YA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_5" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6mvfHP/nMw=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_6" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6m7pXSiwWM=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_7" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6nI3nVFbJs=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_8" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6naMnXoBEE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "NUMPAD_9" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6nlPHaL8Fc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F1" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6n7QHcugbA=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F2" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oD2HfRJXY=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F3" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oQS3h0Jrk=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F4" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oXD3kXoVc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F5" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oc1Xm6UEE=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F6" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oirnpdqc4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F7" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6oqSHsAQ3M=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F8" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6owW3ujXn4=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "F9" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy6o4DHxGaTc=", - "_parent": { - "$ref": "AAAAAAGKy6UGNw4xfO4=" - }, - "name": "Literal1" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKy7TUGBbzoxM=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "MouseButton", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy7XM3Cj5//o=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy7XM3Cj6G/k=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "reference": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy7XM3Cj7YHc=", - "_parent": { - "$ref": "AAAAAAGKy7XM3Cj5//o=" - }, - "reference": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy7TySxqIXe8=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "name": "LEFT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy7UVLRvZVwU=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "name": "RIGHT" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy7Uc9hyFJKo=", - "_parent": { - "$ref": "AAAAAAGKy7TUGBbzoxM=" - }, - "name": "MIDDLE" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKy7WNIiR2ZBo=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "MouseState", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKy7XWKy0L5pg=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy7XWKy0MARM=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "reference": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKy7XWKy0NMWc=", - "_parent": { - "$ref": "AAAAAAGKy7XWKy0L5pg=" - }, - "reference": { - "$ref": "AAAAAAGKy7Ri5QV6uiQ=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy7WjJCXuUbs=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "name": "RELEASED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKy7WyYiaadOA=", - "_parent": { - "$ref": "AAAAAAGKy7WNIiR2ZBo=" - }, - "name": "PRESSED" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKzBm3kZio3s8=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "WindowDisplayState", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKzBq7J7BMH+o=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBq7J7BNkXM=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "reference": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBq7J7BOfiU=", - "_parent": { - "$ref": "AAAAAAGKzBq7J7BMH+o=" - }, - "reference": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBnrlZrmABM=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "name": "FULLSCREEN" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBn6L5v1kfs=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "name": "WINDOWED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBoHE5008A0=", - "_parent": { - "$ref": "AAAAAAGKzBm3kZio3s8=" - }, - "name": "MINIMIZED" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKzBkOnnZ6oJM=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "WindowFocusState", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKzBmXEY+85ZY=", - "_parent": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBmXEY+98m4=", - "_parent": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "reference": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBmXEY++Dp0=", - "_parent": { - "$ref": "AAAAAAGKzBmXEY+85ZY=" - }, - "reference": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBkvlnh2w8c=", - "_parent": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "name": "FOCUSED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBk6O3lke7s=", - "_parent": { - "$ref": "AAAAAAGKzBkOnnZ6oJM=" - }, - "name": "UNFOCUSED" - } - ] - }, - { - "_type": "UMLEnumeration", - "_id": "AAAAAAGKzBo7VqVLt/k=", - "_parent": { - "$ref": "AAAAAAGKzB9uViYFR24=" - }, - "name": "WindowEventType", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAGKzBrJabd2x2c=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBrJabd3VKw=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "reference": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - } - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAGKzBrJabd4keA=", - "_parent": { - "$ref": "AAAAAAGKzBrJabd2x2c=" - }, - "reference": { - "$ref": "AAAAAAGKzBhYMDuRyLQ=" - }, - "aggregation": "composite" - } - } - ], - "literals": [ - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBpa+qeJhng=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "name": "RESIZING" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBpsFKiY2uY=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "name": "RESIZED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBp3manXwrM=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "name": "CLOSED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBqETqsWPQQ=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "name": "FOCUSED" - }, - { - "_type": "UMLEnumerationLiteral", - "_id": "AAAAAAGKzBqa7axVlmU=", - "_parent": { - "$ref": "AAAAAAGKzBo7VqVLt/k=" - }, - "name": "UNFOCUSED" - } - ] - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKzCLAoUDWgto=", - "_parent": { - "$ref": "AAAAAAFElm6BOFNpegQ=" - }, - "name": "ResourcesManager", - "templateParameters": [ - { - "_type": "UMLTemplateParameter", - "_id": "AAAAAAGKzCPuIUbMCFQ=", - "_parent": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "name": "Resource", - "parameterType": "", - "defaultValue": "" - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzCTTOE6bqCs=", - "_parent": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "name": "container of resources loaded", - "visibility": "private" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzCNsqEOUx6Y=", - "_parent": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "name": "Resource loadResource", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCPiT0TmqVs=", - "_parent": { - "$ref": "AAAAAAGKzCNsqEOUx6Y=" - }, - "name": "string path" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCPiT0Tnxx0=", - "_parent": { - "$ref": "AAAAAAGKzCNsqEOUx6Y=" - }, - "name": "function loader" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCPiT0Tok0Q=", - "_parent": { - "$ref": "AAAAAAGKzCNsqEOUx6Y=" - }, - "type": { - "$ref": "AAAAAAGKzCPuIUbMCFQ=" - }, - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzCQDtUmjNKs=", - "_parent": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "name": "Resource getResource", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCSGz0r124s=", - "_parent": { - "$ref": "AAAAAAGKzCQDtUmjNKs=" - }, - "name": "string path" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCSGz0r2cY4=", - "_parent": { - "$ref": "AAAAAAGKzCQDtUmjNKs=" - }, - "type": { - "$ref": "AAAAAAGKzCPuIUbMCFQ=" - }, - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzCUa21NTLj4=", - "_parent": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "name": "getInstance", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzCU6IFRofGU=", - "_parent": { - "$ref": "AAAAAAGKzCUa21NTLj4=" - }, - "type": { - "$ref": "AAAAAAGKzCLAoUDWgto=" - }, - "direction": "return" - } - ] - } - ] - }, - { - "_type": "UMLClass", - "_id": "AAAAAAGKzC3uKcnaAyE=", - "_parent": { - "$ref": "AAAAAAFElm6BOFNpegQ=" - }, - "name": "World", - "templateParameters": [ - { - "_type": "UMLTemplateParameter", - "_id": "AAAAAAGKzC9rj/ZFffA=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Component", - "parameterType": "", - "defaultValue": "" - }, - { - "_type": "UMLTemplateParameter", - "_id": "AAAAAAGKzC+mFfpIL+U=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "...Args", - "parameterType": "", - "defaultValue": "" - }, - { - "_type": "UMLTemplateParameter", - "_id": "AAAAAAGKzEfNnlgzMpc=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Function", - "parameterType": "", - "defaultValue": "" - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzEU/AD003Es=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "size_t id", - "visibility": "private" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzEVYjj6FklM=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "flat map components", - "visibility": "private" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzEV3HkASyFs=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Attribute1", - "type": "" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzEWaCkOdwbI=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "list in reusableId", - "visibility": "private" - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAGKzEYBCUUqTsM=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "list of function*", - "visibility": "private" - } - ], - "operations": [ - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzC7+je0vwrg=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "getInstance", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzC8TU+5EY+4=", - "_parent": { - "$ref": "AAAAAAGKzC7+je0vwrg=" - }, - "type": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzC8jBe/q4jc=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Component registerComponent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzDK2XSKP7dE=", - "_parent": { - "$ref": "AAAAAAGKzC8jBe/q4jc=" - }, - "type": "SparseArray Component", - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzDInfB16qCM=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Component getComponent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzDKA+B6PlsY=", - "_parent": { - "$ref": "AAAAAAGKzDInfB16qCM=" - }, - "type": "SparseArray Component", - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzDNu7yRxKDU=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "killEntity", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzDOI/CWGSm0=", - "_parent": { - "$ref": "AAAAAAGKzDNu7yRxKDU=" - }, - "name": "id", - "type": "" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzDOQgycsInQ=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "createEntity", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzDO4VChBXc8=", - "_parent": { - "$ref": "AAAAAAGKzDOQgycsInQ=" - }, - "type": "size_t id", - "direction": "return" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzDz1DirXNws=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Component addEntityComponent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzD2pGivsxfg=", - "_parent": { - "$ref": "AAAAAAGKzDz1DirXNws=" - }, - "name": "size_t id", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzD2pGivtWdY=", - "_parent": { - "$ref": "AAAAAAGKzDz1DirXNws=" - }, - "name": "Component component", - "type": "" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzD8LAy2ycyc=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "Component Args emplaceEntityComponent", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzD+ORi7HeoY=", - "_parent": { - "$ref": "AAAAAAGKzD8LAy2ycyc=" - }, - "name": "size_t id" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzD+ORi7ICOI=", - "_parent": { - "$ref": "AAAAAAGKzD8LAy2ycyc=" - }, - "name": "Args &&...args" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzEEi2zMEVpo=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "...Components Function addsystem", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzEFtMTQZUVg=", - "_parent": { - "$ref": "AAAAAAGKzEEi2zMEVpo=" - }, - "name": "Function function", - "type": "" - } - ] - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzEGBSTW/UsU=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "runSystems" - }, - { - "_type": "UMLOperation", - "_id": "AAAAAAGKzEHFojiWYW4=", - "_parent": { - "$ref": "AAAAAAGKzC3uKcnaAyE=" - }, - "name": "callSystem", - "visibility": "private", - "parameters": [ - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzELLNDmr8x0=", - "_parent": { - "$ref": "AAAAAAGKzEHFojiWYW4=" - }, - "name": "Function function", - "type": "" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAGKzELLNDms+fg=", - "_parent": { - "$ref": "AAAAAAGKzEHFojiWYW4=" - }, - "name": "World world", - "type": "" - } - ] - } - ] - } - ] - }, - { - "_type": "UMLProfile", - "_id": "AAAAAAFElnEzslS1AuE=", - "_parent": { - "$ref": "AAAAAAFElm5XMFNoGY0=" - }, - "name": "UMLStandardProfile", - "ownedElements": [ - { - "_type": "UMLProfileDiagram", - "_id": "AAAAAAFElnFUQFS4mT4=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "StandardProfileL2", - "ownedViews": [ - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFElnFrT1S8vVg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFElnFrT1S7Kic=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFElnFrT1S9WOE=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S8vVg=" - }, - "model": { - "$ref": "AAAAAAFElnFrT1S7Kic=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFElnFrT1S+aHM=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": -44, - "top": -16, - "width": 1, - "height": 12 - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnFrT1S/1HM=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 57, - "top": 59, - "width": 81, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnFrT1TAD0M=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerChangeable": true, - "containerExtending": true, - "left": 57, - "top": 73, - "width": 81, - "height": 12, - "text": "UMLClassifier" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnFrT1TBaUI=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": -44, - "top": -16, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnFrT1TCF/Y=", - "_parent": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": -44, - "top": -16, - "width": 1, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 52, - "top": 52, - "width": 91, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAFElnFrT1S/1HM=" - }, - "nameLabel": { - "$ref": "AAAAAAFElnFrT1TAD0M=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFElnFrT1TBaUI=" - }, - "propertyLabel": { - "$ref": "AAAAAAFElnFrT1TCF/Y=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 52, - "top": 52, - "width": 91, - "height": 101, - "nameCompartment": { - "$ref": "AAAAAAFElnFrT1S9WOE=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFElnF1nFTadPw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4am/eAECco=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFElnF1nFTbplQ=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFElnF1nVTcCng=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 60, - "top": -116, - "width": 1, - "height": 12 - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnF1nVTd3xg=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 213, - "top": 55, - "width": 83, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnF1nVTewJM=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "font": "Arial;12;1", - "containerChangeable": true, - "containerExtending": true, - "left": 213, - "top": 69, - "width": 83, - "height": 12, - "text": "Realization" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnF1nVTfQRQ=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 60, - "top": -116, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnF1nVTgrV8=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 60, - "top": -116, - "width": 1, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 208, - "top": 48, - "width": 93, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAFElnF1nVTd3xg=" - }, - "nameLabel": { - "$ref": "AAAAAAFElnF1nVTewJM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFElnF1nVTfQRQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFElnF1nVTgrV8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFElnF1nVThfqA=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 208, - "top": 86, - "width": 93, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFElnF1nVTiFXA=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 208, - "top": 96, - "width": 93, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFElnF1nVTjasU=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "model": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 60, - "top": -116, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 208, - "top": 48, - "width": 93, - "height": 38, - "nameCompartment": { - "$ref": "AAAAAAFElnF1nFTbplQ=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFElnF1nVThfqA=" - }, - "operationCompartment": { - "$ref": "AAAAAAFElnF1nVTiFXA=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4am/eAECco=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFElnF1nVTjasU=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFElnGGLFUGHnM=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFElnGGLFUFZFA=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnGGLFUH+8s=", - "_parent": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "model": { - "$ref": "AAAAAAFElnGGLFUFZFA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 174, - "top": 73, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnGGLFUIOR8=", - "_parent": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "model": { - "$ref": "AAAAAAFElnGGLFUFZFA=" - }, - "visible": null, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 174, - "top": 88, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnGGLFUJv6k=", - "_parent": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "model": { - "$ref": "AAAAAAFElnGGLFUFZFA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 175, - "top": 43, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFElnGGLFUGHnM=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "head": { - "$ref": "AAAAAAFElnFrT1S8vVg=" - }, - "tail": { - "$ref": "AAAAAAFElnF1nFTadPw=" - }, - "points": "208:64;142:64", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFElnGGLFUH+8s=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFElnGGLFUIOR8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFElnGGLFUJv6k=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFElnJRglVMyB8=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4am/uAiCQ0=", - "_parent": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFElnJRglVN/RI=", - "_parent": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFElnJRglVO7ow=", - "_parent": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 104, - "top": -176, - "width": 1, - "height": 12 - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnJRglVPiBM=", - "_parent": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 217, - "top": 119, - "width": 74.68359375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnJRglVQT1k=", - "_parent": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "font": "Arial;12;1", - "containerChangeable": true, - "containerExtending": true, - "left": 217, - "top": 133, - "width": 74.68359375, - "height": 12, - "text": "Specification" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnJRglVRdk8=", - "_parent": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 104, - "top": -176, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFElnJRglVSFic=", - "_parent": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 104, - "top": -176, - "width": 1, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 212, - "top": 112, - "width": 84.68359375, - "height": 38, - "stereotypeLabel": { - "$ref": "AAAAAAFElnJRglVPiBM=" - }, - "nameLabel": { - "$ref": "AAAAAAFElnJRglVQT1k=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFElnJRglVRdk8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFElnJRglVSFic=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFElnJRglVTXPE=", - "_parent": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 212, - "top": 150, - "width": 84, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFElnJRglVUe0c=", - "_parent": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 212, - "top": 160, - "width": 84, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFElnJRg1VVWNU=", - "_parent": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "model": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 104, - "top": -176, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 212, - "top": 112, - "width": 84.68359375, - "height": 38, - "nameCompartment": { - "$ref": "AAAAAAFElnJRglVN/RI=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFElnJRglVTXPE=" - }, - "operationCompartment": { - "$ref": "AAAAAAFElnJRglVUe0c=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4am/uAiCQ0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFElnJRg1VVWNU=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFElnKVuVV5hVg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFElnKVuVV4pBU=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnKVuVV6VLo=", - "_parent": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "model": { - "$ref": "AAAAAAFElnKVuVV4pBU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 176, - "top": 141, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnKVuVV7m9U=", - "_parent": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "model": { - "$ref": "AAAAAAFElnKVuVV4pBU=" - }, - "visible": null, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 176, - "top": 156, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFElnKVuVV8bvU=", - "_parent": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "model": { - "$ref": "AAAAAAFElnKVuVV4pBU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 177, - "top": 111, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFElnKVuVV5hVg=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "head": { - "$ref": "AAAAAAFElnFrT1S8vVg=" - }, - "tail": { - "$ref": "AAAAAAFElnJRglVMyB8=" - }, - "points": "212:132;142:132", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFElnKVuVV6VLo=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFElnKVuVV7m9U=" - }, - "propertyLabel": { - "$ref": "AAAAAAFElnKVuVV8bvU=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFJsZbpDNpnkE=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFJsZbpTNq6XM=", - "_parent": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "model": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFJsZbpTNrbHw=", - "_parent": { - "$ref": "AAAAAAFFJsZbpTNq6XM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 561, - "top": 209, - "width": 87, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFJsZbpTNsdGc=", - "_parent": { - "$ref": "AAAAAAFFJsZbpTNq6XM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerChangeable": true, - "containerExtending": true, - "left": 561, - "top": 223, - "width": 87, - "height": 12, - "text": "UMLClass" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFJsZbpTNtikk=", - "_parent": { - "$ref": "AAAAAAFFJsZbpTNq6XM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 1500, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFJsZbpTNuOXU=", - "_parent": { - "$ref": "AAAAAAFFJsZbpTNq6XM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 1500, - "width": 1, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 556, - "top": 204, - "width": 97, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFJsZbpTNrbHw=" - }, - "nameLabel": { - "$ref": "AAAAAAFFJsZbpTNsdGc=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFJsZbpTNtikk=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFJsZbpTNuOXU=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerChangeable": true, - "containerExtending": true, - "left": 556, - "top": 204, - "width": 97, - "height": 305, - "nameCompartment": { - "$ref": "AAAAAAFFJsZbpTNq6XM=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwKqhJFq1z2Y=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKqhJFq2eQM=", - "_parent": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "model": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKqhJFq3hUU=", - "_parent": { - "$ref": "AAAAAAFFwKqhJFq2eQM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 57, - "top": 209, - "width": 79, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKqhJFq4Vb4=", - "_parent": { - "$ref": "AAAAAAFFwKqhJFq2eQM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 57, - "top": 223, - "width": 79, - "height": 12, - "text": "UMLArtifact" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKqhJFq5GlQ=", - "_parent": { - "$ref": "AAAAAAFFwKqhJFq2eQM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKqhJFq6Fls=", - "_parent": { - "$ref": "AAAAAAFFwKqhJFq2eQM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 52, - "top": 204, - "width": 89, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKqhJFq3hUU=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKqhJFq4Vb4=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKqhJFq5GlQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKqhJFq6Fls=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 52, - "top": 204, - "width": 89, - "height": 329, - "nameCompartment": { - "$ref": "AAAAAAFFwKqhJFq2eQM=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKsvdVrTyNI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4am/+BeggQ=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKsvdVrUE8w=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKsvdVrVvYg=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrUE8w=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 237, - "top": 209, - "width": 119, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKsvdVrW/Dg=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrUE8w=" - }, - "font": "Arial;12;3", - "containerExtending": true, - "left": 237, - "top": 223, - "width": 119, - "height": 12, - "text": "File" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKsvdVrXXrQ=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrUE8w=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 48, - "top": -12, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKsvdVrYnv8=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrUE8w=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 48, - "top": -12, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 232, - "top": 204, - "width": 129, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKsvdVrVvYg=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKsvdVrW/Dg=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKsvdVrXXrQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKsvdVrYnv8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKsvdVrZA0U=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 248, - "top": 236, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKsvdlraVvA=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 248, - "top": 236, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKsvdlrbd2U=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "model": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 32, - "top": -8, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 232, - "top": 204, - "width": 129, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwKsvdVrUE8w=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKsvdVrZA0U=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKsvdlraVvA=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4am/+BeggQ=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKsvdlrbd2U=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKtwS1r8DQQ=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anAOB0ybw=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKtwS1r9YJ4=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKtwS1r+fw8=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r9YJ4=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 313, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKtwS1r/Lsw=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r9YJ4=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 189, - "top": 327, - "width": 71, - "height": 12, - "text": "Document" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKtwS1sAGYA=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r9YJ4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 24, - "top": 24, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKtwS1sB7y4=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r9YJ4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 24, - "top": 24, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 184, - "top": 308, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKtwS1r+fw8=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKtwS1r/Lsw=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKtwS1sAGYA=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKtwS1sB7y4=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKtwTFsC02k=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 192, - "top": 352, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKtwTFsD5lc=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 192, - "top": 352, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKtwTFsEQlE=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "model": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 16, - "top": 16, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 184, - "top": 308, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwKtwS1r9YJ4=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKtwTFsC02k=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKtwTFsD5lc=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anAOB0ybw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKtwTFsEQlE=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKuBulskCVg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anAOCKzk8=", - "_parent": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKuBulsld0g=", - "_parent": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuBulsmb/s=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsld0g=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 257, - "top": 357, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuBulsnKBI=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsld0g=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 257, - "top": 371, - "width": 71, - "height": 12, - "text": "Executable" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuBu1soKF0=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsld0g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 96, - "top": -48, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuBu1spOXA=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsld0g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 96, - "top": -48, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 252, - "top": 352, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKuBulsmb/s=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKuBulsnKBI=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKuBu1soKF0=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKuBu1spOXA=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKuBu1sqPhk=", - "_parent": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 284, - "top": 372, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKuBu1srnoE=", - "_parent": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 284, - "top": 372, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKuBu1ssVVg=", - "_parent": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "model": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 64, - "top": -32, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 252, - "top": 352, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwKuBulsld0g=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKuBu1sqPhk=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKuBu1srnoE=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anAOCKzk8=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKuBu1ssVVg=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKuIMltMJw4=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anAOCg6b8=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKuIMltNJK8=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuIM1tO63M=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltNJK8=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 321, - "top": 405, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuIM1tPj60=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltNJK8=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 321, - "top": 419, - "width": 71, - "height": 12, - "text": "Library" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuIM1tQD7A=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltNJK8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 132, - "top": -108, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuIM1tRSSY=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltNJK8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 132, - "top": -108, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 316, - "top": 400, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKuIM1tO63M=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKuIM1tPj60=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKuIM1tQD7A=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKuIM1tRSSY=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKuIM1tSiN4=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 360, - "top": 400, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKuIM1tTPjo=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 360, - "top": 400, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKuIM1tUHbM=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "model": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 88, - "top": -72, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 316, - "top": 400, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwKuIMltNJK8=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKuIM1tSiN4=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKuIM1tTPjo=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anAOCg6b8=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKuIM1tUHbM=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKuS0lt0dAE=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anAeC2MF0=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKuS0lt1+MM=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuS0lt2XgE=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt1+MM=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 385, - "top": 453, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuS0lt36r8=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt1+MM=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 385, - "top": 467, - "width": 71, - "height": 12, - "text": "Script" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuS0lt4pP4=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt1+MM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 180, - "top": -180, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKuS0lt5mi4=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt1+MM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 180, - "top": -180, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 380, - "top": 448, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKuS0lt2XgE=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKuS0lt36r8=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKuS0lt4pP4=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKuS0lt5mi4=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKuS0lt6gjg=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 424, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKuS0lt7fo0=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 424, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKuS0lt8w2A=", - "_parent": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "model": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 120, - "top": -120, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 380, - "top": 448, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwKuS0lt1+MM=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKuS0lt6gjg=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKuS0lt7fo0=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anAeC2MF0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKuS0lt8w2A=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwKueMluc5bE=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anAeDMHyU=", - "_parent": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwKueMludFfk=", - "_parent": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwKueMlueAco=", - "_parent": { - "$ref": "AAAAAAFFwKueMludFfk=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 445, - "top": 501, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKueMluflfo=", - "_parent": { - "$ref": "AAAAAAFFwKueMludFfk=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 445, - "top": 515, - "width": 71, - "height": 12, - "text": "Source" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKueMlughos=", - "_parent": { - "$ref": "AAAAAAFFwKueMludFfk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -108, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwKueMluhfws=", - "_parent": { - "$ref": "AAAAAAFFwKueMludFfk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -108, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 496, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKueMlueAco=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwKueMluflfo=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwKueMlughos=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKueMluhfws=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwKueMluihu4=", - "_parent": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 500, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwKueMlujEyo=", - "_parent": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 500, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwKueMlukJo8=", - "_parent": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "model": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -72, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 440, - "top": 496, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwKueMludFfk=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwKueMluihu4=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwKueMlujEyo=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anAeDMHyU=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwKueMlukJo8=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAFFwKzkslvYVdw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKzkslvX4gU=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzkslvZbd0=", - "_parent": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "model": { - "$ref": "AAAAAAFFwKzkslvX4gU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 258, - "top": 267, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzks1vasdU=", - "_parent": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "model": { - "$ref": "AAAAAAFFwKzkslvX4gU=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 258, - "top": 252, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzks1vby/c=", - "_parent": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "model": { - "$ref": "AAAAAAFFwKzkslvX4gU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 258, - "top": 297, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzkslvYVdw=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "tail": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "points": "216:308;216:288;300:288;300:240", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwKzkslvZbd0=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKzks1vasdU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKzks1vby/c=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAFFwKzsCVvpt2A=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKzsCVvo11g=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzsCVvqAUg=", - "_parent": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "model": { - "$ref": "AAAAAAFFwKzsCVvo11g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 285, - "top": 289, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzsCVvrTi8=", - "_parent": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "model": { - "$ref": "AAAAAAFFwKzsCVvo11g=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 270, - "top": 289, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzsCVvsewQ=", - "_parent": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "model": { - "$ref": "AAAAAAFFwKzsCVvo11g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 314, - "top": 290, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzsCVvpt2A=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "tail": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "points": "300:352;300:240", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwKzsCVvqAUg=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKzsCVvrTi8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKzsCVvsewQ=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAFFwKzxcVv6A2c=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKzxcVv56Dg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzxcVv7wpA=", - "_parent": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "model": { - "$ref": "AAAAAAFFwKzxcVv56Dg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 327, - "top": 297, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzxcVv8NxM=", - "_parent": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "model": { - "$ref": "AAAAAAFFwKzxcVv56Dg=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 327, - "top": 312, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKzxcVv9X58=", - "_parent": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "model": { - "$ref": "AAAAAAFFwKzxcVv56Dg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 328, - "top": 267, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKzxcVv6A2c=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "tail": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "points": "356:400;356:288;300:288;300:240", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwKzxcVv7wpA=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKzxcVv8NxM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKzxcVv9X58=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAFFwKz3OVwLl+8=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKz3OVwK9hs=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz3OVwMNB4=", - "_parent": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "model": { - "$ref": "AAAAAAFFwKz3OVwK9hs=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 357, - "top": 297, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz3OVwNd3E=", - "_parent": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "model": { - "$ref": "AAAAAAFFwKz3OVwK9hs=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 357, - "top": 312, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz3OVwODiI=", - "_parent": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "model": { - "$ref": "AAAAAAFFwKz3OVwK9hs=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 358, - "top": 267, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKz3OVwLl+8=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "tail": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "points": "416:448;416:288;300:288;300:240", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwKz3OVwMNB4=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKz3OVwNd3E=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKz3OVwODiI=" - } - }, - { - "_type": "UMLGeneralizationView", - "_id": "AAAAAAFFwKz9mVwcos8=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwKz9mFwbfDg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz9mVwdsGc=", - "_parent": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "model": { - "$ref": "AAAAAAFFwKz9mFwbfDg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 391, - "top": 297, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz9mVweYvs=", - "_parent": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "model": { - "$ref": "AAAAAAFFwKz9mFwbfDg=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 391, - "top": 312, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwKz9mVwfOSk=", - "_parent": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "model": { - "$ref": "AAAAAAFFwKz9mFwbfDg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 392, - "top": 267, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwKz9mVwcos8=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "tail": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "points": "484:496;484:288;300:288;300:240", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwKz9mVwdsGc=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwKz9mVweYvs=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwKz9mVwfOSk=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK4k1VxFxwI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK4k1VxEEpM=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4k1lxGUvg=", - "_parent": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "model": { - "$ref": "AAAAAAFFwK4k1VxEEpM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 161, - "top": 333, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4k1lxHABk=", - "_parent": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "model": { - "$ref": "AAAAAAFFwK4k1VxEEpM=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 161, - "top": 348, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4k1lxIpIg=", - "_parent": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "model": { - "$ref": "AAAAAAFFwK4k1VxEEpM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 162, - "top": 303, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4k1VxFxwI=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKtwS1r8DQQ=" - }, - "points": "184:324;140:324", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK4k1lxGUvg=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK4k1lxHABk=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK4k1lxIpIg=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK4o4VxWQBI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK4o4VxVx00=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4o4VxXVGc=", - "_parent": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "model": { - "$ref": "AAAAAAFFwK4o4VxVx00=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 195, - "top": 378, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4o4VxYgZc=", - "_parent": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "model": { - "$ref": "AAAAAAFFwK4o4VxVx00=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 195, - "top": 393, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4o4VxZqsQ=", - "_parent": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "model": { - "$ref": "AAAAAAFFwK4o4VxVx00=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 196, - "top": 348, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4o4VxWQBI=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKuBulskCVg=" - }, - "points": "252:369;140:369", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK4o4VxXVGc=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK4o4VxYgZc=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK4o4VxZqsQ=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK4tiVxnpno=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK4tiVxmVJM=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4tiVxoTEk=", - "_parent": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "model": { - "$ref": "AAAAAAFFwK4tiVxmVJM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 227, - "top": 429, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4tiVxpG0I=", - "_parent": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "model": { - "$ref": "AAAAAAFFwK4tiVxmVJM=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 227, - "top": 444, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK4tiVxqKIY=", - "_parent": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "model": { - "$ref": "AAAAAAFFwK4tiVxmVJM=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 228, - "top": 399, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK4tiVxnpno=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKuIMltMJw4=" - }, - "points": "316:420;140:420", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK4tiVxoTEk=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK4tiVxpG0I=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK4tiVxqKIY=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK41YVx4sZw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK41YVx3Hr0=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK41YVx5rZ4=", - "_parent": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "model": { - "$ref": "AAAAAAFFwK41YVx3Hr0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 259, - "top": 473, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK41YVx6mfE=", - "_parent": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "model": { - "$ref": "AAAAAAFFwK41YVx3Hr0=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 259, - "top": 488, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK41YVx7lFo=", - "_parent": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "model": { - "$ref": "AAAAAAFFwK41YVx3Hr0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 260, - "top": 443, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK41YVx4sZw=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKuS0lt0dAE=" - }, - "points": "380:464;140:464", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK41YVx5rZ4=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK41YVx6mfE=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK41YVx7lFo=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK47MFyJhkk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK47MFyIL/c=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK47MFyKeH8=", - "_parent": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "model": { - "$ref": "AAAAAAFFwK47MFyIL/c=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 289, - "top": 521, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK47MVyL2Gg=", - "_parent": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "model": { - "$ref": "AAAAAAFFwK47MFyIL/c=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 289, - "top": 536, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK47MVyMJyk=", - "_parent": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "model": { - "$ref": "AAAAAAFFwK47MFyIL/c=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 290, - "top": 491, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK47MFyJhkk=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKueMluc5bE=" - }, - "points": "440:512;140:512", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK47MFyKeH8=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK47MVyL2Gg=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK47MVyMJyk=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwK5AeFyarms=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK5AeFyZpVg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK5AeFybX8s=", - "_parent": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "model": { - "$ref": "AAAAAAFFwK5AeFyZpVg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 185, - "top": 229, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK5AeFycm2c=", - "_parent": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "model": { - "$ref": "AAAAAAFFwK5AeFyZpVg=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 185, - "top": 244, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwK5AeVydbSU=", - "_parent": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "model": { - "$ref": "AAAAAAFFwK5AeFyZpVg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 186, - "top": 199, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwK5AeFyarms=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwKqhJFq1z2Y=" - }, - "tail": { - "$ref": "AAAAAAFFwKsvdVrTyNI=" - }, - "points": "232:220;140:220", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwK5AeFybX8s=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK5AeFycm2c=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK5AeVydbSU=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwK/k1ly1mNU=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwK/k1ly00Ec=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwK/k1ly236Y=", - "_parent": { - "$ref": "AAAAAAFFwK/k1ly1mNU=" - }, - "model": { - "$ref": "AAAAAAFFwK/k1ly00Ec=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwK/k1ly3kes=", - "_parent": { - "$ref": "AAAAAAFFwK/k1ly236Y=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 385, - "top": 585, - "width": 132, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwK/k1ly4Kb0=", - "_parent": { - "$ref": "AAAAAAFFwK/k1ly236Y=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 385, - "top": 599, - "width": 132, - "height": 12, - "text": "UMLBehavioralFeature" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwK/k11y5jis=", - "_parent": { - "$ref": "AAAAAAFFwK/k1ly236Y=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 972, - "top": 60, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwK/k11y6pH4=", - "_parent": { - "$ref": "AAAAAAFFwK/k1ly236Y=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 972, - "top": 60, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 380, - "top": 580, - "width": 142, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwK/k1ly3kes=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwK/k1ly4Kb0=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwK/k11y5jis=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwK/k11y6pH4=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 380, - "top": 580, - "width": 142, - "height": 101, - "nameCompartment": { - "$ref": "AAAAAAFFwK/k1ly236Y=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLBdPFzSzQk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anA+E+4ZY=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLBdPFzT/sk=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLBdPFzUtqg=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzT/sk=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 589, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLBdPFzVTVM=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzT/sk=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 603, - "width": 71, - "height": 12, - "text": "Destroy" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLBdPFzWXGg=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzT/sk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 120, - "top": 24, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLBdPFzX7Kw=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzT/sk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 120, - "top": 24, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 584, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLBdPFzUtqg=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLBdPFzVTVM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLBdPFzWXGg=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLBdPFzX7Kw=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLBdPFzYl0A=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 632, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLBdPFzZMKQ=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 632, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLBdPFzaqUA=", - "_parent": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "model": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 80, - "top": 16, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 584, - "width": 81, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwLBdPFzT/sk=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLBdPFzYl0A=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLBdPFzZMKQ=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anA+E+4ZY=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLBdPFzaqUA=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLDMaFz6CG0=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLDMaFz5C14=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLDMaFz7zuA=", - "_parent": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "model": { - "$ref": "AAAAAAFFwLDMaFz5C14=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 348, - "top": 579, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLDMaFz8JJ4=", - "_parent": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "model": { - "$ref": "AAAAAAFFwLDMaFz5C14=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 348, - "top": 564, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLDMaFz92bU=", - "_parent": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "model": { - "$ref": "AAAAAAFFwLDMaFz5C14=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 348, - "top": 609, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLDMaFz6CG0=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwK/k1ly1mNU=" - }, - "tail": { - "$ref": "AAAAAAFFwLBdPFzSzQk=" - }, - "points": "316:600;380:600", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLDMaFz7zuA=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLDMaFz8JJ4=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLDMaFz92bU=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLFUbV0ScDI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBOFbTBo=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLFUbV0TTdY=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFUbV0UvYs=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0TTdY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 209, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFUbV0V4oU=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0TTdY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 223, - "width": 71, - "height": 12, - "text": "Auxiliary" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFUbV0WLEA=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0TTdY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -336, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFUbV0XEPg=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0TTdY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -336, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 204, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLFUbV0UvYs=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLFUbV0V4oU=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLFUbV0WLEA=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLFUbV0XEPg=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLFUbV0YxWc=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 128, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLFUbV0Z3Xk=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 128, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLFUbV0aLJo=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "model": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -40, - "top": -224, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 204, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLFUbV0TTdY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLFUbV0YxWc=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLFUbV0Z3Xk=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBOFbTBo=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLFUbV0aLJo=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLFu9F06sWk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBOFx8fA=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLFu9F07mo0=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFu9F08FIY=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F07mo0=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 261, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFu9F09Ig0=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F07mo0=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 275, - "width": 71, - "height": 12, - "text": "Focus" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFu9F0+sYU=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F07mo0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -420, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLFu9F0/2cA=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F07mo0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -420, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 256, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLFu9F08FIY=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLFu9F09Ig0=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLFu9F0+sYU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLFu9F0/2cA=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLFu9F1A690=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 152, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLFu9F1BAsU=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 152, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLFu9F1CLR8=", - "_parent": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "model": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -40, - "top": -280, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 256, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLFu9F07mo0=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLFu9F1A690=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLFu9F1BAsU=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBOFx8fA=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLFu9F1CLR8=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLF4tF1iftI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBOGHzLw=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLF4tF1jr/w=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF4tF1kg2Y=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1jr/w=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 313, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF4tF1la4E=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1jr/w=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 327, - "width": 71, - "height": 12, - "text": "Metaclass" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF4tF1mW9o=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1jr/w=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -480, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF4tF1ngPk=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1jr/w=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -480, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 308, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLF4tF1kg2Y=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLF4tF1la4E=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLF4tF1mW9o=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLF4tF1ngPk=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLF4tF1oP5U=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 184, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLF4tF1pEYI=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 700, - "top": 184, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLF4tF1qaMM=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "model": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -40, - "top": -320, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 308, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLF4tF1jr/w=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLF4tF1oP5U=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLF4tF1pEYI=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBOGHzLw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLF4tF1qaMM=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLF/G12KFPg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBeGdXuw=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLF/G12LESY=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF/G12MFWs=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12LESY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 365, - "width": 121, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF/G12Nq6M=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12LESY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 379, - "width": 121, - "height": 12, - "text": "ImplementationClass" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF/G12OWK0=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12LESY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -564, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLF/G12PipY=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12LESY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -564, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 360, - "width": 131, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLF/G12MFWs=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLF/G12Nq6M=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLF/G12OWK0=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLF/G12PipY=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLF/G12QJs8=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 208, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLF/G12Rf8c=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 208, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLF/HF2Sm8E=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "model": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -376, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 360, - "width": 131, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLF/G12LESY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLF/G12QJs8=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLF/G12Rf8c=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBeGdXuw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLF/HF2Sm8E=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLGEPF2y6SI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBeGzlZQ=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLGEPF2zyUI=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGEPF20OuI=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2zyUI=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 421, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGEPF21TcM=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2zyUI=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 435, - "width": 71, - "height": 12, - "text": "Type" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGEPF22f/8=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2zyUI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -624, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGEPF23oz0=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2zyUI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -624, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 416, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLGEPF20OuI=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLGEPF21TcM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLGEPF22f/8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLGEPF23oz0=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLGEPF24D5Y=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 244, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLGEPF252Tg=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 244, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLGEPF26r38=", - "_parent": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "model": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -416, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 416, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLGEPF2zyUI=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLGEPF24D5Y=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLGEPF252Tg=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBeGzlZQ=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLGEPF26r38=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLGI813a/Lo=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBeHJqBA=", - "_parent": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLGI813bmDw=", - "_parent": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGI9F3c6dc=", - "_parent": { - "$ref": "AAAAAAFFwLGI813bmDw=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 477, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGI9F3dgjo=", - "_parent": { - "$ref": "AAAAAAFFwLGI813bmDw=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 491, - "width": 71, - "height": 12, - "text": "Utility" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGI9F3eWQw=", - "_parent": { - "$ref": "AAAAAAFFwLGI813bmDw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -672, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLGI9F3fVUI=", - "_parent": { - "$ref": "AAAAAAFFwLGI813bmDw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -672, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 472, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLGI9F3c6dc=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLGI9F3dgjo=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLGI9F3eWQw=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLGI9F3fVUI=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLGI9F3g9+w=", - "_parent": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 284, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLGI9F3hmIE=", - "_parent": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 704, - "top": 284, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLGI9F3i+8k=", - "_parent": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "model": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -448, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 472, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLGI813bmDw=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLGI9F3g9+w=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLGI9F3hmIE=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBeHJqBA=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLGI9F3i+8k=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLNej158NLk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLNej157D6Y=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNej1590I0=", - "_parent": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "model": { - "$ref": "AAAAAAFFwLNej157D6Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 233, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNej15+8jc=", - "_parent": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "model": { - "$ref": "AAAAAAFFwLNej157D6Y=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 248, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNej15/BRY=", - "_parent": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "model": { - "$ref": "AAAAAAFFwLNej157D6Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 203, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNej158NLk=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLFUbV0ScDI=" - }, - "points": "720:224;652:224", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLNej1590I0=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLNej15+8jc=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLNej15/BRY=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLNkZ16NQ/Q=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLNkZ16Mp7Y=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNkZ16OhBQ=", - "_parent": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "model": { - "$ref": "AAAAAAFFwLNkZ16Mp7Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 281, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNkZ16PBtY=", - "_parent": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "model": { - "$ref": "AAAAAAFFwLNkZ16Mp7Y=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 296, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNkZ16QvLQ=", - "_parent": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "model": { - "$ref": "AAAAAAFFwLNkZ16Mp7Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 251, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNkZ16NQ/Q=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLFu9F06sWk=" - }, - "points": "720:272;652:272", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLNkZ16OhBQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLNkZ16PBtY=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLNkZ16QvLQ=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLNn916eDZQ=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLNn916d4Yc=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNn916fvYQ=", - "_parent": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "model": { - "$ref": "AAAAAAFFwLNn916d4Yc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 333, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNn916guUU=", - "_parent": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "model": { - "$ref": "AAAAAAFFwLNn916d4Yc=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 348, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNn916hjhM=", - "_parent": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "model": { - "$ref": "AAAAAAFFwLNn916d4Yc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 303, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNn916eDZQ=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLF4tF1iftI=" - }, - "points": "720:324;652:324", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLNn916fvYQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLNn916guUU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLNn916hjhM=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLNr116vKpE=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLNr116u93k=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNr116weUM=", - "_parent": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "model": { - "$ref": "AAAAAAFFwLNr116u93k=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 385, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNr116xjvo=", - "_parent": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "model": { - "$ref": "AAAAAAFFwLNr116u93k=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 400, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNr116yGN0=", - "_parent": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "model": { - "$ref": "AAAAAAFFwLNr116u93k=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 355, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNr116vKpE=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLF/G12KFPg=" - }, - "points": "720:376;652:376", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLNr116weUM=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLNr116xjvo=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLNr116yGN0=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLNvdl7AF7U=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLNvdl6/WJI=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNvd17Byl0=", - "_parent": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "model": { - "$ref": "AAAAAAFFwLNvdl6/WJI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 442, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNvd17Cmyo=", - "_parent": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "model": { - "$ref": "AAAAAAFFwLNvdl6/WJI=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 457, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLNvd17DduQ=", - "_parent": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "model": { - "$ref": "AAAAAAFFwLNvdl6/WJI=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 412, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLNvdl7AF7U=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLGEPF2y6SI=" - }, - "points": "720:433;652:433", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLNvd17Byl0=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLNvd17Cmyo=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLNvd17DduQ=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLN0fl7RscA=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLN0fl7QL9o=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLN0fl7SzeE=", - "_parent": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "model": { - "$ref": "AAAAAAFFwLN0fl7QL9o=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 498, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLN0fl7Tq3c=", - "_parent": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "model": { - "$ref": "AAAAAAFFwLN0fl7QL9o=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 685, - "top": 513, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLN0f17UptI=", - "_parent": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "model": { - "$ref": "AAAAAAFFwLN0fl7QL9o=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 686, - "top": 468, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLN0fl7RscA=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFJsZbpDNpnkE=" - }, - "tail": { - "$ref": "AAAAAAFFwLGI813a/Lo=" - }, - "points": "720:489;652:489", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLN0fl7SzeE=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLN0fl7Tq3c=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLN0f17UptI=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwLRECl7stC8=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLRECl7tsQE=", - "_parent": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "model": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLRECl7u5vE=", - "_parent": { - "$ref": "AAAAAAFFwLRECl7tsQE=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 561, - "top": 545, - "width": 92.6484375, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLRECl7vrCk=", - "_parent": { - "$ref": "AAAAAAFFwLRECl7tsQE=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 561, - "top": 559, - "width": 92.6484375, - "height": 12, - "text": "UMLComponent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLRECl7wqHs=", - "_parent": { - "$ref": "AAAAAAFFwLRECl7tsQE=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "top": 504, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLRECl7xJrI=", - "_parent": { - "$ref": "AAAAAAFFwLRECl7tsQE=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "top": 504, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 540, - "width": 102.6484375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLRECl7u5vE=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLRECl7vrCk=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLRECl7wqHs=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLRECl7xJrI=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 540, - "width": 102.6484375, - "height": 261, - "nameCompartment": { - "$ref": "AAAAAAFFwLRECl7tsQE=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLR8CV8I99Y=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anBuIYUg0=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLR8CV8JFWY=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLR8CV8Knxc=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8JFWY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 549, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLR8CV8LWIw=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8JFWY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 563, - "width": 71, - "height": 12, - "text": "Entity" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLR8CV8Mvqc=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8JFWY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 504, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLR8CV8NdIc=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8JFWY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 504, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 544, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLR8CV8Knxc=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLR8CV8LWIw=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLR8CV8Mvqc=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLR8CV8NdIc=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLR8CV8OpVY=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 748, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLR8CV8PW8k=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 748, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLR8Cl8QCTM=", - "_parent": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "model": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 336, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 544, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLR8CV8JFWY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLR8CV8OpVY=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLR8CV8PW8k=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anBuIYUg0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLR8Cl8QCTM=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLSByF8w+gI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anCOIudjk=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLSByF8x/Yc=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSByF8yMLo=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8x/Yc=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 597, - "width": 88.67578125, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSByF8zspI=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8x/Yc=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 611, - "width": 88.67578125, - "height": 12, - "text": "Implementation" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSByF80AnU=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8x/Yc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 420, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSByF81b24=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8x/Yc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 420, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 592, - "width": 98.67578125, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLSByF8yMLo=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLSByF8zspI=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLSByF80AnU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLSByF81b24=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLSByF82e10=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 768, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLSByF83aE4=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 768, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLSByF84G88=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "model": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -8, - "top": 280, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 592, - "width": 98.67578125, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLSByF8x/Yc=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLSByF82e10=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLSByF83aE4=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anCOIudjk=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLSByF84G88=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLSIN19Ytdk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anCOJEpfw=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLSIN19ZQ0U=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSIOF9a8kE=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19ZQ0U=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 653, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSIOF9bYBg=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19ZQ0U=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 667, - "width": 71, - "height": 12, - "text": "Process" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSIOF9cqZQ=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19ZQ0U=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 348, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSIOF9dI5U=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19ZQ0U=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 348, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 648, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLSIOF9a8kE=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLSIOF9bYBg=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLSIOF9cqZQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLSIOF9dI5U=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLSIOF9ekq0=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 800, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLSIOF9fibc=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 800, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLSIOF9gUN0=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "model": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -8, - "top": 232, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 648, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLSIN19ZQ0U=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLSIOF9ekq0=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLSIOF9fibc=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anCOJEpfw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLSIOF9gUN0=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLSO/1+AoeQ=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anCOJanTs=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLSO/1+BWGA=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSO/1+CG1s=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+BWGA=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 709, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSO/1+DoUc=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+BWGA=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 723, - "width": 71, - "height": 12, - "text": "Service" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSPAF+EVIo=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+BWGA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 312, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSPAF+FZR8=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+BWGA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "top": 312, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 704, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLSO/1+CG1s=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLSO/1+DoUc=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLSPAF+EVIo=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLSPAF+FZR8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLSPAF+GnaI=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 844, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLSPAF+Ho/s=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 716, - "top": 844, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLSPAF+I3E8=", - "_parent": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "model": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -8, - "top": 208, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 704, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLSO/1+BWGA=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLSPAF+GnaI=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLSPAF+Ho/s=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anCOJanTs=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLSPAF+I3E8=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLSXP1+o0Kw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anCeJwn44=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLSXP1+peko=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSXP1+qR3g=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+peko=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 725, - "top": 765, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSXP1+rnfg=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+peko=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 725, - "top": 779, - "width": 71, - "height": 12, - "text": "Subsystem" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSXP1+sqCM=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+peko=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 252, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLSXP1+t4Mc=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+peko=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 252, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 760, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLSXP1+qR3g=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLSXP1+rnfg=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLSXP1+sqCM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLSXP1+t4Mc=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLSXP1+uKrA=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 880, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLSXP1+vdxM=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 880, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLSXP1+woFc=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "model": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": 168, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 720, - "top": 760, - "width": 81, - "height": 36, - "nameCompartment": { - "$ref": "AAAAAAFFwLSXP1+peko=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLSXP1+uKrA=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLSXP1+vdxM=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anCeJwn44=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLSXP1+woFc=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLV9gV/Ybio=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLV9gV/Xhk4=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLV9gV/Z8CU=", - "_parent": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "model": { - "$ref": "AAAAAAFFwLV9gV/Xhk4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 569, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLV9gl/a23I=", - "_parent": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "model": { - "$ref": "AAAAAAFFwLV9gV/Xhk4=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 584, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLV9gl/b3BU=", - "_parent": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "model": { - "$ref": "AAAAAAFFwLV9gV/Xhk4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 539, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLV9gV/Ybio=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "tail": { - "$ref": "AAAAAAFFwLR8CV8I99Y=" - }, - "points": "720:560;658:560", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLV9gV/Z8CU=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLV9gl/a23I=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLV9gl/b3BU=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLWA0V/pWEg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLWA0V/olVk=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWA0V/q2AI=", - "_parent": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "model": { - "$ref": "AAAAAAFFwLWA0V/olVk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 621, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWA0V/rrYc=", - "_parent": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "model": { - "$ref": "AAAAAAFFwLWA0V/olVk=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 636, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWA0V/spgM=", - "_parent": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "model": { - "$ref": "AAAAAAFFwLWA0V/olVk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 591, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWA0V/pWEg=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "tail": { - "$ref": "AAAAAAFFwLSByF8w+gI=" - }, - "points": "720:612;658:612", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLWA0V/q2AI=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLWA0V/rrYc=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLWA0V/spgM=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLWEUV/6d1E=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLWEUV/5Qq4=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWEUV/78Ig=", - "_parent": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "model": { - "$ref": "AAAAAAFFwLWEUV/5Qq4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 677, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWEUV/8eIM=", - "_parent": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "model": { - "$ref": "AAAAAAFFwLWEUV/5Qq4=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 692, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWEUV/9T0A=", - "_parent": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "model": { - "$ref": "AAAAAAFFwLWEUV/5Qq4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 647, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWEUV/6d1E=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "tail": { - "$ref": "AAAAAAFFwLSIN19Ytdk=" - }, - "points": "720:668;658:668", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLWEUV/78Ig=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLWEUV/8eIM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLWEUV/9T0A=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLWIQWALE8M=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLWIQWAKKPo=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWIQWAMDo8=", - "_parent": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "model": { - "$ref": "AAAAAAFFwLWIQWAKKPo=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 737, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWIQWANo/A=", - "_parent": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "model": { - "$ref": "AAAAAAFFwLWIQWAKKPo=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 752, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWIQWAO6qA=", - "_parent": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "model": { - "$ref": "AAAAAAFFwLWIQWAKKPo=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 707, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWIQWALE8M=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "tail": { - "$ref": "AAAAAAFFwLSO/1+AoeQ=" - }, - "points": "720:728;658:728", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLWIQWAMDo8=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLWIQWANo/A=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLWIQWAO6qA=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLWMgWAcaQw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwLWMgWAb2Sk=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWMgWAd1rc=", - "_parent": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "model": { - "$ref": "AAAAAAFFwLWMgWAb2Sk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 789, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWMgWAeZ8k=", - "_parent": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "model": { - "$ref": "AAAAAAFFwLWMgWAb2Sk=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 688, - "top": 804, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLWMgWAfxqc=", - "_parent": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "model": { - "$ref": "AAAAAAFFwLWMgWAb2Sk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 759, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLWMgWAcaQw=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLRECl7stC8=" - }, - "tail": { - "$ref": "AAAAAAFFwLSXP1+o0Kw=" - }, - "points": "720:780;658:780", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLWMgWAd1rc=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLWMgWAeZ8k=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLWMgWAfxqc=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwL2WeWA5NQI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL2WeGA460g=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL2WeWA62bI=", - "_parent": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "model": { - "$ref": "AAAAAAFFwL2WeGA460g=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL2WeWA7mnk=", - "_parent": { - "$ref": "AAAAAAFFwL2WeWA62bI=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 61, - "top": 649, - "width": 98, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL2WeWA8/Wk=", - "_parent": { - "$ref": "AAAAAAFFwL2WeWA62bI=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 61, - "top": 663, - "width": 98, - "height": 12, - "text": "UMLDependency" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL2WeWA9NaM=", - "_parent": { - "$ref": "AAAAAAFFwL2WeWA62bI=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "top": 144, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL2WeWA+CiM=", - "_parent": { - "$ref": "AAAAAAFFwL2WeWA62bI=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "top": 144, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 56, - "top": 644, - "width": 108, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL2WeWA7mnk=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL2WeWA8/Wk=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL2WeWA9NaM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL2WeWA+CiM=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 56, - "top": 644, - "width": 108, - "height": 277, - "nameCompartment": { - "$ref": "AAAAAAFFwL2WeWA62bI=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwL4D0mBZIkY=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anCuK4EUw=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL4D0mBaqmw=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4D0mBbBNE=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBaqmw=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 649, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4D0mBc7go=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBaqmw=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 663, - "width": 69.380859375, - "height": 12, - "text": "Create" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4D02Bd3+g=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBaqmw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -48, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4D02BeWA8=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBaqmw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -48, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 644, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL4D0mBbBNE=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL4D0mBc7go=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL4D02Bd3+g=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL4D02BeWA8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwL4D02Bf0q0=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 664, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwL4D02BgYs8=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 664, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwL4D02BhsHw=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "model": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -32, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 644, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwL4D0mBaqmw=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwL4D02Bf0q0=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwL4D02BgYs8=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anCuK4EUw=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwL4D02BhsHw=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwL4h4WCCAAY=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anC+LOAMA=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL4h4WCD82Y=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4h4mCE1YI=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCD82Y=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 713, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4h4mCFbHY=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCD82Y=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 727, - "width": 69.380859375, - "height": 12, - "text": "Call" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4h4mCG+Bo=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCD82Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -108, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL4h4mCHhD8=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCD82Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -108, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 708, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL4h4mCE1YI=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL4h4mCFbHY=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL4h4mCG+Bo=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL4h4mCHhD8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwL4h4mCIEqs=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 708, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwL4h4mCJktQ=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 708, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwL4h4mCKdqI=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "model": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -72, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 708, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwL4h4WCD82Y=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwL4h4mCIEqs=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwL4h4mCJktQ=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anC+LOAMA=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwL4h4mCKdqI=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwL45WWCr3cU=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anC+Lk1Ss=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL45WWCsDkc=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL45WWCtTBI=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCsDkc=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 769, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL45WWCuTW0=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCsDkc=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 783, - "width": 69.380859375, - "height": 12, - "text": "Instantiate" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL45WWCv18Q=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCsDkc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -192, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL45WWCwZzE=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCsDkc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -192, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 764, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL45WWCtTBI=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL45WWCuTW0=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL45WWCv18Q=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL45WWCwZzE=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwL45WWCxsuk=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 736, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwL45WmCy+mU=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 736, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwL45WmCzW1Y=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "model": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -128, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 764, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwL45WWCsDkc=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwL45WWCxsuk=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwL45WmCy+mU=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anC+Lk1Ss=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwL45WmCzW1Y=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwL5hQGDUxa0=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anC+L65f4=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL5hQGDVSBg=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL5hQGDWrwI=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDVSBg=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 825, - "width": 82.013671875, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL5hQGDXPFU=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDVSBg=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 839, - "width": 82.013671875, - "height": 12, - "text": "Responsibility" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL5hQGDYpi0=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDVSBg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -252, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL5hQGDZAt8=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDVSBg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -252, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 820, - "width": 92.013671875, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL5hQGDWrwI=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL5hQGDXPFU=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL5hQGDYpi0=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL5hQGDZAt8=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwL5hQGDa1nY=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 772, - "width": 91, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwL5hQGDbixI=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 220, - "top": 772, - "width": 91, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwL5hQGDcuS4=", - "_parent": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "model": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -32, - "top": -168, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 820, - "width": 92.013671875, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwL5hQGDVSBg=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwL5hQGDa1nY=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwL5hQGDbixI=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anC+L65f4=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwL5hQGDcuS4=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwL7KdWEqew0=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anDOMQag0=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwL7KdWEr60A=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwL7KdWEspPc=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEr60A=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 241, - "top": 881, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL7KdWEt7g0=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEr60A=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 241, - "top": 895, - "width": 69.380859375, - "height": 12, - "text": "Send" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL7KdWEum1Q=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEr60A=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -324, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwL7KdWEv3Yk=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEr60A=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -60, - "top": -324, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 876, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL7KdWEspPc=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwL7KdWEt7g0=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwL7KdWEum1Q=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL7KdWEv3Yk=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwL7KdWEwzHc=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 216, - "top": 804, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwL7KdWExRWs=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 216, - "top": 804, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwL7KdWEyL0Q=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "model": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -40, - "top": -216, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 236, - "top": 876, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwL7KdWEr60A=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwL7KdWEwzHc=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwL7KdWExRWs=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anDOMQag0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwL7KdWEyL0Q=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+LCGFgCjw=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+LCGFfPQs=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+LCGFhp5w=", - "_parent": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "model": { - "$ref": "AAAAAAFFwL+LCGFfPQs=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 347, - "top": 634, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+LCGFihK4=", - "_parent": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "model": { - "$ref": "AAAAAAFFwL+LCGFfPQs=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 347, - "top": 619, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+LCGFjcmE=", - "_parent": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "model": { - "$ref": "AAAAAAFFwL+LCGFfPQs=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 347, - "top": 664, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+LCGFgCjw=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwK/k1ly1mNU=" - }, - "tail": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "points": "314:655;380:655", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+LCGFhp5w=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+LCGFihK4=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+LCGFjcmE=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+O8GFxUF4=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+O8GFwbog=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+O8GFyCzY=", - "_parent": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "model": { - "$ref": "AAAAAAFFwL+O8GFwbog=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 677, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+O8GFzT+A=", - "_parent": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "model": { - "$ref": "AAAAAAFFwL+O8GFwbog=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 692, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+O8GF0qhg=", - "_parent": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "model": { - "$ref": "AAAAAAFFwL+O8GFwbog=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 199, - "top": 647, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+O8GFxUF4=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "tail": { - "$ref": "AAAAAAFFwL4D0mBZIkY=" - }, - "points": "236:668;163:668", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+O8GFyCzY=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+O8GFzT+A=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+O8GF0qhg=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+SkWGC/a4=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+SkWGBCOg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+SkWGDbeA=", - "_parent": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "model": { - "$ref": "AAAAAAFFwL+SkWGBCOg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 731, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+SkWGEkxM=", - "_parent": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "model": { - "$ref": "AAAAAAFFwL+SkWGBCOg=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 746, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+SkWGFVnU=", - "_parent": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "model": { - "$ref": "AAAAAAFFwL+SkWGBCOg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 199, - "top": 701, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+SkWGC/a4=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "tail": { - "$ref": "AAAAAAFFwL4h4WCCAAY=" - }, - "points": "236:722;163:722", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+SkWGDbeA=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+SkWGEkxM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+SkWGFVnU=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+WL2GTesQ=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+WL2GScgY=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+WL2GUDZ4=", - "_parent": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "model": { - "$ref": "AAAAAAFFwL+WL2GScgY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 797, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+WL2GVfH8=", - "_parent": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "model": { - "$ref": "AAAAAAFFwL+WL2GScgY=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 812, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+WL2GW4Ys=", - "_parent": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "model": { - "$ref": "AAAAAAFFwL+WL2GScgY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 199, - "top": 767, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+WL2GTesQ=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "tail": { - "$ref": "AAAAAAFFwL45WWCr3cU=" - }, - "points": "236:788;163:788", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+WL2GUDZ4=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+WL2GVfH8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+WL2GW4Ys=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+Z72GkT5Y=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+Z72GjzGw=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+Z72GllyU=", - "_parent": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "model": { - "$ref": "AAAAAAFFwL+Z72GjzGw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 854, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+Z72Gm6K8=", - "_parent": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "model": { - "$ref": "AAAAAAFFwL+Z72GjzGw=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 869, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+Z72GnawI=", - "_parent": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "model": { - "$ref": "AAAAAAFFwL+Z72GjzGw=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 199, - "top": 824, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+Z72GkT5Y=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "tail": { - "$ref": "AAAAAAFFwL5hQGDUxa0=" - }, - "points": "236:845;163:845", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+Z72GllyU=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+Z72Gm6K8=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+Z72GnawI=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwL+eh2G1gXM=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwL+eh2G01aU=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+eh2G2oXg=", - "_parent": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "model": { - "$ref": "AAAAAAFFwL+eh2G01aU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 910, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+eh2G3GpE=", - "_parent": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "model": { - "$ref": "AAAAAAFFwL+eh2G01aU=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 198, - "top": 925, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwL+eh2G4woY=", - "_parent": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "model": { - "$ref": "AAAAAAFFwL+eh2G01aU=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 199, - "top": 880, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwL+eh2G1gXM=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwL2WeWA5NQI=" - }, - "tail": { - "$ref": "AAAAAAFFwL7KdWEqew0=" - }, - "points": "236:901;163:901", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwL+eh2G2oXg=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwL+eh2G3GpE=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwL+eh2G4woY=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwMFq1GHZe+E=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMFq1GHYSKM=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMFq1GHa5CM=", - "_parent": { - "$ref": "AAAAAAFFwMFq1GHZe+E=" - }, - "model": { - "$ref": "AAAAAAFFwMFq1GHYSKM=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMFq1GHbxIU=", - "_parent": { - "$ref": "AAAAAAFFwMFq1GHa5CM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 561, - "top": 33, - "width": 93, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMFq1GHc3zA=", - "_parent": { - "$ref": "AAAAAAFFwMFq1GHa5CM=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 561, - "top": 47, - "width": 93, - "height": 12, - "text": "UMLAbstraction" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMFq1GHdTFI=", - "_parent": { - "$ref": "AAAAAAFFwMFq1GHa5CM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMFq1GHeicg=", - "_parent": { - "$ref": "AAAAAAFFwMFq1GHa5CM=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -12, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 28, - "width": 103, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMFq1GHbxIU=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMFq1GHc3zA=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMFq1GHdTFI=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMFq1GHeicg=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 28, - "width": 103, - "height": 153, - "nameCompartment": { - "$ref": "AAAAAAFFwMFq1GHa5CM=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwMGle2H29zI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anDeNf33Q=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMGle2H3I+8=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGle2H4B8s=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H3I+8=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 745, - "top": 29, - "width": 110.396484375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGle2H5FWo=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H3I+8=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 745, - "top": 43, - "width": 110.396484375, - "height": 12, - "text": "Derive" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGle2H6wQw=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H3I+8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 252, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGle2H7ifs=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H3I+8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 252, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 24, - "width": 120.396484375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMGle2H4B8s=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMGle2H5FWo=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMGle2H6wQw=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMGle2H7ifs=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwMGle2H8ZWU=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "subViews": [ - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFFwMJPAWJ40Vg=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H8ZWU=" - }, - "model": { - "$ref": "AAAAAAFFwMJO92J1Y/s=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 745, - "top": 65, - "width": 110.396484375, - "height": 12, - "text": "+computation: String", - "horizontalAlignment": 0 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 60, - "width": 120.396484375, - "height": 22 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwMGle2H9VL8=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 824, - "top": 60, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwMGle2H+hpQ=", - "_parent": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "model": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 168, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 24, - "width": 120.396484375, - "height": 58, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwMGle2H3I+8=" - }, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwMGle2H8ZWU=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwMGle2H9VL8=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anDeNf33Q=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwMGle2H+hpQ=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwMGo6mIepMc=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anDuN2iYk=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMGo6mIfS5g=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGo6mIgcys=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIfS5g=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 745, - "top": 101, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGo6mIha40=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIfS5g=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 745, - "top": 115, - "width": 69.380859375, - "height": 12, - "text": "Refine" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGo6mIiGvE=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIfS5g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 276, - "top": 120, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGo6mIjVCs=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIfS5g=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 276, - "top": 120, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 96, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMGo6mIgcys=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMGo6mIha40=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMGo6mIiGvE=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMGo6mIjVCs=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwMGo6mIkY0Y=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 832, - "top": 172, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwMGo6mIlYhc=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 832, - "top": 172, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwMGo6mImbZE=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "model": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 184, - "top": 80, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 96, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwMGo6mIfS5g=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwMGo6mIkY0Y=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwMGo6mIlYhc=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anDuN2iYk=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwMGo6mImbZE=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwMGrimJGJ0s=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anDuOMqjA=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMGrimJHZ7Y=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGrimJIfxU=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJHZ7Y=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 745, - "top": 153, - "width": 69.380859375, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGrimJJ7uc=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJHZ7Y=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 745, - "top": 167, - "width": 69.380859375, - "height": 12, - "text": "Trace" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGrimJKI9M=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJHZ7Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 324, - "top": 168, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMGrimJL3ag=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJHZ7Y=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 324, - "top": 168, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 148, - "width": 79.380859375, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMGrimJIfxU=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMGrimJJ7uc=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMGrimJKI9M=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMGrimJL3ag=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwMGrimJMCIQ=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 848, - "top": 240, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwMGrimJNPbE=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 848, - "top": 240, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwMGrimJOkXc=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "model": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 216, - "top": 112, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 740, - "top": 148, - "width": 79.380859375, - "height": 36, - "autoResize": true, - "nameCompartment": { - "$ref": "AAAAAAFFwMGrimJHZ7Y=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwMGrimJMCIQ=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwMGrimJNPbE=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anDuOMqjA=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwMGrimJOkXc=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwMLTm2KEAI0=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMLTmmKDF1M=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLTm2KFRRg=", - "_parent": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "model": { - "$ref": "AAAAAAFFwMLTmmKDF1M=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 61, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLTm2KGrkQ=", - "_parent": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "model": { - "$ref": "AAAAAAFFwMLTmmKDF1M=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 76, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLTm2KHZTE=", - "_parent": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "model": { - "$ref": "AAAAAAFFwMLTmmKDF1M=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 699, - "top": 31, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLTm2KEAI0=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwMFq1GHZe+E=" - }, - "tail": { - "$ref": "AAAAAAFFwMGle2H29zI=" - }, - "points": "740:52;658:52", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwMLTm2KFRRg=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMLTm2KGrkQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMLTm2KHZTE=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwMLXQmKVDuM=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMLXQmKUyu0=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLXQmKW+3c=", - "_parent": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "model": { - "$ref": "AAAAAAFFwMLXQmKUyu0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 121, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLXQmKXpUQ=", - "_parent": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "model": { - "$ref": "AAAAAAFFwMLXQmKUyu0=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 136, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLXQmKYWOg=", - "_parent": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "model": { - "$ref": "AAAAAAFFwMLXQmKUyu0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 699, - "top": 91, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLXQmKVDuM=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwMFq1GHZe+E=" - }, - "tail": { - "$ref": "AAAAAAFFwMGo6mIepMc=" - }, - "points": "740:112;658:112", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwMLXQmKW+3c=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMLXQmKXpUQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMLXQmKYWOg=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwMLbmmKmAvI=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMLbmmKloGE=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLbmmKnMuM=", - "_parent": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "model": { - "$ref": "AAAAAAFFwMLbmmKloGE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 169, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLbmmKonTw=", - "_parent": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "model": { - "$ref": "AAAAAAFFwMLbmmKloGE=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 698, - "top": 184, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMLbmmKpbLQ=", - "_parent": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "model": { - "$ref": "AAAAAAFFwMLbmmKloGE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 699, - "top": 139, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMLbmmKmAvI=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwMFq1GHZe+E=" - }, - "tail": { - "$ref": "AAAAAAFFwMGrimJGJ0s=" - }, - "points": "740:160;658:160", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwMLbmmKnMuM=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMLbmmKonTw=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMLbmmKpbLQ=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwMYNEWK8jeA=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMYNEWK7ItA=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMYNEWK9Wb8=", - "_parent": { - "$ref": "AAAAAAFFwMYNEWK8jeA=" - }, - "model": { - "$ref": "AAAAAAFFwMYNEWK7ItA=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMYNEWK++fU=", - "_parent": { - "$ref": "AAAAAAFFwMYNEWK9Wb8=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 561, - "top": 833, - "width": 91, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMYNEWK/PY8=", - "_parent": { - "$ref": "AAAAAAFFwMYNEWK9Wb8=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 561, - "top": 847, - "width": 91, - "height": 12, - "text": "UMLPackage" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMYNEWLAHjA=", - "_parent": { - "$ref": "AAAAAAFFwMYNEWK9Wb8=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMYNEWLBm9I=", - "_parent": { - "$ref": "AAAAAAFFwMYNEWK9Wb8=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 828, - "width": 101, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMYNEWK++fU=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMYNEWK/PY8=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMYNEWLAHjA=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMYNEWLBm9I=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 556, - "top": 828, - "width": 101, - "height": 101, - "nameCompartment": { - "$ref": "AAAAAAFFwMYNEWK9Wb8=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwMdnrWLZAY8=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anD+PGtEg=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMdnrWLaXkY=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMdnrmLbib0=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLaXkY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 729, - "top": 837, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMdnrmLclU4=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLaXkY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 729, - "top": 851, - "width": 71, - "height": 12, - "text": "Framework" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMdnrmLdBNU=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLaXkY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMdnrmLeF4I=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLaXkY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 832, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMdnrmLbib0=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMdnrmLclU4=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMdnrmLdBNU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMdnrmLeF4I=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwMdnrmLf950=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 868, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwMdnrmLgzek=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 878, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwMdnrmLhmpQ=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "model": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 832, - "width": 81, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwMdnrWLaXkY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwMdnrmLf950=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwMdnrmLgzek=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anD+PGtEg=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwMdnrmLhmpQ=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwMeIHGMCTCk=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anD+Pcij0=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwMeIHGMDiPY=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwMeIHGMEN4g=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMDiPY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 729, - "top": 893, - "width": 75.345703125, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMeIHGMFxQc=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMDiPY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 729, - "top": 907, - "width": 75.345703125, - "height": 12, - "text": "ModelLibrary" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMeIHGMG6CQ=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMDiPY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -60, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwMeIHGMH2dQ=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMDiPY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -60, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 888, - "width": 85.345703125, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMeIHGMEN4g=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwMeIHGMFxQc=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwMeIHGMG6CQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMeIHGMH2dQ=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwMeIHGMI7hI=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 904, - "width": 85, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwMeIHGMJi90=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 914, - "width": 85, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwMeIHGMK1pc=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "model": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "top": -40, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 724, - "top": 888, - "width": 85.345703125, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwMeIHGMDiPY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwMeIHGMI7hI=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwMeIHGMJi90=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anD+Pcij0=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwMeIHGMK1pc=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwMevo2Mq4Ew=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMevo2MpIU4=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMevo2Mr7wQ=", - "_parent": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "model": { - "$ref": "AAAAAAFFwMevo2MpIU4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 861, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMevo2Msv/w=", - "_parent": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "model": { - "$ref": "AAAAAAFFwMevo2MpIU4=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 876, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMevo2MtL5c=", - "_parent": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "model": { - "$ref": "AAAAAAFFwMevo2MpIU4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 690, - "top": 831, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMevo2Mq4Ew=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwMYNEWK8jeA=" - }, - "tail": { - "$ref": "AAAAAAFFwMdnrWLZAY8=" - }, - "points": "724:852;656:852", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwMevo2Mr7wQ=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMevo2Msv/w=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMevo2MtL5c=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwMe0G2M7rmg=", - "_parent": { - "$ref": "AAAAAAFElnFUQFS4mT4=" - }, - "model": { - "$ref": "AAAAAAFFwMe0G2M69PQ=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMe0G2M8gls=", - "_parent": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "model": { - "$ref": "AAAAAAFFwMe0G2M69PQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 917, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMe0G2M9WEg=", - "_parent": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "model": { - "$ref": "AAAAAAFFwMe0G2M69PQ=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 689, - "top": 932, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwMe0G2M+CD8=", - "_parent": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "model": { - "$ref": "AAAAAAFFwMe0G2M69PQ=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 690, - "top": 887, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwMe0G2M7rmg=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwMYNEWK8jeA=" - }, - "tail": { - "$ref": "AAAAAAFFwMeIHGMCTCk=" - }, - "points": "724:908;656:908", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwMe0G2M8gls=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwMe0G2M9WEg=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwMe0G2M+CD8=" - } - } - ] - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFElnFrT1S7Kic=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLClassifier" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFElnF1nFTY/Sw=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Realization", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFElnGGLFUFZFA=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "source": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "target": { - "$ref": "AAAAAAFElnFrT1S7Kic=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFElnF1nFTZHOU=", - "_parent": { - "$ref": "AAAAAAFElnF1nFTY/Sw=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFElnJRglVKSoc=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Specification", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFElnKVuVV4pBU=", - "_parent": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "source": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "target": { - "$ref": "AAAAAAFElnFrT1S7Kic=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFElnJRglVLifA=", - "_parent": { - "$ref": "AAAAAAFElnJRglVKSoc=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFJsYgDTM+Z6E=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "entity", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFJsZx3DOCac8=", - "_parent": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "source": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFJsYgDTM/qY8=", - "_parent": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "width": 40, - "height": 40, - "content": "var w = rect.getWidth(),\n m = w / 10;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + m, rect.y2 - m, rect.x2 - m, rect.y2 - m);\n" - } - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFJsZbpDNobIs=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLClass" - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwKqhJFq06mA=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLArtifact" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKsvdVrRJUQ=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "File", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK5AeFyZpVg=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "source": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "isAbstract": true, - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKsvdVrSLo0=", - "_parent": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKtwS1r6wew=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Document", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAFFwKzkslvX4gU=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "source": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "target": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK4k1VxEEpM=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "source": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKtwS1r7XqE=", - "_parent": { - "$ref": "AAAAAAFFwKtwS1r6wew=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKuBulsidLQ=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Executable", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAFFwKzsCVvo11g=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "source": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "target": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK4o4VxVx00=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "source": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKuBulsjhp0=", - "_parent": { - "$ref": "AAAAAAFFwKuBulsidLQ=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKuIMltKnQQ=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Library", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAFFwKzxcVv56Dg=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "source": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "target": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK4tiVxmVJM=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "source": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKuIMltLkmg=", - "_parent": { - "$ref": "AAAAAAFFwKuIMltKnQQ=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKuS0ltysPk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Script", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAFFwKz3OVwK9hs=", - "_parent": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "source": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "target": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK41YVx3Hr0=", - "_parent": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "source": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKuS0ltz9pw=", - "_parent": { - "$ref": "AAAAAAFFwKuS0ltysPk=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwKueMVuaLXM=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Source", - "ownedElements": [ - { - "_type": "UMLGeneralization", - "_id": "AAAAAAFFwKz9mFwbfDg=", - "_parent": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "source": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "target": { - "$ref": "AAAAAAFFwKsvdVrRJUQ=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwK47MFyIL/c=", - "_parent": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "source": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "target": { - "$ref": "AAAAAAFFwKqhJFq06mA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwKueMlubedY=", - "_parent": { - "$ref": "AAAAAAFFwKueMVuaLXM=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwK/k1ly00Ec=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLBehavioralFeature" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLBdO1zQosE=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Destroy", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLDMaFz5C14=", - "_parent": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "source": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "target": { - "$ref": "AAAAAAFFwK/k1ly00Ec=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLBdO1zR7Ak=", - "_parent": { - "$ref": "AAAAAAFFwLBdO1zQosE=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLFUbV0QQVA=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Auxiliary", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLNej157D6Y=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "source": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLFUbV0RoPU=", - "_parent": { - "$ref": "AAAAAAFFwLFUbV0QQVA=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLFu8104he4=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Focus", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLNkZ16Mp7Y=", - "_parent": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "source": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLFu9F05JGE=", - "_parent": { - "$ref": "AAAAAAFFwLFu8104he4=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLF4tF1g4No=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Metaclass", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLNn916d4Yc=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "source": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLF4tF1h94I=", - "_parent": { - "$ref": "AAAAAAFFwLF4tF1g4No=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLF/G12IJ54=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "ImplementationClass", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLNr116u93k=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "source": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLF/G12JIns=", - "_parent": { - "$ref": "AAAAAAFFwLF/G12IJ54=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLGEO12wqJ8=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Type", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLNvdl6/WJI=", - "_parent": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "source": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLGEPF2x7bg=", - "_parent": { - "$ref": "AAAAAAFFwLGEO12wqJ8=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLGI813YL3s=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Utility", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLN0fl7QL9o=", - "_parent": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "source": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLGI813ZPxY=", - "_parent": { - "$ref": "AAAAAAFFwLGI813YL3s=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLProfileDiagram", - "_id": "AAAAAAFFwLKxU14QPaE=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Robustness Stereotypes", - "ownedViews": [ - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwLL0NF4VWXk=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anEeRKntE=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLL0NF4WzoE=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLL0NF4X88I=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4WzoE=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 217, - "top": 89, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLL0NF4YSt8=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4WzoE=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 217, - "top": 103, - "width": 71, - "height": 12, - "text": "entity" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLL0NF4ZQaQ=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4WzoE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -1065, - "top": -270, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLL0NF4asxs=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4WzoE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -1065, - "top": -270, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 84, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLL0NF4X88I=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLL0NF4YSt8=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLL0NF4ZQaQ=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLL0NF4asxs=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwLL0NF4bgXg=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 92, - "top": -28, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwLL0NF4cZ88=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 92, - "top": -18, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwLL0NF4dJaE=", - "_parent": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "model": { - "$ref": "AAAAAAFFJsYgDTM+Z6E=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -710, - "top": -180, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 84, - "width": 81, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwLL0NF4WzoE=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwLL0NF4bgXg=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwLL0NF4cZ88=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anEeRKntE=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwLL0NF4dJaE=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwLMO8l44tWU=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwLMO8l45ook=", - "_parent": { - "$ref": "AAAAAAFFwLMO8l44tWU=" - }, - "model": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwLMO8l46Nac=", - "_parent": { - "$ref": "AAAAAAFFwLMO8l45ook=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 33, - "top": 33, - "width": 79, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLMO8l47xu4=", - "_parent": { - "$ref": "AAAAAAFFwLMO8l45ook=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 33, - "top": 47, - "width": 79, - "height": 12, - "text": "UMLClass" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLMO8l48V+s=", - "_parent": { - "$ref": "AAAAAAFFwLMO8l45ook=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -489, - "top": -414, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwLMO8l490+g=", - "_parent": { - "$ref": "AAAAAAFFwLMO8l45ook=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -489, - "top": -414, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 28, - "top": 28, - "width": 89, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLMO8l46Nac=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwLMO8l47xu4=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwLMO8l48V+s=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLMO8l490+g=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 28, - "top": 28, - "width": 89, - "height": 149, - "nameCompartment": { - "$ref": "AAAAAAFFwLMO8l45ook=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwLMO814+17w=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFJsZx3DOCac8=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLMO814/vLk=", - "_parent": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "model": { - "$ref": "AAAAAAFFJsZx3DOCac8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 109, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLMO815A2sw=", - "_parent": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "model": { - "$ref": "AAAAAAFFJsZx3DOCac8=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 124, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwLMO815BAcU=", - "_parent": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "model": { - "$ref": "AAAAAAFFJsZx3DOCac8=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 164, - "top": 79, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwLMO814+17w=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLMO8l44tWU=" - }, - "tail": { - "$ref": "AAAAAAFFwLL0NF4VWXk=" - }, - "points": "212:100;116:100", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwLMO814/vLk=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwLMO815A2sw=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwLMO815BAcU=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwx8Q/35wG9A=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anEuR2byc=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwx8Q/35xpyY=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwx8Q/35yVU8=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35xpyY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 217, - "top": 37, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwx8Q/35z0VE=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35xpyY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 217, - "top": 51, - "width": 71, - "height": 12, - "text": "control" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwx8Q/3506PU=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35xpyY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -336, - "top": -312, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwx8Q/351cP0=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35xpyY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -336, - "top": -312, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 32, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwx8Q/35yVU8=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwx8Q/35z0VE=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwx8Q/3506PU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwx8Q/351cP0=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwx8RAH52xko=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 76, - "top": -4, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwx8RAH53MWs=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 76, - "top": 6, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwx8RAH54kik=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "model": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": -224, - "top": -208, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 32, - "width": 81, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwx8Q/35xpyY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwx8RAH52xko=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwx8RAH53MWs=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anEuR2byc=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwx8RAH54kik=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwyAHeH6a9yk=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFwyAHeH6Znas=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwyAHeX6b9JY=", - "_parent": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "model": { - "$ref": "AAAAAAFFwyAHeH6Znas=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 61, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwyAHeX6cKyY=", - "_parent": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "model": { - "$ref": "AAAAAAFFwyAHeH6Znas=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 76, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwyAHeX6dvIk=", - "_parent": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "model": { - "$ref": "AAAAAAFFwyAHeH6Znas=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 164, - "top": 31, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwyAHeH6a9yk=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLMO8l44tWU=" - }, - "tail": { - "$ref": "AAAAAAFFwx8Q/35wG9A=" - }, - "points": "212:52;116:52", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwyAHeX6b9JY=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwyAHeX6cKyY=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwyAHeX6dvIk=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFw0h1/QXNqo4=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anEuSThP8=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFw0h1/gXOBI4=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFw0h1/gXPA/w=", - "_parent": { - "$ref": "AAAAAAFFw0h1/gXOBI4=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 217, - "top": 141, - "width": 71, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFw0h1/gXQ/LI=", - "_parent": { - "$ref": "AAAAAAFFw0h1/gXOBI4=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 217, - "top": 155, - "width": 71, - "height": 12, - "text": "boundary" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFw0h1/gXRrB4=", - "_parent": { - "$ref": "AAAAAAFFw0h1/gXOBI4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 96, - "top": -360, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFw0h1/gXSVgA=", - "_parent": { - "$ref": "AAAAAAFFw0h1/gXOBI4=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 96, - "top": -360, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 136, - "width": 81, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFw0h1/gXPA/w=" - }, - "nameLabel": { - "$ref": "AAAAAAFFw0h1/gXQ/LI=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFw0h1/gXRrB4=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFw0h1/gXSVgA=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFw0h1/gXTCRY=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 72, - "top": -20, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFw0h1/gXUu1g=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 72, - "top": -10, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFw0h1/gXVEL8=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "model": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 64, - "top": -240, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 212, - "top": 136, - "width": 81, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFw0h1/gXOBI4=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFw0h1/gXTCRY=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFw0h1/gXUu1g=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anEuSThP8=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFw0h1/gXVEL8=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFw0o5p5IVMGM=", - "_parent": { - "$ref": "AAAAAAFFwLKxU14QPaE=" - }, - "model": { - "$ref": "AAAAAAFFw0o5ppIUB2s=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFw0o5p5IW5Js=", - "_parent": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "model": { - "$ref": "AAAAAAFFw0o5ppIUB2s=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 165, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFw0o5p5IXSKA=", - "_parent": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "model": { - "$ref": "AAAAAAFFw0o5ppIUB2s=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 163, - "top": 180, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFw0o5p5IY/GE=", - "_parent": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "model": { - "$ref": "AAAAAAFFw0o5ppIUB2s=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 164, - "top": 135, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFw0o5p5IVMGM=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwLMO8l44tWU=" - }, - "tail": { - "$ref": "AAAAAAFFw0h1/QXNqo4=" - }, - "points": "212:156;116:156", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFw0o5p5IW5Js=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFw0o5p5IXSKA=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFw0o5p5IY/GE=" - } - } - ] - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwLRECl7r1R4=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLComponent" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLR8CF8G68k=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Entity", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLV9gV/Xhk4=", - "_parent": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "source": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLR8CF8HOik=", - "_parent": { - "$ref": "AAAAAAFFwLR8CF8G68k=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLSByF8umMo=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Implementation", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLWA0V/olVk=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "source": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLSByF8vzKA=", - "_parent": { - "$ref": "AAAAAAFFwLSByF8umMo=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLSIN19WMnE=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Process", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLWEUV/5Qq4=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "source": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLSIN19XVng=", - "_parent": { - "$ref": "AAAAAAFFwLSIN19WMnE=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLSO/19+cMY=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Service", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLWIQWAKKPo=", - "_parent": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "source": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLSO/19/YUk=", - "_parent": { - "$ref": "AAAAAAFFwLSO/19+cMY=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwLSXP1+mTVk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Subsystem", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwLWMgWAb2Sk=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "source": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwLSXP1+njeI=", - "_parent": { - "$ref": "AAAAAAFFwLSXP1+mTVk=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwL2WeGA460g=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLDependency" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwL4D0mBXwu4=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Create", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+LCGFfPQs=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "source": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "target": { - "$ref": "AAAAAAFFwK/k1ly00Ec=" - } - }, - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+O8GFwbog=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "source": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "target": { - "$ref": "AAAAAAFFwL2WeGA460g=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwL4D0mBYXVU=", - "_parent": { - "$ref": "AAAAAAFFwL4D0mBXwu4=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwL4h4WCAEkg=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Call", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+SkWGBCOg=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "source": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "target": { - "$ref": "AAAAAAFFwL2WeGA460g=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwL4h4WCBKPU=", - "_parent": { - "$ref": "AAAAAAFFwL4h4WCAEkg=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwL45WWCpJ0o=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Instantiate", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+WL2GScgY=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "source": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "target": { - "$ref": "AAAAAAFFwL2WeGA460g=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwL45WWCq/8I=", - "_parent": { - "$ref": "AAAAAAFFwL45WWCpJ0o=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwL5hP2DSEFk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Responsibility", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+Z72GjzGw=", - "_parent": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "source": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "target": { - "$ref": "AAAAAAFFwL2WeGA460g=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwL5hQGDTCjI=", - "_parent": { - "$ref": "AAAAAAFFwL5hP2DSEFk=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwL7KdWEoDhA=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Send", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwL+eh2G01aU=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "source": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "target": { - "$ref": "AAAAAAFFwL2WeGA460g=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwL7KdWEpx8M=", - "_parent": { - "$ref": "AAAAAAFFwL7KdWEoDhA=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwMFq1GHYSKM=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLAbstraction" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwMGlemH0Tq8=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Derive", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwMLTmmKDF1M=", - "_parent": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "source": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "target": { - "$ref": "AAAAAAFFwMFq1GHYSKM=" - } - } - ], - "attributes": [ - { - "_type": "UMLAttribute", - "_id": "AAAAAAFFwMJO92J1Y/s=", - "_parent": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "name": "computation", - "type": "String" - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwMGlemH1M8k=", - "_parent": { - "$ref": "AAAAAAFFwMGlemH0Tq8=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwMGo6mIcITc=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Refine", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwMLXQmKUyu0=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "source": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "target": { - "$ref": "AAAAAAFFwMFq1GHYSKM=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwMGo6mIdBMU=", - "_parent": { - "$ref": "AAAAAAFFwMGo6mIcITc=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwMGrimJEvvk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Trace", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwMLbmmKloGE=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "source": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "target": { - "$ref": "AAAAAAFFwMFq1GHYSKM=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwMGrimJF+z8=", - "_parent": { - "$ref": "AAAAAAFFwMGrimJEvvk=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwMYNEWK7ItA=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLPackage" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwMdnrWLXWLA=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Framework", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwMevo2MpIU4=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "source": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "target": { - "$ref": "AAAAAAFFwMYNEWK7ItA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwMdnrWLYFcM=", - "_parent": { - "$ref": "AAAAAAFFwMdnrWLXWLA=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwMeIHGMAPDc=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "ModelLibrary", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwMe0G2M69PQ=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "source": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "target": { - "$ref": "AAAAAAFFwMYNEWK7ItA=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwMeIHGMBKKk=", - "_parent": { - "$ref": "AAAAAAFFwMeIHGMAPDc=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLProfileDiagram", - "_id": "AAAAAAFFwQCuI7bLjDk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "StandardProfileL3", - "ownedViews": [ - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwQHC9rbwK6A=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQHC9rbvUkk=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwQHC9rbx7Lo=", - "_parent": { - "$ref": "AAAAAAFFwQHC9rbwK6A=" - }, - "model": { - "$ref": "AAAAAAFFwQHC9rbvUkk=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHC9rbyTUQ=", - "_parent": { - "$ref": "AAAAAAFFwQHC9rbx7Lo=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 45, - "top": 121, - "width": 107, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHC9rbzlgQ=", - "_parent": { - "$ref": "AAAAAAFFwQHC9rbx7Lo=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 45, - "top": 135, - "width": 107, - "height": 12, - "text": "UMLModel" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHC9rb0L9g=", - "_parent": { - "$ref": "AAAAAAFFwQHC9rbx7Lo=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -168, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHC9rb1XIk=", - "_parent": { - "$ref": "AAAAAAFFwQHC9rbx7Lo=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -48, - "top": -168, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 40, - "top": 116, - "width": 117, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQHC9rbyTUQ=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwQHC9rbzlgQ=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwQHC9rb0L9g=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQHC9rb1XIk=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 40, - "top": 116, - "width": 117, - "height": 97, - "nameCompartment": { - "$ref": "AAAAAAFFwQHC9rbx7Lo=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwQHjjbcLQPM=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anFOUCFas=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwQHjjbcMlRY=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHjjbcNrIk=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcMlRY=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 229, - "top": 41, - "width": 115, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHjjbcOnWs=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcMlRY=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 229, - "top": 55, - "width": 115, - "height": 12, - "text": "BuildComponent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHjjbcPLIM=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcMlRY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 108, - "top": -48, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQHjjbcQOtc=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcMlRY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 108, - "top": -48, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 36, - "width": 125, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQHjjbcNrIk=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwQHjjbcOnWs=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwQHjjbcPLIM=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQHjjbcQOtc=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwQHjjrcRsYI=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 260, - "top": 56, - "width": 105, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwQHjjrcSCoc=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 260, - "top": 66, - "width": 105, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwQHjjrcTWEY=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "model": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 72, - "top": -32, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 36, - "width": 125, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwQHjjbcMlRY=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwQHjjrcRsYI=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwQHjjrcSCoc=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anFOUCFas=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwQHjjrcTWEY=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwQIPLLc0Q7M=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anFOUYNTU=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwQIPLLc1jrg=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIPLLc2rps=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc1jrg=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 229, - "top": 121, - "width": 83, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIPLLc3wdo=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc1jrg=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 229, - "top": 135, - "width": 83, - "height": 12, - "text": "Metamodel" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIPLLc4SHA=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc1jrg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 108, - "top": -84, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIPLLc5Qvc=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc1jrg=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 108, - "top": -84, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 116, - "width": 93, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQIPLLc2rps=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwQIPLLc3wdo=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwQIPLLc4SHA=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQIPLLc5Qvc=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwQIPLLc63qc=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 260, - "top": 124, - "width": 81, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwQIPLbc7y2w=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 260, - "top": 134, - "width": 81, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwQIPLbc8jC8=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "model": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 72, - "top": -56, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 116, - "width": 93, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwQIPLLc1jrg=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwQIPLLc63qc=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwQIPLbc7y2w=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anFOUYNTU=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwQIPLbc8jC8=" - } - }, - { - "_type": "UMLStereotypeView", - "_id": "AAAAAAFFwQIrDLddK/I=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "subViews": [ - { - "_type": "UMLReceptionCompartmentView", - "_id": "AAAAAAGKy4anFeUugvc=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "visible": false, - "font": "Arial;12;0", - "width": 10, - "height": 10 - }, - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwQIrDLdevJE=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIrDLdfcec=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdevJE=" - }, - "font": "Arial;12;0", - "containerExtending": true, - "left": 229, - "top": 181, - "width": 83, - "height": 12, - "text": "«stereotype»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIrDLdgsTM=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdevJE=" - }, - "font": "Arial;12;1", - "containerExtending": true, - "left": 229, - "top": 195, - "width": 83, - "height": 12, - "text": "SystemModel" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIrDLdhAR0=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdevJE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 120, - "top": -168, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQIrDLdiiuQ=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdevJE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 120, - "top": -168, - "height": 12, - "horizontalAlignment": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 176, - "width": 93, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQIrDLdfcec=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwQIrDLdgsTM=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwQIrDLdhAR0=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQIrDLdiiuQ=" - } - }, - { - "_type": "UMLAttributeCompartmentView", - "_id": "AAAAAAFFwQIrDLdjYt8=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 264, - "top": 156, - "width": 88, - "height": 10 - }, - { - "_type": "UMLOperationCompartmentView", - "_id": "AAAAAAFFwQIrDLdkEoo=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 264, - "top": 166, - "width": 88, - "height": 10 - }, - { - "_type": "UMLTemplateParameterCompartmentView", - "_id": "AAAAAAFFwQIrDLdlkbo=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "model": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 80, - "top": -112, - "width": 10, - "height": 10 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "left": 224, - "top": 176, - "width": 93, - "height": 37, - "nameCompartment": { - "$ref": "AAAAAAFFwQIrDLdevJE=" - }, - "suppressAttributes": true, - "suppressOperations": true, - "attributeCompartment": { - "$ref": "AAAAAAFFwQIrDLdjYt8=" - }, - "operationCompartment": { - "$ref": "AAAAAAFFwQIrDLdkEoo=" - }, - "receptionCompartment": { - "$ref": "AAAAAAGKy4anFeUugvc=" - }, - "templateParameterCompartment": { - "$ref": "AAAAAAFFwQIrDLdlkbo=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwQLOH7eRZzI=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQLOH7eQuvE=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLOH7eSzo8=", - "_parent": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "model": { - "$ref": "AAAAAAFFwQLOH7eQuvE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 145, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLOILeTl4U=", - "_parent": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "model": { - "$ref": "AAAAAAFFwQLOH7eQuvE=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 160, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLOILeU1qE=", - "_parent": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "model": { - "$ref": "AAAAAAFFwQLOH7eQuvE=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 190, - "top": 115, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQLOH7eRZzI=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwQHC9rbwK6A=" - }, - "tail": { - "$ref": "AAAAAAFFwQIPLLc0Q7M=" - }, - "points": "224:136;156:136", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwQLOH7eSzo8=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQLOILeTl4U=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQLOILeU1qE=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwQLSp7eim6s=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQLSp7eh5o0=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLSp7ejdqM=", - "_parent": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "model": { - "$ref": "AAAAAAFFwQLSp7eh5o0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 205, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLSp7ekT+I=", - "_parent": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "model": { - "$ref": "AAAAAAFFwQLSp7eh5o0=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 220, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQLSp7el67w=", - "_parent": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "model": { - "$ref": "AAAAAAFFwQLSp7eh5o0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 190, - "top": 175, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQLSp7eim6s=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwQHC9rbwK6A=" - }, - "tail": { - "$ref": "AAAAAAFFwQIrDLddK/I=" - }, - "points": "224:196;156:196", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwQLSp7ejdqM=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQLSp7ekT+I=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQLSp7el67w=" - } - }, - { - "_type": "UMLMetaClassView", - "_id": "AAAAAAFFwQdYRLfPnZs=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - }, - "subViews": [ - { - "_type": "UMLNameCompartmentView", - "_id": "AAAAAAFFwQdYRLfQc8o=", - "_parent": { - "$ref": "AAAAAAFFwQdYRLfPnZs=" - }, - "model": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - }, - "subViews": [ - { - "_type": "LabelView", - "_id": "AAAAAAFFwQdYRLfRm/U=", - "_parent": { - "$ref": "AAAAAAFFwQdYRLfQc8o=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 45, - "top": 41, - "width": 107, - "height": 12, - "text": "«metaClass»" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQdYRLfSwyU=", - "_parent": { - "$ref": "AAAAAAFFwQdYRLfQc8o=" - }, - "fillColor": "#e2e2e2", - "font": "Arial;12;1", - "containerExtending": true, - "left": 45, - "top": 55, - "width": 107, - "height": 12, - "text": "UMLComponent" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQdYRLfTyV4=", - "_parent": { - "$ref": "AAAAAAFFwQdYRLfQc8o=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -702, - "top": -954, - "width": 143.37890625, - "height": 12, - "text": "(from UMLStandardProfile)" - }, - { - "_type": "LabelView", - "_id": "AAAAAAFFwQdYRLfUafY=", - "_parent": { - "$ref": "AAAAAAFFwQdYRLfQc8o=" - }, - "visible": false, - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": -702, - "top": -954, - "height": 12, - "horizontalAlignment": 1 - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 40, - "top": 36, - "width": 117, - "height": 36, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQdYRLfRm/U=" - }, - "nameLabel": { - "$ref": "AAAAAAFFwQdYRLfSwyU=" - }, - "namespaceLabel": { - "$ref": "AAAAAAFFwQdYRLfTyV4=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQdYRLfUafY=" - } - } - ], - "fillColor": "#e2e2e2", - "font": "Arial;12;0", - "containerExtending": true, - "left": 40, - "top": 36, - "width": 117, - "height": 41, - "nameCompartment": { - "$ref": "AAAAAAFFwQdYRLfQc8o=" - } - }, - { - "_type": "UMLExtensionView", - "_id": "AAAAAAFFwQgwnLf7u0w=", - "_parent": { - "$ref": "AAAAAAFFwQCuI7bLjDk=" - }, - "model": { - "$ref": "AAAAAAFFwQgwnLf6Q+0=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQgwnLf82nE=", - "_parent": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "model": { - "$ref": "AAAAAAFFwQgwnLf6Q+0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 64, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQgwnbf9bFo=", - "_parent": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "model": { - "$ref": "AAAAAAFFwQgwnLf6Q+0=" - }, - "visible": null, - "font": "Arial;12;0", - "containerExtending": true, - "left": 189, - "top": 79, - "height": 12, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "edgePosition": 1 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFFwQgwnbf+ckE=", - "_parent": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "model": { - "$ref": "AAAAAAFFwQgwnLf6Q+0=" - }, - "visible": false, - "font": "Arial;12;0", - "containerExtending": true, - "left": 190, - "top": 34, - "height": 12, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFFwQgwnLf7u0w=" - }, - "edgePosition": 1 - } - ], - "font": "Arial;12;0", - "containerExtending": true, - "head": { - "$ref": "AAAAAAFFwQdYRLfPnZs=" - }, - "tail": { - "$ref": "AAAAAAFFwQHjjbcLQPM=" - }, - "lineStyle": 1, - "points": "223:55;157:55", - "showVisibility": true, - "nameLabel": { - "$ref": "AAAAAAFFwQgwnLf82nE=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFFwQgwnbf9bFo=" - }, - "propertyLabel": { - "$ref": "AAAAAAFFwQgwnbf+ckE=" - } - } - ] - }, - { - "_type": "UMLMetaClass", - "_id": "AAAAAAFFwQHC9rbvUkk=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "UMLModel" - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwQHjjbcJ4Ks=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "BuildComponent", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwQgwnLf6Q+0=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "source": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "target": { - "$ref": "AAAAAAFFwLRECl7r1R4=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwQHjjbcKYjk=", - "_parent": { - "$ref": "AAAAAAFFwQHjjbcJ4Ks=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwQIPLLcykEY=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "Metamodel", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwQLOH7eQuvE=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "source": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "target": { - "$ref": "AAAAAAFFwQHC9rbvUkk=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwQIPLLcz/1A=", - "_parent": { - "$ref": "AAAAAAFFwQIPLLcykEY=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwQIrDLdbTko=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "SystemModel", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwQLSp7eh5o0=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "source": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "target": { - "$ref": "AAAAAAFFwQHC9rbvUkk=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwQIrDLdcjKw=", - "_parent": { - "$ref": "AAAAAAFFwQIrDLdbTko=" - }, - "width": 40, - "height": 40 - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFwx8Q/35u/80=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "control", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFwyAHeH6Znas=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "source": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFwx8Q/35vMf0=", - "_parent": { - "$ref": "AAAAAAFFwx8Q/35u/80=" - }, - "width": 40, - "height": 40, - "content": "var w = rect.getWidth(),\n h = w / 2,\n m = w / 8;\ncanvas.fillEllipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.ellipse(rect.x1 + m, rect.y1 + m, rect.x2 - m, rect.y2 - m);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1);\ncanvas.line(rect.x1 + h, rect.y1 + m, rect.x1 + h + m, rect.y1 + 2 * m);\n" - } - }, - { - "_type": "UMLStereotype", - "_id": "AAAAAAFFw0h1/QXL978=", - "_parent": { - "$ref": "AAAAAAFElnEzslS1AuE=" - }, - "name": "boundary", - "ownedElements": [ - { - "_type": "UMLExtension", - "_id": "AAAAAAFFw0o5ppIUB2s=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "source": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "target": { - "$ref": "AAAAAAFFJsZbpDNobIs=" - } - } - ], - "icon": { - "_type": "UMLImage", - "_id": "AAAAAAFFw0h1/QXM/ss=", - "_parent": { - "$ref": "AAAAAAFFw0h1/QXL978=" - }, - "width": "50", - "height": 40, - "content": "var w = rect.getWidth(),\n h = rect.getHeight(),\n m = w / 5;\ncanvas.fillEllipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.ellipse(rect.x1 + m, rect.y1, rect.x2, rect.y2);\ncanvas.line(rect.x1, rect.y1, rect.x1, rect.y2);\ncanvas.line(rect.x1, rect.y1 + h/2, rect.x1 + m, rect.y1 + h/2);\n" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/ProjectOptions.cmake b/ProjectOptions.cmake deleted file mode 100644 index a093ed98..00000000 --- a/ProjectOptions.cmake +++ /dev/null @@ -1,191 +0,0 @@ -include(cmake/SystemLink.cmake) -include(CMakeDependentOption) -include(CheckCXXCompilerFlag) - - -macro(R_Type_supports_sanitizers) - if((CMAKE_CXX_COMPILER_ID MATCHES ".*Clang.*" OR CMAKE_CXX_COMPILER_ID MATCHES ".*GNU.*") AND NOT WIN32) - set(SUPPORTS_UBSAN ON) - else() - set(SUPPORTS_UBSAN OFF) - endif() - - if((CMAKE_CXX_COMPILER_ID MATCHES ".*Clang.*" OR CMAKE_CXX_COMPILER_ID MATCHES ".*GNU.*") AND WIN32) - set(SUPPORTS_ASAN OFF) - else() - set(SUPPORTS_ASAN ON) - endif() -endmacro() - -macro(R_Type_setup_options) - option(R_Type_ENABLE_HARDENING "Enable hardening" ON) - option(R_Type_ENABLE_COVERAGE "Enable coverage reporting" OFF) - cmake_dependent_option( - R_Type_ENABLE_GLOBAL_HARDENING - "Attempt to push hardening options to built dependencies" - ON - R_Type_ENABLE_HARDENING - OFF) - - R_Type_supports_sanitizers() - - if(NOT PROJECT_IS_TOP_LEVEL OR R_Type_PACKAGING_MAINTAINER_MODE) - option(R_Type_ENABLE_IPO "Enable IPO/LTO" ON) - option(R_Type_WARNINGS_AS_ERRORS "Treat Warnings As Errors" OFF) - option(R_Type_ENABLE_USER_LINKER "Enable user-selected linker" OFF) - option(R_Type_ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_LEAK "Enable leak sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_UNDEFINED "Enable undefined sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_THREAD "Enable thread sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF) - option(R_Type_ENABLE_UNITY_BUILD "Enable unity builds" OFF) - option(R_Type_ENABLE_CLANG_TIDY "Enable clang-tidy" OFF) - option(R_Type_ENABLE_CPPCHECK "Enable cpp-check analysis" OFF) - option(R_Type_ENABLE_PCH "Enable precompiled headers" ON) - option(R_Type_ENABLE_CACHE "Enable ccache" OFF) - else() - option(R_Type_ENABLE_IPO "Enable IPO/LTO" ON) - option(R_Type_WARNINGS_AS_ERRORS "Treat Warnings As Errors" OFF) - option(R_Type_ENABLE_USER_LINKER "Enable user-selected linker" OFF) - option(R_Type_ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" ${SUPPORTS_ASAN}) - option(R_Type_ENABLE_SANITIZER_LEAK "Enable leak sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_UNDEFINED "Enable undefined sanitizer" ${SUPPORTS_UBSAN}) - option(R_Type_ENABLE_SANITIZER_THREAD "Enable thread sanitizer" OFF) - option(R_Type_ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF) - option(R_Type_ENABLE_UNITY_BUILD "Enable unity builds" OFF) - option(R_Type_ENABLE_CLANG_TIDY "Enable clang-tidy" ON) - option(R_Type_ENABLE_CPPCHECK "Enable cpp-check analysis" OFF) - option(R_Type_ENABLE_PCH "Enable precompiled headers" OFF) - option(R_Type_ENABLE_CACHE "Enable ccache" ON) - endif() - - if(NOT PROJECT_IS_TOP_LEVEL) - mark_as_advanced( - R_Type_ENABLE_IPO - R_Type_WARNINGS_AS_ERRORS - R_Type_ENABLE_USER_LINKER - R_Type_ENABLE_SANITIZER_ADDRESS - R_Type_ENABLE_SANITIZER_LEAK - R_Type_ENABLE_SANITIZER_UNDEFINED - R_Type_ENABLE_SANITIZER_THREAD - R_Type_ENABLE_SANITIZER_MEMORY - R_Type_ENABLE_UNITY_BUILD - R_Type_ENABLE_CLANG_TIDY - R_Type_ENABLE_CPPCHECK - R_Type_ENABLE_COVERAGE - R_Type_ENABLE_PCH - R_Type_ENABLE_CACHE) - endif() - -endmacro() - -macro(R_Type_global_options) - if(R_Type_ENABLE_IPO) - include(cmake/InterproceduralOptimization.cmake) - R_Type_enable_ipo() - endif() - - R_Type_supports_sanitizers() - - if(R_Type_ENABLE_HARDENING AND R_Type_ENABLE_GLOBAL_HARDENING) - include(cmake/Hardening.cmake) - if(NOT SUPPORTS_UBSAN - OR R_Type_ENABLE_SANITIZER_UNDEFINED - OR R_Type_ENABLE_SANITIZER_ADDRESS - OR R_Type_ENABLE_SANITIZER_THREAD - OR R_Type_ENABLE_SANITIZER_LEAK) - set(ENABLE_UBSAN_MINIMAL_RUNTIME FALSE) - else() - set(ENABLE_UBSAN_MINIMAL_RUNTIME TRUE) - endif() - message("${R_Type_ENABLE_HARDENING} ${ENABLE_UBSAN_MINIMAL_RUNTIME} ${R_Type_ENABLE_SANITIZER_UNDEFINED}") - R_Type_enable_hardening(R_Type_options ON ${ENABLE_UBSAN_MINIMAL_RUNTIME}) - endif() -endmacro() - -macro(R_Type_local_options) - if(PROJECT_IS_TOP_LEVEL) - include(cmake/StandardProjectSettings.cmake) - endif() - - add_library(R_Type_warnings INTERFACE) - add_library(R_Type_options INTERFACE) - - include(cmake/CompilerWarnings.cmake) - R_Type_set_project_warnings( - R_Type_warnings - ${R_Type_WARNINGS_AS_ERRORS} - "" - "" - "" - "") - - if(R_Type_ENABLE_USER_LINKER) - include(cmake/Linker.cmake) - configure_linker(R_Type_options) - endif() - - include(cmake/Sanitizers.cmake) - R_Type_enable_sanitizers( - R_Type_options - ${R_Type_ENABLE_SANITIZER_ADDRESS} - ${R_Type_ENABLE_SANITIZER_LEAK} - ${R_Type_ENABLE_SANITIZER_UNDEFINED} - ${R_Type_ENABLE_SANITIZER_THREAD} - ${R_Type_ENABLE_SANITIZER_MEMORY}) - - set_target_properties(R_Type_options PROPERTIES UNITY_BUILD ${R_Type_ENABLE_UNITY_BUILD}) - - if(R_Type_ENABLE_PCH) - target_precompile_headers( - R_Type_options - INTERFACE - - - ) - endif() - - if(R_Type_ENABLE_CACHE) - message(WARNINGS "cache") - include(cmake/Cache.cmake) - R_Type_enable_cache() - endif() - - include(cmake/StaticAnalyzers.cmake) - if(R_Type_ENABLE_CLANG_TIDY) - R_Type_enable_clang_tidy(R_Type_options ${R_Type_WARNINGS_AS_ERRORS}) - endif() - - if(R_Type_ENABLE_CPPCHECK) - R_Type_enable_cppcheck(${R_Type_WARNINGS_AS_ERRORS} "" # override cppcheck options - ) - endif() - - if(R_Type_ENABLE_COVERAGE) - include(cmake/Tests.cmake) - R_Type_enable_coverage(R_Type_options) - endif() - - if(R_Type_WARNINGS_AS_ERRORS) - check_cxx_compiler_flag("-Wl,--fatal-warnings" LINKER_FATAL_WARNINGS) - if(LINKER_FATAL_WARNINGS) - # This is not working consistently, so disabling for now - # target_link_options(R_Type_options INTERFACE -Wl,--fatal-warnings) - endif() - endif() - - if(R_Type_ENABLE_HARDENING AND NOT R_Type_ENABLE_GLOBAL_HARDENING) - include(cmake/Hardening.cmake) - if(NOT SUPPORTS_UBSAN - OR R_Type_ENABLE_SANITIZER_UNDEFINED - OR R_Type_ENABLE_SANITIZER_ADDRESS - OR R_Type_ENABLE_SANITIZER_THREAD - OR R_Type_ENABLE_SANITIZER_LEAK) - set(ENABLE_UBSAN_MINIMAL_RUNTIME FALSE) - else() - set(ENABLE_UBSAN_MINIMAL_RUNTIME TRUE) - endif() - R_Type_enable_hardening(R_Type_options OFF ${ENABLE_UBSAN_MINIMAL_RUNTIME}) - endif() - -endmacro() diff --git a/README.md b/README.md index 0b44895e..1b5a1cf0 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,25 @@ git clone git@github.com:UwUClub/R-Type.git cmake -S . -B build && cmake --build build ``` +## Binaries +### Server +First start the server +```bash +./server +``` +### Client +Then start the client +```bash +./client +``` + +### Flappybird +Standalone flappybird game to demonstrate ECS. +```bash +./flappybird +``` + + ## More Details * [Dependency Setup](README_dependencies.md) diff --git a/assets/flappybird/sounds/jump.ogg b/assets/flappybird/sounds/jump.ogg new file mode 100644 index 00000000..76e3a2af Binary files /dev/null and b/assets/flappybird/sounds/jump.ogg differ diff --git a/assets/flappybird/sounds/sardoche.mp3 b/assets/flappybird/sounds/sardoche.mp3 new file mode 100644 index 00000000..53fc1197 Binary files /dev/null and b/assets/flappybird/sounds/sardoche.mp3 differ diff --git a/assets/flappybird/sounds/song.mp3 b/assets/flappybird/sounds/song.mp3 new file mode 100644 index 00000000..e502d145 Binary files /dev/null and b/assets/flappybird/sounds/song.mp3 differ diff --git a/assets/flappybird/sprites/background-day.png b/assets/flappybird/sprites/background-day.png new file mode 100644 index 00000000..afcb5ec9 Binary files /dev/null and b/assets/flappybird/sprites/background-day.png differ diff --git a/assets/flappybird/sprites/bird.png b/assets/flappybird/sprites/bird.png new file mode 100644 index 00000000..f338ce8e Binary files /dev/null and b/assets/flappybird/sprites/bird.png differ diff --git a/assets/flappybird/sprites/ground.png b/assets/flappybird/sprites/ground.png new file mode 100644 index 00000000..c374f2b3 Binary files /dev/null and b/assets/flappybird/sprites/ground.png differ diff --git a/assets/flappybird/sprites/pipe-green-bottom.png b/assets/flappybird/sprites/pipe-green-bottom.png new file mode 100644 index 00000000..46644010 Binary files /dev/null and b/assets/flappybird/sprites/pipe-green-bottom.png differ diff --git a/assets/flappybird/sprites/pipe-green-top.png b/assets/flappybird/sprites/pipe-green-top.png new file mode 100644 index 00000000..2bf35110 Binary files /dev/null and b/assets/flappybird/sprites/pipe-green-top.png differ diff --git a/assets/font.ttf b/assets/font.ttf new file mode 100644 index 00000000..91859945 Binary files /dev/null and b/assets/font.ttf differ diff --git a/assets/sounds/bot_explosion.mp3 b/assets/sounds/bot_explosion.mp3 new file mode 100644 index 00000000..ab19a294 Binary files /dev/null and b/assets/sounds/bot_explosion.mp3 differ diff --git a/assets/sounds/enemy_explosion.mp3 b/assets/sounds/enemy_explosion.mp3 new file mode 100644 index 00000000..45dfe5a0 Binary files /dev/null and b/assets/sounds/enemy_explosion.mp3 differ diff --git a/assets/sounds/pew.mp3 b/assets/sounds/pew.mp3 new file mode 100644 index 00000000..36ed5c52 Binary files /dev/null and b/assets/sounds/pew.mp3 differ diff --git a/assets/sounds/pew.ogg b/assets/sounds/pew.ogg new file mode 100644 index 00000000..cb13754b Binary files /dev/null and b/assets/sounds/pew.ogg differ diff --git a/assets/sounds/rtype.mp3 b/assets/sounds/rtype.mp3 new file mode 100644 index 00000000..b1f454d2 Binary files /dev/null and b/assets/sounds/rtype.mp3 differ diff --git a/assets/sounds/shot.mp3 b/assets/sounds/shot.mp3 new file mode 100644 index 00000000..08a7f8fa Binary files /dev/null and b/assets/sounds/shot.mp3 differ diff --git a/assets/sprites/wall.png b/assets/sprites/wall.png new file mode 100644 index 00000000..22c468c8 Binary files /dev/null and b/assets/sprites/wall.png differ diff --git a/cmake/Cache.cmake b/cmake/Cache.cmake deleted file mode 100644 index d7882036..00000000 --- a/cmake/Cache.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Enable cache if available -function(R_Type_enable_cache) - set(CACHE_OPTION - "ccache" - CACHE STRING "Compiler cache to be used") - set(CACHE_OPTION_VALUES "ccache" "sccache") - set_property(CACHE CACHE_OPTION PROPERTY STRINGS ${CACHE_OPTION_VALUES}) - list( - FIND - CACHE_OPTION_VALUES - ${CACHE_OPTION} - CACHE_OPTION_INDEX) - - if(${CACHE_OPTION_INDEX} EQUAL -1) - message( - STATUS - "Using custom compiler cache system: '${CACHE_OPTION}', explicitly supported entries are ${CACHE_OPTION_VALUES}" - ) - endif() - - find_program(CACHE_BINARY NAMES ${CACHE_OPTION_VALUES}) - if(CACHE_BINARY) - message(STATUS "${CACHE_BINARY} found and enabled") - set(CMAKE_CXX_COMPILER_LAUNCHER - ${CACHE_BINARY} - CACHE FILEPATH "CXX compiler cache used") - set(CMAKE_C_COMPILER_LAUNCHER - ${CACHE_BINARY} - CACHE FILEPATH "C compiler cache used") - else() - message(WARNING "${CACHE_OPTION} is enabled but was not found. Not using it") - endif() -endfunction() diff --git a/cmake/Cuda.cmake b/cmake/Cuda.cmake deleted file mode 100644 index 45b1ab29..00000000 --- a/cmake/Cuda.cmake +++ /dev/null @@ -1,48 +0,0 @@ -# ! target_link_cuda -# A function that links Cuda to the given target -# -# # Example -# add_executable(main_cuda main.cu) -# target_compile_features(main_cuda PRIVATE cxx_std_17) -# target_link_libraries(main_cuda PRIVATE project_options project_warnings) -# target_link_cuda(main_cuda) -# -macro(R_Type_target_link_cuda target) - # optional named CUDA_WARNINGS - set(oneValueArgs CUDA_WARNINGS) - cmake_parse_arguments( - _cuda_args - "" - "${oneValueArgs}" - "" - ${ARGN}) - - # add CUDA to cmake language - enable_language(CUDA) - - # use the same C++ standard if not specified - if("${CMAKE_CUDA_STANDARD}" STREQUAL "") - set(CMAKE_CUDA_STANDARD "${CMAKE_CXX_STANDARD}") - endif() - - # -fPIC - set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON) - - # We need to explicitly state that we need all CUDA files in the - # ${target} library to be built with -dc as the member functions - # could be called by other libraries and executables - set_target_properties(${target} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) - - if(APPLE) - # We need to add the path to the driver (libcuda.dylib) as an rpath, - # so that the static cuda runtime can find it at runtime. - set_property(TARGET ${target} PROPERTY BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES}) - endif() - - if(WIN32 AND "$ENV{VSCMD_VER}" STREQUAL "") - message( - WARNING - "Compiling Cuda on Windows outside the Visual Studio Commant prompt or without running `vcvarsall.bat x64` probably fails" - ) - endif() -endmacro() diff --git a/cmake/Doxygen.cmake b/cmake/Doxygen.cmake deleted file mode 100644 index ebbea9f1..00000000 --- a/cmake/Doxygen.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# Enable doxygen doc builds of source -function(R_Type_enable_doxygen DOXYGEN_THEME) - # If not specified, use the top readme file as the first page - if((NOT DOXYGEN_USE_MDFILE_AS_MAINPAGE) AND EXISTS "${PROJECT_SOURCE_DIR}/README.md") - set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${PROJECT_SOURCE_DIR}/README.md") - endif() - - # set better defaults for doxygen - is_verbose(_is_verbose) - if(NOT ${_is_verbose}) - set(DOXYGEN_QUIET YES) - endif() - set(DOXYGEN_CALLER_GRAPH YES) - set(DOXYGEN_CALL_GRAPH YES) - set(DOXYGEN_EXTRACT_ALL YES) - set(DOXYGEN_GENERATE_TREEVIEW YES) - # svg files are much smaller than jpeg and png, and yet they have higher quality - set(DOXYGEN_DOT_IMAGE_FORMAT svg) - set(DOXYGEN_DOT_TRANSPARENT YES) - - # If not specified, exclude the vcpkg files and the files CMake downloads under _deps (like project_options) - if(NOT DOXYGEN_EXCLUDE_PATTERNS) - set(DOXYGEN_EXCLUDE_PATTERNS "${CMAKE_CURRENT_BINARY_DIR}/vcpkg_installed/*" "${CMAKE_CURRENT_BINARY_DIR}/_deps/*") - endif() - - if("${DOXYGEN_THEME}" STREQUAL "") - set(DOXYGEN_THEME "awesome-sidebar") - endif() - - if("${DOXYGEN_THEME}" STREQUAL "awesome" OR "${DOXYGEN_THEME}" STREQUAL "awesome-sidebar") - # use a modern doxygen theme - # https://github.com/jothepro/doxygen-awesome-css v1.6.1 - FetchContent_Declare(_doxygen_theme - URL https://github.com/jothepro/doxygen-awesome-css/archive/refs/tags/v1.6.1.zip) - FetchContent_MakeAvailable(_doxygen_theme) - if("${DOXYGEN_THEME}" STREQUAL "awesome" OR "${DOXYGEN_THEME}" STREQUAL "awesome-sidebar") - set(DOXYGEN_HTML_EXTRA_STYLESHEET "${_doxygen_theme_SOURCE_DIR}/doxygen-awesome.css") - endif() - if("${DOXYGEN_THEME}" STREQUAL "awesome-sidebar") - set(DOXYGEN_HTML_EXTRA_STYLESHEET ${DOXYGEN_HTML_EXTRA_STYLESHEET} - "${_doxygen_theme_SOURCE_DIR}/doxygen-awesome-sidebar-only.css") - endif() - else() - # use the original doxygen theme - endif() - - # find doxygen and dot if available - find_package(Doxygen REQUIRED OPTIONAL_COMPONENTS dot) - - # add doxygen-docs target - message(STATUS "Adding `doxygen-docs` target that builds the documentation.") - doxygen_add_docs(doxygen-docs ALL ${PROJECT_SOURCE_DIR} - COMMENT "Generating documentation - entry file: ${CMAKE_CURRENT_BINARY_DIR}/html/index.html") -endfunction() diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake deleted file mode 100644 index 676e67ab..00000000 --- a/cmake/FindSDL2.cmake +++ /dev/null @@ -1,200 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#.rst: -# FindSDL2 -# ------- -# -# Locate SDL2 library -# -# This module defines -# -# :: -# -# SDL2_LIBRARY, the name of the library to link against -# SDL2_FOUND, if false, do not try to link to SDL -# SDL2_INCLUDE_DIR, where to find SDL.h -# SDL2_VERSION_STRING, human-readable string containing the version of SDL -# -# -# -# This module responds to the flag: -# -# :: -# -# SDL2_BUILDING_LIBRARY -# If this is defined, then no SDL2_main will be linked in because -# only applications need main(). -# Otherwise, it is assumed you are building an application and this -# module will attempt to locate and set the proper link flags -# as part of the returned SDL2_LIBRARY variable. -# -# -# -# Don't forget to include SDLmain.h and SDLmain.m your project for the -# OS X framework based version. (Other versions link to -lSDLmain which -# this module will try to find on your behalf.) Also for OS X, this -# module will automatically add the -framework Cocoa on your behalf. -# -# -# -# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your -# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL -# library (SDL.dll, libsdl.so, SDL.framework, etc). Set -# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again. -# Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this -# value as appropriate. These values are used to generate the final -# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY -# does not get created. -# -# -# -# $SDL2DIR is an environment variable that would correspond to the -# ./configure --prefix=$SDL2DIR used in building SDL. l.e.galup 9-20-02 -# -# Modified by Eric Wing. Added code to assist with automated building -# by using environmental variables and providing a more -# controlled/consistent search behavior. Added new modifications to -# recognize OS X frameworks and additional Unix paths (FreeBSD, etc). -# Also corrected the header search path to follow "proper" SDL -# guidelines. Added a search for SDLmain which is needed by some -# platforms. Added a search for threads which is needed by some -# platforms. Added needed compile switches for MinGW. -# -# On OSX, this will prefer the Framework version (if found) over others. -# People will have to manually change the cache values of SDL2_LIBRARY to -# override this selection or set the CMake environment -# CMAKE_INCLUDE_PATH to modify the search paths. -# -# Note that the header path has changed from SDL/SDL.h to just SDL.h -# This needed to change because "proper" SDL convention is #include -# "SDL.h", not . This is done for portability reasons -# because not all systems place things in SDL/ (see FreeBSD). - -if(NOT SDL2_DIR) - set(SDL2_DIR "" CACHE PATH "SDL2 directory") -endif() - -find_path(SDL2_INCLUDE_DIR SDL.h - HINTS - ENV SDL2DIR - ${SDL2_DIR} - PATH_SUFFIXES SDL2 - # path suffixes to search inside ENV{SDL2DIR} - include/SDL2 include -) - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(VC_LIB_PATH_SUFFIX lib/x64) -else() - set(VC_LIB_PATH_SUFFIX lib/x86) -endif() - -find_library(SDL2_LIBRARY_TEMP - NAMES SDL2 - HINTS - ENV SDL2DIR - ${SDL2_DIR} - PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} -) - -# Hide this cache variable from the user, it's an internal implementation -# detail. The documented library variable for the user is SDL2_LIBRARY -# which is derived from SDL2_LIBRARY_TEMP further below. -set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL) - -if(NOT SDL2_BUILDING_LIBRARY) - if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") - # Non-OS X framework versions expect you to also dynamically link to - # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms - # seem to provide SDLmain for compatibility even though they don't - # necessarily need it. - find_library(SDL2MAIN_LIBRARY - NAMES SDL2main - HINTS - ENV SDL2DIR - ${SDL2_DIR} - PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} - PATHS - /sw - /opt/local - /opt/csw - /opt - ) - endif() -endif() - -# SDL may require threads on your system. -# The Apple build may not need an explicit flag because one of the -# frameworks may already provide it. -# But for non-OSX systems, I will use the CMake Threads package. -if(NOT APPLE) - find_package(Threads) -endif() - -# MinGW needs an additional link flag, -mwindows -# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows -if(MINGW) - set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") -endif() - -if(SDL2_LIBRARY_TEMP) - # For SDLmain - if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) - list(FIND SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL2_MAIN_INDEX) - if(_SDL2_MAIN_INDEX EQUAL -1) - set(SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP}) - endif() - unset(_SDL2_MAIN_INDEX) - endif() - - # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. - # CMake doesn't display the -framework Cocoa string in the UI even - # though it actually is there if I modify a pre-used variable. - # I think it has something to do with the CACHE STRING. - # So I use a temporary variable until the end so I can set the - # "real" variable in one-shot. - if(APPLE) - set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") - endif() - - # For threads, as mentioned Apple doesn't need this. - # In fact, there seems to be a problem if I used the Threads package - # and try using this line, so I'm just skipping it entirely for OS X. - if(NOT APPLE) - set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) - endif() - - # For MinGW library - if(MINGW) - set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) - endif() - - # Set the final string here so the GUI reflects the final state. - set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") -endif() - -if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") - set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) - unset(SDL2_VERSION_MAJOR_LINE) - unset(SDL2_VERSION_MINOR_LINE) - unset(SDL2_VERSION_PATCH_LINE) - unset(SDL2_VERSION_MAJOR) - unset(SDL2_VERSION_MINOR) - unset(SDL2_VERSION_PATCH) -endif() - -set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2MAIN_LIBRARY}) -set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR}) - -include(FindPackageHandleStandardArgs) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL - REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR - VERSION_VAR SDL2_VERSION_STRING) diff --git a/cmake/Hardening.cmake b/cmake/Hardening.cmake deleted file mode 100644 index 02dc432e..00000000 --- a/cmake/Hardening.cmake +++ /dev/null @@ -1,100 +0,0 @@ -include(CheckCXXCompilerFlag) - -macro( - R_Type_enable_hardening - target - global - ubsan_minimal_runtime) - - message(STATUS "** Enabling Hardening (Target ${target}) **") - - if(MSVC) - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} /sdl /DYNAMICBASE /guard:cf") - message(STATUS "*** MSVC flags: /sdl /DYNAMICBASE /guard:cf /NXCOMPAT /CETCOMPAT") - set(NEW_LINK_OPTIONS "${NEW_LINK_OPTIONS} /NXCOMPAT /CETCOMPAT") - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - add_compile_options(/wd4005) - - elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang|GNU") - set(NEW_CXX_DEFINITIONS "${NEW_CXX_DEFINITIONS} -D_GLIBCXX_ASSERTIONS") - message(STATUS "*** GLIBC++ Assertions (vector[], string[], ...) enabled") - - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3") - message(STATUS "*** g++/clang _FORTIFY_SOURCE=3 enabled") - - # check_cxx_compiler_flag(-fpie PIE) - #if(PIE) - # set(NEW_COMPILE_OPTIONS ${NEW_COMPILE_OPTIONS} -fpie) - # set(NEW_LINK_OPTIONS ${NEW_LINK_OPTIONS} -pie) - # - # message(STATUS "*** g++/clang PIE mode enabled") - #else() - # message(STATUS "*** g++/clang PIE mode NOT enabled (not supported)") - #endif() - - check_cxx_compiler_flag(-fstack-protector-strong STACK_PROTECTOR) - if(STACK_PROTECTOR) - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -fstack-protector-strong") - message(STATUS "*** g++/clang -fstack-protector-strong enabled") - else() - message(STATUS "*** g++/clang -fstack-protector-strong NOT enabled (not supported)") - endif() - - check_cxx_compiler_flag(-fcf-protection CF_PROTECTION) - if(CF_PROTECTION) - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -fcf-protection") - message(STATUS "*** g++/clang -fcf-protection enabled") - else() - message(STATUS "*** g++/clang -fcf-protection NOT enabled (not supported)") - endif() - - check_cxx_compiler_flag(-fstack-clash-protection CLASH_PROTECTION) - if(CLASH_PROTECTION) - if(LINUX OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -fstack-clash-protection") - message(STATUS "*** g++/clang -fstack-clash-protection enabled") - else() - message(STATUS "*** g++/clang -fstack-clash-protection NOT enabled (clang on non-Linux)") - endif() - else() - message(STATUS "*** g++/clang -fstack-clash-protection NOT enabled (not supported)") - endif() - endif() - - if(${ubsan_minimal_runtime}) - check_cxx_compiler_flag("-fsanitize=undefined -fno-sanitize-recover=undefined -fsanitize-minimal-runtime" - MINIMAL_RUNTIME) - if(MINIMAL_RUNTIME) - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -fsanitize=undefined -fsanitize-minimal-runtime") - set(NEW_LINK_OPTIONS "${NEW_LINK_OPTIONS} -fsanitize=undefined -fsanitize-minimal-runtime") - - if(NOT ${global}) - set(NEW_COMPILE_OPTIONS "${NEW_COMPILE_OPTIONS} -fno-sanitize-recover=undefined") - set(NEW_LINK_OPTIONS "${NEW_LINK_OPTIONS} -fno-sanitize-recover=undefined") - else() - message(STATUS "** not enabling -fno-sanitize-recover=undefined for global consumption") - endif() - - message(STATUS "*** ubsan minimal runtime enabled") - else() - message(STATUS "*** ubsan minimal runtime NOT enabled (not supported)") - endif() - else() - message(STATUS "*** ubsan minimal runtime NOT enabled (not requested)") - endif() - - message(STATUS "** Hardening Compiler Flags: ${NEW_COMPILE_OPTIONS}") - message(STATUS "** Hardening Linker Flags: ${NEW_LINK_OPTIONS}") - message(STATUS "** Hardening Compiler Defines: ${NEW_CXX_DEFINITIONS}") - - if(${global}) - message(STATUS "** Setting hardening options globally for all dependencies") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${NEW_COMPILE_OPTIONS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${NEW_LINK_OPTIONS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${NEW_CXX_DEFINITIONS}") - else() - target_compile_options(${target} INTERFACE ${NEW_COMPILE_OPTIONS}) - target_link_options(${target} INTERFACE ${NEW_LINK_OPTIONS}) - target_compile_definitions(${target} INTERFACE ${NEW_CXX_DEFINITIONS}) - endif() -endmacro() diff --git a/cmake/InterproceduralOptimization.cmake b/cmake/InterproceduralOptimization.cmake deleted file mode 100644 index 113d0f0d..00000000 --- a/cmake/InterproceduralOptimization.cmake +++ /dev/null @@ -1,9 +0,0 @@ -macro(R_Type_enable_ipo) - include(CheckIPOSupported) - check_ipo_supported(RESULT result OUTPUT output) - if(result) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) - else() - message(SEND_ERROR "IPO is not supported: ${output}") - endif() -endmacro() diff --git a/cmake/Linker.cmake b/cmake/Linker.cmake deleted file mode 100644 index f6a102b3..00000000 --- a/cmake/Linker.cmake +++ /dev/null @@ -1,31 +0,0 @@ -macro(R_Type_configure_linker project_name) - include(CheckCXXCompilerFlag) - - set(USER_LINKER_OPTION - "lld" - CACHE STRING "Linker to be used") - set(USER_LINKER_OPTION_VALUES "lld" "gold" "bfd" "mold") - set_property(CACHE USER_LINKER_OPTION PROPERTY STRINGS ${USER_LINKER_OPTION_VALUES}) - list( - FIND - USER_LINKER_OPTION_VALUES - ${USER_LINKER_OPTION} - USER_LINKER_OPTION_INDEX) - - if(${USER_LINKER_OPTION_INDEX} EQUAL -1) - message( - STATUS - "Using custom linker: '${USER_LINKER_OPTION}', explicitly supported entries are ${USER_LINKER_OPTION_VALUES}") - endif() - - if(NOT ENABLE_USER_LINKER) - return() - endif() - - set(LINKER_FLAG "-fuse-ld=${USER_LINKER_OPTION}") - - check_cxx_compiler_flag(${LINKER_FLAG} CXX_SUPPORTS_USER_LINKER) - if(CXX_SUPPORTS_USER_LINKER) - target_compile_options(${project_name} INTERFACE ${LINKER_FLAG}) - endif() -endmacro() diff --git a/cmake/PackageProject.cmake b/cmake/PackageProject.cmake deleted file mode 100644 index 8c9bb357..00000000 --- a/cmake/PackageProject.cmake +++ /dev/null @@ -1,190 +0,0 @@ -# Uses ycm (permissive BSD-3-Clause license) and ForwardArguments (permissive MIT license) - -function(R_Type_package_project) - cmake_policy(SET CMP0103 NEW) # disallow multiple calls with the same NAME - - set(_options ARCH_INDEPENDENT # default to false - ) - set(_oneValueArgs - # default to the project_name: - NAME - COMPONENT - # default to project version: - VERSION - # default to semver - COMPATIBILITY - # default to ${CMAKE_BINARY_DIR} - CONFIG_EXPORT_DESTINATION - # default to ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/${NAME} suitable for vcpkg, etc. - CONFIG_INSTALL_DESTINATION) - set(_multiValueArgs - # recursively found for the current folder if not specified - TARGETS - # a list of public/interface include directories or files - PUBLIC_INCLUDES - # the names of the INTERFACE/PUBLIC dependencies that are found using `CONFIG` - PUBLIC_DEPENDENCIES_CONFIGURED - # the INTERFACE/PUBLIC dependencies that are found by any means using `find_dependency`. - # the arguments must be specified within double quotes (e.g. " 1.0.0 EXACT" or " CONFIG"). - PUBLIC_DEPENDENCIES - # the names of the PRIVATE dependencies that are found using `CONFIG`. Only included when BUILD_SHARED_LIBS is OFF. - PRIVATE_DEPENDENCIES_CONFIGURED - # PRIVATE dependencies that are only included when BUILD_SHARED_LIBS is OFF - PRIVATE_DEPENDENCIES) - - cmake_parse_arguments( - _PackageProject - "${_options}" - "${_oneValueArgs}" - "${_multiValueArgs}" - "${ARGN}") - - # Set default options - include(GNUInstallDirs) # Define GNU standard installation directories such as CMAKE_INSTALL_DATADIR - - # set default packaged targets - if(NOT _PackageProject_TARGETS) - get_all_installable_targets(_PackageProject_TARGETS) - message(STATUS "package_project: considering ${_PackageProject_TARGETS} as the exported targets") - endif() - - # default to the name of the project or the given name - if("${_PackageProject_NAME}" STREQUAL "") - set(_PackageProject_NAME ${PROJECT_NAME}) - endif() - # ycm args - set(_PackageProject_NAMESPACE "${_PackageProject_NAME}::") - set(_PackageProject_VARS_PREFIX ${_PackageProject_NAME}) - set(_PackageProject_EXPORT ${_PackageProject_NAME}) - - # default version to the project version - if("${_PackageProject_VERSION}" STREQUAL "") - set(_PackageProject_VERSION ${PROJECT_VERSION}) - endif() - - # default compatibility to SameMajorVersion - if("${_PackageProject_COMPATIBILITY}" STREQUAL "") - set(_PackageProject_COMPATIBILITY "SameMajorVersion") - endif() - - # default to the build directory - if("${_PackageProject_CONFIG_EXPORT_DESTINATION}" STREQUAL "") - set(_PackageProject_CONFIG_EXPORT_DESTINATION "${CMAKE_BINARY_DIR}") - endif() - set(_PackageProject_EXPORT_DESTINATION "${_PackageProject_CONFIG_EXPORT_DESTINATION}") - - # use datadir (works better with vcpkg, etc) - if("${_PackageProject_CONFIG_INSTALL_DESTINATION}" STREQUAL "") - set(_PackageProject_CONFIG_INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/${_PackageProject_NAME}") - endif() - # ycm args - set(_PackageProject_INSTALL_DESTINATION "${_PackageProject_CONFIG_INSTALL_DESTINATION}") - - # Installation of the public/interface includes - if(NOT - "${_PackageProject_PUBLIC_INCLUDES}" - STREQUAL - "") - foreach(_INC ${_PackageProject_PUBLIC_INCLUDES}) - # make include absolute - if(NOT IS_ABSOLUTE ${_INC}) - set(_INC "${CMAKE_CURRENT_SOURCE_DIR}/${_INC}") - endif() - # install include - if(IS_DIRECTORY ${_INC}) - # the include directories are directly installed to the install destination. If you want an `include` folder in the install destination, name your include directory as `include` (or install it manually using `install()` command). - install(DIRECTORY ${_INC} DESTINATION "./") - else() - install(FILES ${_INC} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - endif() - endforeach() - endif() - - # Append the configured public dependencies - if(NOT - "${_PackageProject_PUBLIC_DEPENDENCIES_CONFIGURED}" - STREQUAL - "") - set(_PUBLIC_DEPENDENCIES_CONFIG) - foreach(DEP ${_PackageProject_PUBLIC_DEPENDENCIES_CONFIGURED}) - list(APPEND _PUBLIC_DEPENDENCIES_CONFIG "${DEP} CONFIG") - endforeach() - endif() - list(APPEND _PackageProject_PUBLIC_DEPENDENCIES ${_PUBLIC_DEPENDENCIES_CONFIG}) - # ycm arg - set(_PackageProject_DEPENDENCIES ${_PackageProject_PUBLIC_DEPENDENCIES}) - - # Append the configured private dependencies - if(NOT - "${_PackageProject_PRIVATE_DEPENDENCIES_CONFIGURED}" - STREQUAL - "") - set(_PRIVATE_DEPENDENCIES_CONFIG) - foreach(DEP ${_PackageProject_PRIVATE_DEPENDENCIES_CONFIGURED}) - list(APPEND _PRIVATE_DEPENDENCIES_CONFIG "${DEP} CONFIG") - endforeach() - endif() - # ycm arg - list(APPEND _PackageProject_PRIVATE_DEPENDENCIES ${_PRIVATE_DEPENDENCIES_CONFIG}) - - # Installation of package (compatible with vcpkg, etc) - install( - TARGETS ${_PackageProject_TARGETS} - EXPORT ${_PackageProject_EXPORT} - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_PackageProject_NAME}" COMPONENT dev) - - # install the usage file - set(_targets_str "") - foreach(_target ${_PackageProject_TARGETS}) - set(_targets_str "${_targets_str} ${_PackageProject_NAMESPACE}${_target}") - endforeach() - set(USAGE_FILE_CONTENT - "The package ${_PackageProject_NAME} provides CMake targets: - - find_package(${_PackageProject_NAME} CONFIG REQUIRED) - target_link_libraries(main PRIVATE ${_targets_str}) - ") - install(CODE "MESSAGE(STATUS \"${USAGE_FILE_CONTENT}\")") - file(WRITE "${_PackageProject_EXPORT_DESTINATION}/usage" "${USAGE_FILE_CONTENT}") - install(FILES "${_PackageProject_EXPORT_DESTINATION}/usage" - DESTINATION "${_PackageProject_CONFIG_INSTALL_DESTINATION}") - - unset(_PackageProject_TARGETS) - - # download ForwardArguments - FetchContent_Declare( - _fargs - URL https://github.com/polysquare/cmake-forward-arguments/archive/8c50d1f956172edb34e95efa52a2d5cb1f686ed2.zip) - FetchContent_GetProperties(_fargs) - if(NOT _fargs_POPULATED) - FetchContent_Populate(_fargs) - endif() - include("${_fargs_SOURCE_DIR}/ForwardArguments.cmake") - - # prepare the forward arguments for ycm - set(_FARGS_LIST) - cmake_forward_arguments( - _PackageProject - _FARGS_LIST - OPTION_ARGS - "${_options};" - SINGLEVAR_ARGS - "${_oneValueArgs};EXPORT_DESTINATION;INSTALL_DESTINATION;NAMESPACE;VARS_PREFIX;EXPORT" - MULTIVAR_ARGS - "${_multiValueArgs};DEPENDENCIES;PRIVATE_DEPENDENCIES") - - # download ycm - FetchContent_Declare(_ycm URL https://github.com/robotology/ycm/archive/refs/tags/v0.13.0.zip) - FetchContent_GetProperties(_ycm) - if(NOT _ycm_POPULATED) - FetchContent_Populate(_ycm) - endif() - include("${_ycm_SOURCE_DIR}/modules/InstallBasicPackageFiles.cmake") - - install_basic_package_files(${_PackageProject_NAME} "${_FARGS_LIST}") - - include("${_ycm_SOURCE_DIR}/modules/AddUninstallTarget.cmake") -endfunction() diff --git a/cmake/PreventInSourceBuilds.cmake b/cmake/PreventInSourceBuilds.cmake deleted file mode 100644 index cc588357..00000000 --- a/cmake/PreventInSourceBuilds.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# -# This function will prevent in-source builds -# -function(R_Type_assure_out_of_source_builds) - # make sure the user doesn't play dirty with symlinks - get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) - get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH) - - # disallow in-source builds - if("${srcdir}" STREQUAL "${bindir}") - message("######################################################") - message("Warning: in-source builds are disabled") - message("Please create a separate build directory and run cmake from there") - message("######################################################") - message(FATAL_ERROR "Quitting configuration") - endif() -endfunction() - -R_Type_assure_out_of_source_builds() diff --git a/cmake/Sanitizers.cmake b/cmake/Sanitizers.cmake deleted file mode 100644 index 30f3f83b..00000000 --- a/cmake/Sanitizers.cmake +++ /dev/null @@ -1,90 +0,0 @@ -function( - R_Type_enable_sanitizers - project_name - ENABLE_SANITIZER_ADDRESS - ENABLE_SANITIZER_LEAK - ENABLE_SANITIZER_UNDEFINED_BEHAVIOR - ENABLE_SANITIZER_THREAD - ENABLE_SANITIZER_MEMORY) - - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") - set(SANITIZERS "") - - if(${ENABLE_SANITIZER_ADDRESS}) - list(APPEND SANITIZERS "address") - endif() - - if(${ENABLE_SANITIZER_LEAK}) - list(APPEND SANITIZERS "leak") - endif() - - if(${ENABLE_SANITIZER_UNDEFINED_BEHAVIOR}) - list(APPEND SANITIZERS "undefined") - endif() - - if(${ENABLE_SANITIZER_THREAD}) - if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS) - message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled") - else() - list(APPEND SANITIZERS "thread") - endif() - endif() - - if(${ENABLE_SANITIZER_MEMORY} AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") - message( - WARNING - "Memory sanitizer requires all the code (including libc++) to be MSan-instrumented otherwise it reports false positives" - ) - if("address" IN_LIST SANITIZERS - OR "thread" IN_LIST SANITIZERS - OR "leak" IN_LIST SANITIZERS) - message(WARNING "Memory sanitizer does not work with Address, Thread or Leak sanitizer enabled") - else() - list(APPEND SANITIZERS "memory") - endif() - endif() - elseif(MSVC) - if(${ENABLE_SANITIZER_ADDRESS}) - list(APPEND SANITIZERS "address") - endif() - if(${ENABLE_SANITIZER_LEAK} - OR ${ENABLE_SANITIZER_UNDEFINED_BEHAVIOR} - OR ${ENABLE_SANITIZER_THREAD} - OR ${ENABLE_SANITIZER_MEMORY}) - message(WARNING "MSVC only supports address sanitizer") - endif() - endif() - - list( - JOIN - SANITIZERS - "," - LIST_OF_SANITIZERS) - - if(LIST_OF_SANITIZERS) - if(NOT - "${LIST_OF_SANITIZERS}" - STREQUAL - "") - if(NOT MSVC) - target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) - target_link_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) - else() - string(FIND "$ENV{PATH}" "$ENV{VSINSTALLDIR}" index_of_vs_install_dir) - if("${index_of_vs_install_dir}" STREQUAL "-1") - message( - SEND_ERROR - "Using MSVC sanitizers requires setting the MSVC environment before building the project. Please manually open the MSVC command prompt and rebuild the project." - ) - endif() - target_compile_options(${project_name} INTERFACE /fsanitize=${LIST_OF_SANITIZERS} /Zi /INCREMENTAL:NO) - target_compile_definitions(${project_name} INTERFACE _DISABLE_VECTOR_ANNOTATION _DISABLE_STRING_ANNOTATION) - target_link_options(${project_name} INTERFACE /INCREMENTAL:NO) - endif() - endif() - endif() - -endfunction() - - - diff --git a/cmake/StandardProjectSettings.cmake b/cmake/StandardProjectSettings.cmake index b9f4123e..5e4f4025 100644 --- a/cmake/StandardProjectSettings.cmake +++ b/cmake/StandardProjectSettings.cmake @@ -38,8 +38,3 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND MSVC_VERSION GREATER 1900) else() message(STATUS "No colored compiler diagnostic set for '${CMAKE_CXX_COMPILER_ID}' compiler.") endif() - - -# run vcvarsall when msvc is used -include("${CMAKE_CURRENT_LIST_DIR}/VCEnvironment.cmake") -run_vcvarsall() diff --git a/cmake/StaticAnalyzers.cmake b/cmake/StaticAnalyzers.cmake deleted file mode 100644 index 416be2a7..00000000 --- a/cmake/StaticAnalyzers.cmake +++ /dev/null @@ -1,109 +0,0 @@ -macro(R_Type_enable_cppcheck WARNINGS_AS_ERRORS CPPCHECK_OPTIONS) - find_program(CPPCHECK cppcheck) - if(CPPCHECK) - - if(CMAKE_GENERATOR MATCHES ".*Visual Studio.*") - set(CPPCHECK_TEMPLATE "vs") - else() - set(CPPCHECK_TEMPLATE "gcc") - endif() - - if("${CPPCHECK_OPTIONS}" STREQUAL "") - # Enable all warnings that are actionable by the user of this toolset - # style should enable the other 3, but we'll be explicit just in case - set(CMAKE_CXX_CPPCHECK - ${CPPCHECK} - --template=${CPPCHECK_TEMPLATE} - --enable=style,performance,warning,portability - --inline-suppr - # We cannot act on a bug/missing feature of cppcheck - --suppress=cppcheckError - --suppress=internalAstError - # if a file does not have an internalAstError, we get an unmatchedSuppression error - --suppress=unmatchedSuppression - # noisy and incorrect sometimes - --suppress=passedByValue - # ignores code that cppcheck thinks is invalid C++ - --suppress=syntaxError - --suppress=preprocessorErrorDirective - --inconclusive) - else() - # if the user provides a CPPCHECK_OPTIONS with a template specified, it will override this template - set(CMAKE_CXX_CPPCHECK ${CPPCHECK} --template=${CPPCHECK_TEMPLATE} ${CPPCHECK_OPTIONS}) - endif() - - if(NOT - "${CMAKE_CXX_STANDARD}" - STREQUAL - "") - set(CMAKE_CXX_CPPCHECK ${CMAKE_CXX_CPPCHECK} --std=c++${CMAKE_CXX_STANDARD}) - endif() - if(${WARNINGS_AS_ERRORS}) - list(APPEND CMAKE_CXX_CPPCHECK --error-exitcode=2) - endif() - else() - message(${WARNING_MESSAGE} "cppcheck requested but executable not found") - endif() -endmacro() - -macro(R_Type_enable_clang_tidy target WARNINGS_AS_ERRORS) - - find_program(CLANGTIDY clang-tidy) - if(CLANGTIDY) - if(NOT - CMAKE_CXX_COMPILER_ID - MATCHES - ".*Clang") - - get_target_property(TARGET_PCH ${target} INTERFACE_PRECOMPILE_HEADERS) - - if("${TARGET_PCH}" STREQUAL "TARGET_PCH-NOTFOUND") - get_target_property(TARGET_PCH ${target} PRECOMPILE_HEADERS) - endif() - - if(NOT ("${TARGET_PCH}" STREQUAL "TARGET_PCH-NOTFOUND")) - message( - SEND_ERROR - "clang-tidy cannot be enabled with non-clang compiler and PCH, clang-tidy fails to handle gcc's PCH file") - endif() - endif() - - # construct the clang-tidy command line - set(CLANG_TIDY_OPTIONS - ${CLANGTIDY} - -extra-arg=-Wno-unknown-warning-option - -extra-arg=-Wno-ignored-optimization-argument - -extra-arg=-Wno-unused-command-line-argument - -p) - # set standard - if(NOT - "${CMAKE_CXX_STANDARD}" - STREQUAL - "") - if("${CLANG_TIDY_OPTIONS_DRIVER_MODE}" STREQUAL "cl") - set(CLANG_TIDY_OPTIONS ${CLANG_TIDY_OPTIONS} -extra-arg=/std:c++${CMAKE_CXX_STANDARD}) - else() - set(CLANG_TIDY_OPTIONS ${CLANG_TIDY_OPTIONS} -extra-arg=-std=c++${CMAKE_CXX_STANDARD}) - endif() - endif() - - # set warnings as errors - if(${WARNINGS_AS_ERRORS}) - list(APPEND CLANG_TIDY_OPTIONS -warnings-as-errors=*) - endif() - - message("Also setting clang-tidy globally") - set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_OPTIONS}) - else() - message(${WARNING_MESSAGE} "clang-tidy requested but executable not found") - endif() -endmacro() - -macro(R_Type_enable_include_what_you_use) - find_program(INCLUDE_WHAT_YOU_USE include-what-you-use) - if(INCLUDE_WHAT_YOU_USE) - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE}) - else() - message(${WARNING_MESSAGE} "include-what-you-use requested but executable not found") - endif() -endmacro() diff --git a/cmake/SystemLink.cmake b/cmake/SystemLink.cmake deleted file mode 100644 index 000a9ad1..00000000 --- a/cmake/SystemLink.cmake +++ /dev/null @@ -1,83 +0,0 @@ -# Include a system directory (which suppresses its warnings). -function(target_include_system_directories target) - set(multiValueArgs INTERFACE PUBLIC PRIVATE) - cmake_parse_arguments( - ARG - "" - "" - "${multiValueArgs}" - ${ARGN}) - - foreach(scope IN ITEMS INTERFACE PUBLIC PRIVATE) - foreach(lib_include_dirs IN LISTS ARG_${scope}) - if(NOT MSVC) - # system includes do not work in MSVC - # awaiting https://gitlab.kitware.com/cmake/cmake/-/issues/18272# - # awaiting https://gitlab.kitware.com/cmake/cmake/-/issues/17904 - set(_SYSTEM SYSTEM) - endif() - if(${scope} STREQUAL "INTERFACE" OR ${scope} STREQUAL "PUBLIC") - target_include_directories( - ${target} - ${_SYSTEM} - ${scope} - "$" - "$") - else() - target_include_directories( - ${target} - ${_SYSTEM} - ${scope} - ${lib_include_dirs}) - endif() - endforeach() - endforeach() - -endfunction() - -# Include the directories of a library target as system directories (which suppresses their warnings). -function( - target_include_system_library - target - scope - lib) - # check if this is a target - if(TARGET ${lib}) - get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES) - if(lib_include_dirs) - target_include_system_directories(${target} ${scope} ${lib_include_dirs}) - else() - message(TRACE "${lib} library does not have the INTERFACE_INCLUDE_DIRECTORIES property.") - endif() - endif() -endfunction() - -# Link a library target as a system library (which suppresses its warnings). -function( - target_link_system_library - target - scope - lib) - # Include the directories in the library - target_include_system_library(${target} ${scope} ${lib}) - - # Link the library - target_link_libraries(${target} ${scope} ${lib}) -endfunction() - -# Link multiple library targets as system libraries (which suppresses their warnings). -function(target_link_system_libraries target) - set(multiValueArgs INTERFACE PUBLIC PRIVATE) - cmake_parse_arguments( - ARG - "" - "" - "${multiValueArgs}" - ${ARGN}) - - foreach(scope IN ITEMS INTERFACE PUBLIC PRIVATE) - foreach(lib IN LISTS ARG_${scope}) - target_link_system_library(${target} ${scope} ${lib}) - endforeach() - endforeach() -endfunction() diff --git a/cmake/Tests.cmake b/cmake/Tests.cmake deleted file mode 100644 index f57d7ace..00000000 --- a/cmake/Tests.cmake +++ /dev/null @@ -1,6 +0,0 @@ -function(R_Type_enable_coverage project_name) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") - target_compile_options(${project_name} INTERFACE --coverage -O0 -g) - target_link_libraries(${project_name} INTERFACE --coverage) - endif() -endfunction() diff --git a/cmake/VCEnvironment.cmake b/cmake/VCEnvironment.cmake deleted file mode 100644 index a95cb467..00000000 --- a/cmake/VCEnvironment.cmake +++ /dev/null @@ -1,71 +0,0 @@ -include("${CMAKE_CURRENT_LIST_DIR}/Utilities.cmake") - -macro(detect_architecture) - # detect the architecture - string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" CMAKE_SYSTEM_PROCESSOR_LOWER) - if(CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL x86 OR CMAKE_SYSTEM_PROCESSOR_LOWER MATCHES "^i[3456]86$") - set(VCVARSALL_ARCH x86) - elseif( - CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL x64 - OR CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL x86_64 - OR CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL amd64) - set(VCVARSALL_ARCH x64) - elseif(CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL arm) - set(VCVARSALL_ARCH arm) - elseif(CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL arm64 OR CMAKE_SYSTEM_PROCESSOR_LOWER STREQUAL aarch64) - set(VCVARSALL_ARCH arm64) - else() - if(CMAKE_HOST_SYSTEM_PROCESSOR) - set(VCVARSALL_ARCH ${CMAKE_HOST_SYSTEM_PROCESSOR}) - else() - set(VCVARSALL_ARCH x64) - message(STATUS "Unkown architecture CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR_LOWER} - using x64") - endif() - endif() -endmacro() - -# Run vcvarsall.bat and set CMake environment variables -function(run_vcvarsall) - # if MSVC but VSCMD_VER is not set, which means vcvarsall has not run - if(MSVC AND "$ENV{VSCMD_VER}" STREQUAL "") - - # find vcvarsall.bat - get_filename_component(MSVC_DIR ${CMAKE_CXX_COMPILER} DIRECTORY) - find_file( - VCVARSALL_FILE - NAMES vcvarsall.bat - PATHS "${MSVC_DIR}" - "${MSVC_DIR}/.." - "${MSVC_DIR}/../.." - "${MSVC_DIR}/../../../../../../../.." - "${MSVC_DIR}/../../../../../../.." - PATH_SUFFIXES "VC/Auxiliary/Build" "Common7/Tools" "Tools") - - if(EXISTS ${VCVARSALL_FILE}) - # detect the architecture - detect_architecture() - - # run vcvarsall and print the environment variables - message(STATUS "Running `${VCVARSALL_FILE} ${VCVARSALL_ARCH}` to set up the MSVC environment") - execute_process( - COMMAND - "cmd" "/c" ${VCVARSALL_FILE} ${VCVARSALL_ARCH} # - "&&" "call" "echo" "VCVARSALL_ENV_START" # - "&" "set" # - OUTPUT_VARIABLE VCVARSALL_OUTPUT - OUTPUT_STRIP_TRAILING_WHITESPACE) - - # parse the output and get the environment variables string - find_substring_by_prefix(VCVARSALL_ENV "VCVARSALL_ENV_START" "${VCVARSALL_OUTPUT}") - - # set the environment variables - set_env_from_string("${VCVARSALL_ENV}") - - else() - message( - WARNING - "Could not find `vcvarsall.bat` for automatic MSVC environment preparation. Please manually open the MSVC command prompt and rebuild the project. - ") - endif() - endif() -endfunction() diff --git a/cmake/_FORTIFY_SOURCE.hpp b/cmake/_FORTIFY_SOURCE.hpp deleted file mode 100644 index 1a1615a8..00000000 --- a/cmake/_FORTIFY_SOURCE.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifdef _FORTIFY_SOURCE - #if _FORTIFY_SOURCE < 3 - #undef _FORTIFY_SOURCE - #define _FORTIFY_SOURCE 3 - #endif -#else - #define _FORTIFY_SOURCE 3 -#endif diff --git a/config/background.json b/config/background.json new file mode 100644 index 00000000..d2f38488 --- /dev/null +++ b/config/background.json @@ -0,0 +1,13 @@ +{ + "path": "assets/sprites/background.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width":1920, + "height": 1080, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/background2.json b/config/background2.json new file mode 100644 index 00000000..e59a07f8 --- /dev/null +++ b/config/background2.json @@ -0,0 +1,13 @@ +{ + "path": "assets/sprites/background.png", + "scale": 1, + "rects": { + "frame1": { + "top": 15, + "left": 400, + "width":1920, + "height": 1080, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/bonus.json b/config/bonus.json new file mode 100644 index 00000000..8c507b57 --- /dev/null +++ b/config/bonus.json @@ -0,0 +1,69 @@ +{ + "path": "assets/sprites/powerup.png", + "scale": 0.1, + "rects": { + "frame1": { + "top": 24, + "left": 96, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame2": { + "top": 24, + "left": 441, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame3": { + "top": 24, + "left": 786, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame4": { + "top": 24, + "left": 1131, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame5": { + "top": 24, + "left": 1476, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame6": { + "top": 24, + "left": 1131, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame7": { + "top": 24, + "left": 786, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame8": { + "top": 24, + "left": 441, + "width": 345, + "height": 384, + "time": 0.1 + }, + "frame9": { + "top": 24, + "left": 96, + "width": 345, + "height": 384, + "time": 0.1 + } + } +} \ No newline at end of file diff --git a/config/bullet.json b/config/bullet.json new file mode 100644 index 00000000..be6f0ef7 --- /dev/null +++ b/config/bullet.json @@ -0,0 +1,13 @@ +{ + "path": "assets/sprites/r-typesheet2.png", + "scale": 1, + "rects": { + "frame1": { + "top": 10, + "left": 304, + "width": 25, + "height": 13, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/enemy.json b/config/enemy.json new file mode 100644 index 00000000..91904670 --- /dev/null +++ b/config/enemy.json @@ -0,0 +1,55 @@ +{ + "path": "assets/sprites/r-typesheet5.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame2": { + "top": 0, + "left": 33, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame3": { + "top": 0, + "left": 66, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame4": { + "top": 0, + "left": 99, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame5": { + "top": 0, + "left": 132, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame6": { + "top": 0, + "left": 165, + "width": 33, + "height": 33, + "time": 0.1 + }, + "frame7": { + "top": 0, + "left": 198, + "width": 33, + "height": 33, + "time": 0.1 + } + } +} \ No newline at end of file diff --git a/config/flappybird/flappybird.json b/config/flappybird/flappybird.json new file mode 100644 index 00000000..834daefc --- /dev/null +++ b/config/flappybird/flappybird.json @@ -0,0 +1,159 @@ +{ + "graphics": { + "name": "Flappy Bird", + "width": 288, + "height": 512, + "font": "assets/font.ttf" + }, + "physics": { + "gravity": 2, + "initial_fall_velocity": 2 + }, + "sounds": { + "music": { + "path": "assets/flappybird/sounds/song.mp3", + "volume": 30, + "loop": true + }, + "jump": { + "path": "assets/flappybird/sounds/jump.ogg", + "volume": 100, + "loop": false + }, + "death": { + "path": "assets/flappybird/sounds/sardoche.mp3", + "volume": 100, + "loop": false + } + }, + "entities": { + "score": { + "size": 50, + "position": { + "x": 131, + "y": 50 + } + }, + "ground_1": { + "speed": 100, + "position": { + "y": 400 + }, + "hitbox": { + "width": 336, + "height": 112 + } + }, + "ground_2": { + "speed": 100, + "position": { + "x": 288, + "y": 400 + }, + "hitbox": { + "width": 336, + "height": 112 + } + }, + "pipes": { + "loop_width": 2000, + "speed": 100, + "hitbox": { + "width": 52, + "height": 320 + }, + "items": [ + { + "x": 240, + "y": 250, + "orientation": "bottom", + "scored": true + }, + { + "x": 240, + "y": -250, + "orientation": "top", + "scored": false + }, + { + "x": 480, + "y": 180, + "orientation": "bottom", + "scored": true + }, + { + "x": 480, + "y": -280, + "orientation": "top", + "scored": false + }, + { + "x": 700, + "y": 130, + "orientation": "bottom", + "scored": true + }, + { + "x": 890, + "y": -100, + "orientation": "top", + "scored": true + }, + { + "x": 1100, + "y": 130, + "orientation": "bottom", + "scored": true + }, + { + "x": 1300, + "y": -130, + "orientation": "top", + "scored": true + }, + { + "x": 1560, + "y": -280, + "orientation": "top", + "scored": true + }, + { + "x": 1560, + "y": 210, + "orientation": "bottom", + "scored": false + }, + { + "x": 1800, + "y": 130, + "orientation": "bottom", + "scored": true + } + ] + }, + "bird": { + "position": { + "x": 127, + "y": 10 + }, + "weight": 80, + "jump": { + "height": 100, + "strength": 5, + "floating": 50 + }, + "hitbox": { + "width": 34, + "height": 24 + } + }, + "replay_message": { + "position": { + "x": 38, + "y": 110 + }, + "size": 20, + "text": "Press escape to replay" + } + } +} \ No newline at end of file diff --git a/config/flappybird/sprites/background.json b/config/flappybird/sprites/background.json new file mode 100644 index 00000000..56083462 --- /dev/null +++ b/config/flappybird/sprites/background.json @@ -0,0 +1,13 @@ +{ + "path": "assets/flappybird/sprites/background-day.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width":288, + "height": 512, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/flappybird/sprites/bird.json b/config/flappybird/sprites/bird.json new file mode 100644 index 00000000..db23c78f --- /dev/null +++ b/config/flappybird/sprites/bird.json @@ -0,0 +1,27 @@ +{ + "path": "assets/flappybird/sprites/bird.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 34, + "height": 24, + "time": 0.2 + }, + "frame2": { + "top": 0, + "left": 34, + "width": 34, + "height": 24, + "time": 0.2 + }, + "frame3": { + "top": 0, + "left": 68, + "width": 34, + "height": 24, + "time": 0.2 + } + } +} \ No newline at end of file diff --git a/config/flappybird/sprites/ground.json b/config/flappybird/sprites/ground.json new file mode 100644 index 00000000..ee22bab9 --- /dev/null +++ b/config/flappybird/sprites/ground.json @@ -0,0 +1,13 @@ +{ + "path": "assets/flappybird/sprites/ground.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 336, + "height": 112, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/flappybird/sprites/pipe-bottom.json b/config/flappybird/sprites/pipe-bottom.json new file mode 100644 index 00000000..73ae3b55 --- /dev/null +++ b/config/flappybird/sprites/pipe-bottom.json @@ -0,0 +1,13 @@ +{ + "path": "assets/flappybird/sprites/pipe-green-bottom.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 52, + "height": 320, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/flappybird/sprites/pipe-top.json b/config/flappybird/sprites/pipe-top.json new file mode 100644 index 00000000..ef8be3e1 --- /dev/null +++ b/config/flappybird/sprites/pipe-top.json @@ -0,0 +1,13 @@ +{ + "path": "assets/flappybird/sprites/pipe-green-top.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 52, + "height": 320, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/missiles.json b/config/missiles.json new file mode 100644 index 00000000..65c70e48 --- /dev/null +++ b/config/missiles.json @@ -0,0 +1,13 @@ +{ + "path": "assets/sprites/r-typesheet2.png", + "scale": 1, + "rects": { + "frame1": { + "top": 10, + "left": 207, + "width": 25, + "height": 13, + "time": 0 + } + } +} \ No newline at end of file diff --git a/config/player_1.json b/config/player_1.json new file mode 100644 index 00000000..1f96a0b7 --- /dev/null +++ b/config/player_1.json @@ -0,0 +1,41 @@ +{ + "path": "assets/sprites/r-typesheet42.png", + "scale": 1, + "rects": { + "frame1": { + "top": 0, + "left": 0, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame2": { + "top": 0, + "left": 33, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame3": { + "top": 0, + "left": 66, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame4": { + "top": 0, + "left": 99, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame5": { + "top": 0, + "left": 132, + "width": 33, + "height": 17, + "time": 0.2 + } + } +} \ No newline at end of file diff --git a/config/player_2.json b/config/player_2.json new file mode 100644 index 00000000..d1fab380 --- /dev/null +++ b/config/player_2.json @@ -0,0 +1,41 @@ +{ + "path": "assets/sprites/r-typesheet42.png", + "scale": 1, + "rects": { + "frame1": { + "top": 17, + "left": 0, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame2": { + "top": 17, + "left": 33, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame3": { + "top": 17, + "left": 66, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame4": { + "top": 17, + "left": 99, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame5": { + "top": 17, + "left": 132, + "width": 33, + "height": 17, + "time": 0.2 + } + } +} diff --git a/config/player_3.json b/config/player_3.json new file mode 100644 index 00000000..d991fa82 --- /dev/null +++ b/config/player_3.json @@ -0,0 +1,41 @@ +{ + "path": "assets/sprites/r-typesheet42.png", + "scale": 1, + "rects": { + "frame1": { + "top": 34, + "left": 0, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame2": { + "top": 34, + "left": 33, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame3": { + "top": 34, + "left": 66, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame4": { + "top": 34, + "left": 99, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame5": { + "top": 34, + "left": 132, + "width": 33, + "height": 17, + "time": 0.2 + } + } +} \ No newline at end of file diff --git a/config/player_4.json b/config/player_4.json new file mode 100644 index 00000000..cf2a38d2 --- /dev/null +++ b/config/player_4.json @@ -0,0 +1,41 @@ +{ + "path": "assets/sprites/r-typesheet42.png", + "scale": 1, + "rects": { + "frame1": { + "top": 51, + "left": 0, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame2": { + "top": 51, + "left": 33, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame3": { + "top": 51, + "left": 66, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame4": { + "top": 51, + "left": 99, + "width": 33, + "height": 17, + "time": 0.2 + }, + "frame5": { + "top": 51, + "left": 132, + "width": 33, + "height": 17, + "time": 0.2 + } + } +} \ No newline at end of file diff --git a/config/r-type.json b/config/r-type.json new file mode 100644 index 00000000..73d4ca87 --- /dev/null +++ b/config/r-type.json @@ -0,0 +1,12 @@ +{ + "graphics": { + "name": "R-Type", + "width": 1920, + "height": 1080, + "font": "assets/font.ttf" + }, + "physics": { + "gravity": 2, + "initial_fall_velocity": 2 + } +} diff --git a/config/serverMessage.json b/config/serverMessage.json new file mode 100644 index 00000000..463c1cff --- /dev/null +++ b/config/serverMessage.json @@ -0,0 +1,13 @@ +{ + "path": "assets/sprites/loading-message.png", + "scale": 1, + "rects": { + "frame1": { + "top": 15, + "left": 400, + "width": 700, + "height": 400, + "time": 0 + } + } +} \ No newline at end of file diff --git a/doc/RFC.md b/doc/RFC.md index d618ae3a..ceb15dd2 100644 --- a/doc/RFC.md +++ b/doc/RFC.md @@ -7,91 +7,396 @@ R-Type is an iconic series of horizontal-scrolling shoot 'em up video games deve ## Table of Contents 1. [Introduction](#1-introduction) -2. [Protocol Specification](#2-protocol-specification) +2. [Definitions](#2-definitions) - 2.1. [Packet Format](#21-packet-format) + * 2.1. [Packet](#21-packet) - 2.2. [Packet Type](#22-packet-type) + * 2.2. [Data Types](#22-data-types) - 2.3. [Reception Aknowledgment](#23-reception-aknowledgment) +3. [Protocol Specification](#3-protocol-specification) - 2.4. [Serialization](#24-serialization) + * 3.1. [Packet Format](#31-packet-format) -3. [Security Considerations](#3-security-considerations) -4. [Authors](#4-authors) + * 3.2. [Packet Types](#32-packet-types) + + * 3.2.1. [From client](#321-from-client) + * [Connect](#connect) + * [Disconnect](#disconnect) + * [Move](#move) + * [Shoot](#shoot) -## 1. Introduction + * 3.2.2. [From server](#322-from-server) + * [Player joined](#player-joined) + * [Player left](#player-left) + * [Player position update](#player-position-update) + * [Player shot](#player-shot) + * [Player got bonus](#player-got-bonus) + * [Player died](#player-died) + * [Enemy spawned](#enemy-spawned) + * [Enemy died](#enemy-died) + * [Enemy shot](#enemy-shot) + * [Server is full](#server-is-full) -The multiplayer R-Type game protocol is designed to enable communication -between clients and servers in a multiplayer R-Type game. This protocol -defines various message types and associated data structures for in-game -events, including player interactions and monster behavior. + * 3.3. [Reception Aknowledgment](#33-reception-aknowledgment) -## 2. Protocol Specification + * 3.4. [Serialization](#34-serialization) -Each client is a game player that listens to user inputs, sends actions to the server and calculates some game logic on its side. The server centralizes the main game logic and defines what happens in the game. It always has the last word on clients. +5. [Security Considerations](#4-security-considerations) +6. [Authors](#5-authors) -### 2.1. Packet Format +## 1. Introduction -A packet has the following properties: -| Name | Kind | Description | -| - | - | - | -| `uuid` | 16-byte string | Unique id to identify the packet. See [part 2.3](#23-reception-aknowledgment) to learn about its utility | -| `type` | 4-byte int | Packet type. See [part 2.2](#22-packet-type) to get the list of packet types | -| `payload` | vector of float (variable size) | Data carried by the packet. The size and meaning of each value depends on packet type, check [part 2.2](#22-packet-type) | +The multiplayer R-Type game protocol is designed to enable communication +between clients and servers in a multiplayer R-Type game. This protocol +defines various message types and associated data structures for in-game +events, including player interactions and enemy behavior. -If the packet format is not respected, the packet will be ignored by the server. +## 2. Definitions -### 2.2 Packet Type +### 2.1. Packet -Packets sent by client: +The R-Type server accepts connections from UDP clients and communicates with them using packets. A packet is a sequence of bytes sent over the UDP connection. -| Name | Type | Bounds to | Payload format | Payload size | -| - | - | - | - | - | -| `CONNECT` | `0` | Server | empty | 0 bytes | -| `DISCONNECT` | `1` | Server | empty | 0 bytes | -| `MOVE` | `3` | Server |
  1. Move shift on horizontal axis (negative being left, positive being right, max absolute value is 1)
  2. Move shift on vertical axis (negative being bottom, positive being top, max absolute value is 1)
| 8 bytes | -| `SHOOT` | `4` | Server | empty | 0 bytes | -| `BONUS` | `5` | Server |
  1. Bonus type
| 4 bytes +### 2.2. Data Types -Packets sent by server: +| Name | Size (bytes) | Encodes | Notes | +| - | - | - | - | +| boolean | 1 | Either false or true | True is encoded as 0x01, false as 0x00 | +| unsigned byte | 1 | An integer between 0 and 255 | Unsigned 8-bit integer | +| unsigned short | 2 | An integer between 0 and 65535 | Unsigned 16-bit integer | +| float | 4 | A single-precision 32-bit IEEE 754 floating point number | +| string | ≥ 1 | A sequence of bytes representing characters | -| Name | Type | Bounds to | Payload format | Payload size | -| - | - | - | - | - | -| `PLAYER_SPAWN` | `0` | Client |
  1. Entity id
  2. Is packet receiver the concerned player (`1` for yes, otherwise no)
  3. Player color (goes from `0` to `3`)
  4. Entity horizontal position
  5. Entity vertical position
| 20 bytes | -| `PLAYER_DISCONNECTION` | `1` | Client |
  1. Id of the entity who leaves
| 4 bytes | -| `PLAYER_POSITION` | `2` | Client |
  1. Entity id
  2. Entity horizontal position
  3. Entity vertical position
| 12 bytes | -| `PLAYER_SHOOT` | `3` | Client |
  1. Shooting entity id
| 4 bytes | -| `PLAYER_BONUS` | `4` | Client |
  1. Concerned entity id
| 4 bytes | -| `PLAYER_DEATH` | `5` | Client |
  1. Dying entity id
| 4 bytes | -| `ENEMY_SPAWN` | `6` | Client |
  1. Spawning entity id
  2. Entity horizontal position
  3. Entity vertical position
| 12 bytes | -| `ENEMY_DEATH` | `7` | Client |
  1. Dying entity id
| 4 bytes | -| `ENEMY_SHOOT` | `8` | Client |
  1. Shooting entity id
| 4 bytes | -| `SERVER_FULL` | `9` | Client | empty | 0 bytes | +## 3. Protocol Specification -Packets sent by both: +Each client is a game player that listens to user inputs, sends actions to the server and calculates some game logic on its side. The server centralizes the main game logic and defines what happens in the game. It always has the last word on clients. -| Name | Type | Bounds to | Payload format | Payload size | -| - | - | - | - | - | -| `RECEPTION_AKNOWLEDGMENT` | `-1` | Client & Server | empty | 0 bytes | +### 3.1. Packet Format -The first packet sent by a client to its server **must** be of type `CONNECT`. Otherwise, the server will not listen to any of its packets. +A packet has the following properties: +| Name | Kind | Description | +| - | - | - | +| `uuid` | 36-byte string | Unique id to identify the packet. See [part 3.3](#33-reception-aknowledgment) to learn about its utility | +| `type` | byte | [Packet type](#32-packet-types) | +| `payload` | depends on [packet type](#32-packet-types) | Data carried by the packet | + +If the packet format is not respected, the server will send back a packet of Error type (see [packet types](#32-packet-types)) + +### 3.2. Packet Types + +#### 3.2.1. From client + +##### Connect +| Type | Bounds to | Payload description | Payload type | +| - | - | - | - | +| `0x00` | Server | empty | empty | + +##### Disconnect +| Type | Bounds to | Payload description | Payload type | +| - | - | - | - | +| `0x01` | Server | empty | empty | + +##### Move + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x02Server + + + +
Move shift on horizontal axis
Move shift on vertical axis
+
+ + + +
float
float
+
+ +##### Shoot +| Type | Bounds to | Payload description | Payload type | +| - | - | - | - | +| `0x03` | Server | empty | empty | + +#### 3.2.2. From server + +##### Player joined + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x00Client + + + + + + +
Player entity ID
Is receiver the concerned player
Player color
Player horizontal position
Player vertical position
+
+ + + + + + +
unsigned short
boolean
unsigned byte
float
float
+
+ +##### Player left + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x01Client + + +
Player entity ID
+
+ + +
unsigned short
+
+ +##### Player position update + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x02Client + + + + +
Entity ID
Entity horizontal position
Entity vertical position
+
+ + + + +
unsigned short
float
float
+
+ +##### Player shot + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x03Client + + +
Shooter entity ID
+
+ + +
unsigned short
+
+ +##### Player got bonus + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x04Client + + + +
Player entity ID
Bonus type
+
+ + + +
unsigned short
unsigned byte
+
+ +##### Player died + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x05Client + + +
Entity ID
+
+ + +
unsigned short
+
+ +##### Enemy spawned + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x06Client + + + + +
Enemy entity ID
Enemy horizontal position
Enemy vertical position
+
+ + + + +
unsigned short
float
float
+
+ +##### Enemy died + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x07Client + + +
Entity ID
+
+ + +
unsigned short
+
+ +##### Enemy shot + + + + + + + + + + + + + +
TypeBound toPayload descriptionPayload type
0x08Client + + +
Shooter entity ID
+
+ + +
unsigned short
+
+ +##### Server is full +| Type | Bound to | Payload description | Payload type | +| - | - | - | - | +| `0x09` | Client | empty | empty | + +#### 3.2.3. From client & server + +##### Answer aknowledgment +| Type | Bound to | Payload type | Payload size (bytes) | +| - | - | - | - | +| `-1` | Client & Server | empty | empty | + +##### Answer error +| Type | Bound to | Payload type | Payload size (bytes) | +| - | - | - | - | +| `-2` | Client & Server | empty | empty | + +The first packet sent by a client to its server **must** be of type [connect](#connect). Otherwise, the server will not listen to any of its packets. When a client connects the server should: - - send `PLAYER_SPAWN` packets to the connecting client, for each player already present in the server - - send `ENEMY_SPAWN` packets to the connecting client, for each enemy already present in the server + - send a [player joined](#player-joined) to the new player for each player already present in the server + - send [enemy spawned](#enemy-spawned) packets to the connecting client, for each enemy already present in the server -This way the connecting client is aware of what is going during the gameplay. +This way the new client is aware of what is going during the gameplay. -### 2.3. Reception Aknowledgment +### 3.3. Reception Aknowledgment A client or server receiving a packet whose type is `>= 0` must send back an aknowledgment packet (type `-1`). Its uuid must be the same as the one of the received packet. This practice is recommended for timeout and crash detection: not sending aknowledgment results to be considered as inactive and kicked by the server or left by the client. -### 2.4. Serialization +### 3.4. Serialization -The protocol is binary, so packets must be serialized to binary format before being sent. It must be unserialized from binary format before being read. +The protocol is binary, so packets must be serialized to binary format before being sent. It must be unserialized from binary format before being read. -## 3. Security Considerations +## 4. Security Considerations Implementations of this protocol should consider security aspects to protect against unauthorized access, cheating, and other potential vulnerabilities. @@ -99,7 +404,7 @@ You must check your packet reception when making a client or server: always make Remember that the server should always have the last word on the client. -## 4. Authors +## 5. Authors **A game developed by:** - Valentin GEGOUX (valentin.gegoux@epitech.eu) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt new file mode 100644 index 00000000..13497627 --- /dev/null +++ b/extern/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(EwECS) \ No newline at end of file diff --git a/extern/EwECS b/extern/EwECS new file mode 160000 index 00000000..59f07aea --- /dev/null +++ b/extern/EwECS @@ -0,0 +1 @@ +Subproject commit 59f07aeadb75fb2c09bee607831828e0cb67cfd4 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 655ecf46..ee1b40f7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,9 @@ add_executable(client) add_executable(server) -add_library(ecs STATIC) +add_executable(flappybird) add_library(rtype STATIC) - -add_subdirectory(ecs) add_subdirectory(rtype) add_subdirectory(server) add_subdirectory(client) +add_subdirectory(flappybird) diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 6c1f4a40..3bb80fc9 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,54 +1,26 @@ find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") target_sources(client PRIVATE main.cpp - SDLDisplayClass.cpp ) add_subdirectory(network) add_subdirectory(systems) -if (SDL2_DOWNLOADED) - target_link_libraries(client - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - SDL2::SDL2main - SDL2::SDL2 - SDL2_image - ${Boost_LIBRARIES} - Boost::serialization - Threads::Threads - ecs - rtype - Boost::asio - Boost::uuid - ) -else() - target_link_libraries(client - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - SDL2::SDL2main - SDL2::SDL2 - SDL2_image - ${Boost_LIBRARIES} - Boost::serialization - Threads::Threads - ecs - rtype - Boost::asio - Boost::serialization - Boost::uuid - ) -endif() +target_link_libraries(client + PRIVATE + Threads::Threads + ecs + rtype +) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(client PRIVATE ${Boost_INCLUDE_DIRS}) -target_include_directories(client PRIVATE "../../build/_deps/sdl2-src/include/SDL2") -target_include_directories(client PRIVATE "../../build/_deps/sdl2_image-src/include") +target_include_directories(client PRIVATE "${PROJECT_SOURCE_DIR}/extern/EwECS/includes") + set_target_properties(client PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) + diff --git a/src/client/SDLDisplayClass.cpp b/src/client/SDLDisplayClass.cpp deleted file mode 100644 index 879e02e2..00000000 --- a/src/client/SDLDisplayClass.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* -** EPITECH PROJECT, 2023 -** R-Type -** File description: -** SDLDisplayClass -*/ - -#include "SDLDisplayClass.hpp" -#include -#include -#include "IsAlive.hpp" -#include "SparseArray.hpp" -#include "Utils.hpp" -#include "Values.hpp" -#include "World.hpp" -#include -#if defined(__linux__) - #include - #include - #include -#endif - -SDLDisplayClass::SDLDisplayClass() -{ - const Uint32 windowFlags = 0; - - if (SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO) < 0) { - std::cerr << "Couldn't initialize SDL: " << SDL_GetError() << std::endl; - return; - } - _window = SDL_CreateWindow("R-Type", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, - windowFlags); - if (_window == nullptr) { - std::cout << "Failed to open SDL window: " << SDL_GetError() << std::endl; - return; - } - IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG); - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); - _renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); - if (_renderer == nullptr) { - std::cerr << "Failed to create renderer: " << SDL_GetError() << std::endl; - return; - } -#if defined(__linux__) - char result[PATH_MAX]; - ssize_t count = readlink("/proc/self/exe", result, PATH_MAX); - if (count < 0 || count >= PATH_MAX) { - _assetPath = "./"; - return; - } - result[count] = '\0'; - char *dir = dirname(result); - if (dir == nullptr) { - _assetPath = "./"; - return; - } - _assetPath = std::string(dir) + "/"; -#else - _assetPath = "./"; -#endif -} - -size_t SDLDisplayClass::addEntity(ECS::Utils::Vector2f aPos, Component::Speed aSpeed, Component::TypeEntity aType, - Component::LoadedSprite aSprite, Component::HitBox aHitBox, - Component::IsAlive aIsAlive) -{ - ECS::Core::World &world = ECS::Core::World::getInstance(); - auto &vec = world.getComponent(); - auto &spd = world.getComponent(); - auto &type = world.getComponent(); - auto &sprite = world.getComponent(); - auto &hitbox = world.getComponent(); - auto &isAlive = world.getComponent(); - const size_t idx = world.createEntity(); - - vec.insertAt(idx, aPos); - spd.insertAt(idx, aSpeed); - type.insertAt(idx, aType); - sprite.insertAt(idx, aSprite); - hitbox.insertAt(idx, aHitBox); - isAlive.insertAt(idx, aIsAlive); - return idx; -} - -SDL_Texture *SDLDisplayClass::getTexture(const std::string &aPath) -{ - std::string path = _assetPath + aPath; - - if (_textures.find(path) == _textures.end()) { - _textures[path] = IMG_LoadTexture(_renderer, path.c_str()); - if (_textures[path] == nullptr) { - std::cerr << "Failed to create texture: " << SDL_GetError() << std::endl; - return nullptr; - } - } - return _textures[path]; -} - -void SDLDisplayClass::freeRects(const std::size_t &aIdx) -{ - auto &world = ECS::Core::World::getInstance(); - auto &sprites = world.getComponent(); - - if (!sprites[aIdx].has_value()) { - return; - } - delete sprites[aIdx]->rect; - delete sprites[aIdx]->srcRect; -} - -SDLDisplayClass::~SDLDisplayClass() -{ - auto &world = ECS::Core::World::getInstance(); - auto &sprites = world.getComponent(); - - for (auto &sprite : sprites) { - if (!sprite.has_value()) { - continue; - } - delete sprite->rect; - delete sprite->srcRect; - } - for (auto &texture : _textures) { - SDL_DestroyTexture(texture.second); - } - SDL_DestroyRenderer(_renderer); - SDL_DestroyWindow(_window); - SDL_Quit(); -} diff --git a/src/client/SDLDisplayClass.hpp b/src/client/SDLDisplayClass.hpp deleted file mode 100644 index 5b3bb650..00000000 --- a/src/client/SDLDisplayClass.hpp +++ /dev/null @@ -1,84 +0,0 @@ -/* -** EPITECH PROJECT, 2023 -** R-Type -** File description: -** SDLDisplayClass -*/ - -#ifndef SDLDISPLAYClass_HPP_ -#define SDLDISPLAYClass_HPP_ - -#include -#include -#include -#include "Components.hpp" -#include "KeyboardEvent.hpp" -#include "MouseEvent.hpp" -#include "Utils.hpp" -#include "WindowEvent.hpp" -#include -#include - -class SDLDisplayClass -{ - public: - /** - * @brief Destroy the SDLDisplayClass object - * - */ - ~SDLDisplayClass(); - - /** - * @brief Get an Instance of the SDLDisplayClass (singleton) - * - * @return SDLDisplayClass& - */ - static SDLDisplayClass &getInstance() - { - static SDLDisplayClass instance; - - return instance; - } - - /** - * @brief Get the texture object - * - * @return SDL_Texture* - */ - SDL_Texture *getTexture(const std::string &path); - - /** - * @brief Free the rects of the entity - * - * @param idx The index of the entity - */ - void freeRects(const std::size_t &idx); - - /** - * @brief Create a new entity object - * - * @param aPos Position of the entity - * @param aSpeed Speed of the entity - * @param aType Type of the entity - * @param aSprite Sprite of the entity - * @param aHitBox Hitbox of the entity - * @param aIsAlive IsAlive of the entity - * @return size_t The index of the entity - */ - static size_t addEntity(ECS::Utils::Vector2f aPos, Component::Speed aSpeed, Component::TypeEntity aType, - Component::LoadedSprite aSprite, Component::HitBox aHitBox, - Component::IsAlive aIsAlive); - SDL_Renderer *_renderer; - SDL_Window *_window; - std::string _assetPath; - - private: - std::unordered_map _textures; - /** - * @brief Construct a new SDLDisplayClass object - * - */ - SDLDisplayClass(); -}; - -#endif /* !SDLDISPLAYClass_HPP_ */ diff --git a/src/client/main.cpp b/src/client/main.cpp index a8aa4fbd..f80dbcff 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -1,25 +1,28 @@ -#include -#include -#include "ClientHandler.hpp" +#include "AddEntity.hpp" +#include "ClientGameEvent.hpp" #include "Components.hpp" -#include "EventManager.hpp" -#include "HitBox.hpp" +#include "EwECS/Asset/AssetManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Music/MusicPlugin.hpp" +#include "EwECS/Network/ClientHandler.hpp" +#include "EwECS/Network/Packet.hpp" +#include "EwECS/Physic/PhysicPlugin.hpp" +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "EwECS/Sound/SoundPlugin.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" -#include "SDLDisplayClass.hpp" +#include "PacketFactory.hpp" #include "ServerGameEvent.hpp" #include "System.hpp" #include "TypeEntity.hpp" -#include "Utils.hpp" #include "Values.hpp" -#include "World.hpp" -#include int main(int ac, char **av) { if (ac < 3) { - std::cerr << "Usage: " << av[0] << " " << std::endl; + ECS::Logger::error("Usage: " + std::string(av[0]) + " "); return FAILURE; } @@ -27,131 +30,111 @@ int main(int ac, char **av) // Network std::string host(av[1]); std::string port(av[2]); - auto &client = Network::ClientHandler::getInstance(); - client.start(host, port); - std::cout << "start client" << std::endl; - RType::Packet connectPacket(static_cast(RType::ServerEventType::CONNECT)); - std::cout << "made connect packet" << std::endl; - client.send(connectPacket); - std::cout << "sent connect packet" << std::endl; + auto &client = ECS::Network::ClientHandler::getInstance(); + + client.onReceive([](int8_t aPacketType, ECS::Network::IPayload *aPayload) { + if (aPacketType >= RType::ClientEventType::MAX_CLI_EVT) { + return; + } + if (aPacketType >= 0) { + auto eventType = static_cast(aPacketType); + + ECS::Event::EventManager::getInstance()->pushEvent( + RType::ClientGameEvent(eventType, aPayload)); + } + }); + + client.start(host, port, RType::packetFactory); + client.send(RType::ServerEventType::CONNECT); // Setup ECS / graphic - std::cout << "start ECS" << std::endl; ECS::Core::World &world = ECS::Core::World::getInstance(); - SDLDisplayClass &display = SDLDisplayClass::getInstance(); ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - std::cout << "ECS started" << std::endl; + ECS::Render::RenderPlugin renderPlugin; + ECS::Asset::AssetManager &assetManager = ECS::Asset::AssetManager::getInstance(); + ECS::Physic::PhysicPlugin physicPlugin; + ECS::SoundPlugin soundPlugin; + ECS::MusicPlugin musicPlugin; + + // Graphic systems plug // Components - std::cout << "register components" << std::endl; - world.registerComponent(); world.registerComponent(); world.registerComponent(); - world.registerComponent(); - world.registerComponent(); world.registerComponent(); - std::cout << "components registered" << std::endl; - // Graphic systems - std::cout << "add systems graphs" << std::endl; - world.addSystem(ECS::System::getInput); - world.addSystem(ECS::System::loadTextures); - world.addSystem(ECS::System::displayEntities); - world.addSystem(ECS::System::quitSDL); - std::cout << "systems graphs added" << std::endl; + ECS::Physic::PhysicPluginConfig::getInstance().load("config/r-type.json"); + ECS::Render::RenderPluginConfig::getInstance().load("config/r-type.json"); + physicPlugin.plug(world, assetManager); + renderPlugin.plug(world, assetManager); + soundPlugin.plug(world, assetManager); + musicPlugin.plug(world, assetManager); // Background systems - std::cout << "add systems background" << std::endl; world.addSystem(ECS::System::createBackground); world.addSystem(ECS::System::moveBackground); - std::cout << "systems background added" << std::endl; // Player systems - std::cout << "add systems player" << std::endl; world.addSystem( ECS::System::movePlayer); world.addSystem( ECS::System::triggerPlayerShoot); - std::cout << "systems player added" << std::endl; // Bot systems - std::cout << "add systems bot" << std::endl; world.addSystem(ECS::System::createBot); world.addSystem(ECS::System::updateBotPosition); world.addSystem(ECS::System::triggerBotShoot); - world.addSystem( - ECS::System::botHit); + world.addSystem(ECS::System::botHit); world.addSystem( ECS::System::triggerBotDeath); world.addSystem(ECS::System::triggerBotDisconnect); - std::cout << "systems bot added" << std::endl; // Enemy systems - std::cout << "add systems enemy" << std::endl; world.addSystem(ECS::System::createEnemy); world.addSystem(ECS::System::moveEnemy); world.addSystem(ECS::System::triggerEnemyShoot); - world.addSystem(ECS::System::enemyHit); + world.addSystem(ECS::System::enemyHit); world.addSystem( ECS::System::triggerEnemyDeath); - std::cout << "systems enemy added" << std::endl; // Bonus systems - std::cout << "add systems bonus" << std::endl; world.addSystem(ECS::System::moveBonus); - world.addSystem( - ECS::System::triggerBonus); - world.addSystem(ECS::System::triggerBotBonus); - std::cout << "systems bonus added" << std::endl; + world.addSystem(ECS::System::triggerBonus); // Missile systems - std::cout << "add systems missile" << std::endl; world.addSystem(ECS::System::moveMissiles); - std::cout << "systems missile added" << std::endl; // Error message system - std::cout << "add systems error" << std::endl; world.addSystem(ECS::System::createServerFullErrorMessage); - std::cout << "systems error added" << std::endl; // Loading message - std::cout << "add loading message" << std::endl; - display.addEntity( - ECS::Utils::Vector2f {SCREEN_WIDTH / 2 - LOADING_MESSAGE_TEX_WIDTH / 2, - SCREEN_HEIGHT / 2 - LOADING_MESSAGE_TEX_HEIGHT / 2}, - Component::Speed {0}, Component::TypeEntity {false, false, false, false, false, false, false}, - Component::LoadedSprite {LOADING_MESSAGE_ASSET, nullptr, nullptr, - new SDL_Rect {0, 0, LOADING_MESSAGE_TEX_WIDTH, LOADING_MESSAGE_TEX_HEIGHT}}, - Component::HitBox {}, Component::IsAlive {false, 0}); - std::cout << "loading message added" << std::endl; + try { + AddEntity::addEntity(ECS::Utils::Vector2f {SCREEN_WIDTH / 2 - LOADING_MESSAGE_TEX_WIDTH / 2, + SCREEN_HEIGHT / 2 - LOADING_MESSAGE_TEX_HEIGHT / 2}, + Component::Speed {0}, + Component::TypeEntity {false, false, false, false, false, false, false}, + Component::LoadedSprite {"config/serverMessage.json"}, Component::HitBox {}, + Component::IsAlive {false, 0}); + } catch (std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); + ECS::Network::ClientHandler::getInstance().stop(); + return FAILURE; + } // Game loop while (world.isRunning()) { - std::cout << "will run system loop" << std::endl; world.runSystems(); - std::cout << "did run system loop" << std::endl; - std::cout << "will run render" << std::endl; - SDL_RenderPresent(display._renderer); - std::cout << "did run render" << std::endl; - std::cout << "will clear event" << std::endl; - eventManager->clearNonGameEvents(); - std::cout << "did clear event" << std::endl; - std::cout << "will calc time" << std::endl; + eventManager->keepEventsAndClear(); world.calcDeltaTime(); - std::cout << "did calc time" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } // Quit server properly - std::cout << "will make disconnect packet" << std::endl; - RType::Packet disconnectPacket(static_cast(RType::ServerEventType::DISCONNECT)); - std::cout << "will send disconnect packet" << std::endl; - client.send(disconnectPacket); - std::cout << "did send disconnect packet" << std::endl; - Network::NetworkHandler::getInstance().stop(); - std::cout << "did stop network" << std::endl; + client.send(RType::ServerEventType::DISCONNECT); + ECS::Network::ClientHandler::getInstance().stop(); } catch (std::exception &e) { - Network::NetworkHandler::getInstance().stop(); - std::cerr << "[RType client exception] " << e.what() << std::endl; + ECS::Network::ClientHandler::getInstance().stop(); + ECS::Logger::error("[RType client exception] " + std::string(e.what())); return FAILURE; } return SUCCESS; diff --git a/src/client/network/CMakeLists.txt b/src/client/network/CMakeLists.txt index b1f6e23d..7bbf9e14 100644 --- a/src/client/network/CMakeLists.txt +++ b/src/client/network/CMakeLists.txt @@ -1,22 +1,3 @@ -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - -target_sources(client PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/ClientHandler.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/ClientHandler.cpp" -) - -target_link_libraries(client - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - Boost::asio -) - target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/client/network/ClientHandler.cpp b/src/client/network/ClientHandler.cpp deleted file mode 100644 index 8e63e1bd..00000000 --- a/src/client/network/ClientHandler.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "ClientHandler.hpp" -#include -#include -#include -#include -#include -#include "EventManager.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" - -namespace Network { - - using boost::asio::ip::udp; - - ClientHandler::ClientHandler() - : _resolver(udp::resolver(NetworkHandler::getInstance().getIoService())) - {} - - void ClientHandler::start(std::string &aHost, std::string &aPort) - { - NetworkHandler &network = NetworkHandler::getInstance(); - _serverEndpoint = *_resolver.resolve(udp::v4(), aHost, aPort).begin(); - - network.onReceive([this](const RType::Packet &aPacket, udp::endpoint &aEndpoint) { - (void) aEndpoint; - - if (aEndpoint == _serverEndpoint) { - receivePacket(aPacket); - } - }); - - network.onReceiveAknowledgment([this](const std::string &aUuid, udp::endpoint &aEndpoint) { - (void) aUuid; - (void) aEndpoint; - }); - - network.start(udp::v4()); - std::cout << "Connected to " << _serverEndpoint << std::endl; - } - - void ClientHandler::receivePacket(const RType::Packet &aPacket) - { - RType::ClientEventType packetType = static_cast(aPacket.type); - - auto *evt = new RType::ClientGameEvent(packetType, aPacket.payload); - ECS::Event::EventManager::getInstance()->pushEvent(evt); - } - - void ClientHandler::send(RType::Packet &aPacket) - { - NetworkHandler::getInstance().send(aPacket, _serverEndpoint); - } - -} // namespace Network diff --git a/src/client/network/ClientHandler.hpp b/src/client/network/ClientHandler.hpp deleted file mode 100644 index dac46327..00000000 --- a/src/client/network/ClientHandler.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include "Packets.hpp" -#include "Values.hpp" -#include - -#ifndef CLIENTHANDLER_HPP - #define CLIENTHANDLER_HPP - -namespace Network { - - using boost::asio::ip::udp; - - class ClientHandler - { - private: - udp::resolver _resolver; - udp::endpoint _serverEndpoint; - - /** - * @brief Get the instance of the singleton - */ - ClientHandler(); - - public: - /** - * @brief Destroy the ClientHandler object - */ - ~ClientHandler() = default; - - /** - * @brief Get the instance of the singleton - * @return ClientHandler & The instance of the singleton - */ - static ClientHandler &getInstance() - { - static ClientHandler instance; - return instance; - } - - /** - * @brief Run the client - * @param aHost The host to connect to - * @param aPort THe port to connect to - */ - void start(std::string &, std::string &); - - /** - * @brief Handle packet reception - * @param aPacket The received packet - */ - void receivePacket(const RType::Packet &); - - /** - * @brief Send a packet to the server - * @param aPacket The packet to send - */ - void send(RType::Packet &aPacket); - }; - -} // namespace Network - -#endif diff --git a/src/client/network/PacketFactory.hpp b/src/client/network/PacketFactory.hpp new file mode 100644 index 00000000..f25270f5 --- /dev/null +++ b/src/client/network/PacketFactory.hpp @@ -0,0 +1,55 @@ +#include +#include "ClientGameEvent.hpp" +#include "EwECS/Network/ClientHandler.hpp" +#include "EwECS/Network/Serialization.hpp" +#include "ServerPackets.hpp" + +#ifndef PACKET_FACTORY_HPP_ + #define PACKET_FACTORY_HPP_ + +namespace RType { + + static ECS::Network:: + PacketFactory packetFactory = {{ClientEventType::PLAYER_SPAWN, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer( + aBuffer); + }}, + {ClientEventType::PLAYER_DISCONNECTION, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}, + {ClientEventType::PLAYER_POSITION, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer( + aBuffer); + }}, + {ClientEventType::PLAYER_SHOOT, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}, + {ClientEventType::PLAYER_BONUS, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer( + aBuffer); + }}, + {ClientEventType::PLAYER_DEATH, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}, + {ClientEventType::ENEMY_SPAWN, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer( + aBuffer); + }}, + {ClientEventType::ENEMY_DEATH, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}, + {ClientEventType::ENEMY_SHOOT, + [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}}; +} // namespace RType + +#endif diff --git a/src/client/systems/AddEntity.cpp b/src/client/systems/AddEntity.cpp new file mode 100644 index 00000000..ac41ce2a --- /dev/null +++ b/src/client/systems/AddEntity.cpp @@ -0,0 +1,23 @@ +#include "AddEntity.hpp" +#include "EwECS/World.hpp" + +size_t AddEntity::addEntity(ECS::Utils::Vector2f aPos, Component::Speed aSpeed, Component::TypeEntity aType, + Component::LoadedSprite aSprite, Component::HitBox aHitBox, Component::IsAlive aIsAlive) +{ + ECS::Core::World &world = ECS::Core::World::getInstance(); + auto &vec = world.getComponent(); + auto &spd = world.getComponent(); + auto &type = world.getComponent(); + auto &sprite = world.getComponent(); + auto &hitbox = world.getComponent(); + auto &isAlive = world.getComponent(); + const size_t idx = world.createEntity(); + + vec.insertAt(idx, aPos); + spd.insertAt(idx, aSpeed); + type.insertAt(idx, aType); + sprite.insertAt(idx, aSprite); + hitbox.insertAt(idx, aHitBox); + isAlive.insertAt(idx, aIsAlive); + return idx; +} diff --git a/src/client/systems/AddEntity.hpp b/src/client/systems/AddEntity.hpp new file mode 100644 index 00000000..26cf860b --- /dev/null +++ b/src/client/systems/AddEntity.hpp @@ -0,0 +1,28 @@ +#ifndef ADDENTITY_HPP_ +#define ADDENTITY_HPP_ + +#include "Components.hpp" +#include "EwECS/Physic/HitBox.hpp" +#include "EwECS/SFMLDisplayClass/LoadedSprite.hpp" +#include "EwECS/Utils.hpp" + +class AddEntity +{ + public: + /** + * @brief Create a new entity object + * + * @param aPos Position of the entity + * @param aSpeed Speed of the entity + * @param aType Type of the entity + * @param aSprite Sprite of the entity + * @param aHitBox Hitbox of the entity + * @param aIsAlive IsAlive of the entity + * @return size_t The index of the entity + */ + static size_t addEntity(ECS::Utils::Vector2f aPos, Component::Speed aSpeed, Component::TypeEntity aType, + Component::LoadedSprite aSprite, Component::HitBox aHitBox, + Component::IsAlive aIsAlive); +}; + +#endif /* !ADDENTITY_HPP_ */ diff --git a/src/client/systems/CMakeLists.txt b/src/client/systems/CMakeLists.txt index a6af5548..ec6230e1 100644 --- a/src/client/systems/CMakeLists.txt +++ b/src/client/systems/CMakeLists.txt @@ -1,8 +1,3 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - add_subdirectory(player) add_subdirectory(bot) add_subdirectory(enemy) @@ -13,10 +8,7 @@ add_subdirectory(graphic) target_sources(client PRIVATE System.hpp + AddEntity.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/System.hpp b/src/client/systems/System.hpp index 7a8de381..e187cbc9 100644 --- a/src/client/systems/System.hpp +++ b/src/client/systems/System.hpp @@ -1,14 +1,22 @@ #ifndef SYSTEM_HPP_ #define SYSTEM_HPP_ +#include +#include +#include +#include +#include +#include #include "Components.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Event/WindowEvent.hpp" +#include "EwECS/Music/MusicComponent.hpp" +#include "EwECS/Physic/HitBox.hpp" +#include "EwECS/SFMLDisplayClass/LoadedSprite.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "KeyboardEvent.hpp" -#include "SparseArray.hpp" -#include "Utils.hpp" -#include "WindowEvent.hpp" -#include "World.hpp" -#include "components/HitBox.hpp" namespace ECS { class System @@ -30,18 +38,6 @@ namespace ECS { static void moveBonus(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType); - /** - * @brief Handle the trigger of the bonus - * @param aPos The position of the bonus - * @param aType The type of the bonus - * @param aIsAlive The isAlive of the bonus - * @param aHitBox The hitbox of the bonus - */ - static void triggerBonus(Core::SparseArray &aPos, - Core::SparseArray &aType, - Core::SparseArray &aIsAlive, - Core::SparseArray &aHitBox); - /** * @brief Move the player * @brief Move the player (locally, send to server) @@ -67,34 +63,6 @@ namespace ECS { static void updateBotPosition(Core::SparseArray &aPos, Core::SparseArray &aType); - /** - * @brief Get the all the input of the user (locally) - * - */ - static void getInput(); - - /** - * @brief Close the SDL window (locally) - * - */ - static void quitSDL(); - - /** - * @brief Load all the textures of the game (locally) - * - * @param aSprites SparseArray of all the entities sprites - */ - static void loadTextures(Core::SparseArray &aSprites); - - /** - * @brief Display all the entities on the screen (locally) - * - * @param aSprites SparseArray of all the entities sprites - * @param aPos SparseArray of all the entities position - */ - static void displayEntities(Core::SparseArray &aSprites, - Core::SparseArray &aPos); - /** * @brief Handle the background's movements (locally) * @details Background are the entities with the TypeEntity::isBackground set to true @@ -154,12 +122,10 @@ namespace ECS { /** * @brief Handle enemies who get hit (locally) * - * @param aPos SparseArray of all entities position * @param aType SparseArray of all entities type * @param aHitBox SparseArray of all entities hitbox */ - static void enemyHit(Core::SparseArray &aPos, - Core::SparseArray &aType, + static void enemyHit(Core::SparseArray &aType, Core::SparseArray &aHitBox); /** @@ -183,14 +149,10 @@ namespace ECS { /** * @brief Handle bots who get hit (locally) * - * @param aPos SparseArray of all entities position * @param aType SparseArray of all entities type - * @param aIsAlive SparseArray of all entities isAlive component * @param HitBox SparseArray of all entities hitbox component */ - static void botHit(Core::SparseArray &aPos, - Core::SparseArray &aType, - Core::SparseArray &aIsAlive, + static void botHit(Core::SparseArray &aType, Core::SparseArray &HitBox); /** @@ -208,8 +170,8 @@ namespace ECS { * @brief Handle the death of a bot (triggered by server) * @param aSpeed */ - static void triggerBotBonus(Core::SparseArray &aSpeed, - Core::SparseArray &aType); + static void triggerBonus(Core::SparseArray &aSpeed, + Core::SparseArray &aType); /** * @brief Handle the disconnection of a player (triggered by server) @@ -226,21 +188,13 @@ namespace ECS { * @brief Map of all the SDL_Keycode and their equivalent in our ECS * */ - static const inline std::unordered_map _keyMap = { - {SDLK_ESCAPE, ECS::Event::KeyIdentifier::ESCAPE}, {SDLK_UP, ECS::Event::KeyIdentifier::UP}, - {SDLK_DOWN, ECS::Event::KeyIdentifier::DOWN}, {SDLK_LEFT, ECS::Event::KeyIdentifier::LEFT}, - {SDLK_RIGHT, ECS::Event::KeyIdentifier::RIGHT}, {SDLK_SPACE, ECS::Event::KeyIdentifier::SPACE}, - }; - - /** - * @brief Map of all the SDL_WindowEvent and their equivalent in our ECS - * - */ - static const inline std::unordered_map _windowEventMap = { - {SDL_WINDOWEVENT_CLOSE, ECS::Event::WindowEventType::CLOSED}, - {SDL_WINDOWEVENT_RESIZED, ECS::Event::WindowEventType::RESIZED}, - {SDL_WINDOWEVENT_FOCUS_GAINED, ECS::Event::WindowEventType::FOCUSED}, - {SDL_WINDOWEVENT_FOCUS_LOST, ECS::Event::WindowEventType::UNFOCUSED}, + static const inline std::unordered_map _keyMap = { + {sf::Keyboard::Key::Escape, ECS::Event::KeyIdentifier::ESCAPE}, + {sf::Keyboard::Key::Up, ECS::Event::KeyIdentifier::UP}, + {sf::Keyboard::Key::Down, ECS::Event::KeyIdentifier::DOWN}, + {sf::Keyboard::Key::Left, ECS::Event::KeyIdentifier::LEFT}, + {sf::Keyboard::Key::Right, ECS::Event::KeyIdentifier::RIGHT}, + {sf::Keyboard::Key::Space, ECS::Event::KeyIdentifier::SPACE}, }; }; } // namespace ECS diff --git a/src/client/systems/background/CMakeLists.txt b/src/client/systems/background/CMakeLists.txt index 3f5999aa..bac4929c 100644 --- a/src/client/systems/background/CMakeLists.txt +++ b/src/client/systems/background/CMakeLists.txt @@ -1,15 +1,6 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE System+CreateBackground.cpp System+MoveBackground.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/background/System+CreateBackground.cpp b/src/client/systems/background/System+CreateBackground.cpp index a8309baf..726dd339 100644 --- a/src/client/systems/background/System+CreateBackground.cpp +++ b/src/client/systems/background/System+CreateBackground.cpp @@ -1,38 +1,42 @@ #include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::createBackground() { auto &world = ECS::Core::World::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - - if (gameEvent.getType() == RType::ClientEventType::PLAYER_SPAWN) { - bool isLocalPlayer = gameEvent.getPayload()[1] == 1; + for (auto &gameEvent : events) { + if (gameEvent.getType() != RType::ClientEventType::PLAYER_SPAWN) { + continue; + } + const auto &payload = gameEvent.getPayload(); - if (isLocalPlayer) { - display.freeRects(0); - world.killEntity(0); - display.addEntity(ECS::Utils::Vector2f {0, 0}, Component::Speed {BACKGROUND_SPEED}, - Component::TypeEntity {false, false, false, false, false, false, true}, - Component::LoadedSprite {BACKGROUND_ASSET, nullptr, nullptr, - new SDL_Rect {400, 15, SCREEN_WIDTH, SCREEN_HEIGHT}}, - Component::HitBox {}, Component::IsAlive {false, 0}); - display.addEntity(ECS::Utils::Vector2f {SCREEN_WIDTH, 0}, Component::Speed {BACKGROUND_SPEED}, - Component::TypeEntity {false, false, false, false, false, false, true}, - Component::LoadedSprite {BACKGROUND_ASSET, nullptr, nullptr, - new SDL_Rect {400, 15, SCREEN_WIDTH, SCREEN_HEIGHT}}, - Component::HitBox {}, Component::IsAlive {false, 0}); + if (payload.isReceiver) { + world.killEntity(0); + try { + auto idx = + AddEntity::addEntity(ECS::Utils::Vector2f {0, 0}, Component::Speed {BACKGROUND_SPEED}, + Component::TypeEntity {false, false, false, false, false, false, true}, + Component::LoadedSprite {"config/background.json"}, Component::HitBox {}, + Component::IsAlive {false, 0}); + AddEntity::addEntity(ECS::Utils::Vector2f {SCREEN_WIDTH, 0}, Component::Speed {BACKGROUND_SPEED}, + Component::TypeEntity {false, false, false, false, false, false, true}, + Component::LoadedSprite {"config/background2.json"}, Component::HitBox {}, + Component::IsAlive {false, 0}); + world.emplaceEntityComponent(idx, "assets/sounds/rtype.mp3", 100, true); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); } } } diff --git a/src/client/systems/background/System+MoveBackground.cpp b/src/client/systems/background/System+MoveBackground.cpp index 01e295bb..3eb7e482 100644 --- a/src/client/systems/background/System+MoveBackground.cpp +++ b/src/client/systems/background/System+MoveBackground.cpp @@ -1,21 +1,28 @@ -#include "SDLDisplayClass.hpp" +#include +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::moveBackground(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto deltaTime = Core::World::getInstance().getDeltaTime(); + const auto size = aType.size(); - for (size_t i = 0; i < aType.size(); i++) { - if (!aType[i].has_value() || !aType[i].value().isBackground) { + for (size_t i = 0; i < size; i++) { + if (!aType[i].has_value() || !aType[i].value().isBackground || !aPos[i].has_value() + || !aSpeed[i].has_value()) { continue; } - aPos[i].value().x -= aSpeed[i].value().speed * deltaTime; - if (aPos[i].value().x <= -SCREEN_WIDTH) { - aPos[i].value().x = SCREEN_WIDTH; + + auto &pos = aPos[i].value(); + auto &speed = aSpeed[i].value().speed; + + pos.x -= speed * deltaTime; + if (pos.x <= -SCREEN_WIDTH) { + pos.x = SCREEN_WIDTH; } } } diff --git a/src/client/systems/bonus/CMakeLists.txt b/src/client/systems/bonus/CMakeLists.txt index 0026ddcf..5599716e 100644 --- a/src/client/systems/bonus/CMakeLists.txt +++ b/src/client/systems/bonus/CMakeLists.txt @@ -1,15 +1,6 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE - System+TriggerBonus.cpp System+MoveBonus.cpp + System+TriggerBonus.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/bonus/System+MoveBonus.cpp b/src/client/systems/bonus/System+MoveBonus.cpp index 4aa58b11..a87e55c0 100644 --- a/src/client/systems/bonus/System+MoveBonus.cpp +++ b/src/client/systems/bonus/System+MoveBonus.cpp @@ -1,25 +1,27 @@ #include "../System.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::moveBonus(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto &world = Core::World::getInstance(); + const auto size = aType.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { - if (!aPos[idx].has_value()) { + for (size_t idx = 0; idx < size; idx++) { + if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { continue; } + auto &pos = aPos[idx].value(); auto &speed = aSpeed[idx].value(); auto &type = aType[idx].value(); + if (type.isBonus) { pos.x -= speed.speed * world.getDeltaTime(); if (pos.x < -30) { - SDLDisplayClass::getInstance().freeRects(idx); world.killEntity(idx); } } diff --git a/src/client/systems/bonus/System+TriggerBonus.cpp b/src/client/systems/bonus/System+TriggerBonus.cpp index 0f9f4b8b..f08c0638 100644 --- a/src/client/systems/bonus/System+TriggerBonus.cpp +++ b/src/client/systems/bonus/System+TriggerBonus.cpp @@ -1,45 +1,48 @@ -#include -#include #include -#include "ClientHandler.hpp" -#include "Packets.hpp" -#include "SDLDisplayClass.hpp" +#include "ClientGameEvent.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" +#include "IsAlive.hpp" +#include "ServerPackets.hpp" #include "System.hpp" +#include "TypeUtils.hpp" +#include "Values.hpp" namespace ECS { - void System::triggerBonus(Core::SparseArray &aPos, Core::SparseArray &aType, - Core::SparseArray &aIsAlive, - Core::SparseArray &aHitBox) + void System::triggerBonus(Core::SparseArray &aSpeed, + Core::SparseArray &aType) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); - auto &client = Network::ClientHandler::getInstance(); + Event::EventManager *eventManager = Event::EventManager::getInstance(); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); - for (size_t bonus = 0; bonus < aType.size(); bonus++) { - if (!aType[bonus].has_value() || !aType[bonus].value().isBonus) { + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; + + if (gameEvent.getType() != RType::ClientEventType::PLAYER_BONUS) { continue; } - for (size_t player = 0; player < aPos.size(); player++) { - if (!aType[player].has_value() || !aType[player].value().isPlayer) { - continue; - } - if ((aPos[bonus].value().x > aPos[player].value().x - && aPos[bonus].value().x < aPos[player].value().x + aHitBox[player].value().width - && aPos[bonus].value().y > aPos[player].value().y - && aPos[bonus].value().y < aPos[player].value().y + aHitBox[player].value().height) - || (aPos[bonus].value().x + aHitBox[bonus].value().width > aPos[player].value().x - && aPos[bonus].value().x + aHitBox[bonus].value().width - < aPos[player].value().x + aHitBox[player].value().width - && aPos[bonus].value().y > aPos[player].value().y - && aPos[bonus].value().y < aPos[player].value().y + aHitBox[player].value().height)) { - aIsAlive[bonus].value().isAlive = false; - display.freeRects(bonus); - RType::Packet packet(static_cast(RType::ServerEventType::BONUS), {1}); - client.send(packet); - world.killEntity(bonus); - break; - } + + const auto &payload = gameEvent.getPayload(); + + auto localPlayerId = RType::TypeUtils::getEntityIdByOnlineId(aType, payload.playerId); + + if (!aSpeed[localPlayerId].has_value()) { + continue; } + + aSpeed[localPlayerId].value().speed *= BONUS_GAIN_FACTOR; + + auto localBonusId = RType::TypeUtils::getEntityIdByOnlineId(aType, payload.bonusId); + + world.killEntity(localBonusId); + + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } -} // namespace ECS +} // namespace ECS \ No newline at end of file diff --git a/src/client/systems/bot/CMakeLists.txt b/src/client/systems/bot/CMakeLists.txt index a0e4a20d..da5f9c13 100644 --- a/src/client/systems/bot/CMakeLists.txt +++ b/src/client/systems/bot/CMakeLists.txt @@ -1,20 +1,10 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE System+CreateBot.cpp System+UpdateBotPosition.cpp System+TriggerBotShoot.cpp System+BotHit.cpp System+TriggerBotDeath.cpp - System+TriggerBotBonus.cpp System+TriggerBotDisconnect.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/bot/System+BotHit.cpp b/src/client/systems/bot/System+BotHit.cpp index 762123da..8447c451 100644 --- a/src/client/systems/bot/System+BotHit.cpp +++ b/src/client/systems/bot/System+BotHit.cpp @@ -1,33 +1,35 @@ #include -#include "SDLDisplayClass.hpp" -#include "SparseArray.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/SparseArray.hpp" #include "System.hpp" -#include "components/HitBox.hpp" #include "components/IsAlive.hpp" -#include namespace ECS { - void System::botHit(Core::SparseArray &aPos, Core::SparseArray &aType, - Core::SparseArray &aIsAlive, Core::SparseArray &aHitBox) + void System::botHit(Core::SparseArray &aType, Core::SparseArray &aHitBox) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); + auto &display = SFMLDisplayClass::getInstance(); + const auto size = aHitBox.size(); - for (size_t player = 0; player < aType.size(); player++) { - if (!aType[player].has_value() || !aType[player].value().isPlayer) { + for (size_t player = 0; player < size; player++) { + if (!aType[player].has_value() || !aType[player].value().isPlayer || !aHitBox[player].has_value()) { continue; } - for (size_t missileId = 0; missileId < aPos.size(); missileId++) { - if (!aType[missileId].has_value() || !aType[missileId].value().isBullet) { + + auto &hitBoxPlayer = aHitBox[player].value(); + + if (!hitBoxPlayer.isColliding) { + continue; + } + + auto &colliders = hitBoxPlayer.collidingId; + + for (auto &collider : colliders) { + if (!aType[collider].has_value() || !aType[collider].value().isEnemyMissile) { continue; } - if ((aPos[missileId].value().x > aPos[player].value().x - && aPos[missileId].value().x < aPos[player].value().x + aHitBox[player].value().width - && aPos[missileId].value().y > aPos[player].value().y - && aPos[missileId].value().y < aPos[player].value().y + aHitBox[player].value().height)) { - display.freeRects(missileId); - world.killEntity(missileId); - } + + world.killEntity(collider); } } } diff --git a/src/client/systems/bot/System+CreateBot.cpp b/src/client/systems/bot/System+CreateBot.cpp index 257b6bf8..14a93d62 100644 --- a/src/client/systems/bot/System+CreateBot.cpp +++ b/src/client/systems/bot/System+CreateBot.cpp @@ -1,6 +1,11 @@ +#include +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" @@ -8,43 +13,38 @@ namespace ECS { void System::createBot() { Event::EventManager *eventManager = Event::EventManager::getInstance(); - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); - - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - - if (gameEvent.getType() == RType::ClientEventType::PLAYER_SPAWN) { - if (gameEvent.getPayload().size() != 5) { - eventManager->removeEvent(event); - continue; - } - - size_t onlineEntityId = static_cast(gameEvent.getPayload()[0]); - Component::TypeEntity entityType {false, true, false, false, false, false, false, onlineEntityId}; - - bool isLocalPlayer = gameEvent.getPayload()[1] == 1; - if (isLocalPlayer) { - entityType.isPlayer = true; - entityType.isBot = false; - } - - int color = static_cast(gameEvent.getPayload()[2]); - float posX = gameEvent.getPayload()[3]; - float posY = gameEvent.getPayload()[4]; - std::cout << "Player with color " << color << " joined" << std::endl; - - display.addEntity(ECS::Utils::Vector2f {posX, posY}, Component::Speed {PLAYER_SPEED}, entityType, - Component::LoadedSprite { - PLAYER_ASSET, nullptr, - new SDL_Rect {0, color * PLAYER_TEX_HEIGHT, PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}, - new SDL_Rect {0, 0, PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}}, - Component::HitBox {PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}, - Component::IsAlive {true, 0}); - - eventManager->removeEvent(event); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); + + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; + + if (gameEvent.getType() != RType::ClientEventType::PLAYER_SPAWN) { + continue; + } + + const auto &payload = gameEvent.getPayload(); + + Component::TypeEntity entityType {false, true, false, false, false, false, false, payload.playerId, false}; + + if (payload.isReceiver) { + entityType.isPlayer = true; + entityType.isBot = false; } + + std::string path = "config/player_" + std::to_string(payload.playerColor + 1) + ".json"; + + try { + AddEntity::addEntity(ECS::Utils::Vector2f {payload.posX, payload.posY}, Component::Speed {PLAYER_SPEED}, + entityType, Component::LoadedSprite {path}, + Component::HitBox {PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}, + Component::IsAlive {true, 0}); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); + } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } - -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/client/systems/bot/System+TriggerBotBonus.cpp b/src/client/systems/bot/System+TriggerBotBonus.cpp deleted file mode 100644 index 8b5ee0ca..00000000 --- a/src/client/systems/bot/System+TriggerBotBonus.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "System.hpp" -#include "TypeUtils.hpp" - -namespace ECS { - void System::triggerBotBonus(Core::SparseArray &aSpeed, - Core::SparseArray &aType) - { - Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); - auto &typeUtils = RType::TypeUtils::getInstance(); - - for (auto &event : events) { - auto &gameEvent = dynamic_cast(*event); - - if (gameEvent.getType() == RType::ClientEventType::PLAYER_BONUS) { - if (gameEvent.getPayload().size() != 2) { - eventManager->removeEvent(event); - continue; - } - - std::size_t const onlineBotId = static_cast(gameEvent.getPayload()[0]); - std::size_t const localBotId = typeUtils.getEntityIdByOnlineId(aType, onlineBotId); - float const type = gameEvent.getPayload()[1]; - - if (type == 1) { - if (!aSpeed[localBotId].has_value()) { - eventManager->removeEvent(event); - continue; - } - aSpeed[localBotId].value().speed += static_cast(10); - } - eventManager->removeEvent(event); - } - } - } -} // namespace ECS \ No newline at end of file diff --git a/src/client/systems/bot/System+TriggerBotDeath.cpp b/src/client/systems/bot/System+TriggerBotDeath.cpp index 2a9fda01..7ce403e1 100644 --- a/src/client/systems/bot/System+TriggerBotDeath.cpp +++ b/src/client/systems/bot/System+TriggerBotDeath.cpp @@ -1,11 +1,12 @@ +#include #include "ClientGameEvent.hpp" -#include "EventManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" #include "IsAlive.hpp" -#include "SDLDisplayClass.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "TypeUtils.hpp" #include "Values.hpp" -#include namespace ECS { void System::triggerBotDeath(Core::SparseArray &aType, @@ -13,52 +14,63 @@ namespace ECS { Core::SparseArray &aSprites) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; // Receive death event from server - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < events.size(); i++) { + auto &gameEvent = events[i]; - if (gameEvent.getType() == RType::ClientEventType::PLAYER_DEATH) { - if (gameEvent.getPayload().size() != 1) { - eventManager->removeEvent(event); - continue; - } + if (gameEvent.getType() != RType::ClientEventType::PLAYER_DEATH) { + continue; + } - size_t onlineBotId = static_cast(gameEvent.getPayload()[0]); - size_t localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, onlineBotId); - if (!aIsAlive[localBotId].has_value()) { - eventManager->removeEvent(event); - continue; - } + const auto &payload = gameEvent.getPayload(); - aIsAlive[localBotId].value().isAlive = false; + const auto localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, payload.playerId); - eventManager->removeEvent(event); + if (!aIsAlive[localBotId].has_value()) { + toRemove.push_back(i); + continue; } + + aIsAlive[localBotId].value().isAlive = false; + + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); // Explosion + entity removal - for (size_t botId = 0; botId < aType.size(); botId++) { - if (!aType[botId].has_value() || (!aType[botId].value().isBot && !aType[botId].value().isPlayer)) { + const auto size = aType.size(); + + for (size_t botId = 0; botId < size; botId++) { + if (!aType[botId].has_value() || (!aType[botId].value().isBot && !aType[botId].value().isPlayer) + || !aIsAlive[botId].has_value() || !aSprites[botId].has_value()) { continue; } - if (!aIsAlive[botId].value().isAlive && aIsAlive[botId].value().timeToDie < 0) { - std::cout << "Bot " << aType[botId].value().onlineId.value_or(0) << " killed" << std::endl; - display.freeRects(botId); + + auto &sprite = aSprites[botId].value(); + auto &isAlive = aIsAlive[botId].value(); + auto &type = aType[botId].value(); + + if (!isAlive.isAlive && isAlive.timeToDie < 0) { world.killEntity(botId); - } else if (!aIsAlive[botId].value().isAlive && aIsAlive[botId].value().timeToDie == 0) { - aSprites[botId].value().path = EXPLOSION_ASSET; - aSprites[botId].value().texture = nullptr; - aSprites[botId].value().rect->h = EXPLOSION_TEX_HEIGHT; - aSprites[botId].value().rect->w = EXPLOSION_TEX_WIDTH; - aSprites[botId].value().rect->x = 146; - aSprites[botId].value().rect->y = 46; - aIsAlive[botId].value().timeToDie = 1; - } else if (!aIsAlive[botId].value().isAlive) { - aIsAlive[botId].value().timeToDie -= world.getDeltaTime(); + } else if (!isAlive.isAlive && isAlive.timeToDie == 0) { + sprite.path = EXPLOSION_ASSET; + sprite.texture = nullptr; + type.isBot = true; + type.isPlayer = false; + for (size_t i = 0; i < sprite.rect.size(); i++) { + sprite.rect[i].height = EXPLOSION_TEX_HEIGHT; + sprite.rect[i].width = EXPLOSION_TEX_WIDTH; + sprite.rect[i].left = 146 * (i + 1); + sprite.rect[i].top = 46; + sprite.rectTime[i] = 0.2; + } + isAlive.timeToDie = 1; + } else if (!isAlive.isAlive) { + isAlive.timeToDie -= world.getDeltaTime(); } } } diff --git a/src/client/systems/bot/System+TriggerBotDisconnect.cpp b/src/client/systems/bot/System+TriggerBotDisconnect.cpp index 7aef5986..4073a29f 100644 --- a/src/client/systems/bot/System+TriggerBotDisconnect.cpp +++ b/src/client/systems/bot/System+TriggerBotDisconnect.cpp @@ -1,5 +1,7 @@ +#include #include "ClientGameEvent.hpp" -#include "EventManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "TypeUtils.hpp" @@ -8,27 +10,28 @@ namespace ECS { { auto &world = Core::World::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - if (gameEvent.getType() == RType::ClientEventType::PLAYER_DISCONNECTION) { - if (gameEvent.getPayload().size() != 1) { - eventManager->removeEvent(event); - continue; - } - size_t onlineBotId = static_cast(gameEvent.getPayload()[0]); - size_t localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, onlineBotId); - if (!aType[localBotId].has_value()) { - eventManager->removeEvent(event); - continue; - } - world.killEntity(localBotId); + if (gameEvent.getType() != RType::ClientEventType::PLAYER_DISCONNECTION) { + continue; + } + + const auto &payload = gameEvent.getPayload(); + + const auto localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, payload.playerId); - eventManager->removeEvent(event); - std::cout << "Player " << onlineBotId << " disconnected" << std::endl; + if (!aType[localBotId].has_value()) { + toRemove.push_back(i); + continue; } + world.killEntity(localBotId); + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/client/systems/bot/System+TriggerBotShoot.cpp b/src/client/systems/bot/System+TriggerBotShoot.cpp index 876ba636..ba2fba17 100644 --- a/src/client/systems/bot/System+TriggerBotShoot.cpp +++ b/src/client/systems/bot/System+TriggerBotShoot.cpp @@ -1,41 +1,48 @@ +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/Sound/Sound.hpp" +#include "EwECS/Sound/SoundComponent.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "SDLDisplayClass.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::triggerBotShoot() { - auto &display = SDLDisplayClass::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); + auto &world = Core::World::getInstance(); - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - if (gameEvent.getType() == RType::ClientEventType::PLAYER_SHOOT) { - if (gameEvent.getPayload().size() != 3) { - eventManager->removeEvent(event); - continue; - } - size_t onlineBulletId = static_cast(gameEvent.getPayload()[0]); - float posX = gameEvent.getPayload()[1]; - auto posY = gameEvent.getPayload()[2]; + if (gameEvent.getType() != RType::ClientEventType::PLAYER_SHOOT) { + continue; + } - display.addEntity( - ECS::Utils::Vector2f {posX, posY}, Component::Speed {BULLET_SPEED}, - Component::TypeEntity {false, false, false, true, false, false, false, onlineBulletId}, - Component::LoadedSprite {BULLET_ASSET, nullptr, - new SDL_Rect {207, 10, BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}, - new SDL_Rect {0, 0, BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}}, - Component::HitBox {BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}, Component::IsAlive {false, 0}); + const auto &payload = gameEvent.getPayload(); - eventManager->removeEvent(event); + try { + auto entity_id = AddEntity::addEntity( + ECS::Utils::Vector2f {payload.posX, payload.posY}, Component::Speed {BULLET_SPEED}, + Component::TypeEntity {false, false, false, true, false, false, false, payload.bulletId, false}, + Component::LoadedSprite {"config/missiles.json"}, + Component::HitBox {BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}, Component::IsAlive {false, 0}); + world.emplaceEntityComponent(entity_id, "assets/sounds/pew.mp3", 40, false); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS \ No newline at end of file diff --git a/src/client/systems/bot/System+UpdateBotPosition.cpp b/src/client/systems/bot/System+UpdateBotPosition.cpp index a8bbad6d..2eef1228 100644 --- a/src/client/systems/bot/System+UpdateBotPosition.cpp +++ b/src/client/systems/bot/System+UpdateBotPosition.cpp @@ -1,6 +1,8 @@ +#include #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "TypeUtils.hpp" @@ -9,32 +11,33 @@ namespace ECS { Core::SparseArray &aType) { Event::EventManager *eventManager = Event::EventManager::getInstance(); - ; - auto events = eventManager->getEventsByType(Event::EventType::GAME); - - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - - if (gameEvent.getType() == RType::ClientEventType::PLAYER_POSITION) { - if (gameEvent.getPayload().size() != 3) { - eventManager->removeEvent(event); - continue; - } - std::size_t onlineBotId = static_cast(gameEvent.getPayload()[0]); - float posX = gameEvent.getPayload()[1]; - float posY = gameEvent.getPayload()[2]; - - size_t localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, onlineBotId); - if (!aPos[localBotId].has_value()) { - eventManager->removeEvent(event); - continue; - } - aPos[localBotId].value().x = posX; - aPos[localBotId].value().y = posY; - - eventManager->removeEvent(event); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); + + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; + + if (gameEvent.getType() != RType::ClientEventType::PLAYER_POSITION) { + continue; + } + + const auto &payload = gameEvent.getPayload(); + + const auto localBotId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, payload.playerId); + + if (!aPos[localBotId].has_value()) { + toRemove.push_back(i); + continue; } + + auto &posLocal = aPos[localBotId].value(); + + posLocal.x = payload.posX; + posLocal.y = payload.posY; + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS \ No newline at end of file diff --git a/src/client/systems/enemy/CMakeLists.txt b/src/client/systems/enemy/CMakeLists.txt index 9670b528..317b6b65 100644 --- a/src/client/systems/enemy/CMakeLists.txt +++ b/src/client/systems/enemy/CMakeLists.txt @@ -1,8 +1,3 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE System+CreateEnemy.cpp System+MoveEnemy.cpp @@ -12,7 +7,3 @@ target_sources(client PRIVATE ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/enemy/System+CreateEnemy.cpp b/src/client/systems/enemy/System+CreateEnemy.cpp index b2774a60..fd866389 100644 --- a/src/client/systems/enemy/System+CreateEnemy.cpp +++ b/src/client/systems/enemy/System+CreateEnemy.cpp @@ -1,39 +1,41 @@ +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" - namespace ECS { void System::createEnemy() { Event::EventManager *eventManager = Event::EventManager::getInstance(); - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + std::vector toRemove; + const auto size = events.size(); + + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + if (gameEvent.getType() != RType::ClientEventType::ENEMY_SPAWN) { + continue; + } - if (gameEvent.getType() == RType::ClientEventType::ENEMY_SPAWN) { - if (gameEvent.getPayload().size() != 3) { - eventManager->removeEvent(event); - continue; - } - std::size_t onlineEntityId = static_cast(gameEvent.getPayload()[0]); - float posX = gameEvent.getPayload()[1]; - float posY = gameEvent.getPayload()[2]; + const auto &payload = gameEvent.getPayload(); - display.addEntity( - ECS::Utils::Vector2f {posX, posY}, Component::Speed {ENEMY_SPEED}, - Component::TypeEntity {false, false, true, false, false, false, false, onlineEntityId}, - Component::LoadedSprite {ENEMY_ASSET, nullptr, - new SDL_Rect {0, 0, ENEMY_TEX_WIDTH, ENEMY_TEX_HEIGHT}, - new SDL_Rect {0, 0, ENEMY_TEX_WIDTH, ENEMY_TEX_HEIGHT}}, + try { + AddEntity::addEntity( + ECS::Utils::Vector2f {payload.posX, payload.posY}, Component::Speed {ENEMY_SPEED}, + Component::TypeEntity {false, false, true, false, false, false, false, payload.enemyId, false}, + Component::LoadedSprite {"config/enemy.json"}, Component::HitBox {ENEMY_TEX_WIDTH, ENEMY_TEX_HEIGHT}, Component::IsAlive {true, 0}); - - eventManager->removeEvent(event); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/client/systems/enemy/System+EnemyHit.cpp b/src/client/systems/enemy/System+EnemyHit.cpp index af5bbe1c..fe7063bd 100644 --- a/src/client/systems/enemy/System+EnemyHit.cpp +++ b/src/client/systems/enemy/System+EnemyHit.cpp @@ -1,32 +1,33 @@ -#include "SDLDisplayClass.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" #include "System.hpp" #include "Values.hpp" -#include namespace ECS { - void System::enemyHit(Core::SparseArray &aPos, Core::SparseArray &aType, + void System::enemyHit(Core::SparseArray &aType, Core::SparseArray &aHitBox) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); + const auto size = aHitBox.size(); - for (size_t enemy = 0; enemy < aType.size(); enemy++) { - if (!aType[enemy].has_value() || !aType[enemy].value().isEnemy) { + for (size_t enemy = 0; enemy < size; enemy++) { + if (!aType[enemy].has_value() || !aType[enemy].value().isEnemy || !aHitBox[enemy].has_value()) { continue; } - for (size_t bullet = 0; bullet < aPos.size(); bullet++) { - if (!aType[bullet].has_value() || !aType[bullet].value().isBullet) { + + auto &hitBoxEnemy = aHitBox[enemy].value(); + + if (!hitBoxEnemy.isColliding) { + continue; + } + + auto &colliders = hitBoxEnemy.collidingId; + + for (auto &collider : colliders) { + if (!aType[collider].has_value() || !aType[collider].value().isBullet) { continue; } - if (aPos[bullet].value().x > aPos[enemy].value().x - && aPos[bullet].value().x < aPos[enemy].value().x + aHitBox[enemy].value().width - && aPos[bullet].value().y > aPos[enemy].value().y - && aPos[bullet].value().y < aPos[enemy].value().y + aHitBox[enemy].value().height) { - display.freeRects(bullet); - world.killEntity(bullet); - break; - } + world.killEntity(collider); } } } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/client/systems/enemy/System+MoveEnemy.cpp b/src/client/systems/enemy/System+MoveEnemy.cpp index 709610b3..b466cfca 100644 --- a/src/client/systems/enemy/System+MoveEnemy.cpp +++ b/src/client/systems/enemy/System+MoveEnemy.cpp @@ -1,29 +1,31 @@ -#include "SDLDisplayClass.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" #include "System.hpp" -#include "World.hpp" +#include "Values.hpp" namespace ECS { void System::moveEnemy(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); + auto &display = SFMLDisplayClass::getInstance(); + const auto size = aPos.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { - if (!aPos[idx].has_value()) { + for (size_t idx = 0; idx < size; idx++) { + if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { continue; } + auto &pos = aPos[idx].value(); auto &speed = aSpeed[idx].value(); auto &type = aType[idx].value(); + if (type.isEnemy) { pos.x -= speed.speed * world.getDeltaTime(); - if (pos.x < -30) { - display.freeRects(idx); + if (pos.x < -ENEMY_TEX_WIDTH) { world.killEntity(idx); } } } } - } // namespace ECS diff --git a/src/client/systems/enemy/System+TriggerEnemyDeath.cpp b/src/client/systems/enemy/System+TriggerEnemyDeath.cpp index 228d155f..e9904f48 100644 --- a/src/client/systems/enemy/System+TriggerEnemyDeath.cpp +++ b/src/client/systems/enemy/System+TriggerEnemyDeath.cpp @@ -1,13 +1,17 @@ +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "HitBox.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/Sound/SoundComponent.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "SDLDisplayClass.hpp" +#include "SFML/Graphics/Rect.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "TypeUtils.hpp" #include "Values.hpp" -#include "World.hpp" -#include namespace ECS { void System::triggerEnemyDeath(Core::SparseArray &aType, @@ -16,60 +20,75 @@ namespace ECS { Core::SparseArray &aPos) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; // Receive death event from server - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - if (gameEvent.getType() == RType::ClientEventType::ENEMY_DEATH) { - if (gameEvent.getPayload().size() != 1) { - eventManager->removeEvent(event); - continue; - } - size_t onlineEnemyId = static_cast(gameEvent.getPayload()[0]); - size_t localEnemyId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, onlineEnemyId); - if (!aIsAlive[localEnemyId].has_value()) { - eventManager->removeEvent(event); - continue; - } - aIsAlive[localEnemyId].value().isAlive = false; + if (gameEvent.getType() != RType::ClientEventType::ENEMY_DEATH) { + continue; + } + + const auto &payload = gameEvent.getPayload(); + + const auto localEnemyId = RType::TypeUtils::getInstance().getEntityIdByOnlineId(aType, payload.enemyId); + + if (!aIsAlive[localEnemyId].has_value()) { + toRemove.push_back(i); + continue; + } + aIsAlive[localEnemyId].value().isAlive = false; - eventManager->removeEvent(event); + if (aPos[localEnemyId].has_value()) { + try { + auto idx = AddEntity::addEntity( + ECS::Utils::Vector2f {aPos[localEnemyId].value().x, aPos[localEnemyId].value().y}, + Component::Speed {BONUS_SPEED}, + Component::TypeEntity {false, false, false, false, false, true, false, payload.bonusId, false}, + Component::LoadedSprite {"config/bonus.json"}, + Component::HitBox {BONUS_TEX_WIDTH, BONUS_TEX_HEIGHT}, Component::IsAlive {false, 0}); + world.emplaceEntityComponent(idx, "assets/sounds/enemy_explosion.mp3", + 20, false); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); + } } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); // Explosion + entity removal - for (size_t enemy = 0; enemy < aType.size(); enemy++) { - if (!aType[enemy].has_value() || !aType[enemy].value().isEnemy) { + const auto typeSize = aType.size(); + + for (size_t enemy = 0; enemy < typeSize; enemy++) { + if (!aType[enemy].has_value() || !aType[enemy].value().isEnemy || !aIsAlive[enemy].has_value() + || !aSprites[enemy].has_value() || !aPos[enemy].has_value()) { continue; } - if (!aIsAlive[enemy].value().isAlive && aIsAlive[enemy].value().timeToDie < 0) { - std::cout << "Enemy " << aType[enemy].value().onlineId.value_or(0) << " killed" << std::endl; - display.freeRects(enemy); + + auto &sprite = aSprites[enemy].value(); + auto &isAlive = aIsAlive[enemy].value(); + + if (!isAlive.isAlive && isAlive.timeToDie < 0) { world.killEntity(enemy); - } else if (!aIsAlive[enemy].value().isAlive && aIsAlive[enemy].value().timeToDie == 0) { - aSprites[enemy].value().path = EXPLOSION_ASSET; - aSprites[enemy].value().texture = nullptr; - aSprites[enemy].value().rect->h = EXPLOSION_TEX_HEIGHT; - aSprites[enemy].value().rect->w = EXPLOSION_TEX_WIDTH; - aSprites[enemy].value().rect->x = 146; - aSprites[enemy].value().rect->y = 46; - aIsAlive[enemy].value().timeToDie = 1; - if (rand() % 5 == 0) { - display.addEntity( - ECS::Utils::Vector2f {aPos[enemy].value().x, aPos[enemy].value().y}, - Component::Speed {BONUS_SPEED}, - Component::TypeEntity {false, false, false, false, false, true, false}, - Component::LoadedSprite {BONUS_ASSET, nullptr, - new SDL_Rect {125, 520, BONUS_TEX_WIDTH, BONUS_TEX_HEIGHT}, - new SDL_Rect {0, 0, 50, 50}}, - Component::HitBox {BONUS_TEX_WIDTH, BONUS_TEX_HEIGHT}, Component::IsAlive {false, 0}); + } else if (!isAlive.isAlive && isAlive.timeToDie == 0) { + sprite.path = EXPLOSION_ASSET; + sprite.texture = nullptr; + for (size_t i = 0; i < sprite.rect.size(); i++) { + sprite.rect[i].height = EXPLOSION_TEX_HEIGHT; + sprite.rect[i].width = EXPLOSION_TEX_WIDTH; + sprite.rect[i].left = 146 * (i + 1); + sprite.rect[i].top = 46; + sprite.rectTime[i] = 0.2; } - } else if (!aIsAlive[enemy].value().isAlive) { - aIsAlive[enemy].value().timeToDie -= world.getDeltaTime(); + isAlive.timeToDie = 1; + + } else if (!isAlive.isAlive) { + isAlive.timeToDie -= world.getDeltaTime(); } } } diff --git a/src/client/systems/enemy/System+TriggerEnemyShoot.cpp b/src/client/systems/enemy/System+TriggerEnemyShoot.cpp index 3b40de90..e5952099 100644 --- a/src/client/systems/enemy/System+TriggerEnemyShoot.cpp +++ b/src/client/systems/enemy/System+TriggerEnemyShoot.cpp @@ -1,41 +1,45 @@ +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/Sound/SoundComponent.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "SDLDisplayClass.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::triggerEnemyShoot() { - auto &display = SDLDisplayClass::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; + auto &world = Core::World::getInstance(); - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; + if (gameEvent.getType() != RType::ClientEventType::ENEMY_SHOOT) { + continue; + } - if (gameEvent.getType() == RType::ClientEventType::ENEMY_SHOOT) { - if (gameEvent.getPayload().size() != 3) { - eventManager->removeEvent(event); - continue; - } - std::size_t onlineMissileId = static_cast(gameEvent.getPayload()[0]); - float posX = gameEvent.getPayload()[1]; - auto posY = gameEvent.getPayload()[2]; + const auto &payload = gameEvent.getPayload(); - display.addEntity( - ECS::Utils::Vector2f {posX, posY}, Component::Speed {MISSILES_SPEED}, - Component::TypeEntity {false, false, false, true, false, false, false, onlineMissileId}, - Component::LoadedSprite {MISSILES_ASSET, nullptr, - new SDL_Rect {304, 10, MISSILES_TEX_WIDTH, MISSILES_TEX_HEIGHT}, - new SDL_Rect {0, 0, MISSILES_TEX_WIDTH, MISSILES_TEX_HEIGHT}}, + try { + auto idx = AddEntity::addEntity( + ECS::Utils::Vector2f {payload.posX, payload.posY}, Component::Speed {MISSILES_SPEED}, + Component::TypeEntity {false, false, false, false, false, false, false, payload.bulletId, true}, + Component::LoadedSprite {"config/bullet.json"}, Component::HitBox {MISSILES_TEX_WIDTH, MISSILES_TEX_HEIGHT}, Component::IsAlive {false, 0}); - - eventManager->removeEvent(event); + world.emplaceEntityComponent(idx, "assets/sounds/shot.mp3", 20, false); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/client/systems/graphic/CMakeLists.txt b/src/client/systems/graphic/CMakeLists.txt index e5ae98bd..1ccbe46c 100644 --- a/src/client/systems/graphic/CMakeLists.txt +++ b/src/client/systems/graphic/CMakeLists.txt @@ -1,18 +1,5 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE - System+DisplayEntities.cpp - System+GetInput.cpp - System+LoadTextures.cpp - System+SDLQuit.cpp System+CreateServerFullErrorMessage.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/graphic/System+CreateServerFullErrorMessage.cpp b/src/client/systems/graphic/System+CreateServerFullErrorMessage.cpp index 27d65dd8..76903ee3 100644 --- a/src/client/systems/graphic/System+CreateServerFullErrorMessage.cpp +++ b/src/client/systems/graphic/System+CreateServerFullErrorMessage.cpp @@ -1,37 +1,43 @@ #include +#include +#include "AddEntity.hpp" #include "ClientGameEvent.hpp" -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::createServerFullErrorMessage() { auto &world = ECS::Core::World::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + SFMLDisplayClass &display = SFMLDisplayClass::getInstance(); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - if (gameEvent.getType() == RType::ClientEventType::SERVER_FULL) { - display.freeRects(0); - world.killEntity(0); - std::cout << "Server is full" << std::endl; - display.addEntity(ECS::Utils::Vector2f {SCREEN_WIDTH / 2 - SERVER_FULL_MESSAGE_TEX_WIDTH / 2, - SCREEN_HEIGHT / 2 - SERVER_FULL_MESSAGE_TEX_HEIGHT / 2}, - Component::Speed {0}, - Component::TypeEntity {false, false, false, false, false, false, true}, - Component::LoadedSprite {SERVER_FULL_MESSAGE, nullptr, nullptr, - new SDL_Rect {400, 15, SERVER_FULL_MESSAGE_TEX_WIDTH, - SERVER_FULL_MESSAGE_TEX_HEIGHT}}, - Component::HitBox {}, Component::IsAlive {false, 0}); - - eventManager->removeEvent(event); + if (gameEvent.getType() != RType::ClientEventType::SERVER_FULL) { + continue; + } + world.killEntity(0); + try { + AddEntity::addEntity(ECS::Utils::Vector2f {SCREEN_WIDTH / 2 - SERVER_FULL_MESSAGE_TEX_WIDTH / 2, + SCREEN_HEIGHT / 2 - SERVER_FULL_MESSAGE_TEX_HEIGHT / 2}, + Component::Speed {0}, + Component::TypeEntity {false, false, false, false, false, false, true}, + Component::LoadedSprite {"serverMessage.json"}, Component::HitBox {}, + Component::IsAlive {false, 0}); + } catch (const std::exception &e) { + ECS::Logger::error("[RType client exception] " + std::string(e.what())); } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/client/systems/graphic/System+DisplayEntities.cpp b/src/client/systems/graphic/System+DisplayEntities.cpp deleted file mode 100644 index f5ac54d3..00000000 --- a/src/client/systems/graphic/System+DisplayEntities.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "KeyboardEvent.hpp" -#include "SDLDisplayClass.hpp" -#include "System.hpp" -#include - -namespace ECS { - void System::displayEntities(Core::SparseArray &aSprites, - Core::SparseArray &aPos) - { - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - - SDL_SetRenderDrawColor(display._renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); - SDL_RenderClear(display._renderer); - for (size_t i = 0; i < aSprites.size(); i++) { - if (!aSprites[i].has_value() || aSprites[i]->texture == nullptr) { - continue; - } - if (!aPos[i].has_value()) { - continue; - } - if (aSprites[i]->srcRect != nullptr) { - aSprites[i]->srcRect->x = static_cast(aPos[i].value().x); - aSprites[i]->srcRect->y = static_cast(aPos[i].value().y); - } - SDL_RenderCopy(display._renderer, aSprites[i]->texture, aSprites[i]->rect, aSprites[i]->srcRect); - } - } -} // namespace ECS diff --git a/src/client/systems/graphic/System+GetInput.cpp b/src/client/systems/graphic/System+GetInput.cpp deleted file mode 100644 index 059e33cd..00000000 --- a/src/client/systems/graphic/System+GetInput.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "EventManager.hpp" -#include "KeyboardEvent.hpp" -#include "SDLDisplayClass.hpp" -#include "System.hpp" -#include "Values.hpp" -#include - -namespace ECS { - void System::getInput() - { - Event::EventManager *eventManager = Event::EventManager::getInstance(); - SDL_Event event; - - while (SDL_PollEvent(&event) != 0) { - if (event.type == SDL_KEYDOWN && (_keyMap.find(event.key.keysym.sym) != _keyMap.end())) { - try { - auto *keyEvent = - new Event::KeyboardEvent(_keyMap.at(event.key.keysym.sym), Event::KeyState::PRESSED); - eventManager->pushEvent(keyEvent); - } catch (std::exception &e) { - std::cerr << e.what() << std::endl; - } - } - if (event.type == SDL_WINDOWEVENT && (_windowEventMap.find(event.window.event) != _windowEventMap.end())) { - auto *windowEvent = new Event::WindowEvent( - SCREEN_WIDTH, SCREEN_WIDTH, 0, 0, ECS::Event::WindowDisplayState::FULLSCREEN, - ECS::Event::WindowFocusState::FOCUSED, _windowEventMap.at(event.window.event)); - eventManager->pushEvent(windowEvent); - } - } - } -} // namespace ECS diff --git a/src/client/systems/graphic/System+LoadTextures.cpp b/src/client/systems/graphic/System+LoadTextures.cpp deleted file mode 100644 index f75f3494..00000000 --- a/src/client/systems/graphic/System+LoadTextures.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "SDLDisplayClass.hpp" -#include "System.hpp" -#include - -namespace ECS { - void System::loadTextures(Core::SparseArray &aSprites) - { - SDLDisplayClass &display = SDLDisplayClass::getInstance(); - - for (auto &aSprite : aSprites) { - if (!aSprite.has_value() || aSprite.value().texture != nullptr) { - continue; - } - aSprite.value().texture = display.getTexture(aSprite.value().path); - if (aSprite.value().texture == nullptr) { - std::cerr << "Failed to load texture: " << aSprite.value().path << std::endl; - } - } - } -} // namespace ECS diff --git a/src/client/systems/graphic/System+SDLQuit.cpp b/src/client/systems/graphic/System+SDLQuit.cpp deleted file mode 100644 index a597f421..00000000 --- a/src/client/systems/graphic/System+SDLQuit.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "EventManager.hpp" -#include "SDLDisplayClass.hpp" -#include "System.hpp" -#include "WindowEvent.hpp" - -void ECS::System::quitSDL() -{ - auto &world = ECS::Core::World::getInstance(); - Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto windowEvent = eventManager->getEventsByType(Event::EventType::WINDOW); - - for (auto &idx : windowEvent) { - auto *event = static_cast(idx); - if (event->_windowEventType == Event::WindowEventType::CLOSED) { - world.stop(); - break; - } - } -} diff --git a/src/client/systems/missile/CMakeLists.txt b/src/client/systems/missile/CMakeLists.txt index 32e7590e..257d3f27 100644 --- a/src/client/systems/missile/CMakeLists.txt +++ b/src/client/systems/missile/CMakeLists.txt @@ -1,14 +1,5 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE System+MoveMissiles.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/missile/System+MoveMissiles.cpp b/src/client/systems/missile/System+MoveMissiles.cpp index e91400fd..5744f619 100644 --- a/src/client/systems/missile/System+MoveMissiles.cpp +++ b/src/client/systems/missile/System+MoveMissiles.cpp @@ -1,34 +1,35 @@ -#include "SDLDisplayClass.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::moveMissiles(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto &world = Core::World::getInstance(); - auto &display = SDLDisplayClass::getInstance(); + auto &display = SFMLDisplayClass::getInstance(); + const auto size = aPos.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { + for (size_t idx = 0; idx < size; idx++) { if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { continue; } + auto &pos = aPos[idx].value(); auto &speed = aSpeed[idx].value(); auto &type = aType[idx].value(); - if (type.isBullet) { + + if (type.isBullet || type.isEnemyMissile) { if (speed.speed == MISSILES_SPEED) { pos.x -= speed.speed * world.getDeltaTime(); } else if (speed.speed == BULLET_SPEED) { pos.x += speed.speed * world.getDeltaTime(); } - if (pos.x > SCREEN_WIDTH + 30 || pos.x < -30) { - display.freeRects(idx); + if (pos.x > SCREEN_WIDTH + MISSILES_TEX_WIDTH || pos.x < -MISSILES_TEX_WIDTH) { world.killEntity(idx); } } } } - } // namespace ECS diff --git a/src/client/systems/player/CMakeLists.txt b/src/client/systems/player/CMakeLists.txt index f080d090..3a784f9f 100644 --- a/src/client/systems/player/CMakeLists.txt +++ b/src/client/systems/player/CMakeLists.txt @@ -1,15 +1,6 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(client PRIVATE System+MovePlayer.cpp System+TriggerPlayerShoot.cpp ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/client/systems/player/PlayerMoveState.hpp b/src/client/systems/player/PlayerMoveState.hpp new file mode 100644 index 00000000..382fb49c --- /dev/null +++ b/src/client/systems/player/PlayerMoveState.hpp @@ -0,0 +1,21 @@ +#ifndef PLAYERMOVESTATE_HPP_ +#define PLAYERMOVESTATE_HPP_ + +struct PlayerMoveState +{ + PlayerMoveState() = default; + ~PlayerMoveState() = default; + + static PlayerMoveState &getInstance() + { + static PlayerMoveState instance; + return instance; + } + + bool runningX = false; + bool runningY = false; + float speedX = 0; + float speedY = 0; +}; + +#endif /* !PLAYERMOVESTATE_HPP_ */ diff --git a/src/client/systems/player/System+MovePlayer.cpp b/src/client/systems/player/System+MovePlayer.cpp index 1fc9ff8d..edb41a94 100644 --- a/src/client/systems/player/System+MovePlayer.cpp +++ b/src/client/systems/player/System+MovePlayer.cpp @@ -1,11 +1,14 @@ #include -#include "ClientHandler.hpp" -#include "EventManager.hpp" -#include "KeyboardEvent.hpp" -#include "SDLDisplayClass.hpp" +#include "ClientPackets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Network/ClientHandler.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "EwECS/World.hpp" +#include "PlayerMoveState.hpp" +#include "ServerGameEvent.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" #include "components/IsAlive.hpp" #include @@ -14,67 +17,89 @@ namespace ECS { Core::SparseArray &aType, Core::SparseArray &aIsAlive) { - Network::ClientHandler &network = Network::ClientHandler::getInstance(); - + Core::World &world = Core::World::getInstance(); + ECS::Network::ClientHandler &client = ECS::Network::ClientHandler::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto keyboardEvent = eventManager->getEventsByType(Event::EventType::KEYBOARD); - static const std::unordered_map> + PlayerMoveState &playerMoveState = PlayerMoveState::getInstance(); + auto &keyboardEvent = eventManager->getEventsByType(); + static const std::unordered_map< + Event::KeyIdentifier, std::function> keyMap = { {Event::KeyIdentifier::UP, - [&network](float &spd, Utils::Vector2f &xy, float onlineId) { - xy.y -= spd; - RType::Packet packet(static_cast(RType::ServerEventType::MOVE), {onlineId, 0, 1}); - network.send(packet); + [](PlayerMoveState &moveState, Event::KeyState state, float speed) { + moveState.runningY = (state == Event::KeyState::PRESSED) ? true : false; + moveState.speedY = -speed; + return RType::Client::MovePayload {0, 1}; }}, {Event::KeyIdentifier::DOWN, - [&network](float &spd, Utils::Vector2f &xy, float onlineId) { - xy.y += spd; - RType::Packet packet(static_cast(RType::ServerEventType::MOVE), {onlineId, 0, -1}); - network.send(packet); + [](PlayerMoveState &moveState, Event::KeyState state, float speed) { + moveState.runningY = (state == Event::KeyState::PRESSED) ? true : false; + moveState.speedY = speed; + return RType::Client::MovePayload {0, -1}; }}, {Event::KeyIdentifier::LEFT, - [&network](float &spd, Utils::Vector2f &xy, float onlineId) { - xy.x -= spd; - RType::Packet packet(static_cast(RType::ServerEventType::MOVE), {onlineId, -1, 0}); - network.send(packet); + [](PlayerMoveState &moveState, Event::KeyState state, float speed) { + moveState.runningX = (state == Event::KeyState::PRESSED) ? true : false; + moveState.speedX = -speed; + return RType::Client::MovePayload {-1, 0}; }}, {Event::KeyIdentifier::RIGHT, - [&network](float &spd, Utils::Vector2f &xy, float onlineId) { - xy.x += spd; - RType::Packet packet(static_cast(RType::ServerEventType::MOVE), {onlineId, 1, 0}); - network.send(packet); + [](PlayerMoveState &moveState, Event::KeyState state, float speed) { + moveState.runningX = (state == Event::KeyState::PRESSED) ? true : false; + moveState.speedX = speed; + return RType::Client::MovePayload {1, 0}; }}, }; + const auto size = aPos.size(); - for (size_t i = 0; i < aPos.size(); i++) { + for (size_t i = 0; i < size; i++) { if (!aType[i].has_value() || !aType[i].value().isPlayer) { continue; } + auto &pos = aPos[i].value(); + auto &speed = aSpeed[i].value().speed; + RType::Client::MovePayload payload {0, 0}; + for (auto &event : keyboardEvent) { - auto *keyEvent = static_cast(event); - if (keyMap.find(keyEvent->_keyId) == keyMap.end() || !aIsAlive[i].value().isAlive) { - continue; - } - auto &pos = aPos[i].value(); - float onlinePlayerId = static_cast(aType[i].value().onlineId.value_or(-1)); - if (onlinePlayerId == -1) { + if (keyMap.find(event._keyId) == keyMap.end() || !aIsAlive[i].has_value() || !aPos[i].has_value() + || !aSpeed[i].has_value() || !aIsAlive[i].value().isAlive) { continue; } - keyMap.at(keyEvent->_keyId)(aSpeed[i].value().speed, pos, onlinePlayerId); - if (pos.x < 0) { - pos.x = 0; - } - if (pos.x > SCREEN_WIDTH) { - pos.x = SCREEN_WIDTH; - } - if (pos.y < 0) { - pos.y = 0; + payload = keyMap.at(event._keyId)(playerMoveState, event._state, speed); + } + if (playerMoveState.runningX) { + pos.x += speed; + if (playerMoveState.speedX < 0) { + payload.moveX = -1; + } else { + payload.moveX = 1; } - if (pos.y > SCREEN_HEIGHT) { - pos.y = SCREEN_HEIGHT; + } + if (playerMoveState.runningY) { + pos.y += speed; + + if (playerMoveState.speedY < 0) { + payload.moveY = 1; + } else { + payload.moveY = -1; } } + + client.send(RType::ServerEventType::MOVE, payload); + + if (pos.x < 0) { + pos.x = 0; + } + if (pos.x > SCREEN_WIDTH) { + pos.x = SCREEN_WIDTH; + } + if (pos.y < 0) { + pos.y = 0; + } + if (pos.y > SCREEN_HEIGHT) { + pos.y = SCREEN_HEIGHT; + } } } } // namespace ECS diff --git a/src/client/systems/player/System+TriggerPlayerShoot.cpp b/src/client/systems/player/System+TriggerPlayerShoot.cpp index 7ece2ae7..7bc18432 100644 --- a/src/client/systems/player/System+TriggerPlayerShoot.cpp +++ b/src/client/systems/player/System+TriggerPlayerShoot.cpp @@ -1,8 +1,10 @@ #include -#include "ClientHandler.hpp" -#include "EventManager.hpp" -#include "KeyboardEvent.hpp" -#include "SDLDisplayClass.hpp" +#include "ClientPackets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Network/ClientHandler.hpp" +#include "EwECS/SFMLDisplayClass/SFMLDisplayClass.hpp" +#include "ServerGameEvent.hpp" #include "System.hpp" #include "Values.hpp" #include @@ -12,28 +14,27 @@ namespace ECS { Core::SparseArray &aType, Core::SparseArray &aIsAlive) { - Network::ClientHandler &client = Network::ClientHandler::getInstance(); + ECS::Network::ClientHandler &client = ECS::Network::ClientHandler::getInstance(); Event::EventManager *eventManager = Event::EventManager::getInstance(); - auto keyboardEvent = eventManager->getEventsByType(Event::EventType::KEYBOARD); + auto &keyboardEvent = eventManager->getEventsByType(); + const auto size = aPos.size(); - for (size_t i = 0; i < aPos.size(); i++) { - if (!aType[i].has_value() || !aType[i].value().isPlayer || !aIsAlive[i].value().isAlive) { + for (size_t i = 0; i < size; i++) { + if (!aType[i].has_value() || !aType[i].value().isPlayer || !aIsAlive[i].has_value() + || !aIsAlive[i].value().isAlive) { continue; } for (auto &event : keyboardEvent) { - auto *keyEvent = static_cast(event); - - if (keyEvent->_keyId == Event::KeyIdentifier::SPACE) { - std::cout << "Shoot !" << std::endl; + if (event._keyId == Event::KeyIdentifier::SPACE && event._state == Event::KeyState::PRESSED) { int playerOnlineId = aType[i].value().onlineId.value_or(-1); + if (playerOnlineId == -1) { continue; } - RType::Packet packet(static_cast(RType::ServerEventType::SHOOT), - {static_cast(playerOnlineId)}); - client.send(packet); + + client.send(RType::ServerEventType::SHOOT); } } } } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/ecs/CMakeLists.txt b/src/ecs/CMakeLists.txt deleted file mode 100644 index 4600e744..00000000 --- a/src/ecs/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - -target_sources(ecs PRIVATE - World.hpp - SparseArray.hpp -) - -add_subdirectory(Event) - -target_link_libraries(ecs - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - SDL2::SDL2 - SDL2::SDL2main - SDL2_image - ${Boost_LIBRARIES} -) - -target_include_directories(ecs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(ecs PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Event") -target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(rtype PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(ecs PRIVATE ${Boost_INCLUDE_DIRS}) -target_include_directories(client PRIVATE "../../build/_deps/sdl2_image-src/include") -target_include_directories(server PRIVATE "../../build/_deps/sdl2_image-src/include") - - -set_target_properties(ecs PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib -) diff --git a/src/ecs/Event/CMakeLists.txt b/src/ecs/Event/CMakeLists.txt deleted file mode 100644 index aa28872f..00000000 --- a/src/ecs/Event/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.15...3.23) - -target_sources(ecs PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/EventManager.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Event.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/KeyboardEvent.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/MouseEvent.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/WindowEvent.cpp - ) - -target_include_directories(ecs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -target_include_directories(rtype PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/ecs/Event/Event.cpp b/src/ecs/Event/Event.cpp deleted file mode 100644 index 805dbc0e..00000000 --- a/src/ecs/Event/Event.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "Event.hpp" - -// -------------------CONSTRUCTORS / DESTRUCTOR-------------------// -ECS::Event::Event::Event(const ECS::Event::EventType &aEventType) - : _type(aEventType) -{} - -// -------------------PUBLIC METHODS-------------------// -const ECS::Event::EventType &ECS::Event::Event::getType() const -{ - return _type; -} diff --git a/src/ecs/Event/Event.hpp b/src/ecs/Event/Event.hpp deleted file mode 100644 index bb3a6ee3..00000000 --- a/src/ecs/Event/Event.hpp +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef EVENT_HPP -#define EVENT_HPP - -#include - -namespace ECS::Event { - /** - * @brief Enum of all event types - * - */ - enum class EventType - { - KEYBOARD, - MOUSE, - WINDOW, - GAME, // These are the events that are not related to the engine but to the game, the game library should create - // its own events and use this type - OTHER, - NONE - }; - - /** - * @brief Event class is the base class of all events - * - */ - class Event - { - public: - //-------------------CONSTRUCTORS / DESTRUCTOR-------------------// - /** - * @brief Construct a new Event object - * - * @param aEventType The type of the event. - */ - explicit Event(const EventType &aEventType); - - /** - * @brief Destroy the Event object - * - */ - virtual ~Event() = default; - - //-------------------OPERATORS-------------------// - /** - * @brief Construct a new Event object - * - * @param aOther The Event to copy. - */ - Event(const Event &aOther) = default; - - /** - * @brief Construct a new Event object - * - * @param aOther The Event to move. - */ - Event(Event &&aOther) noexcept = default; - - /** - * @brief Copy assignment operator - * - * @param aOther The Event to copy. - * @return Event& A reference to the Event. - */ - Event &operator=(const Event &aOther) = default; - - /** - * @brief Move assignment operator - * - * @param aOther The Event to move. - * @return Event& A reference to the Event. - */ - Event &operator=(Event &&aOther) noexcept = default; - - //-------------------METHODS-------------------// - /** - * @brief Get the Type object - * - * @return const EventType& The type of the event. - */ - [[nodiscard]] const EventType &getType() const; - - protected: - EventType _type; - }; -} // namespace ECS::Event - -#endif // ! \ No newline at end of file diff --git a/src/ecs/Event/EventManager.cpp b/src/ecs/Event/EventManager.cpp deleted file mode 100644 index 36f18eea..00000000 --- a/src/ecs/Event/EventManager.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "EventManager.hpp" -#include -#include "Event.hpp" - -//-------------------CONSTRUCTORS / DESTRUCTOR-------------------// -ECS::Event::EventManager::EventManager() = default; - -ECS::Event::EventManager::~EventManager() -{ - _events.clear(); -} - -//-------------------PUBLIC METHODS-------------------// -void ECS::Event::EventManager::pushEvent(Event *aEvent) -{ - _events.push_back(std::unique_ptr(aEvent)); -} - -ECS::Event::EventManager *ECS::Event::EventManager::getInstance() -{ - static EventManager instance; - - return &instance; -} - -std::vector> &ECS::Event::EventManager::getEvents() -{ - return _events; -} - -std::vector ECS::Event::EventManager::getEventsByType(const EventType &aEventType) -{ - std::vector events; - - for (auto &event : _events) { - if (event->getType() == aEventType) { - events.push_back(event.get()); - } - } - return events; -} - -void ECS::Event::EventManager::clearNonGameEvents() -{ - for (auto it = _events.begin(); it != _events.end();) { - if ((*it)->getType() != EventType::GAME) { - it = _events.erase(it); - } else { - ++it; - } - } -} - -void ECS::Event::EventManager::removeEvent(Event *aEvent) -{ - for (auto it = _events.begin(); it != _events.end();) { - if (it->get() == aEvent) { - it = _events.erase(it); - } else { - ++it; - } - } -} - -//-------------------NESTED CLASSES-------------------// -//-------------------EventManagerException-------------------// -ECS::Event::EventManager::EventManagerException::EventManagerException(const std::string &aMessage) - : _message(aMessage) -{} - -const char *ECS::Event::EventManager::EventManagerException::what() const noexcept -{ - return _message.c_str(); -} diff --git a/src/ecs/Event/EventManager.hpp b/src/ecs/Event/EventManager.hpp deleted file mode 100644 index f394937a..00000000 --- a/src/ecs/Event/EventManager.hpp +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef EVENTMANAGER_HPP -#define EVENTMANAGER_HPP - -#include -#include -#include -#include -#include -#include -#include "Event.hpp" -#include - -namespace ECS::Event { - class Event; - - /** - * @brief EventManager class is a singleton that manage all events - * - */ - class EventManager final - { - public: - //------------------- DESTRUCTOR-------------------// - /** - * @brief Destroy the Event Manager object - * - */ - ~EventManager(); - - //-------------------OPERATORS-------------------// - /** - * @brief Copy assignment operator, delete because singleton. - * - * @param aOther The EventManager to copy. - */ - EventManager(const EventManager &aOther) = delete; - - /** - * @brief Move assignment operator, delete because singleton. - * - * @param aOther The EventManager to move. - */ - EventManager(EventManager &&aOther) noexcept = delete; - - /** - * @brief Copy assignment operator, delete because singleton. - * - * @param aOther The EventManager to copy. - * @return EventManager& A reference to the EventManager. - */ - EventManager &operator=(const EventManager &aOther) = delete; - - /** - * @brief Move assignment operator, delete because singleton. - * - * @param aOther The EventManager to move. - * @return EventManager& A reference to the EventManager. - */ - EventManager &operator=(EventManager &&aOther) noexcept = delete; - - //-------------------METHODS-------------------// - /** - * @brief Get the Instance object (singleton) - * - * @return EventManager* A pointer to the EventManager. - */ - static EventManager *getInstance(); - - /** - * @brief Push an event to the queue - * - * @param aEvent The event to push. - */ - void pushEvent(Event *aEvent); - - /** - * @brief Get the Events object - * - * @return std::vector& A reference to the vector of events. - */ - [[nodiscard]] std::vector> &getEvents(); - - /** - * @brief Get all the events of a specific type - * - */ - std::vector getEventsByType(const EventType &aEventType); - - /** - * @brief Clear non game events - * - */ - void clearNonGameEvents(); - - /** - * @brief Remove an event from the queue - * @param aIndex The index of the event to remove. - * - */ - void removeEvent(Event *aEvent); - - private: - EventManager(); - std::vector> _events; - - private: - //-------------------EXCEPTIONS-------------------// - class EventManagerException : public std::exception - { - public: - explicit EventManagerException(const std::string &aMessage); - ~EventManagerException() override = default; - - [[nodiscard]] const char *what() const noexcept override; - - private: - std::string _message; - }; - }; -} // namespace ECS::Event - -#endif // ! diff --git a/src/ecs/Event/KeyboardEvent.cpp b/src/ecs/Event/KeyboardEvent.cpp deleted file mode 100644 index 287d92e2..00000000 --- a/src/ecs/Event/KeyboardEvent.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "KeyboardEvent.hpp" - -// -------------------CONSTRUCTORS / DESTRUCTOR-------------------// -ECS::Event::KeyboardEvent::KeyboardEvent(const KeyIdentifier &aKeyId, const KeyState &aKeyState, - const bool &aIsShiftPressed, const bool &aIsCtrlPressed, - const bool &aIsAltPressed, const bool &aIsSystemPressed) - : Event(EventType::KEYBOARD), - _keyId(aKeyId), - _state(aKeyState), - _isShiftPressed(aIsShiftPressed), - _isCtrlPressed(aIsCtrlPressed), - _isAltPressed(aIsAltPressed), - _isSystemPressed(aIsSystemPressed) -{} diff --git a/src/ecs/Event/KeyboardEvent.hpp b/src/ecs/Event/KeyboardEvent.hpp deleted file mode 100644 index 08acad51..00000000 --- a/src/ecs/Event/KeyboardEvent.hpp +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef KEYBOARDEVENT_HPP -#define KEYBOARDEVENT_HPP - -#include "Event.hpp" - -namespace ECS::Event { - enum class KeyIdentifier - { - A = 0, - B = 1, - C = 2, - D = 3, - E = 4, - F = 5, - G = 6, - H = 7, - I = 8, - J = 9, - K = 10, - L = 11, - M = 12, - N = 13, - O = 14, - P = 15, - Q = 16, - R = 17, - S = 18, - T = 19, - U = 20, - V = 21, - W = 22, - X = 23, - Y = 24, - Z = 25, - NUM_0 = 26, - NUM_1 = 27, - NUM_2 = 28, - NUM_3 = 29, - NUM_4 = 30, - NUM_5 = 31, - NUM_6 = 32, - NUM_7 = 33, - NUM_8 = 34, - NUM_9 = 35, - ESCAPE = 36, - LCONTROL = 37, - LSHIFT = 38, - LALT = 39, - LSYSTEM = 40, - RCONTROL = 41, - RSHIFT = 42, - RALT = 43, - RSYSTEM = 44, - MENU = 45, - LBRACKET = 46, - RBRACKET = 47, - SEMICOLON = 48, - COMMA = 49, - PERIOD = 50, - QUOTE = 51, - SLASH = 52, - BACKSLASH = 53, - TILDE = 54, - EQUAL = 55, - DASH = 56, - SPACE = 57, - RETURN = 58, - BACKSPACE = 59, - TAB = 60, - PAGEUP = 61, - PAGEDOWN = 62, - END = 63, - HOME = 64, - INSERT = 65, - DEL = 66, - ADD = 67, - SUBTRACT = 68, - MULTIPLY = 69, - DIVIDE = 70, - LEFT = 71, - RIGHT = 72, - UP = 73, - DOWN = 74, - NUMPAD_0 = 75, - NUMPAD_1 = 76, - NUMPAD_2 = 77, - NUMPAD_3 = 78, - NUMPAD_4 = 79, - NUMPAD_5 = 80, - NUMPAD_6 = 81, - NUMPAD_7 = 82, - NUMPAD_8 = 83, - NUMPAD_9 = 84, - F1 = 85, - F2 = 86, - F3 = 87, - F4 = 88, - F5 = 89, - F6 = 90, - F7 = 91, - F8 = 92, - F9 = 93, - F10 = 94, - F11 = 95, - F12 = 96 - }; - - enum class KeyState - { - PRESSED = 0, - RELEASED = 1 - }; - - class KeyboardEvent : public Event - { - public: - // -------------------CONSTRUCTORS / DESTRUCTOR-------------------// - /** - * @brief Construct a new Keyboard Event object - * - * @param aKey The key pressed. - * @param aState The state of the key. - * @param aIsShiftPressed Is the shift key pressed. - * @param aIsCtrlPressed Is the ctrl key pressed. - * @param aIsAltPressed Is the alt key pressed. - * @param aIsSystemPressed Is the system key pressed. - */ - KeyboardEvent(const KeyIdentifier &aKeyId, const KeyState &aKeyState, const bool &aIsShiftPressed = false, - const bool &aIsCtrlPressed = false, const bool &aIsAltPressed = false, - const bool &aIsSystemPressed = false); - - // -------------------ATTRIBUTES-------------------// - const KeyIdentifier _keyId; - const KeyState _state; - const bool _isShiftPressed; - const bool _isCtrlPressed; - const bool _isAltPressed; - const bool _isSystemPressed; - }; -} // namespace ECS::Event - -#endif // ! diff --git a/src/ecs/Event/MouseEvent.cpp b/src/ecs/Event/MouseEvent.cpp deleted file mode 100644 index d46ee28d..00000000 --- a/src/ecs/Event/MouseEvent.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "MouseEvent.hpp" - -// -------------------CONSTRUCTORS / DESTRUCTOR-------------------// -ECS::Event::MouseEvent::MouseEvent(const int &aX, const int &aY, const MouseButton &aButton, const MouseState &aState, - const bool &aIsMoving, const bool &aIsAltPressed, const bool &aIsShiftPressed, - const bool &aIsCtrlPressed) - : Event(EventType::MOUSE), - _position(aX, aY), - _button(aButton), - _state(aState), - _isMoving(aIsMoving), - _isAltPressed(aIsAltPressed), - _isShiftPressed(aIsShiftPressed), - _isCtrlPressed(aIsCtrlPressed) -{} \ No newline at end of file diff --git a/src/ecs/Event/MouseEvent.hpp b/src/ecs/Event/MouseEvent.hpp deleted file mode 100644 index d27497d5..00000000 --- a/src/ecs/Event/MouseEvent.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef MOUSEEVENT_HPP -#define MOUSEEVENT_HPP - -#include "Event.hpp" -#include "Utils.hpp" - -namespace ECS::Event { - - enum class MouseButton - { - LEFT = 0, /*!< The left mouse button. */ - RIGHT = 1, /*!< The right mouse button. */ - MIDDLE = 2 /*!< The middle (wheel) mouse button. */ - }; - - enum class MouseState - { - RELEASED = 0, /*!< The mouse button is released. */ - PRESSED = 1 /*!< The mouse button is pressed. */ - }; - - using MousePosition = ECS::Utils::Vector2i; - - /** - * @brief Mouse event class is the base class of all mouse events - */ - class MouseEvent : public Event - { - public: - //-------------------CONSTRUCTORS / DESTRUCTOR-------------------// - /** - * @brief Construct a new Mouse Event object - * - * @param aX The x position of the mouse. - * @param aY The y position of the mouse. - * @param aButton The mouse button. - * @param aState The mouse button state. - * @param aIsMoving Is the mouse moving. - * @param aIsAltPressed Is the left alt key pressed. - * @param aIsShiftPressed Is the left shift key pressed. - * @param aIsCtrlPressed Is the left ctrl key pressed. - */ - MouseEvent(const int &aX, const int &aY, const MouseButton &aButton, const MouseState &aState, - const bool &aIsMoving = false, const bool &aIsAltPressed = false, - const bool &aIsShiftPressed = false, const bool &aIsCtrlPressed = false); - - //-------------------ATTRIBUTES-------------------// - const MousePosition _position; /*!< The position of the mouse. */ - const MouseButton _button; /*!< The mouse button. */ - const MouseState _state; /*!< The mouse button state. */ - bool _isMoving; /*!< Is the mouse moving. */ - bool _isAltPressed; /*!< Is the left alt key pressed. */ - bool _isShiftPressed; /*!< Is the left shift key pressed. */ - bool _isCtrlPressed; /*!< Is the left ctrl key pressed. */ - }; -} // namespace ECS::Event - -#endif // ! diff --git a/src/ecs/Event/WindowEvent.cpp b/src/ecs/Event/WindowEvent.cpp deleted file mode 100644 index 692233e0..00000000 --- a/src/ecs/Event/WindowEvent.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "WindowEvent.hpp" - -// -------------------CONSTRUCTORS / DESTRUCTOR-------------------// -ECS::Event::WindowEvent::WindowEvent(const int &aWidth, const int &aHeight, const int &aX, const int &aY, - const WindowDisplayState &aWindowState, const WindowFocusState &aWindowFocusState, - const WindowEventType &aWindowEventType) - : Event(EventType::WINDOW), - _size(aWidth, aHeight), - _position(aX, aY), - _windowState(aWindowState), - _windowFocusState(aWindowFocusState), - _windowEventType(aWindowEventType) -{} diff --git a/src/ecs/Event/WindowEvent.hpp b/src/ecs/Event/WindowEvent.hpp deleted file mode 100644 index 59be23e1..00000000 --- a/src/ecs/Event/WindowEvent.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef WINDOWEVENT_HPP -#define WINDOWEVENT_HPP - -#include "Event.hpp" -#include "Utils.hpp" - -namespace ECS::Event { - enum class WindowFocusState - { - FOCUSED = 0, /*!< The window is focused. */ - UNFOCUSED = 1 /*!< The window is unfocused. */ - }; - - enum class WindowDisplayState - { - FULLSCREEN = 0, /*!< The window is fullscreen. */ - WINDOWED = 1, /*!< The window is windowed. */ - MINIMIZED = 2 /*!< The window is minimized. */ - }; - - enum class WindowEventType - { - RESIZING = 0, /*!< The window is resizing. */ - RESIZED = 1, /*!< The window is resized. */ - CLOSED = 2, /*!< The window is closed. */ - FOCUSED = 3, /*!< The window is focused. */ - UNFOCUSED = 4 /*!< The window is unfocused. */ - }; - - using WindowSize = ECS::Utils::Vector2i; - using WindowPosition = ECS::Utils::Vector2i; - - /** - * @brief Window event class is the base class of all window events - * - */ - class WindowEvent : public Event - { - public: - //-------------------CONSTRUCTORS / DESTRUCTOR-------------------// - /** - * @brief Construct a new Window Event object - * - * @param aWidth The width of the window. - * @param aHeight The height of the window. - * @param aWindowState The state of the window. - * @param aWindowFocusState The focus state of the window. - * @param aWindowEventType The type of the window event. - */ - WindowEvent(const int &aWidth, const int &aHeight, const int &aX, const int &aY, - const WindowDisplayState &aWindowState, const WindowFocusState &aWindowFocusState, - const WindowEventType &aWindowEventType); - - //-------------------ATTRIBUTES-------------------// - const WindowSize _size; /*!< The size of the window. */ - const WindowPosition _position; /*!< The position of the window. */ - const WindowDisplayState _windowState; /*!< Is the window fullscreen. */ - const WindowFocusState _windowFocusState; /*!< Is the window focused. */ - const WindowEventType _windowEventType; /*!< The type of the window event. */ - }; -} // namespace ECS::Event -#endif // ! diff --git a/src/ecs/SparseArray.hpp b/src/ecs/SparseArray.hpp deleted file mode 100644 index 5229cc0b..00000000 --- a/src/ecs/SparseArray.hpp +++ /dev/null @@ -1,183 +0,0 @@ -/* -** EPITECH PROJECT, 2023 -** bs -** File description: -** SparseArray -*/ - -#ifndef SPARSEARRAY_HPP_ -#define SPARSEARRAY_HPP_ - -#include -#include - -namespace ECS::Core { - - /** - * @brief SparseArray class is a container that store a component in a sparse array - * - * @tparam Component The type of the component to store - */ - template - class SparseArray - { - public: - //-------------- TYPEDEFS --------------// - using valueType = std::optional; - using referenceType = valueType &; - using constReferenceType = const valueType &; - using containerT = std::vector; - using sizeType = typename containerT::size_type; - using iterator = typename containerT::iterator; - using constIterator = typename containerT::const_iterator; - - public: - //-------------- CTOR, DTOR, OPERATORS --------------// - SparseArray() = default; - ~SparseArray() = default; - - SparseArray(const SparseArray &aOther) - : _container(aOther._container) - {} - SparseArray(SparseArray &&aOther) noexcept - : _container(std::move(aOther._container)) - {} - - SparseArray &operator=(const SparseArray &aOther) - { - _container = aOther._container; - return *this; - } - SparseArray &operator=(SparseArray &&aOther) noexcept - { - _container = std::move(aOther._container); - return *this; - } - - referenceType operator[](std::size_t aIndex) - { - return _container[aIndex]; - } - constReferenceType operator[](std::size_t aIndex) const - { - return _container[aIndex]; - } - - //-------------- METHODS ITERATOR--------------// - iterator begin() - { - return _container.begin(); - } - constIterator begin() const - { - return _container.begin(); - } - constIterator cbegin() const - { - return _container.cbegin(); - } - - iterator end() - { - return _container.end(); - } - constIterator end() const - { - return _container.end(); - } - constIterator cend() const - { - return _container.cend(); - } - - sizeType size() const - { - return _container.size(); - } - - //-------------- METHODS --------------// - /** - * @brief Insert a component at the position aPos - * - * @param aPos The position to insert the component (Index of the Entity) - * @param aValue The component to insert - * @return referenceType A reference to the component inserted - */ - referenceType insertAt(sizeType aPos, constReferenceType aValue) - { - if (aPos >= _container.size()) { - _container.resize(aPos + 1); - } - _container[aPos] = aValue; - return _container[aPos]; - } - - /** - * @brief Insert a component at the position aPos - * - * @param aPos The position to insert the component (Index of the Entity) - * @param aValue The component to insert - * @return referenceType A reference to the component inserted - */ - referenceType insertAt(sizeType aPos, valueType &&aValue) - { - if (aPos >= _container.size()) { - _container.resize(aPos + 1); - } - _container[aPos] = std::move(aValue); - return _container[aPos]; - } - - /** - * @brief Emplace and build a component at the position aPos - * - * @tparam Args Inferred type of the arguments - * @param aPos The position to insert the component (Index of the Entity) - * @param aArgs The list of arguments to build the component - * @return referenceType - */ - template - referenceType emplaceAt(sizeType aPos, Args &&...aArgs) - { - if (aPos >= _container.size()) { - _container.resize(aPos + 1); - } - _container[aPos].emplace(Component(std::forward(aArgs)...)); - return _container[aPos]; - } - - /** - * @brief Remove a component at the position aPos - * - * @param aPos The position to remove the component (Index of the Entity) - */ - void erase(sizeType aPos) - { - if (aPos >= _container.size()) { - return; - } - _container[aPos].reset(); - } - - /** - * @brief Get the index of a component - * - * @param aValue The component to get the index - * @return sizeType The index of the component, or the size of the container if not found - */ - sizeType getIndex(constReferenceType aValue) const - { - for (sizeType i = 0; i < _container.size(); i++) { - if (_container[i] == aValue) { - return i; - } - } - return _container.size(); - } - - private: - containerT _container; - }; -} // namespace ECS::Core - -#endif /* !SPARSEARRAY_HPP_ */ diff --git a/src/ecs/Utils.hpp b/src/ecs/Utils.hpp deleted file mode 100644 index 0ff97002..00000000 --- a/src/ecs/Utils.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef UTILS_HPP -#define UTILS_HPP - -#include - -namespace ECS::Utils { - struct Vector2i - { - Vector2i() - : x(0), - y(0) - {} - Vector2i(int aX, int aY) - : x(aX), - y(aY) - {} - int x; - int y; - }; - - struct Vector2f - { - Vector2f() - : x(0), - y(0) - {} - Vector2f(float aX, float aY) - : x(aX), - y(aY) - {} - float x; - float y; - }; -} // namespace ECS::Utils - -#endif // ! diff --git a/src/ecs/World.hpp b/src/ecs/World.hpp deleted file mode 100644 index f81b9613..00000000 --- a/src/ecs/World.hpp +++ /dev/null @@ -1,350 +0,0 @@ -/* -** EPITECH PROJECT, 2023 -** bs -** File description: -** World -*/ - -#ifndef WORLD_HPP_ -#define WORLD_HPP_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "SparseArray.hpp" -#include - -namespace ECS::Core { - /** - * @brief A class that contains all the components and entities and systems - * @details This class is a singleton, it contains all the components and entities and systems, it uses SparseArray -as Component container - * @details It all works with templates, see How to use section for more details - */ - class World - { - public: - //-------------- INSTANCE --------------// - /** - * @brief Get the Instance object (Singleton) - * - * @return World& The instance of the World - */ - static World &getInstance() - { - static World sharedInstance; - - return sharedInstance; - } - - //-------------- METHODS COMPONENT --------------// - /** - * @brief Register a component in the World class. - * - * @tparam Component Represents the type of the component being registered. (Can be anything but I recommend - * struct) - * @return SparseArray& - */ - template - SparseArray ®isterComponent() - { - if (_components.find(std::type_index(typeid(Component))) != _components.cend()) { - throw RegistryException("Component already registered"); - } - auto &component = _components[std::type_index(typeid(Component))] = SparseArray(); - _eraseFunctions[std::type_index(typeid(Component))] = [](World ®istry, const std::size_t &idx) { - auto &myComponent = registry.getComponent(); - - myComponent.erase(idx); - }; - _addFunctions[std::type_index(typeid(Component))] = [](World ®istry, const std::size_t &idx) { - auto &myComponent = registry.getComponent(); - - myComponent.emplaceAt(idx, Component()); - }; - return std::any_cast &>(component); - } - - /** - * @brief Get the Component object - * - * @tparam Component Represents the type of the component being retrieved. - * @return SparseArray& The component - */ - template - SparseArray &getComponent() - { - try { - auto &component = - std::any_cast &>(_components.at(std::type_index(typeid(Component)))); - return component; - } catch (const std::bad_any_cast &e) { - throw RegistryException("There is no component of this type"); - } - } - - /** - * @brief Get the Component object - * - * @tparam Component Represents the type of the component being retrieved. - * @return SparseArray const& The component - */ - template - SparseArray const &getComponent() const - { - try { - auto &component = std::any_cast const &>( - _components.at(std::type_index(typeid(Component)))); - return component; - } catch (const std::bad_any_cast &e) { - throw RegistryException("There is no component of this type"); - } - } - - //-------------- METHODS ENTITY --------------// - /** - * @brief Kill an entity - * @details This method will call the erase function of all the components - * @param aIdx The index of the entity - */ - void killEntity(const std::size_t &aIdx) - { - for (auto &component : _components) { - _eraseFunctions[component.first](*this, aIdx); - } - _reusableIds.push_back(aIdx); - } - - /** - * @brief Create an entity - * @details This method will create an entity and return its index, if there is reusable ids, it will use - * @return std::size_t The index of the entity - */ - std::size_t createEntity() - { - if (_reusableIds.empty()) { - for (auto &component : _components) { - _addFunctions[component.first](*this, _id); - } - return _id++; - } - auto &idx = _reusableIds.back(); - - _reusableIds.pop_back(); - for (auto &component : _components) { - _addFunctions[component.first](*this, idx); - } - return idx; - } - - /** - * @brief Add an entity to a component - * - * @tparam Component The component to add the entity to - * @param aIdx The index of the entity (index in the sparse array) - * @param aComponent The component to add (can be anything but I recommend struct, same as when you - * registered component) - * @return SparseArray::referenceType The reference to the component - */ - template - typename SparseArray::referenceType addEntityComponent(const std::size_t &aIdx, - Component &&aComponent) - { - try { - auto &componentArray = getComponent(); - - return componentArray.emplaceAt(aIdx, std::forward(aComponent)); - } catch (const RegistryException &e) { - throw RegistryException("There is no component of this type in the registry"); - } - } - - /** - * @brief Add an entity to a component - * - * @tparam Component The component to add the entity to - * @tparam Args The arguments to pass to the constructor of the component - * @param aIdx The index of the entity (index in the sparse array) - * @param aArgs The arguments to pass to the constructor of the component - * @return SparseArray::referenceType - */ - template - typename SparseArray::referenceType emplaceEntityComponent(const std::size_t &aIdx, - Args &&...aArgs) - { - try { - auto &componentArray = getComponent(); - - return componentArray.emplaceAt(aIdx, std::forward(aArgs)...); - } catch (const RegistryException &e) { - throw RegistryException("There is no component of this type in the registry"); - } - } - - /** - * @brief Remove an entity from a component - * - * @tparam Component The component to remove the entity from - * @param aIdx The index of the entity (index in the sparse array) - */ - template - void removeEntityInComponent(const std::size_t &aIdx) - { - try { - auto &componentArray = getComponent(); - - componentArray.erase(aIdx); - } catch (const RegistryException &e) { - throw RegistryException("There is no component of this type in the registry"); - } - } - - /** - * @brief Remove a component from the World - * - * @tparam Component The component to remove - */ - template - void removeComponent() - { - try { - _components.erase(std::type_index(typeid(Component))); - } catch (const RegistryException &e) { - throw RegistryException("There is no component of this type in the registry"); - } - } - - //-------------- METHODS SYSTEM --------------// - /** - * @brief Add a system to the World - * @details A system is a function that need a special signature, it needs to take a World and the - * components, pay attention to the How to use section - * @tparam Components The components that the system needs - * @tparam Function Inferred by the compiler - * @param aFunction The function to add as a system - */ - template - void addSystem(Function &&aFunction) - { - _systems.push_back([this, func = std::forward(aFunction)]() { - callSystem(func); - }); - } - - /** - * @brief Run all the systems, giving them automatically the World and the components the need - * - */ - void runSystems() - { - for (auto &system : _systems) { - system(); - } - } - - /** - * @brief Check if the World is running - * - * @return true if the World is running - * @return false if the World is not running - */ - [[nodiscard]] bool isRunning() const - { - return _isRunning; - } - - /** - * @brief Stop the World - * - */ - void stop() - { - _isRunning = false; - } - - /** - * @brief Start the World - * - */ - void start() - { - _isRunning = true; - } - - void calcDeltaTime() - { - auto now = std::chrono::steady_clock::now(); - _delta = now - _lastTime; - _lastTime = now; - } - - [[nodiscard]] float getDeltaTime() const - { - return _delta.count(); - } - - private: - /** - * @brief Call a system, this is what is stored in the vector of systems - * - * @tparam Components The components that the system needs - * @tparam Function Inferred by the compiler - * @param aFunction The function to call - * @param aReg The World - */ - template - void callSystem(Function &&aFunction) - { - aFunction(getComponent()...); - } - - //-------------- EXCEPTION --------------// - /** - * @brief Exception class for the World class - * - */ - class RegistryException : public std::exception - { - public: - explicit RegistryException(const char *message) - : _message(message) - {} - - const char *what() const noexcept override - { - return _message; - } - - private: - const char *_message; - }; - World() - : _delta(0) - {} - - private: - size_t _id {0}; - std::unordered_map _components; - std::unordered_map> _eraseFunctions; - std::unordered_map> _addFunctions; - std::vector _reusableIds; - - using systemFunction = std::function; - std::vector _systems; - - bool _isRunning {true}; - std::chrono::time_point _lastTime {std::chrono::steady_clock::now()}; - std::chrono::duration _delta; - }; -} // namespace ECS::Core - -#endif /* !WORLD_HPP_ */ diff --git a/src/flappybird/CMakeLists.txt b/src/flappybird/CMakeLists.txt new file mode 100644 index 00000000..b669f64b --- /dev/null +++ b/src/flappybird/CMakeLists.txt @@ -0,0 +1,20 @@ +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") + +target_sources(flappybird PRIVATE + main.cpp +) + +add_subdirectory(components) +add_subdirectory(systems) + +target_link_libraries(flappybird PRIVATE + ecs +) + +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/components) +target_include_directories(flappybird PRIVATE "${PROJECT_SOURCE_DIR}/extern/EwECS/includes") + +set_target_properties(flappybird PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) diff --git a/src/flappybird/Values.hpp b/src/flappybird/Values.hpp new file mode 100644 index 00000000..4a801316 --- /dev/null +++ b/src/flappybird/Values.hpp @@ -0,0 +1,12 @@ +#ifndef VALUES_HPP_ +#define VALUES_HPP_ +#include + +// --------------- CONFIG ---------------------- // +static const std::string CONFIG_PATH = "config/flappybird/flappybird.json"; + +// ------------------ RETURN STATUS ------------ // +const constexpr int SUCCESS = 0; +const constexpr int FAILURE = 84; + +#endif /* !VALUES_HPP_ */ diff --git a/src/flappybird/components/CMakeLists.txt b/src/flappybird/components/CMakeLists.txt new file mode 100644 index 00000000..acf3fe5d --- /dev/null +++ b/src/flappybird/components/CMakeLists.txt @@ -0,0 +1 @@ +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/flappybird/components/Components.hpp b/src/flappybird/components/Components.hpp new file mode 100644 index 00000000..db0dec84 --- /dev/null +++ b/src/flappybird/components/Components.hpp @@ -0,0 +1,11 @@ +#ifndef COMPONENTS_HPP_ +#define COMPONENTS_HPP_ + +#include "EwECS/Physic/Weight.hpp" +#include "EwECS/SFMLDisplayClass/LoadedSprite.hpp" +#include "Jump.hpp" +#include "Score.hpp" +#include "Speed.hpp" +#include "TypeEntity.hpp" + +#endif // !COMPONENTS_HPP_ diff --git a/src/flappybird/components/Jump.hpp b/src/flappybird/components/Jump.hpp new file mode 100644 index 00000000..c9585a54 --- /dev/null +++ b/src/flappybird/components/Jump.hpp @@ -0,0 +1,30 @@ +#ifndef JUMP_HPP_ +#define JUMP_HPP_ + +namespace Component { + struct Jump + { + Jump() + : strength(0), + height(0), + floating(0), + isJumping(false), + initialAltitude(0) + {} + Jump(float aStrength, float aHeight, float aFloating) + : strength(aStrength), + height(aHeight), + floating(aFloating), + isJumping(false), + initialAltitude(0) + {} + + float strength; + float height; + float floating; + bool isJumping; + float initialAltitude; + }; +} // namespace Component + +#endif // ! diff --git a/src/flappybird/components/Score.hpp b/src/flappybird/components/Score.hpp new file mode 100644 index 00000000..4d5d7f28 --- /dev/null +++ b/src/flappybird/components/Score.hpp @@ -0,0 +1,27 @@ +#include + +#ifndef SCORE_HPP + #define SCORE_HPP + +namespace Component { + struct Score + { + /** + * @brief Construct a new Speed object + * + */ + Score() + : score(0) + {} + /** + * @brief Construct a new Speed object + * + * @param aScore The score value + */ + explicit Score(float aScore) + : score(aScore) + {} + unsigned short score; + }; +} // namespace Component +#endif // DEBUG diff --git a/src/flappybird/components/Speed.hpp b/src/flappybird/components/Speed.hpp new file mode 100644 index 00000000..60eb828f --- /dev/null +++ b/src/flappybird/components/Speed.hpp @@ -0,0 +1,27 @@ +#include + +#ifndef SPEED_HPP + #define SPEED_HPP + +namespace Component { + struct Speed + { + /** + * @brief Construct a new Speed object + * + */ + Speed() + : speed(0) + {} + /** + * @brief Construct a new Speed object + * + * @param aSpeed The speed of the entity + */ + explicit Speed(float aSpeed) + : speed(aSpeed) + {} + float speed; + }; +} // namespace Component +#endif // DEBUG diff --git a/src/flappybird/components/TypeEntity.hpp b/src/flappybird/components/TypeEntity.hpp new file mode 100644 index 00000000..135225a5 --- /dev/null +++ b/src/flappybird/components/TypeEntity.hpp @@ -0,0 +1,45 @@ +/* +** EPITECH PROJECT, 2023 +** Flappy Bird +** File description: +** TypeEntity +*/ + +#include +#include + +#ifndef TYPEENTITY_HPP + #define TYPEENTITY_HPP + +enum EntityType +{ + BACKGROUND = 0, + GROUND = 1, + PIPE = 2, + BIRD = 3, + TEXT = 4, + NONE = -1, +}; + +namespace Component { + struct TypeEntity + { + /** + * @brief Construct a new Type Entity object + * + */ + TypeEntity() = default; + /** + * @brief Construct a new Type Entity object + * + * + */ + explicit TypeEntity(EntityType aType) + : type(aType) + {} + + EntityType type = NONE; + }; +} // namespace Component + +#endif /* TYPEENTITY_HPP */ diff --git a/src/flappybird/main.cpp b/src/flappybird/main.cpp new file mode 100644 index 00000000..56a85e42 --- /dev/null +++ b/src/flappybird/main.cpp @@ -0,0 +1,66 @@ +#include +#include "Components.hpp" +#include "EwECS/Asset/AssetManager.hpp" +#include "EwECS/ConfigReader/ConfigReader.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Music/MusicPlugin.hpp" +#include "EwECS/Physic/PhysicPlugin.hpp" +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "EwECS/SFMLDisplayClass/TextComponent.hpp" +#include "EwECS/Sound/SoundPlugin.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" +#include "System.hpp" +#include "Values.hpp" + +int main(int ac, char **av) +{ + (void) ac; + (void) av; + + // Load components + ECS::Core::World &world = ECS::Core::World::getInstance(); + ECS::Asset::AssetManager &assetManager = ECS::Asset::AssetManager::getInstance(); + + auto &vec = world.registerComponent(); + auto &speed = world.registerComponent(); + auto &type = world.registerComponent(); + auto &jump = world.registerComponent(); + auto &score = world.registerComponent(); + + auto &renderConf = ECS::Render::RenderPluginConfig::getInstance(); + auto &physicConf = ECS::Physic::PhysicPluginConfig::getInstance(); + ECS::SoundPlugin soundPlugin; + ECS::MusicPlugin musicPlugin; + renderConf.load(CONFIG_PATH); + physicConf.load(CONFIG_PATH); + ECS::Render::RenderPlugin renderPlugin; + ECS::Physic::PhysicPlugin physicPlugin; + + renderPlugin.plug(world, assetManager); + physicPlugin.plug(world, assetManager); + soundPlugin.plug(world, assetManager); + musicPlugin.plug(world, assetManager); + + auto &sprite = world.getComponent(); + auto &weight = world.getComponent(); + auto &hitbox = world.getComponent(); + auto &text = world.getComponent(); + + // Load systems + world.addSystem(ECS::System::jump); + world.addSystem(ECS::System::moveGround); + world.addSystem(ECS::System::movePipes); + world.addSystem(ECS::System::killBird); + world.addSystem(ECS::System::updateScore); + world.addSystem(ECS::System::replay); + + // Game loop + ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); + while (world.isRunning()) { + world.runSystems(); + eventManager->keepEventsAndClear<>(); + world.calcDeltaTime(); + } + return SUCCESS; +} \ No newline at end of file diff --git a/src/flappybird/systems/CMakeLists.txt b/src/flappybird/systems/CMakeLists.txt new file mode 100644 index 00000000..1309d614 --- /dev/null +++ b/src/flappybird/systems/CMakeLists.txt @@ -0,0 +1,5 @@ +add_subdirectory(bird) +add_subdirectory(environment) +add_subdirectory(score) + +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/flappybird/systems/System.hpp b/src/flappybird/systems/System.hpp new file mode 100644 index 00000000..a557601a --- /dev/null +++ b/src/flappybird/systems/System.hpp @@ -0,0 +1,57 @@ +#ifndef SYSTEM_HPP_ +#define SYSTEM_HPP_ + +#include "Components.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Event/MouseEvent.hpp" +#include "EwECS/Event/WindowEvent.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" +#include + +namespace ECS { + class System + { + public: + /** + * @brief Make an entity jump + * + * @param aPos SparseArray of all entities position + * @param aJump Sparsearray of all entities who can jump + * @param aWeight Sparsearray of all entities weight + */ + static void jump(Core::SparseArray &aPos, Core::SparseArray &aJump, + Core::SparseArray &aWeight); + + /** + * @brief Move the ground + * + */ + static void moveGround(); + + /** + * @brief Move the pipes + * + */ + static void movePipes(); + + /** + * @brief Kill the bird if it touches the ground or a pipe + * + */ + static void killBird(); + + /** + * @brief Display the score + * + */ + static void updateScore(); + + /** + * @brief Replay the game if the player press enter + * + */ + static void replay(); + }; +} // namespace ECS +#endif /* !SYSTEM_HPP_ */ diff --git a/src/flappybird/systems/bird/CMakeLists.txt b/src/flappybird/systems/bird/CMakeLists.txt new file mode 100644 index 00000000..9cf49164 --- /dev/null +++ b/src/flappybird/systems/bird/CMakeLists.txt @@ -0,0 +1,6 @@ +target_sources(flappybird PRIVATE + System+Jump.cpp + System+KillBird.cpp +) + +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/flappybird/systems/bird/System+Jump.cpp b/src/flappybird/systems/bird/System+Jump.cpp new file mode 100644 index 00000000..c7f8a38e --- /dev/null +++ b/src/flappybird/systems/bird/System+Jump.cpp @@ -0,0 +1,62 @@ +#include "EwECS/ConfigReader/ConfigReader.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Sound/Sound.hpp" +#include "EwECS/World.hpp" +#include "SoundComponent.hpp" +#include "System.hpp" +#include "Values.hpp" + +namespace ECS { + void System::jump(Core::SparseArray &aPos, Core::SparseArray &aJump, + Core::SparseArray &aWeight) + { + Event::EventManager *eventManager = Event::EventManager::getInstance(); + auto &events = eventManager->getEventsByType(); + auto &world = Core::World::getInstance(); + auto &soundsConf = ConfigReader::getInstance().get(CONFIG_PATH)["sounds"]; + + try { + auto &birdConf = ConfigReader::getInstance().get(CONFIG_PATH)["entities"]["bird"]; + const auto &size = aJump.size(); + + for (size_t i = 0; i < size; i++) { + if (!aPos[i].has_value() || !aJump[i].has_value()) { + continue; + } + auto &pos = aPos[i].value(); + auto &jump = aJump[i].value(); + if (jump.isJumping) { + float targetY = jump.initialAltitude - jump.height; + auto endTolerance = static_cast(birdConf["jump"]["floating"]); + + if (std::abs(targetY - pos.y) < endTolerance) { + jump.isJumping = false; + } else { + pos.y += (targetY - pos.y) * jump.strength * world.getDeltaTime(); + } + + if (aWeight[i].has_value()) { + aWeight[i].value().resetFallVelocity(); + } + } + + for (auto &keyEvent : events) { + if (keyEvent._keyId == Event::KeyIdentifier::SPACE) { + if (!jump.isJumping) { + world.emplaceEntityComponent(i, soundsConf["jump"]["path"], + soundsConf["jump"]["volume"], + soundsConf["jump"]["loop"]); + } + + jump.isJumping = true; + jump.initialAltitude = pos.y; + } + } + } + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } +} // namespace ECS diff --git a/src/flappybird/systems/bird/System+KillBird.cpp b/src/flappybird/systems/bird/System+KillBird.cpp new file mode 100644 index 00000000..bbad586d --- /dev/null +++ b/src/flappybird/systems/bird/System+KillBird.cpp @@ -0,0 +1,113 @@ +#include +#include "EwECS/ConfigReader/ConfigReader.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Music/Music.hpp" +#include "EwECS/Music/MusicComponent.hpp" +#include "EwECS/Music/MusicPlugin.hpp" +#include "EwECS/Physic/PhysicPlugin.hpp" +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "EwECS/SFMLDisplayClass/TextComponent.hpp" +#include "EwECS/Sound/Sound.hpp" +#include "EwECS/Sound/SoundComponent.hpp" +#include "SparseArray.hpp" +#include "System.hpp" +#include "Utils.hpp" +#include "Values.hpp" +#include "components/Speed.hpp" +#include "components/TypeEntity.hpp" + +namespace ECS { + + static void killPlayer(size_t aBirdId) + { + try { + ECS::Core::World &world = ECS::Core::World::getInstance(); + auto &vec = world.getComponent(); + auto &type = world.getComponent(); + auto &speed = world.getComponent(); + auto &text = world.getComponent(); + auto &music = world.getComponent(); + + auto &replayMessageConf = ConfigReader::getInstance().get(CONFIG_PATH)["entities"]["replay_message"]; + auto &soundsConf = ConfigReader::getInstance().get(CONFIG_PATH)["sounds"]; + + size_t typeSize = type.size(); + + // Remove music + ECS::Music::stop(music[aBirdId].value()); + world.removeEntityInComponent(aBirdId); + world.killEntity(aBirdId); + + // Stop moving entities + for (size_t i = 0; i < typeSize; i++) { + if (!speed[i].has_value()) { + continue; + } + speed[i].value().speed = 0; + } + + // Add info message + auto replayMessageId = world.createEntity(); + vec.insertAt(replayMessageId, + ECS::Utils::Vector2f {replayMessageConf["position"]["x"], replayMessageConf["position"]["y"]}); + type.insertAt(replayMessageId, Component::TypeEntity {EntityType::TEXT}); + text.insertAt(replayMessageId, + Component::TextComponent(replayMessageConf["text"], Component::TextColor::WHITE, + replayMessageConf["size"])); + + // Add death sound + world.emplaceEntityComponent(replayMessageId, soundsConf["death"]["path"], + soundsConf["death"]["volume"], + soundsConf["death"]["loop"]); + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } + + void System::killBird() + { + ECS::Core::World &world = ECS::Core::World::getInstance(); + auto &vec = world.getComponent(); + auto &hitbox = world.getComponent(); + auto &type = world.getComponent(); + size_t typeSize = type.size(); + + try { + auto &birdConf = ConfigReader::getInstance().get(CONFIG_PATH)["entities"]["bird"]; + + for (size_t birdId = 0; birdId < typeSize; birdId++) { + if (!type[birdId].has_value() || type[birdId].value().type != EntityType::BIRD + || !hitbox[birdId].has_value() || !vec[birdId].has_value()) { + continue; + } + + // Check bird too high + float birdHeight = birdConf["hitbox"]["height"]; + if (vec[birdId].value().y <= -birdHeight) { + killPlayer(birdId); + return; + } + + if (!hitbox[birdId].value().isColliding) { + continue; + } + + // Check collision with pipe or ground + auto &colliders = hitbox[birdId].value().collidingId; + for (auto &collider : colliders) { + if (!type[collider].has_value()) { + continue; + } + auto &colliderType = type[collider].value().type; + if (colliderType != EntityType::GROUND && colliderType != EntityType::PIPE) { + continue; + } + killPlayer(birdId); + return; + } + } + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } +} // namespace ECS diff --git a/src/flappybird/systems/environment/CMakeLists.txt b/src/flappybird/systems/environment/CMakeLists.txt new file mode 100644 index 00000000..0073ea14 --- /dev/null +++ b/src/flappybird/systems/environment/CMakeLists.txt @@ -0,0 +1,7 @@ +target_sources(flappybird PRIVATE + System+MoveGround.cpp + System+MovePipes.cpp + System+Replay.cpp +) + +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/flappybird/systems/environment/System+MoveGround.cpp b/src/flappybird/systems/environment/System+MoveGround.cpp new file mode 100644 index 00000000..cd74d7af --- /dev/null +++ b/src/flappybird/systems/environment/System+MoveGround.cpp @@ -0,0 +1,31 @@ +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "SparseArray.hpp" +#include "System.hpp" + +namespace ECS { + void System::moveGround() + { + auto screenWidth = static_cast(Render::RenderPluginConfig::getInstance()._windowWidth); + auto &world = Core::World::getInstance(); + auto &pos = world.getComponent(); + auto &type = world.getComponent(); + auto &speed = world.getComponent(); + + for (size_t i = 0; i < pos.size(); i++) { + if (!pos[i].has_value() || !type[i].has_value() || !speed[i].has_value()) { + continue; + } + auto &typeVal = type[i].value().type; + if (typeVal != EntityType::GROUND) { + continue; + } + auto &posVal = pos[i].value(); + auto &speedVal = speed[i].value().speed; + + posVal.x -= speedVal * world.getDeltaTime(); + if (posVal.x <= -screenWidth) { + posVal.x = screenWidth; + } + } + } +} // namespace ECS diff --git a/src/flappybird/systems/environment/System+MovePipes.cpp b/src/flappybird/systems/environment/System+MovePipes.cpp new file mode 100644 index 00000000..5e8fa06b --- /dev/null +++ b/src/flappybird/systems/environment/System+MovePipes.cpp @@ -0,0 +1,44 @@ +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "SparseArray.hpp" +#include "System.hpp" +#include "Values.hpp" + +namespace ECS { + void System::movePipes() + { + auto &world = Core::World::getInstance(); + auto &pos = world.getComponent(); + auto &type = world.getComponent(); + auto &speed = world.getComponent(); + auto &score = world.getComponent(); + + try { + auto &configReader = ConfigReader::getInstance(); + auto &conf = configReader.loadConfig(CONFIG_PATH); + float pipeLoopWidth = conf["entities"]["pipes"]["loop_width"]; + + for (size_t i = 0; i < pos.size(); i++) { + if (!pos[i].has_value() || !type[i].has_value() || !speed[i].has_value() || !score[i].has_value()) { + continue; + } + auto &typeVal = type[i].value().type; + if (typeVal != EntityType::PIPE) { + continue; + } + auto &posVal = pos[i].value(); + auto &speedVal = speed[i].value().speed; + + posVal.x -= speedVal * Core::World::getInstance().getDeltaTime(); + if (posVal.x <= -pipeLoopWidth / 2) { + posVal.x = pipeLoopWidth / 2; + if (score[i].value().score == 1) { + score[i]->score = 0; + } + } + } + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } +} // namespace ECS diff --git a/src/flappybird/systems/environment/System+Replay.cpp b/src/flappybird/systems/environment/System+Replay.cpp new file mode 100644 index 00000000..f5801e94 --- /dev/null +++ b/src/flappybird/systems/environment/System+Replay.cpp @@ -0,0 +1,147 @@ +#include "Components.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Music/MusicComponent.hpp" +#include "EwECS/Physic/PhysicPlugin.hpp" +#include "EwECS/SFMLDisplayClass/RenderPlugin.hpp" +#include "EwECS/SFMLDisplayClass/TextComponent.hpp" +#include "EwECS/Sound/Sound.hpp" +#include "SparseArray.hpp" +#include "System.hpp" +#include "Values.hpp" + +namespace ECS { + static void setupEntities() + { + auto &world = ECS::Core::World::getInstance(); + + try { + // Get config + auto &conf = ConfigReader::getInstance().loadConfig(CONFIG_PATH); + auto &scoreConf = conf["entities"]["score"]; + auto &ground1Conf = conf["entities"]["ground_1"]; + auto &ground2Conf = conf["entities"]["ground_2"]; + auto &birdConf = conf["entities"]["bird"]; + auto &pipesConf = conf["entities"]["pipes"]; + auto &soundsConf = conf["sounds"]; + auto &physicConf = ECS::Physic::PhysicPluginConfig::getInstance(); + + // Get components + auto &vec = world.getComponent(); + auto &speed = world.getComponent(); + auto &type = world.getComponent(); + auto &sprite = world.getComponent(); + auto &weight = world.getComponent(); + auto &jump = world.getComponent(); + auto &hitbox = world.getComponent(); + auto &score = world.getComponent(); + auto &text = world.getComponent(); + + // Setup background + size_t backgroundId = world.createEntity(); + vec.insertAt(backgroundId, ECS::Utils::Vector2f {0, 0}); + type.insertAt(backgroundId, Component::TypeEntity {EntityType::BACKGROUND}); + sprite.insertAt(backgroundId, Component::LoadedSprite {"config/flappybird/sprites/background.json"}); + + // Setup score entity + size_t scoreId = world.createEntity(); + vec.insertAt(scoreId, ECS::Utils::Vector2f {scoreConf["position"]["x"], scoreConf["position"]["y"]}); + type.insertAt(scoreId, Component::TypeEntity {EntityType::TEXT}); + score.insertAt(scoreId, Component::Score {0}); + text.insertAt(scoreId, Component::TextComponent("0", Component::TextColor::WHITE, scoreConf["size"])); + + // Setup pipes + for (auto &pipe : pipesConf["items"]) { + size_t pipeId = world.createEntity(); + std::string pipePath = + "config/flappybird/sprites/pipe-" + pipe["orientation"].get() + ".json"; + float pipeScore = 2; + + if (pipe["scored"]) { + pipeScore = 0; + } + + vec.insertAt(pipeId, ECS::Utils::Vector2f {pipe["x"], pipe["y"]}); + speed.insertAt(pipeId, Component::Speed {pipesConf["speed"]}); + type.insertAt(pipeId, Component::TypeEntity {EntityType::PIPE}); + sprite.insertAt(pipeId, Component::LoadedSprite {pipePath}); + hitbox.insertAt(pipeId, + Component::HitBox {pipesConf["hitbox"]["width"], pipesConf["hitbox"]["height"]}); + score.insertAt(pipeId, Component::Score {pipeScore}); + } + + // Setup ground entities + size_t ground1Id = world.createEntity(); + vec.insertAt(ground1Id, ECS::Utils::Vector2f {0, ground1Conf["position"]["y"]}); + speed.insertAt(ground1Id, Component::Speed {ground1Conf["speed"]}); + type.insertAt(ground1Id, Component::TypeEntity {EntityType::GROUND}); + sprite.insertAt(ground1Id, Component::LoadedSprite {"config/flappybird/sprites/ground.json"}); + hitbox.insertAt(ground1Id, + Component::HitBox {ground1Conf["hitbox"]["width"], ground1Conf["hitbox"]["height"]}); + + size_t ground2Id = world.createEntity(); + vec.insertAt(ground2Id, ECS::Utils::Vector2f {ground2Conf["position"]["x"], ground2Conf["position"]["y"]}); + speed.insertAt(ground2Id, Component::Speed {ground2Conf["speed"]}); + type.insertAt(ground2Id, Component::TypeEntity {EntityType::GROUND}); + sprite.insertAt(ground2Id, Component::LoadedSprite {"config/flappybird/sprites/ground.json"}); + hitbox.insertAt(ground2Id, + Component::HitBox {ground2Conf["hitbox"]["width"], ground2Conf["hitbox"]["height"]}); + + // Setup player entity + size_t birdId = world.createEntity(); + vec.insertAt(birdId, ECS::Utils::Vector2f {birdConf["position"]["x"], birdConf["position"]["y"]}); + type.insertAt(birdId, Component::TypeEntity {EntityType::BIRD}); + sprite.insertAt(birdId, Component::LoadedSprite {"config/flappybird/sprites/bird.json"}); + weight.insertAt(birdId, Component::Weight(birdConf["weight"], physicConf._initialJumpVelocity)); + jump.insertAt(birdId, Component::Jump(birdConf["jump"]["strength"], birdConf["jump"]["height"], + birdConf["jump"]["floating"])); + hitbox.insertAt(birdId, Component::HitBox {birdConf["hitbox"]["width"], birdConf["hitbox"]["height"]}); + + // Add music + world.emplaceEntityComponent( + birdId, soundsConf["music"]["path"], soundsConf["music"]["volume"], soundsConf["music"]["loop"]); + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } + + void System::replay() + { + Event::EventManager *eventManager = Event::EventManager::getInstance(); + auto &world = Core::World::getInstance(); + auto &events = eventManager->getEventsByType(); + auto &type = world.getComponent(); + auto &sound = world.getComponent(); + + size_t typeSize = type.size(); + + // first setup + if (typeSize < 1 || !type[1].has_value()) { + setupEntities(); + return; + } + + // detect ESCAPE key press + for (auto &keyEvent : events) { + if (keyEvent._keyId != Event::KeyIdentifier::ESCAPE) { + continue; + } + // check player doesn't exist + for (size_t i = 0; i < typeSize; i++) { + if (!type[i].has_value() || type[i].value().type != EntityType::BIRD) { + continue; + } + return; + } + // kill all entities + for (size_t i = 0; i < typeSize; i++) { + if (sound[i].has_value()) { + ECS::Sound::stop(sound[i].value()); + } + world.killEntity(i); + } + return; + } + } +} // namespace ECS diff --git a/src/flappybird/systems/score/CMakeLists.txt b/src/flappybird/systems/score/CMakeLists.txt new file mode 100644 index 00000000..5cdd8501 --- /dev/null +++ b/src/flappybird/systems/score/CMakeLists.txt @@ -0,0 +1,5 @@ +target_sources(flappybird PRIVATE + System+UpdateScore.cpp +) + +target_include_directories(flappybird PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/flappybird/systems/score/System+UpdateScore.cpp b/src/flappybird/systems/score/System+UpdateScore.cpp new file mode 100644 index 00000000..1275590e --- /dev/null +++ b/src/flappybird/systems/score/System+UpdateScore.cpp @@ -0,0 +1,54 @@ +#include "EwECS/Logger.hpp" +#include "EwECS/SFMLDisplayClass/TextComponent.hpp" +#include "SFMLDisplayClass.hpp" +#include "System.hpp" +#include "Values.hpp" +#include "World.hpp" + +namespace ECS { + void System::updateScore() + { + auto &world = Core::World::getInstance(); + auto &type = world.getComponent(); + auto &text = world.getComponent(); + auto &score = world.getComponent(); + auto &pos = world.getComponent(); + + try { + auto &configReader = ConfigReader::getInstance(); + auto &conf = configReader.loadConfig(CONFIG_PATH); + auto &birdConf = conf["entities"]["bird"]; + + size_t typeSize = type.size(); + + for (size_t textId = 0; textId < typeSize; textId++) { + if (!type[textId].has_value() || !score[textId].has_value() || !text[textId].has_value()) { + continue; + } + if (type[textId].value().type != EntityType::TEXT) { + continue; + } + for (size_t pipeId = 0; pipeId < typeSize; pipeId++) { + if (!type[pipeId].has_value() || !score[pipeId].has_value() || !pos[pipeId].has_value()) { + continue; + } + if (type[pipeId].value().type != EntityType::PIPE) { + continue; + } + if (score[pipeId].value().score > 0) { + continue; + } + if (pos[pipeId].value().x > birdConf["position"]["x"]) { + continue; + } + score[pipeId]->score = 1; + score[textId]->score += 1; + text[textId]->text = std::to_string(score[textId]->score); + return; + } + } + } catch (std::exception &e) { + Logger::error("Failed to load config: " + std::string(e.what())); + } + } +} // namespace ECS \ No newline at end of file diff --git a/src/rtype/CMakeLists.txt b/src/rtype/CMakeLists.txt index 37cee9a5..d296f83b 100644 --- a/src/rtype/CMakeLists.txt +++ b/src/rtype/CMakeLists.txt @@ -1,47 +1,30 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") -find_package(SDL2 REQUIRED) - target_sources(rtype PRIVATE - Packets.hpp - Values.hpp - NetworkHandler.hpp - NetworkHandler.cpp - TypeUtils.hpp TypeUtils.cpp - PlayerColor.hpp ) add_subdirectory(events) add_subdirectory(components) target_link_libraries(rtype - PRIVATE R_Type::R_Type_options + PRIVATE R_Type::R_Type_warnings - ${Boost_LIBRARIES} - Boost::asio - Boost::serialization - Boost::uuid ecs - SDL2::SDL2main - SDL2::SDL2 - SDL2_image ) target_include_directories(rtype PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} ) target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} ) +target_include_directories(rtype PRIVATE "${PROJECT_SOURCE_DIR}/extern/EwECS/includes") set_target_properties(rtype PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin diff --git a/src/rtype/ClientPackets.hpp b/src/rtype/ClientPackets.hpp new file mode 100644 index 00000000..a200c250 --- /dev/null +++ b/src/rtype/ClientPackets.hpp @@ -0,0 +1,23 @@ +#include "EwECS/Network/Packet.hpp" + +#ifndef CLIENTPACKETS_HPP + #define CLIENTPACKETS_HPP + +namespace RType::Client { + + PACK(struct MovePayload + : ECS::Network::IPayload { + float moveX; + float moveY; + + MovePayload() = default; + + MovePayload(float aMoveX, float aMoveY) + { + moveX = aMoveX; + moveY = aMoveY; + } + }); +} // namespace RType::Client + +#endif diff --git a/src/rtype/NetworkHandler.cpp b/src/rtype/NetworkHandler.cpp deleted file mode 100644 index e2c6d5a5..00000000 --- a/src/rtype/NetworkHandler.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "NetworkHandler.hpp" -#include -#include -#include -#include -#include -#include "EventManager.hpp" -#include "Packets.hpp" - -namespace Network { - - using boost::asio::ip::udp; - - void NetworkHandler::start(const boost::asio::basic_socket::protocol_type &aProtocol) - { - _socket.open(aProtocol); - listen(); - } - - void NetworkHandler::bind(const udp::endpoint &aEndpoint) - { - _socket.bind(aEndpoint); - } - - void NetworkHandler::onReceive(std::function aOnReceive) - { - _onReceive = aOnReceive; - } - - void NetworkHandler::onReceiveAknowledgment( - std::function aOnReceiveAknowledgment) - { - _onReceiveAknowledgment = aOnReceiveAknowledgment; - } - - void NetworkHandler::listen() - { - _socket.async_receive_from(boost::asio::buffer(_readBuffer), _readEndpoint, - boost::bind(&NetworkHandler::handleRequest, this, boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred)); - - if (!_ioThread.joinable()) { - _ioThread = std::thread(boost::bind(&boost::asio::io_service::run, &_ioService)); - } - } - - void NetworkHandler::handleRequest(const boost::system::error_code &aError, std::size_t aBytesTransferred) - { - (void) aError; - (void) aBytesTransferred; - - RType::Packet packet; - RType::unserializePacket>(&packet, _readBuffer); - - if (packet.type == -1) { // receive aknowledgment - _onReceiveAknowledgment(packet.uuid, _readEndpoint); - if (_senders.find(packet.uuid) != _senders.end() && _senders[packet.uuid].first.joinable()) { - _senders[packet.uuid].second = false; - _senders[packet.uuid].first.join(); - _senders.erase(packet.uuid); - } - } else { - answerAknowledgment(packet.uuid, _readEndpoint); - _onReceive(packet, _readEndpoint); - } - listen(); - } - - void NetworkHandler::send(const RType::Packet &aPacket, udp::endpoint &aClientEndpoint) - { - boost::asio::streambuf buf; - RType::serializePacket(&buf, aPacket); - _socket.send_to(buf.data(), aClientEndpoint); - - // _senders[aPacket.uuid].second = true; - // _senders[aPacket.uuid].first = std::thread([this, aPacket, aClientEndpoint]() { - // try { - // boost::asio::streambuf buf; - // RType::serializePacket(&buf, aPacket); - - // while (_senders[aPacket.uuid].second.load()) { - // _socket.send_to(buf.data(), aClientEndpoint); - // std::this_thread::sleep_for(std::chrono::milliseconds(200)); - // } - // } catch (std::exception &e) { - // std::cerr << "NetworkHandler send error: " << e.what() << std::endl; - // } - // }); - } - - void NetworkHandler::answerAknowledgment(const std::string &aPacketUuid, udp::endpoint &aEndpoint) - { - try { - boost::asio::streambuf buf; - RType::Packet packet(aPacketUuid); - RType::serializePacket(&buf, packet); - _socket.send_to(buf.data(), aEndpoint); - } catch (std::exception &e) { - std::cerr << "NetworkHandler send error: " << e.what() << std::endl; - } - } - - boost::asio::io_service &NetworkHandler::getIoService() - { - return _ioService; - } - - void NetworkHandler::stop() - { - for (auto &sender : _senders) { - sender.second.second = false; - if (sender.second.first.joinable()) { - sender.second.first.join(); - } - } - _ioService.stop(); - if (_ioThread.joinable()) { - _ioThread.join(); - } - _socket.close(); - } - -} // namespace Network diff --git a/src/rtype/NetworkHandler.hpp b/src/rtype/NetworkHandler.hpp deleted file mode 100644 index a1fd2e59..00000000 --- a/src/rtype/NetworkHandler.hpp +++ /dev/null @@ -1,117 +0,0 @@ -#include -#include -#include "Packets.hpp" -#include "Values.hpp" -#include - -#ifndef NETWORKHANDLER_HPP - #define NETWORKHANDLER_HPP - -namespace Network { - enum ConnectionStatus - { - PENDING, - CONNECTED, - }; - - using boost::asio::ip::udp; - using Sender = std::pair>; - - class NetworkHandler - { - private: - boost::asio::io_service _ioService; - udp::socket _socket = udp::socket(_ioService); - std::array _readBuffer = std::array(); - udp::endpoint _readEndpoint; - std::function _onReceive; - std::function _onReceiveAknowledgment; - std::thread _ioThread; - - std::unordered_map _senders; - - /** - * @brief Launch the server - */ - NetworkHandler() = default; - - /** - * @brief Handle a request from a client - * @param aError The error code - * @param aBytesTransferred The number of bytes transferred - */ - void handleRequest(const boost::system::error_code &, std::size_t); - - public: - /** - * @brief Destroy the NetworkHandler object - */ - ~NetworkHandler() = default; - - /** - * @brief Get the instance of the singleton - * @return NetworkHandler & The instance of the singleton - */ - static NetworkHandler &getInstance() - { - static NetworkHandler instance; - return instance; - } - - /** - * @brief Start handler with specific protocol - * @param aProtocol The protocol to use - */ - void start(const boost::asio::basic_socket::protocol_type &); - - /** - * @brief Start handler with specific protocol - * @param aEndpoint The endpoint to bind to - */ - void bind(const udp::endpoint &); - - /** - * @brief Set the on receive callback - * @param aOnReceive The callback to set - */ - void onReceive(std::function); - - /** - * @brief Set the on receive aknowledgment callback - * @param aOnReceiveAlnowledgment The callback to set - */ - void onReceiveAknowledgment(std::function); - - /** - * @brief Listen to clients - */ - void listen(); - - /** - * @brief Send a message to the server - * @param aPacket The packet to send - * @param aClientEndpoint The id of the client to send the message to - */ - void send(const RType::Packet &, udp::endpoint &); - - /** - * @brief Answer to a sender as the packet has been received - * @param aPacketUuid The uuid of the packet - * @param aEndpoint The endpoint of the sender - */ - void answerAknowledgment(const std::string &, udp::endpoint &); - - /** - * @brief Get the io service - */ - boost::asio::io_service &getIoService(); - - /** - * @brief Stop the handler - */ - void stop(); - }; - -} // namespace Network - -#endif diff --git a/src/rtype/Packets.hpp b/src/rtype/Packets.hpp deleted file mode 100644 index 143c3298..00000000 --- a/src/rtype/Packets.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ClientGameEvent.hpp" -#include "ServerGameEvent.hpp" -#include -#include -#include -#include - -#ifndef PACKETS_HPP - #define PACKETS_HPP - -namespace RType { - - struct Packet - { - std::string uuid; - int type; - std::vector payload; - - Packet() = default; - - Packet(int aType) - : uuid(boost::uuids::to_string(boost::uuids::uuid(boost::uuids::random_generator()()))), - type(aType), - payload() - {} - - Packet(int aType, std::vector aPayload) - : uuid(boost::uuids::to_string(boost::uuids::uuid(boost::uuids::random_generator()()))), - type(aType), - payload(aPayload) - {} - - Packet(const std::string &aUuid) // answer aknowledgment - : uuid(aUuid), - type(-1), - payload() - {} - - template - void serialize(archive &ar, const unsigned int /*version*/) - { - ar &uuid; - ar &type; - ar &payload; - } - }; - - struct Aknowlegdment - { - std::string uuid; - }; - - inline void serializePacket(boost::asio::streambuf *buf, const Packet &aPacket) - { - std::ostream archiveStream(buf); - boost::archive::binary_oarchive archive(archiveStream); - archive << aPacket; - } - - template - void unserializePacket(Packet *aPacket, BufferType &aReadBuffer) - { - std::string receivedData(aReadBuffer.data(), aReadBuffer.size()); - std::istringstream archiveStream(receivedData); - boost::archive::binary_iarchive archive(archiveStream); - archive >> *aPacket; - } -} // namespace RType - -#endif diff --git a/src/rtype/ServerPackets.hpp b/src/rtype/ServerPackets.hpp new file mode 100644 index 00000000..718baf77 --- /dev/null +++ b/src/rtype/ServerPackets.hpp @@ -0,0 +1,162 @@ +#include "EwECS/Network/Packet.hpp" + +#ifndef SERVERPACKETS_HPP + #define SERVERPACKETS_HPP + +namespace RType::Server { + + PACK(struct PlayerJoinedPayload + : ECS::Network::IPayload { + unsigned short playerId; + bool isReceiver; + uint8_t playerColor; + float posX; + float posY; + + PlayerJoinedPayload() = default; + + PlayerJoinedPayload(unsigned short aPlayerId, bool aIsReceiver, uint8_t aPlayerColor, float aPosX, + float aPosY) + { + playerId = aPlayerId; + isReceiver = aIsReceiver; + playerColor = aPlayerColor; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct PlayerLeftPayload + : ECS::Network::IPayload { + unsigned short playerId; + + PlayerLeftPayload() = default; + + PlayerLeftPayload(unsigned short aPlayerId) + { + playerId = aPlayerId; + } + }); + + PACK(struct PlayerPositionPayload + : ECS::Network::IPayload { + unsigned short playerId; + float posX; + float posY; + + PlayerPositionPayload() = default; + + PlayerPositionPayload(unsigned short aPlayerId, float aPosX, float aPosY) + { + playerId = aPlayerId; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct PlayerGotBonusPayload + : ECS::Network::IPayload { + unsigned short playerId; + unsigned short bonusId; + + PlayerGotBonusPayload() = default; + + PlayerGotBonusPayload(unsigned short aPlayerId, unsigned short aBonusId) + { + playerId = aPlayerId; + bonusId = aBonusId; + } + }); + + PACK(struct PlayerShotPayload + : ECS::Network::IPayload { + unsigned short bulletId; + float posX; + float posY; + + PlayerShotPayload() = default; + + PlayerShotPayload(unsigned short aBulletId, float aPosX, float aPosY) + { + bulletId = aBulletId; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct PlayerDiedPayload + : ECS::Network::IPayload { + unsigned short playerId; + + PlayerDiedPayload() = default; + + PlayerDiedPayload(unsigned short aPlayerId) + { + playerId = aPlayerId; + } + }); + + PACK(struct EnemySpawnedPayload + : ECS::Network::IPayload { + unsigned short enemyId; + float posX; + float posY; + + EnemySpawnedPayload() = default; + + EnemySpawnedPayload(unsigned short aEnemyId, float aPosX, float aPosY) + { + enemyId = aEnemyId; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct EnemyPositionPayload + : ECS::Network::IPayload { + uint8_t enemyId; + float posX; + float posY; + + EnemyPositionPayload() = default; + + EnemyPositionPayload(uint8_t aEnemyId, float aPosX, float aPosY) + { + enemyId = aEnemyId; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct EnemyShotPayload + : ECS::Network::IPayload { + unsigned short bulletId; + float posX; + float posY; + + EnemyShotPayload() = default; + + EnemyShotPayload(unsigned short aBulletId, float aPosX, float aPosY) + { + bulletId = aBulletId; + posX = aPosX; + posY = aPosY; + } + }); + + PACK(struct EnemyDiedPayload + : ECS::Network::IPayload { + unsigned short enemyId; + unsigned short bonusId; + + EnemyDiedPayload() = default; + + EnemyDiedPayload(unsigned short aEnemyId, unsigned short aBonusId) + { + enemyId = aEnemyId; + bonusId = aBonusId; + } + }); +} // namespace RType::Server + +#endif diff --git a/src/rtype/TypeUtils.hpp b/src/rtype/TypeUtils.hpp index 66f18d7f..2e24ec08 100644 --- a/src/rtype/TypeUtils.hpp +++ b/src/rtype/TypeUtils.hpp @@ -1,6 +1,6 @@ #include #include "Components.hpp" -#include "SparseArray.hpp" +#include "EwECS/SparseArray.hpp" #ifndef RTYPE_UTILS_HPP_ #define RTYPE_UTILS_HPP_ diff --git a/src/rtype/Values.hpp b/src/rtype/Values.hpp index 51e3f9d3..64a4a819 100644 --- a/src/rtype/Values.hpp +++ b/src/rtype/Values.hpp @@ -9,10 +9,6 @@ #define VALUES_HPP_ #include -//------------------ NETWORK ------------------// -const constexpr unsigned short READ_BUFFER_SIZE = 1024; -const constexpr float PACKET_TIMEOUT = 2.0F; // in seconds - // ------------------ DISPLAY ------------------ // const constexpr int SCREEN_WIDTH = 1920; const constexpr int SCREEN_HEIGHT = 1080; @@ -22,7 +18,7 @@ const constexpr float ENEMY_SPEED = 200; const constexpr int ENEMY_TEX_WIDTH = 33; const constexpr int ENEMY_TEX_HEIGHT = 33; static const std::string ENEMY_ASSET = "assets/sprites/r-typesheet5.png"; -const constexpr int PROBABILTY_SHOOT_ENEMY = 200000; +const constexpr int PROBABILTY_SHOOT_ENEMY = 100; const constexpr int ENEMY_SPAWN_INTERVAL = 5; // in seconds //------------------ BACKGROUND ------------------// @@ -37,6 +33,7 @@ const constexpr float PLAYER_SPEED = 10; const constexpr int PLAYER_TEX_WIDTH = 33; const constexpr int PLAYER_TEX_HEIGHT = 17; const constexpr int MAX_NUMBER_PLAYER = 4; +const constexpr float DELTA = 5.F; //------------------ BULLET (for players) ------------------// static const std::string BULLET_ASSET = "assets/sprites/r-typesheet2.png"; @@ -62,9 +59,11 @@ const constexpr int FAILURE = 84; //------------------ BONUS ------------------// static const std::string BONUS_ASSET = "assets/sprites/powerup.png"; -const constexpr float BONUS_SPEED = 800; +const constexpr float BONUS_SPEED = 200; const constexpr int BONUS_TEX_WIDTH = 250; const constexpr int BONUS_TEX_HEIGHT = 280; +const constexpr float BONUS_SCALE = 0.1; +const constexpr float BONUS_GAIN_FACTOR = 1.5; // ------------------ LOADING MESSAGE ------------------ // static const std::string LOADING_MESSAGE_ASSET = "assets/sprites/loading-message.png"; @@ -76,4 +75,7 @@ static const std::string SERVER_FULL_MESSAGE = "assets/sprites/server-full-messa const constexpr int SERVER_FULL_MESSAGE_TEX_WIDTH = 556; const constexpr int SERVER_FULL_MESSAGE_TEX_HEIGHT = 95; +// ------------------ CRASH DETECTION ------------------ // +const constexpr float PACKET_TIMEOUT = 5; + #endif /* !VALUES_HPP_ */ diff --git a/src/rtype/components/CMakeLists.txt b/src/rtype/components/CMakeLists.txt index b3975757..9dee15df 100644 --- a/src/rtype/components/CMakeLists.txt +++ b/src/rtype/components/CMakeLists.txt @@ -1,12 +1,3 @@ -find_package(Threads REQUIRED) -find_package(SDL2 REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_include_directories(rtype PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(rtype PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/rtype/components/Components.hpp b/src/rtype/components/Components.hpp index c3a90524..e5c4ac6d 100644 --- a/src/rtype/components/Components.hpp +++ b/src/rtype/components/Components.hpp @@ -7,10 +7,7 @@ #ifndef COMPONENTS_HPP_ #define COMPONENTS_HPP_ -#include "Connection.hpp" -#include "HitBox.hpp" #include "IsAlive.hpp" -#include "LoadedSprite.hpp" #include "Speed.hpp" #include "TypeEntity.hpp" #endif /* !COMPONENTS_HPP_ */ diff --git a/src/rtype/components/Connection.hpp b/src/rtype/components/Connection.hpp deleted file mode 100644 index e4ebf5fb..00000000 --- a/src/rtype/components/Connection.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include "NetworkHandler.hpp" - -#ifndef CONNECTION_STATUS_HPP - #define CONNECTION_STATUS_HPP - -namespace Component { - struct Connection - { - /** - * @brief Construct a new ConnectionStatus object - * - */ - Connection() - : status(Network::ConnectionStatus::PENDING) - {} - /** - * @brief Construct a new ConnectionStatus object - * - * @param aStatus The status of the entity - */ - explicit Connection(Network::ConnectionStatus aStatus) - : status(aStatus) - {} - - Network::ConnectionStatus status; - float age; - }; -} // namespace Component -#endif // DEBUG \ No newline at end of file diff --git a/src/rtype/components/HitBox.hpp b/src/rtype/components/HitBox.hpp deleted file mode 100644 index d889c585..00000000 --- a/src/rtype/components/HitBox.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef HITBOX_HPP_ -#define HITBOX_HPP_ - -namespace Component { - struct HitBox - { - /** - * @brief Construct a new Hit Box object - * - */ - HitBox() - : width(0), - height(0) - {} - /** - * @brief Construct a new Hit Box object - * - * @param aWidth Width of the hitbox - * @param aHeight Height of the hitbox - */ - HitBox(float aWidth, float aHeight) - : width(aWidth), - height(aHeight) - {} - float width; - float height; - }; -} // namespace Component - -#endif /* !HITBOX_HPP_ */ diff --git a/src/rtype/components/LoadedSprite.hpp b/src/rtype/components/LoadedSprite.hpp deleted file mode 100644 index b487f9cb..00000000 --- a/src/rtype/components/LoadedSprite.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -** EPITECH PROJECT, 2023 -** R-Type -** File description: -** LoadedSprite -*/ - -#include -#include -#include -#include - -#ifndef LOADEDSPRITE_HPP - #define LOADEDSPRITE_HPP - -namespace Component { - struct LoadedSprite - { - /** - * @brief Construct a new Loaded Sprite object - * - */ - LoadedSprite() - : texture(nullptr), - rect(nullptr), - srcRect(nullptr) - {} - /** - * @brief Construct a new Loaded Sprite object - * - * @param aPath path to the sprite - * @param aTexture texture of the sprite (once loaded) - * @param aTextureRect Size and position of the sprite in the texture - * @param aDisplayRect Size and position of the sprite on the screen - */ - LoadedSprite(std::string aPath, SDL_Texture *aTexture, SDL_Rect *aTextureRect, SDL_Rect *aDisplayRect) - : path(std::move(aPath)), - texture(aTexture), - rect(aTextureRect), - srcRect(aDisplayRect) - {} - - std::string path; - SDL_Texture *texture; - SDL_Rect *rect; - SDL_Rect *srcRect; - }; -} // namespace Component -#endif // DEBUG \ No newline at end of file diff --git a/src/rtype/components/TypeEntity.hpp b/src/rtype/components/TypeEntity.hpp index 6dfe3e87..cbbefefa 100644 --- a/src/rtype/components/TypeEntity.hpp +++ b/src/rtype/components/TypeEntity.hpp @@ -38,14 +38,15 @@ namespace Component { * @param aIsBackground a boolean to know if the entity is a background */ TypeEntity(bool aIsPlayer, bool aIsBot, bool aIsEnemy, bool aIsBullet, bool aIsWall, bool aIsBonus, - bool aIsBackground) + bool aIsBackground, bool aIsEnemyMissile = false) : isPlayer(aIsPlayer), isBot(aIsBot), isEnemy(aIsEnemy), isBullet(aIsBullet), isWall(aIsWall), isBonus(aIsBonus), - isBackground(aIsBackground) + isBackground(aIsBackground), + isEnemyMissile(aIsEnemyMissile) {} /** * @brief Construct a new Type Entity object @@ -60,7 +61,7 @@ namespace Component { * @param aOnlineId an optional size_t to know the online id of the entity */ TypeEntity(bool aIsPlayer, bool aIsBot, bool aIsEnemy, bool aIsBullet, bool aIsWall, bool aIsBonus, - bool aIsBackground, size_t aOnlineId) + bool aIsBackground, size_t aOnlineId, bool aIsEnemyMissile = false) : isPlayer(aIsPlayer), isBot(aIsBot), isEnemy(aIsEnemy), @@ -68,7 +69,8 @@ namespace Component { isWall(aIsWall), isBonus(aIsBonus), isBackground(aIsBackground), - onlineId(aOnlineId) + onlineId(aOnlineId), + isEnemyMissile(aIsEnemyMissile) {} bool isPlayer; @@ -79,6 +81,7 @@ namespace Component { bool isBonus; bool isBackground; std::optional onlineId; + bool isEnemyMissile; }; } // namespace Component diff --git a/src/rtype/events/CMakeLists.txt b/src/rtype/events/CMakeLists.txt index 55d44edb..7f75f1ed 100644 --- a/src/rtype/events/CMakeLists.txt +++ b/src/rtype/events/CMakeLists.txt @@ -1,7 +1,3 @@ -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - -find_package(Threads REQUIRED) - target_sources(rtype PRIVATE ClientGameEvent.hpp ClientGameEvent.cpp @@ -11,19 +7,12 @@ target_sources(rtype PRIVATE target_include_directories(rtype PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} ) target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} ) target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(rtype PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/rtype/events/ClientGameEvent.cpp b/src/rtype/events/ClientGameEvent.cpp index 33c7de43..9b8d5a32 100644 --- a/src/rtype/events/ClientGameEvent.cpp +++ b/src/rtype/events/ClientGameEvent.cpp @@ -3,13 +3,11 @@ namespace RType { ClientGameEvent::ClientGameEvent(ClientEventType aType) - : ECS::Event::Event(ECS::Event::EventType::GAME), - _type(aType) + : _type(aType) {} - ClientGameEvent::ClientGameEvent(ClientEventType aType, std::vector aPayload) - : ECS::Event::Event(ECS::Event::EventType::GAME), - _type(aType), + ClientGameEvent::ClientGameEvent(ClientEventType aType, ECS::Network::IPayload *aPayload) + : _type(aType), _payload(aPayload) {} @@ -18,9 +16,4 @@ namespace RType { return _type; } - std::vector ClientGameEvent::getPayload() const - { - return _payload; - } - } // namespace RType diff --git a/src/rtype/events/ClientGameEvent.hpp b/src/rtype/events/ClientGameEvent.hpp index 7d00ac8b..85e87b32 100644 --- a/src/rtype/events/ClientGameEvent.hpp +++ b/src/rtype/events/ClientGameEvent.hpp @@ -1,13 +1,14 @@ #include +#include #include -#include "Event.hpp" +#include "EwECS/Network/Packet.hpp" #ifndef CLIENTGAMEEVENT_HPP #define CLIENTGAMEEVENT_HPP namespace RType { - enum class ClientEventType + enum ClientEventType { PLAYER_SPAWN = 0, PLAYER_DISCONNECTION = 1, @@ -19,16 +20,17 @@ namespace RType { ENEMY_DEATH = 7, ENEMY_SHOOT = 8, SERVER_FULL = 9, + MAX_CLI_EVT = 10 }; /** * @brief Game event class is the base class of all game events */ - class ClientGameEvent : public ECS::Event::Event + class ClientGameEvent { private: ClientEventType _type; - std::vector _payload; + std::shared_ptr _payload; public: //-------------------CONSTRUCTORS / DESTRUCTOR-------------------// @@ -38,24 +40,33 @@ namespace RType { */ explicit ClientGameEvent(ClientEventType aType); + ClientGameEvent(const ClientGameEvent &gameEvent) = default; + ClientGameEvent(ClientGameEvent &&gameEvent) = default; + ClientGameEvent &operator=(const ClientGameEvent &gameEvent) = default; + ClientGameEvent &operator=(ClientGameEvent &&gameEvent) noexcept = default; + /** * @brief Construct a new Game Event object * @param aType the type of the event * @param aPayload the payload of the event */ - explicit ClientGameEvent(ClientEventType aType, std::vector aPayload); + explicit ClientGameEvent(ClientEventType aType, ECS::Network::IPayload *aPayload); /** * @brief Get event type * @return ClientEventType */ - ClientEventType getType() const; + [[nodiscard]] ClientEventType getType() const; /** - * @brief Get the payload of the event - * @return std::vector + * @brief Get payload + * @return The payload */ - std::vector getPayload() const; + template + [[nodiscard]] const Payload &getPayload() const + { + return *reinterpret_cast(_payload.get()); + } }; } // namespace RType diff --git a/src/rtype/events/ServerGameEvent.cpp b/src/rtype/events/ServerGameEvent.cpp index eff81997..00e90aef 100644 --- a/src/rtype/events/ServerGameEvent.cpp +++ b/src/rtype/events/ServerGameEvent.cpp @@ -1,17 +1,11 @@ #include "ServerGameEvent.hpp" -#include namespace RType { - using boost::asio::ip::udp; - - ServerGameEvent::ServerGameEvent(ServerEventType aType, int aEntityId, std::vector aPayload, - udp::endpoint aClientEndpoint) - : ECS::Event::Event(ECS::Event::EventType::GAME), - _type(aType), + ServerGameEvent::ServerGameEvent(ServerEventType aType, unsigned short aEntityId, ECS::Network::IPayload *aPayload) + : _type(aType), _entityId(aEntityId), - _payload(aPayload), - _clientEndpoint(aClientEndpoint) + _payload(aPayload) {} ServerEventType ServerGameEvent::getType() const @@ -19,19 +13,9 @@ namespace RType { return _type; } - int ServerGameEvent::getEntityId() const + unsigned short ServerGameEvent::getEntityId() const { return _entityId; } - std::vector ServerGameEvent::getPayload() const - { - return _payload; - } - - udp::endpoint ServerGameEvent::getClientEndpoint() const - { - return _clientEndpoint; - } - } // namespace RType diff --git a/src/rtype/events/ServerGameEvent.hpp b/src/rtype/events/ServerGameEvent.hpp index 73231d2f..22896cfd 100644 --- a/src/rtype/events/ServerGameEvent.hpp +++ b/src/rtype/events/ServerGameEvent.hpp @@ -1,33 +1,31 @@ -#include -#include "Event.hpp" +#include +#include "EwECS/Network/Packet.hpp" #ifndef SERVERGAMEEVENT_HPP #define SERVERGAMEEVENT_HPP namespace RType { - using boost::asio::ip::udp; - - enum class ServerEventType + enum ServerEventType { + AKNOWLEDGMENT = -1, CONNECT = 0, DISCONNECT = 1, - AKNOWLEDGMENT = 2, - MOVE = 3, - SHOOT = 4, - BONUS = 5, + MOVE = 2, + SHOOT = 3, + BONUS = 4, + MAX_SRV_EVT = 5 }; /** * @brief Game event class is the base class of all game events */ - class ServerGameEvent : public ECS::Event::Event + class ServerGameEvent { private: ServerEventType _type; - int _entityId; - std::vector _payload; - udp::endpoint _clientEndpoint; + unsigned short _entityId; + std::shared_ptr _payload; public: //-------------------CONSTRUCTORS / DESTRUCTOR-------------------// @@ -36,34 +34,35 @@ namespace RType { * @param aType the type of the event * @param aEntityId the entity id * @param aPayload the payload - * @param aClientEndpoint the endpoint of the client who triggers the event */ - explicit ServerGameEvent(ServerEventType aType, int aEntityId, std::vector aPayload, - udp::endpoint aClientEndpoint); + ServerGameEvent(ServerEventType aType, unsigned short aEntityId, ECS::Network::IPayload *aPayload); + + ServerGameEvent(const ServerGameEvent &gameEvent) = default; + ServerGameEvent(ServerGameEvent &&gameEvent) = default; + ServerGameEvent &operator=(const ServerGameEvent &gameEvent) = default; + ServerGameEvent &operator=(ServerGameEvent &&gameEvent) noexcept = default; /** * @brief Get event type * @return EventType */ - ServerEventType getType() const; + [[nodiscard]] ServerEventType getType() const; /** * @brief Get entity id * @return The entity id */ - int getEntityId() const; + [[nodiscard]] unsigned short getEntityId() const; /** * @brief Get payload * @return The payload */ - std::vector getPayload() const; - - /** - * @brief Get client endpoint - * @return udp::endpoint - */ - udp::endpoint getClientEndpoint() const; + template + [[nodiscard]] const Payload &getPayload() const + { + return *reinterpret_cast(_payload.get()); + } }; } // namespace RType diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index dd607004..5be63a82 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(SDL2 REQUIRED) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") target_sources(server PRIVATE @@ -11,19 +9,14 @@ add_subdirectory(systems) add_subdirectory(timers) target_link_libraries(server - PRIVATE R_Type::R_Type_options + PRIVATE R_Type::R_Type_warnings - SDL2::SDL2main - SDL2::SDL2 - SDL2_image - ${Boost_LIBRARIES} - Boost::asio - Boost::serialization ecs + rtype ) target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(server PRIVATE ${Boost_INCLUDE_DIRS}) +target_include_directories(server PRIVATE "${PROJECT_SOURCE_DIR}/extern/EwECS/includes") set_target_properties(server PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin diff --git a/src/server/main.cpp b/src/server/main.cpp index 70b5489b..2587213f 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -1,18 +1,24 @@ #include +#include #include "Components.hpp" -#include "EventManager.hpp" +#include "EwECS/Asset/AssetManager.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/Physic/PhysicPlugin.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" #include "HitBox.hpp" #include "IsAlive.hpp" -#include "NetworkHandler.hpp" -#include "ServerHandler.hpp" +#include "PacketFactory.hpp" +#include "ServerGameEvent.hpp" #include "System.hpp" -#include "Utils.hpp" -#include "World.hpp" +#include "Values.hpp" int main(int ac, char **av) { if (ac < 3) { - std::cerr << "Usage: " << av[0] << " " << std::endl; + ECS::Logger::error("Usage: " + std::string(av[0]) + " "); return FAILURE; } @@ -20,82 +26,83 @@ int main(int ac, char **av) // Network std::string host(av[1]); unsigned short port = static_cast(std::stoi(av[2])); - Network::ServerHandler &server = Network::ServerHandler::getInstance(); - std::cout << "will start server" << std::endl; - server.start(host, port); - std::cout << "server started" << std::endl; + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); + server.onReceive([&server](int8_t aPacketType, ECS::Network::IPayload *aPayload, unsigned short aEntityId) { + if (aPacketType >= RType::ServerEventType::MAX_SRV_EVT) { + server.sendError(aEntityId); + return; + } + if (aPacketType >= 0) { + auto eventType = static_cast(aPacketType); + + ECS::Event::EventManager::getInstance()->pushEvent( + RType::ServerGameEvent(eventType, aEntityId, aPayload)); + } else if (aPacketType == AKNOWLEDGMENT_PACKET_TYPE) { + ECS::Event::EventManager::getInstance()->pushEvent( + RType::ServerGameEvent(RType::ServerEventType::AKNOWLEDGMENT, aEntityId, {})); + } + }); + server.start(host, port, 4, RType::packetFactory); // Setup ECS - std::cout << "start ECS" << std::endl; ECS::Core::World &world = ECS::Core::World::getInstance(); ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - std::cout << "ECS started" << std::endl; + ECS::Asset::AssetManager &assetManager = ECS::Asset::AssetManager::getInstance(); // Components - std::cout << "register components" << std::endl; - world.registerComponent(); world.registerComponent(); world.registerComponent(); - world.registerComponent(); world.registerComponent(); - world.registerComponent(); - std::cout << "components registered" << std::endl; + + ECS::Physic::PhysicPlugin physicPlugin; + + physicPlugin.plug(world, assetManager); // Player systems - std::cout << "add systems player" << std::endl; world.addSystem(ECS::System::welcomePlayer); world.addSystem(ECS::System::movePlayer); world.addSystem(ECS::System::playerShoot); - world.addSystem( - ECS::System::playerHit); + world.addSystem(ECS::System::playerHit); world.addSystem(ECS::System::killPlayer); - world.addSystem(ECS::System::moveSpeedUp); world.addSystem(ECS::System::disconnectPlayer); - std::cout << "systems player added" << std::endl; + + // Bonus systems + world.addSystem(ECS::System::moveBonus); + world.addSystem(ECS::System::triggerBonus); // Network systems - std::cout << "add systems network" << std::endl; world.addSystem(ECS::System::receiveAknowledgment); world.addSystem( ECS::System::handlePlayerCrash); - std::cout << "systems network added" << std::endl; // Enemy systems - std::cout << "add systems enemy" << std::endl; world.addSystem(ECS::System::spawnEnemy); world.addSystem(ECS::System::moveEnemy); world.addSystem(ECS::System::enemyShoot); - world.addSystem( - ECS::System::enemyHit); - world.addSystem(ECS::System::killEnemy); - std::cout << "systems enemy added" << std::endl; + world.addSystem(ECS::System::enemyHit); + world.addSystem(ECS::System::killEnemy); // Missile systems - std::cout << "add systems missile" << std::endl; world.addSystem(ECS::System::moveMissiles); - std::cout << "systems missile added" << std::endl; // Game loop while (world.isRunning()) { - std::cout << "will run systems" << std::endl; world.runSystems(); - std::cout << "systems runned" << std::endl; - std::cout << "will clear non game events" << std::endl; - eventManager->clearNonGameEvents(); - std::cout << "non game events cleared" << std::endl; - std::cout << "will calc delta time" << std::endl; + eventManager->keepEventsAndClear(); world.calcDeltaTime(); - std::cout << "delta time calculated" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - Network::NetworkHandler::getInstance().stop(); + ECS::Network::ServerHandler::getInstance().stop(); } catch (std::exception &e) { - Network::NetworkHandler::getInstance().stop(); - std::cout << "[RType server exception] " << e.what() << std::endl; + ECS::Network::ServerHandler::getInstance().stop(); + ECS::Logger::error("[RType server exception] " + std::string(e.what())); return FAILURE; } return SUCCESS; diff --git a/src/server/network/CMakeLists.txt b/src/server/network/CMakeLists.txt index 9f2b31af..af5a346f 100644 --- a/src/server/network/CMakeLists.txt +++ b/src/server/network/CMakeLists.txt @@ -1,29 +1,3 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - -target_sources(server PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/ServerHandler.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/ServerHandler.cpp" -) - -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - ecs - rtype - Boost::asio - Boost::serialization - Boost::uuid - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/network/PacketFactory.hpp b/src/server/network/PacketFactory.hpp new file mode 100644 index 00000000..fa7d05a7 --- /dev/null +++ b/src/server/network/PacketFactory.hpp @@ -0,0 +1,18 @@ +#include +#include "ClientPackets.hpp" +#include "EwECS/Network/Serialization.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "ServerGameEvent.hpp" + +#ifndef PACKET_FACTORY_HPP_ + #define PACKET_FACTORY_HPP_ + +namespace RType { + + static ECS::Network::PacketFactory packetFactory = { + {ServerEventType::MOVE, [](ECS::Network::Buffer &aBuffer) -> ECS::Network::IPayload * { + return ECS::Network::unserializePointer(aBuffer); + }}}; +} // namespace RType + +#endif diff --git a/src/server/network/ServerHandler.cpp b/src/server/network/ServerHandler.cpp deleted file mode 100644 index 809cdcc3..00000000 --- a/src/server/network/ServerHandler.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "ServerHandler.hpp" -#include -#include -#include -#include "EventManager.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" -#include "PlayerColor.hpp" -#include "Values.hpp" - -namespace Network { - - using boost::asio::ip::udp; - - void ServerHandler::start(std::string &aHost, unsigned short aPort) - { - NetworkHandler &network = NetworkHandler::getInstance(); - udp::endpoint endpoint(boost::asio::ip::address::from_string(aHost), aPort); - - for (int i = 0; i < MAX_NUMBER_PLAYER; i++) { - _clientColors[i] = -1; - } - - network.onReceive([this](const RType::Packet &aPacket, udp::endpoint &aClientEndpoint) { - receivePacket(aPacket, aClientEndpoint); - }); - - network.onReceiveAknowledgment([this](const std::string &aUuid, udp::endpoint &aClientEndpoint) { - (void) aUuid; - auto client = std::find_if(_clients.begin(), _clients.end(), - [this, aClientEndpoint](const std::pair &aPair) { - return aPair.second == aClientEndpoint; - }); - if (client == _clients.end()) { - return; - } - ECS::Event::EventManager::getInstance()->pushEvent( - new RType::ServerGameEvent(RType::ServerEventType::AKNOWLEDGMENT, client->first, {}, aClientEndpoint)); - }); - - network.start(endpoint.protocol()); - network.bind(endpoint); - std::cout << "Server " << endpoint << " listening" << std::endl; - } - - void ServerHandler::receivePacket(const RType::Packet &aPacket, udp::endpoint &aClientEndpoint) - { - auto client = std::find_if(_clients.begin(), _clients.end(), - [this, aClientEndpoint](const std::pair &aPair) { - return aPair.second == aClientEndpoint; - }); - - auto packetType = static_cast(aPacket.type); - - if (client == _clients.end() && packetType == RType::ServerEventType::CONNECT && _clients.size() < 4) { - std::cout << "New client connected" << std::endl; - ECS::Event::EventManager::getInstance()->pushEvent( - new RType::ServerGameEvent(RType::ServerEventType::CONNECT, 0, aPacket.payload, aClientEndpoint)); - } - if (client != _clients.end() && packetType != RType::ServerEventType::CONNECT) { - size_t id = client->first; - auto *evt = new RType::ServerGameEvent(packetType, id, aPacket.payload, aClientEndpoint); - - ECS::Event::EventManager::getInstance()->pushEvent(evt); - } - } - - void ServerHandler::addClient(size_t aClientId, udp::endpoint aEndpoint) - { - _clients[aClientId] = aEndpoint; - std::cout << "Player " << aClientId << " joined" << std::endl; - } - - RType::PLAYER_COLOR ServerHandler::addClientColor(size_t aClientId) - { - RType::PLAYER_COLOR color = RType::PLAYER_COLOR::NONE; - - for (int i = 0; i < MAX_NUMBER_PLAYER; i++) { - color = static_cast(i); - if (_clientColors[i] == -1) { - _clientColors[i] = aClientId; - return color; - } - } - return RType::PLAYER_COLOR::NONE; - } - - RType::PLAYER_COLOR ServerHandler::getClientColor(size_t aClientId) - { - for (int i = 0; i < MAX_NUMBER_PLAYER; i++) { - if (_clientColors[i] == aClientId) { - return static_cast(i); - } - } - return RType::PLAYER_COLOR::NONE; - } - - void ServerHandler::removeClient(size_t aClientId) - { - _clients.erase(aClientId); - for (int i = 0; i < MAX_NUMBER_PLAYER; i++) { - if (_clientColors[i] == aClientId) { - _clientColors[i] = -1; - } - } - } - - int ServerHandler::getNumberClients() const - { - return _clients.size(); - } - - void ServerHandler::send(const RType::Packet &aPacket, size_t aClientId, - ECS::Core::SparseArray &aConnection) - { - if (aConnection[aClientId].has_value()) { - aConnection[aClientId].value().status = Network::ConnectionStatus::PENDING; - NetworkHandler::getInstance().send(aPacket, _clients[aClientId]); - } - } - - void ServerHandler::broadcast(int aType, std::vector aPayload, - ECS::Core::SparseArray &aConnection) - { - for (auto &client : _clients) { - if (aConnection[client.first].has_value()) { - aConnection[client.first].value().status = Network::ConnectionStatus::PENDING; - NetworkHandler::getInstance().send(RType::Packet(aType, aPayload), client.second); - } - } - } - - bool ServerHandler::isFull() const - { - return _clients.size() >= MAX_NUMBER_PLAYER; - } - -} // namespace Network diff --git a/src/server/network/ServerHandler.hpp b/src/server/network/ServerHandler.hpp deleted file mode 100644 index 6e767ba8..00000000 --- a/src/server/network/ServerHandler.hpp +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include -#include "Components.hpp" -#include "Packets.hpp" -#include "PlayerColor.hpp" -#include "SparseArray.hpp" -#include "Values.hpp" -#include - -#ifndef SERVERHANDLER_HPP - #define SERVERHANDLER_HPP - -namespace Network { - - constexpr unsigned short READ_BUFFER_SIZE = 1024; - - using boost::asio::ip::udp; - - class ServerHandler - { - private: - std::unordered_map _clients; - std::array _clientColors; - - /** - * @brief Launch the server - */ - ServerHandler() = default; - - public: - /** - * @brief Destroy the ServerHandler object - */ - ~ServerHandler() = default; - - /** - * @brief Get the instance of the singleton - * @return ServerHandler & The instance of the singleton - */ - static ServerHandler &getInstance() - { - static ServerHandler instance; - return instance; - } - - /** - * @brief Start the server - * @param aHost The host to listen to - * @param aPort The port to listen to - * @return ServerHandler & The instance of the singleton - */ - void start(std::string &, unsigned short); - - /** - * @brief Handle packet reception - * @param aPacket The received packet - * @param aEndpoint The endpoint of the server - */ - void receivePacket(const RType::Packet &, udp::endpoint &); - - /** - * @brief Register a client to the server - * @param aClientId The id of the client - * @param aEndpoint The endpoint of the client - */ - void addClient(size_t, udp::endpoint); - - /** - * @brief Get the client color - * @param aClientId The id of the client - * @return int The client color - */ - RType::PLAYER_COLOR getClientColor(size_t); - - /** - * @brief Add a client to the client color list - * - * @param aClientId The id of the client to add - * @return The client color (if -1, the server is full and the client is not added) - */ - RType::PLAYER_COLOR addClientColor(size_t); - - /** - * @brief Remove a client from the server - * @param aClientId The id of the client to remove - */ - void removeClient(size_t); - - /** - * @brief Get the number of clients connected to the server - * @return int The number of clients connected to the server - */ - int getNumberClients() const; - - /** - * @brief Send a packet to a client - * @param aPacket The packet to send - * @param aClientId The id of the client to send the message to - */ - void send(const RType::Packet &, size_t, ECS::Core::SparseArray &); - - /** - * @brief Broadcast a message to all clients. Each client receives a packet with a unique uuid. - * @param aType The packet type to send - * @param aPayload The payload to send - * @param aConnections Connection components of clients - */ - void broadcast(int, std::vector, ECS::Core::SparseArray &); - - /** - * @brief Check if the server is full - * @return true if the server is full, false otherwise - */ - [[nodiscard]] bool isFull() const; - }; - -} // namespace Network - -#endif diff --git a/src/server/systems/CMakeLists.txt b/src/server/systems/CMakeLists.txt index 1cfd515c..23016faa 100644 --- a/src/server/systems/CMakeLists.txt +++ b/src/server/systems/CMakeLists.txt @@ -1,31 +1,9 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - add_subdirectory(network) add_subdirectory(player) add_subdirectory(enemy) add_subdirectory(missile) add_subdirectory(bonus) -target_sources(server PRIVATE - System.hpp -) - -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/System.hpp b/src/server/systems/System.hpp index 352ff48f..0f1807d7 100644 --- a/src/server/systems/System.hpp +++ b/src/server/systems/System.hpp @@ -2,13 +2,14 @@ #define SYSTEM_HPP_ #include "Components.hpp" -#include "HitBox.hpp" -#include "KeyboardEvent.hpp" -#include "MouseEvent.hpp" -#include "SparseArray.hpp" -#include "Utils.hpp" -#include "WindowEvent.hpp" -#include "World.hpp" +#include "EwECS/Event/KeyboardEvent.hpp" +#include "EwECS/Event/MouseEvent.hpp" +#include "EwECS/Event/WindowEvent.hpp" +#include "EwECS/Network/Connection.hpp" +#include "EwECS/Physic/HitBox.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/Utils.hpp" +#include "EwECS/World.hpp" namespace ECS { class System @@ -62,21 +63,34 @@ namespace ECS { * @brief Move the player speed up * * @param aSpeed Sparsearray of all entities speed + * @param aPos SparseArray of all entities position + * @param aType SparseArray of all entities type + */ + static void moveBonus(Core::SparseArray &aSpeed, Core::SparseArray &aPos, + Core::SparseArray &aType); + + /** + * @brief Trigger the bonus + * + * @param aType SparseArray of all entities type + * @param aIsAlive SparseArray of all entities isAlive + * @param aHitBox SparseArray of all entities hitbox * @param aConnection SparseArray of all entities connection */ - static void moveSpeedUp(Core::SparseArray &aSpeed, - Core::SparseArray &aConnection); + static void triggerBonus(Core::SparseArray &aType, + Core::SparseArray &aIsAlive, + Core::SparseArray &aHitBox, + Core::SparseArray &aConnection, + Core::SparseArray &aSpeed); /** * @brief Handle players who get hit * - * @param aPos SparseArray of all entities position * @param aType SparseArray of all entities type * @param aIsAlive SparseArray of all entities isAlive * @param aHitBox SparseArray of all entities hitbox */ - static void playerHit(Core::SparseArray &aPos, - Core::SparseArray &aType, + static void playerHit(Core::SparseArray &aType, Core::SparseArray &aIsAlive, Core::SparseArray &aHitBox); @@ -163,13 +177,11 @@ namespace ECS { /** * @brief Handle enemies who get hit * - * @param aPos SparseArray of all entities position * @param aType SparseArray of all entities type * @param aHitBox SparseArray of all entities hitbox * @param aIsAlive SparseArray of all entities isAlive */ - static void enemyHit(Core::SparseArray &aPos, - Core::SparseArray &aType, + static void enemyHit(Core::SparseArray &aType, Core::SparseArray &aHitBox, Core::SparseArray &aIsAlive); @@ -180,9 +192,10 @@ namespace ECS { * @param aIsAlive SparseArray of all entities isAlive * @param aConnection SparseArray of all entities connection */ - static void killEnemy(Core::SparseArray &aType, - Core::SparseArray &aIsAlive, - Core::SparseArray &aConnection); + static void + killEnemy(Core::SparseArray &aType, Core::SparseArray &aIsAlive, + Core::SparseArray &aConnection, Core::SparseArray &aPos, + Core::SparseArray &aHitBox, Core::SparseArray &aSpeed); /** * @brief Move missiles diff --git a/src/server/systems/bonus/CMakeLists.txt b/src/server/systems/bonus/CMakeLists.txt index f1d6faa2..75e065ad 100644 --- a/src/server/systems/bonus/CMakeLists.txt +++ b/src/server/systems/bonus/CMakeLists.txt @@ -1,25 +1,8 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE - System+MoveSpeed.cpp -) - -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads + System+MoveBonus.cpp + System+TriggerBonus.cpp ) target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/bonus/System+MoveBonus.cpp b/src/server/systems/bonus/System+MoveBonus.cpp new file mode 100644 index 00000000..ad7f192f --- /dev/null +++ b/src/server/systems/bonus/System+MoveBonus.cpp @@ -0,0 +1,36 @@ +#include +#include +#include "ClientGameEvent.hpp" +#include "Components.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/World.hpp" +#include "ServerGameEvent.hpp" +#include "SparseArray.hpp" +#include "System.hpp" +#include "Values.hpp" + +namespace ECS { + void System::moveBonus(Core::SparseArray &aSpeed, Core::SparseArray &aPos, + Core::SparseArray &aType) + { + auto &world = Core::World::getInstance(); + const auto size = aType.size(); + + for (size_t idx = 0; idx < size; idx++) { + if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { + continue; + } + + auto &pos = aPos[idx].value(); + auto &speed = aSpeed[idx].value(); + auto &type = aType[idx].value(); + + if (type.isBonus) { + pos.x -= speed.speed * world.getDeltaTime(); + if (pos.x < -30) { + world.killEntity(idx); + } + } + } + } +} // namespace ECS diff --git a/src/server/systems/bonus/System+MoveSpeed.cpp b/src/server/systems/bonus/System+MoveSpeed.cpp deleted file mode 100644 index 62033f5c..00000000 --- a/src/server/systems/bonus/System+MoveSpeed.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "Components.hpp" -#include "Event.hpp" -#include "EventManager.hpp" -#include "Packets.hpp" -#include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "System.hpp" -#include "World.hpp" - -namespace ECS { - void System::moveSpeedUp(Core::SparseArray &aSpeed, - Core::SparseArray &aConnection) - { - ECS::Core::World const &world = ECS::Core::World::getInstance(); - ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - Network::ServerHandler &network = Network::ServerHandler::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); - - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - if (gameEvent.getType() == RType::ServerEventType::BONUS) { - auto playerId = static_cast(gameEvent.getEntityId()); - float const bonusType = gameEvent.getPayload()[0]; - - if (bonusType == 1) { - aSpeed[playerId].value().speed += 10; - network.broadcast(static_cast(RType::ClientEventType::PLAYER_BONUS), - {static_cast(playerId), 1}, aConnection); - } - eventManager->removeEvent(event); - } - } - } -} // namespace ECS \ No newline at end of file diff --git a/src/server/systems/bonus/System+TriggerBonus.cpp b/src/server/systems/bonus/System+TriggerBonus.cpp new file mode 100644 index 00000000..861c0d20 --- /dev/null +++ b/src/server/systems/bonus/System+TriggerBonus.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include "ClientGameEvent.hpp" +#include "Components.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/World.hpp" +#include "ServerGameEvent.hpp" +#include "ServerPackets.hpp" +#include "SparseArray.hpp" +#include "System.hpp" +#include "Values.hpp" + +namespace ECS { + void System::triggerBonus(Core::SparseArray &aType, + Core::SparseArray &aIsAlive, + Core::SparseArray &aHitBox, + Core::SparseArray &aConnection, + Core::SparseArray &aSpeed) + { + auto &world = Core::World::getInstance(); + auto &server = Network::ServerHandler::getInstance(); + const auto size = aType.size(); + + for (size_t playerId = 0; playerId < size; playerId++) { + if (!aType[playerId].has_value() || !aType[playerId].value().isPlayer || !aHitBox[playerId].has_value() + || !aIsAlive[playerId].has_value()) { + continue; + } + + auto &hitBoxPlayer = aHitBox[playerId].value(); + auto &isPlayerAlive = aIsAlive[playerId].value(); + + if (!isPlayerAlive.isAlive) { + continue; + } + + if (!hitBoxPlayer.isColliding) { + continue; + } + + auto &colliders = hitBoxPlayer.collidingId; + + for (auto &collider : colliders) { + if (!aType[collider].has_value() || !aType[collider].value().isBonus) { + continue; + } + + aSpeed[playerId].value().speed *= BONUS_GAIN_FACTOR; + + RType::Server::PlayerGotBonusPayload payload(playerId, collider); + server.broadcast(RType::ClientEventType::PLAYER_BONUS, payload, aConnection); + world.killEntity(collider); + } + } + } +} // namespace ECS diff --git a/src/server/systems/enemy/CMakeLists.txt b/src/server/systems/enemy/CMakeLists.txt index ca9c4fc5..e7d2152c 100644 --- a/src/server/systems/enemy/CMakeLists.txt +++ b/src/server/systems/enemy/CMakeLists.txt @@ -1,7 +1,3 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE System+SpawnEnemy.cpp System+MoveEnemy.cpp @@ -10,20 +6,6 @@ target_sources(server PRIVATE System+KillEnemy.cpp ) -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/enemy/System+EnemyHit.cpp b/src/server/systems/enemy/System+EnemyHit.cpp index c0522347..3cafebb8 100644 --- a/src/server/systems/enemy/System+EnemyHit.cpp +++ b/src/server/systems/enemy/System+EnemyHit.cpp @@ -2,29 +2,41 @@ #include "Values.hpp" namespace ECS { - void System::enemyHit(Core::SparseArray &aPos, Core::SparseArray &aType, + void System::enemyHit(Core::SparseArray &aType, Core::SparseArray &aHitBox, Core::SparseArray &aIsAlive) { auto &world = Core::World::getInstance(); + const auto size = aType.size(); - for (size_t enemyId = 0; enemyId < aType.size(); enemyId++) { - if (!aType[enemyId].has_value() || !aType[enemyId].value().isEnemy) { + for (size_t enemyId = 0; enemyId < size; enemyId++) { + if (!aType[enemyId].has_value() || !aType[enemyId].value().isEnemy || !aHitBox[enemyId].has_value() + || !aIsAlive[enemyId].has_value()) { continue; } - for (size_t bullet = 0; bullet < aPos.size(); bullet++) { - if (!aType[bullet].has_value() || !aType[bullet].value().isBullet) { + + auto &hitBoxEnemy = aHitBox[enemyId].value(); + + if (!hitBoxEnemy.isColliding) { + continue; + } + + auto &isAliveEnemy = aIsAlive[enemyId].value(); + + if (!isAliveEnemy.isAlive) { + continue; + } + + auto &colliders = hitBoxEnemy.collidingId; + + for (auto &collider : colliders) { + if (!aType[collider].has_value() || !aType[collider].value().isBullet) { continue; } - if (aPos[bullet].value().x > aPos[enemyId].value().x - && aPos[bullet].value().x < aPos[enemyId].value().x + aHitBox[enemyId].value().width - && aPos[bullet].value().y > aPos[enemyId].value().y - && aPos[bullet].value().y < aPos[enemyId].value().y + aHitBox[enemyId].value().height) { - aIsAlive[enemyId].value().isAlive = false; - world.killEntity(bullet); - break; - } + + isAliveEnemy.isAlive = false; + world.killEntity(collider); } } } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/server/systems/enemy/System+EnemyShoot.cpp b/src/server/systems/enemy/System+EnemyShoot.cpp index b1de619a..0f67ae37 100644 --- a/src/server/systems/enemy/System+EnemyShoot.cpp +++ b/src/server/systems/enemy/System+EnemyShoot.cpp @@ -1,11 +1,12 @@ #include #include "ClientGameEvent.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "IsAlive.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::enemyShoot(Core::SparseArray &aPos, Core::SparseArray &aSpeed, @@ -14,31 +15,35 @@ namespace ECS { Core::SparseArray &aIsAlive, Core::SparseArray &aConnection) { - auto &server = Network::ServerHandler::getInstance(); + auto &server = ECS::Network::ServerHandler::getInstance(); auto &world = Core::World::getInstance(); + const auto size = aPos.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { + for (size_t idx = 0; idx < size; idx++) { if (!aPos[idx].has_value() || !aType[idx].has_value() || !aIsAlive[idx].has_value()) { continue; } + auto pos = aPos[idx].value(); auto &type = aType[idx].value(); auto &isAlive = aIsAlive[idx].value(); + if (type.isEnemy && rand() % PROBABILTY_SHOOT_ENEMY == 0 && isAlive.isAlive) { - // Create entity - size_t missileId = world.createEntity(); - auto posX = pos.x - MISSILES_TEX_WIDTH; + auto missileId = world.createEntity(); + auto posX = pos.x - (MISSILES_TEX_WIDTH * 2); auto posY = pos.y + ENEMY_TEX_HEIGHT / 2.0F - MISSILES_TEX_HEIGHT / 2.0F; ECS::Utils::Vector2f entityPos(posX, posY); + aPos.insertAt(missileId, entityPos); aSpeed.insertAt(missileId, Component::Speed {MISSILES_SPEED}); - aType.insertAt(missileId, Component::TypeEntity {false, false, false, true, false, false, false}); + aType.insertAt(missileId, + Component::TypeEntity {false, false, false, false, false, false, false, true}); aHitBox.insertAt(missileId, Component::HitBox {MISSILES_TEX_WIDTH, MISSILES_TEX_HEIGHT}); // Send packet - server.broadcast(static_cast(RType::ClientEventType::ENEMY_SHOOT), - {static_cast(missileId), posX, posY}, aConnection); + RType::Server::EnemyShotPayload payload(missileId, posX, posY); + server.broadcast(RType::ClientEventType::ENEMY_SHOOT, payload, aConnection); } } } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/server/systems/enemy/System+KillEnemy.cpp b/src/server/systems/enemy/System+KillEnemy.cpp index 96269cc7..be904238 100644 --- a/src/server/systems/enemy/System+KillEnemy.cpp +++ b/src/server/systems/enemy/System+KillEnemy.cpp @@ -1,27 +1,37 @@ #include -#include "HitBox.hpp" +#include "ClientGameEvent.hpp" +#include "EwECS/Network/ServerHandler.hpp" #include "IsAlive.hpp" -#include "ServerHandler.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" namespace ECS { void System::killEnemy(Core::SparseArray &aType, Core::SparseArray &aIsAlive, - Core::SparseArray &aConnection) + Core::SparseArray &aConnection, + Core::SparseArray &aPos, Core::SparseArray &aHitBox, + Core::SparseArray &aSpeed) { auto &world = Core::World::getInstance(); - auto &server = Network::ServerHandler::getInstance(); + auto &server = ECS::Network::ServerHandler::getInstance(); + const auto size = aType.size(); - for (size_t enemyId = 0; enemyId < aType.size(); enemyId++) { - if (!aType[enemyId].has_value() || !aType[enemyId].value().isEnemy) { + for (size_t enemyId = 0; enemyId < size; enemyId++) { + if (!aType[enemyId].has_value() || !aType[enemyId].value().isEnemy || !aIsAlive[enemyId].has_value()) { continue; } if (!aIsAlive[enemyId].value().isAlive) { + auto bonusId = world.createEntity(); + aPos.insertAt(bonusId, ECS::Utils::Vector2f {aPos[enemyId].value().x, aPos[enemyId].value().y}); + aSpeed.insertAt(bonusId, Component::Speed {BONUS_SPEED}); + aType.insertAt(bonusId, Component::TypeEntity {false, false, false, false, false, true, false}); + aHitBox.insertAt(bonusId, Component::HitBox {BONUS_TEX_WIDTH, BONUS_TEX_HEIGHT}); + + RType::Server::EnemyDiedPayload payload(enemyId, bonusId); + server.broadcast(RType::ClientEventType::ENEMY_DEATH, payload, aConnection); + world.killEntity(enemyId); - std::cout << "Enemy " << enemyId << " killed" << std::endl; - server.broadcast(static_cast(RType::ClientEventType::ENEMY_DEATH), {static_cast(enemyId)}, - aConnection); } } } diff --git a/src/server/systems/enemy/System+MoveEnemy.cpp b/src/server/systems/enemy/System+MoveEnemy.cpp index cac37571..0a3ecd57 100644 --- a/src/server/systems/enemy/System+MoveEnemy.cpp +++ b/src/server/systems/enemy/System+MoveEnemy.cpp @@ -1,26 +1,29 @@ +#include "EwECS/World.hpp" #include "System.hpp" -#include "World.hpp" +#include "Values.hpp" namespace ECS { void System::moveEnemy(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto &world = Core::World::getInstance(); + const auto size = aPos.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { + for (size_t idx = 0; idx < size; idx++) { if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { continue; } + auto &pos = aPos[idx].value(); auto &speed = aSpeed[idx].value(); auto &type = aType[idx].value(); + if (type.isEnemy) { pos.x -= speed.speed * world.getDeltaTime(); - if (pos.x < -30) { + if (pos.x < -ENEMY_TEX_WIDTH) { world.killEntity(idx); } } } } - } // namespace ECS diff --git a/src/server/systems/enemy/System+SpawnEnemy.cpp b/src/server/systems/enemy/System+SpawnEnemy.cpp index 867948dd..c268da8e 100644 --- a/src/server/systems/enemy/System+SpawnEnemy.cpp +++ b/src/server/systems/enemy/System+SpawnEnemy.cpp @@ -1,5 +1,7 @@ +#include "ClientGameEvent.hpp" +#include "EwECS/Network/ServerHandler.hpp" #include "IsAlive.hpp" -#include "ServerHandler.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" #include "Timer+SpawnEnemy.hpp" @@ -11,7 +13,7 @@ namespace ECS { Core::SparseArray &aIsAlive, Core::SparseArray &aConnection) { - Network::ServerHandler &server = Network::ServerHandler::getInstance(); + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); Timer::TimerSpawnEnemy &timer = Timer::TimerSpawnEnemy::getInstance(); auto &world = Core::World::getInstance(); @@ -23,9 +25,10 @@ namespace ECS { timer.reset(); // Create entity - size_t enemyId = world.createEntity(); - float posX = static_cast(SCREEN_WIDTH - ENEMY_TEX_WIDTH); - float posY = static_cast(rand() % SCREEN_HEIGHT); + auto enemyId = world.createEntity(); + auto posX = static_cast(SCREEN_WIDTH - ENEMY_TEX_WIDTH); + auto posY = static_cast(rand() % SCREEN_HEIGHT); + aPos.insertAt(enemyId, ECS::Utils::Vector2f {posX, posY}); aSpeed.insertAt(enemyId, Component::Speed {ENEMY_SPEED}); aType.insertAt(enemyId, Component::TypeEntity {false, false, true, false, false, false, false}); @@ -34,7 +37,7 @@ namespace ECS { aIsAlive.insertAt(enemyId, Component::IsAlive {true, 0}); // Send packet - server.broadcast(static_cast(RType::ClientEventType::ENEMY_SPAWN), - {static_cast(enemyId), posX, posY}, aConnection); + RType::Server::EnemySpawnedPayload payload(enemyId, posX, posY); + server.broadcast(RType::ClientEventType::ENEMY_SPAWN, payload, aConnection); } } // namespace ECS diff --git a/src/server/systems/missile/CMakeLists.txt b/src/server/systems/missile/CMakeLists.txt index 6dc7483d..de7f75ea 100644 --- a/src/server/systems/missile/CMakeLists.txt +++ b/src/server/systems/missile/CMakeLists.txt @@ -1,25 +1,7 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE System+MoveMissiles.cpp ) -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/missile/System+MoveMissiles.cpp b/src/server/systems/missile/System+MoveMissiles.cpp index 06886ae3..2fa7816c 100644 --- a/src/server/systems/missile/System+MoveMissiles.cpp +++ b/src/server/systems/missile/System+MoveMissiles.cpp @@ -1,31 +1,33 @@ +#include "EwECS/World.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::moveMissiles(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType) { auto &world = Core::World::getInstance(); + const auto size = aPos.size(); - for (size_t idx = 0; idx < aPos.size(); idx++) { + for (size_t idx = 0; idx < size; idx++) { if (!aPos[idx].has_value() || !aSpeed[idx].has_value() || !aType[idx].has_value()) { continue; } + auto &pos = aPos[idx].value(); auto &speed = aSpeed[idx].value(); auto &type = aType[idx].value(); - if (type.isBullet) { + + if (type.isBullet || type.isEnemyMissile) { if (speed.speed == MISSILES_SPEED) { pos.x -= speed.speed * world.getDeltaTime(); } else if (speed.speed == BULLET_SPEED) { pos.x += speed.speed * world.getDeltaTime(); } - if (pos.x > SCREEN_WIDTH + 30 || pos.x < -30) { + if (pos.x > SCREEN_WIDTH + MISSILES_TEX_WIDTH || pos.x < -MISSILES_TEX_WIDTH) { world.killEntity(idx); } } } } - } // namespace ECS diff --git a/src/server/systems/network/CMakeLists.txt b/src/server/systems/network/CMakeLists.txt index aa724bbc..66c6f4bc 100644 --- a/src/server/systems/network/CMakeLists.txt +++ b/src/server/systems/network/CMakeLists.txt @@ -1,26 +1,8 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE System+HandleClientCrash.cpp System+ReceiveAknowledgment.cpp ) -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/network/System+HandleClientCrash.cpp b/src/server/systems/network/System+HandleClientCrash.cpp index 450452ac..fc7d1ad6 100644 --- a/src/server/systems/network/System+HandleClientCrash.cpp +++ b/src/server/systems/network/System+HandleClientCrash.cpp @@ -1,16 +1,15 @@ #include #include #include "Components.hpp" -#include "Event.hpp" -#include "EventManager.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Logger.hpp" +#include "EwECS/Network/Packet.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::handlePlayerCrash(Core::SparseArray &aIsAlive, @@ -18,13 +17,14 @@ namespace ECS { Core::SparseArray &aConnection) { Core::World &world = Core::World::getInstance(); + const auto size = aConnection.size(); - for (int i = 0; i < aConnection.size(); i++) { + for (size_t i = 0; i < size; i++) { if (aType[i].has_value() && aType[i]->isPlayer && aConnection[i].has_value() && aIsAlive[i].has_value() - && aConnection[i].value().status == Network::ConnectionStatus::PENDING) { + && aConnection[i].value().status == ECS::Network::ConnectionStatus::PENDING) { aConnection[i].value().age += world.getDeltaTime(); if (aConnection[i].value().age >= PACKET_TIMEOUT) { - std::cout << "Player " << i << " timed out" << std::endl; + ECS::Logger::info("Player " + std::to_string(i) + " crashed"); aIsAlive[i].value().isAlive = false; } } diff --git a/src/server/systems/network/System+ReceiveAknowledgment.cpp b/src/server/systems/network/System+ReceiveAknowledgment.cpp index 38266ff3..3569f539 100644 --- a/src/server/systems/network/System+ReceiveAknowledgment.cpp +++ b/src/server/systems/network/System+ReceiveAknowledgment.cpp @@ -1,33 +1,37 @@ #include #include +#include #include "Components.hpp" -#include "Event.hpp" -#include "EventManager.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/Packet.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/SparseArray.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" #include "System.hpp" namespace ECS { void System::receiveAknowledgment(Core::SparseArray &aConnection) { ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; + + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); if (gameEvent.getType() == RType::ServerEventType::AKNOWLEDGMENT) { - size_t playerId = gameEvent.getEntityId(); + auto playerId = gameEvent.getEntityId(); if (aConnection[playerId].has_value()) { - std::cout << "Got aknowledgment from " << playerId << std::endl; - aConnection[playerId].value().status = Network::ConnectionStatus::CONNECTED; - aConnection[playerId].value().age = 0; + auto &connection = aConnection[playerId].value(); + + connection.status = ECS::Network::ConnectionStatus::CONNECTED; + connection.age = 0; } - eventManager->removeEvent(event); + toRemove.push_back(i); } } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/server/systems/player/CMakeLists.txt b/src/server/systems/player/CMakeLists.txt index d193311c..32794d05 100644 --- a/src/server/systems/player/CMakeLists.txt +++ b/src/server/systems/player/CMakeLists.txt @@ -1,7 +1,3 @@ -find_package(Threads REQUIRED) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE System+WelcomePlayer.cpp System+MovePlayer.cpp @@ -11,20 +7,6 @@ target_sources(server PRIVATE System+DisconnectPlayer.cpp ) -target_link_libraries(server - PRIVATE R_Type::R_Type_options - R_Type::R_Type_warnings - ${Boost_LIBRARIES} - rtype - ecs - Threads::Threads -) - target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${Boost_INCLUDE_DIRS} -) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/src/server/systems/player/System+DisconnectPlayer.cpp b/src/server/systems/player/System+DisconnectPlayer.cpp index 71179172..08e09a3b 100644 --- a/src/server/systems/player/System+DisconnectPlayer.cpp +++ b/src/server/systems/player/System+DisconnectPlayer.cpp @@ -1,36 +1,43 @@ #include +#include +#include "ClientGameEvent.hpp" #include "Components.hpp" -#include "Event.hpp" -#include "EventManager.hpp" -#include "Packets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/World.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" +#include "ServerPackets.hpp" #include "System.hpp" -#include "World.hpp" namespace ECS { void System::disconnectPlayer(Core::SparseArray &aConnection) { Core::World &world = Core::World::getInstance(); ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - Network::ServerHandler &server = Network::ServerHandler::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - if (gameEvent.getType() == RType::ServerEventType::DISCONNECT) { - size_t playerId = gameEvent.getEntityId(); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - world.killEntity(playerId); - server.removeClient(playerId); - - server.broadcast(static_cast(RType::ClientEventType::PLAYER_DISCONNECTION), - {static_cast(playerId)}, aConnection); + if (gameEvent.getType() != RType::ServerEventType::DISCONNECT) { + continue; + } - eventManager->removeEvent(event); + auto playerId = gameEvent.getEntityId(); - std::cout << "Player " << playerId << " left" << std::endl; + if (!aConnection[playerId].has_value()) { + continue; } + + RType::Server::PlayerLeftPayload payload(playerId); + server.broadcast(RType::ClientEventType::PLAYER_DISCONNECTION, payload, aConnection); + world.killEntity(playerId); + server.removeClient(playerId); + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/server/systems/player/System+KillPlayer.cpp b/src/server/systems/player/System+KillPlayer.cpp index f221bdd5..f40bc387 100644 --- a/src/server/systems/player/System+KillPlayer.cpp +++ b/src/server/systems/player/System+KillPlayer.cpp @@ -1,7 +1,8 @@ #include -#include "HitBox.hpp" +#include "ClientGameEvent.hpp" +#include "EwECS/Network/ServerHandler.hpp" #include "IsAlive.hpp" -#include "ServerHandler.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" @@ -11,18 +12,19 @@ namespace ECS { Core::SparseArray &aConnection) { auto &world = Core::World::getInstance(); - auto &server = Network::ServerHandler::getInstance(); + auto &server = ECS::Network::ServerHandler::getInstance(); + const auto size = aType.size(); - for (size_t playerId = 0; playerId < aType.size(); playerId++) { - if (!aType[playerId].has_value() || !aType[playerId].value().isPlayer) { + for (size_t playerId = 0; playerId < size; playerId++) { + if (!aType[playerId].has_value() || !aType[playerId].value().isPlayer || !aIsAlive[playerId].has_value()) { continue; } if (!aIsAlive[playerId].value().isAlive) { - world.killEntity(playerId); + RType::Server::PlayerDiedPayload payload(playerId); + server.broadcast(RType::ClientEventType::PLAYER_DEATH, payload, aConnection); + server.removeClient(playerId); - std::cout << "Player " << playerId << " killed" << std::endl; - server.broadcast(static_cast(RType::ClientEventType::PLAYER_DEATH), {static_cast(playerId)}, - aConnection); + world.killEntity(playerId); } } } diff --git a/src/server/systems/player/System+MovePlayer.cpp b/src/server/systems/player/System+MovePlayer.cpp index 1d5b38b3..dd5ecf47 100644 --- a/src/server/systems/player/System+MovePlayer.cpp +++ b/src/server/systems/player/System+MovePlayer.cpp @@ -1,10 +1,16 @@ #include -#include "EventManager.hpp" +#include +#include "ClientGameEvent.hpp" +#include "ClientPackets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" +#include "World.hpp" #include namespace ECS { @@ -12,61 +18,70 @@ namespace ECS { Core::SparseArray &aConnection) { ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - Network::ServerHandler &network = Network::ServerHandler::getInstance(); + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; - auto events = eventManager->getEventsByType(Event::EventType::GAME); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); + if (gameEvent.getType() != RType::ServerEventType::MOVE) { + continue; + } - if (gameEvent.getType() == RType::ServerEventType::MOVE) { - // Check payload size - if (gameEvent.getPayload().size() != 3) { - eventManager->removeEvent(event); - continue; - } + const auto &payload = gameEvent.getPayload(); - // Get and check entity ID - int entityId = static_cast(gameEvent.getPayload()[0]); - if (entityId < 0 || entityId >= aPos.size() || !aPos[entityId].has_value() - || !aSpeed[entityId].has_value()) { - eventManager->removeEvent(event); - continue; - } + // Get and check entity ID + auto entityId = gameEvent.getEntityId(); - // Get and check move values - float moveX = gameEvent.getPayload()[1]; - float moveY = gameEvent.getPayload()[2]; - if (moveX < -1 || moveX > 1 || moveY < -1 || moveY > 1) { - eventManager->removeEvent(event); - continue; - } + if (entityId < 0 || entityId >= aPos.size() || !aPos[entityId].has_value() + || !aSpeed[entityId].has_value()) { + toRemove.push_back(i); + server.sendError(entityId); + continue; + } - // Move player - float speed = aSpeed[entityId].value().speed; - auto &pos = aPos[entityId].value(); + // Get and check move values + if (payload.moveX < -1 || payload.moveX > 1 || payload.moveY < -1 || payload.moveY > 1) { + toRemove.push_back(i); + server.sendError(entityId); + continue; + } + + // Move player + if (!aSpeed[entityId].has_value() || !aPos[entityId].has_value()) { + toRemove.push_back(i); + server.sendError(entityId); + continue; + } - pos.x += moveX * speed; - pos.y -= moveY * speed; + float speed = aSpeed[entityId].value().speed; + auto &pos = aPos[entityId].value(); - if (pos.x < 0) { - pos.x = 0; - } - if (pos.x > SCREEN_WIDTH) { - pos.x = SCREEN_WIDTH; - } - if (pos.y < 0) { - pos.y = 0; - } - if (pos.y > SCREEN_HEIGHT) { - pos.y = SCREEN_HEIGHT; - } + auto delta = DELTA; - network.broadcast(static_cast(RType::ClientEventType::PLAYER_POSITION), - {static_cast(entityId), pos.x, pos.y}, aConnection); + pos.x += payload.moveX * speed / delta; + pos.y -= payload.moveY * speed / delta; - eventManager->removeEvent(event); + if (pos.x < 0) { + pos.x = 0; } + if (pos.x > SCREEN_WIDTH) { + pos.x = SCREEN_WIDTH; + } + if (pos.y < 0) { + pos.y = 0; + } + if (pos.y > SCREEN_HEIGHT) { + pos.y = SCREEN_HEIGHT; + } + + RType::Server::PlayerPositionPayload payloadToSend(entityId, pos.x, pos.y); + server.broadcast(RType::ClientEventType::PLAYER_POSITION, payloadToSend, aConnection); + + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/server/systems/player/System+PlayerHit.cpp b/src/server/systems/player/System+PlayerHit.cpp index b1093177..c5ed7ebe 100644 --- a/src/server/systems/player/System+PlayerHit.cpp +++ b/src/server/systems/player/System+PlayerHit.cpp @@ -1,51 +1,43 @@ -#include "SparseArray.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/Utils.hpp" #include "System.hpp" -#include "components/HitBox.hpp" #include "components/IsAlive.hpp" namespace ECS { - bool checkHitBox(size_t playerId, size_t obstacleId, Core::SparseArray &aPos, - Core::SparseArray &aHitBox) - { - if (aPos[playerId].value().x > aPos[obstacleId].value().x - && aPos[playerId].value().x < aPos[obstacleId].value().x + aHitBox[obstacleId].value().width - && aPos[playerId].value().y > aPos[obstacleId].value().y - && aPos[playerId].value().y < aPos[obstacleId].value().y + aHitBox[obstacleId].value().height) { - return (true); - } else if ((aPos[playerId].value().x + aHitBox[playerId].value().width > aPos[obstacleId].value().x - && aPos[playerId].value().x + aHitBox[playerId].value().width - < aPos[obstacleId].value().x + aHitBox[obstacleId].value().width - && aPos[playerId].value().y > aPos[obstacleId].value().y - && aPos[playerId].value().y < aPos[obstacleId].value().y + aHitBox[obstacleId].value().height)) { - return (true); - } else if (aPos[obstacleId].value().x > aPos[playerId].value().x - && aPos[obstacleId].value().x < aPos[playerId].value().x + aHitBox[playerId].value().width - && aPos[obstacleId].value().y > aPos[playerId].value().y - && aPos[obstacleId].value().y < aPos[playerId].value().y + aHitBox[playerId].value().height) { - return (true); - } - return (false); - } - - void System::playerHit(Core::SparseArray &aPos, Core::SparseArray &aType, + void System::playerHit(Core::SparseArray &aType, Core::SparseArray &aIsAlive, Core::SparseArray &aHitBox) { auto &world = Core::World::getInstance(); + const auto size = aType.size(); + + for (size_t playerId = 0; playerId < size; playerId++) { + if (!aType[playerId].has_value() || !aType[playerId].value().isPlayer || !aHitBox[playerId].has_value() + || !aIsAlive[playerId].has_value()) { + continue; + } + + auto &hitBoxPlayer = aHitBox[playerId].value(); + auto &isPlayerAlive = aIsAlive[playerId].value(); - for (size_t playerId = 0; playerId < aType.size(); playerId++) { - if (!aType[playerId].has_value() || !aType[playerId].value().isPlayer) { + if (!isPlayerAlive.isAlive) { continue; } - for (size_t obstacleId = 0; obstacleId < aPos.size(); obstacleId++) { - if (!aType[obstacleId].has_value() - || (!aType[obstacleId].value().isBullet && !aType[obstacleId].value().isEnemy)) { + + if (!hitBoxPlayer.isColliding) { + continue; + } + + auto &colliders = hitBoxPlayer.collidingId; + + for (auto &collider : colliders) { + if (!aType[collider].has_value() + || (!aType[collider].value().isEnemy && !aType[collider].value().isEnemyMissile)) { continue; } - if (checkHitBox(playerId, obstacleId, aPos, aHitBox)) { - aIsAlive[playerId].value().isAlive = false; - world.killEntity(obstacleId); - } + + isPlayerAlive.isAlive = false; + world.killEntity(collider); } } } diff --git a/src/server/systems/player/System+PlayerShoot.cpp b/src/server/systems/player/System+PlayerShoot.cpp index d740cbdf..95fd000e 100644 --- a/src/server/systems/player/System+PlayerShoot.cpp +++ b/src/server/systems/player/System+PlayerShoot.cpp @@ -1,11 +1,15 @@ +#include #include -#include "EventManager.hpp" +#include +#include "ClientGameEvent.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { void System::playerShoot(Core::SparseArray &aPos, Core::SparseArray &aSpeed, @@ -15,50 +19,37 @@ namespace ECS { { auto &world = Core::World::getInstance(); ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - Network::ServerHandler &server = Network::ServerHandler::getInstance(); + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; - auto events = eventManager->getEventsByType(Event::EventType::GAME); + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - - if (gameEvent.getType() == RType::ServerEventType::SHOOT) { - if (gameEvent.getPayload().size() != 1) { - eventManager->removeEvent(event); - continue; - } - - int playerId = static_cast(gameEvent.getPayload()[0]); - - if (playerId < 0 || playerId >= aPos.size()) { - eventManager->removeEvent(event); - continue; - } - if (!aPos[playerId].has_value()) { - eventManager->removeEvent(event); - continue; - } + if (gameEvent.getType() != RType::ServerEventType::SHOOT) { + continue; + } - std::cout << "Player " << playerId << " shoot" << std::endl; + const auto playerId = gameEvent.getEntityId(); + auto &pos = aPos[playerId].value(); - auto pos = aPos[playerId].value(); + // Create entity + auto bulletId = world.createEntity(); + float posX = pos.x + BULLET_TEX_WIDTH + PLAYER_TEX_WIDTH; + float posY = pos.y; - // Create entity - size_t bulletId = world.createEntity(); - float posX = pos.x + BULLET_TEX_WIDTH + PLAYER_TEX_WIDTH; - float posY = pos.y; - aPos.insertAt(bulletId, ECS::Utils::Vector2f {posX, posY}); - aSpeed.insertAt(bulletId, Component::Speed {BULLET_SPEED}); - aType.insertAt(bulletId, Component::TypeEntity {false, false, false, true, false, false, false}); - aHitBox.insertAt(bulletId, Component::HitBox {BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}); + aPos.insertAt(bulletId, ECS::Utils::Vector2f {posX, posY}); + aSpeed.insertAt(bulletId, Component::Speed {BULLET_SPEED}); + aType.insertAt(bulletId, Component::TypeEntity {false, false, false, true, false, false, false}); + aHitBox.insertAt(bulletId, Component::HitBox {BULLET_TEX_WIDTH, BULLET_TEX_HEIGHT}); - // Send packet - server.broadcast(static_cast(RType::ClientEventType::PLAYER_SHOOT), - {static_cast(bulletId), posX, posY}, aConnection); + // Send packet + RType::Server::PlayerShotPayload payloadToSend(bulletId, posX, posY); + server.broadcast(RType::ClientEventType::PLAYER_SHOOT, payloadToSend, aConnection); - // Delete event - eventManager->removeEvent(event); - } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } -} // namespace ECS \ No newline at end of file +} // namespace ECS diff --git a/src/server/systems/player/System+WelcomePlayer.cpp b/src/server/systems/player/System+WelcomePlayer.cpp index ad376309..9062742b 100644 --- a/src/server/systems/player/System+WelcomePlayer.cpp +++ b/src/server/systems/player/System+WelcomePlayer.cpp @@ -1,23 +1,19 @@ -#include #include +#include +#include "ClientGameEvent.hpp" #include "Components.hpp" -#include "Event.hpp" -#include "EventManager.hpp" -#include "HitBox.hpp" -#include "NetworkHandler.hpp" -#include "Packets.hpp" +#include "EwECS/Event/EventManager.hpp" +#include "EwECS/Network/ServerHandler.hpp" +#include "EwECS/Physic/HitBox.hpp" +#include "EwECS/SparseArray.hpp" +#include "EwECS/World.hpp" #include "PlayerColor.hpp" #include "ServerGameEvent.hpp" -#include "ServerHandler.hpp" -#include "SparseArray.hpp" +#include "ServerPackets.hpp" #include "System.hpp" #include "Values.hpp" -#include "World.hpp" namespace ECS { - - using boost::asio::ip::udp; - void System::welcomePlayer(Core::SparseArray &aPos, Core::SparseArray &aSpeed, Core::SparseArray &aType, Core::SparseArray &aHitBox, @@ -26,65 +22,74 @@ namespace ECS { { ECS::Core::World &world = ECS::Core::World::getInstance(); ECS::Event::EventManager *eventManager = ECS::Event::EventManager::getInstance(); - Network::ServerHandler &server = Network::ServerHandler::getInstance(); - Network::NetworkHandler &network = Network::NetworkHandler::getInstance(); - auto events = eventManager->getEventsByType(Event::EventType::GAME); - - for (auto &event : events) { - auto &gameEvent = static_cast(*event); - if (gameEvent.getType() == RType::ServerEventType::CONNECT) { - if (server.isFull()) { - udp::endpoint cliEndpoint = gameEvent.getClientEndpoint(); - network.send(RType::Packet(static_cast(RType::ClientEventType::SERVER_FULL)), cliEndpoint); - eventManager->removeEvent(event); - continue; - } + ECS::Network::ServerHandler &server = ECS::Network::ServerHandler::getInstance(); + auto &events = eventManager->getEventsByType(); + const auto size = events.size(); + std::vector toRemove; + + for (size_t i = 0; i < size; i++) { + auto &gameEvent = events[i]; + + if (gameEvent.getType() != RType::ServerEventType::CONNECT) { + continue; + } + + const auto entityId = gameEvent.getEntityId(); + + if (entityId > 0 || server.isFull()) { + server.sendError(entityId); + toRemove.push_back(i); + continue; + } + + auto playerId = world.createEntity(); - size_t playerId = world.createEntity(); - RType::PLAYER_COLOR playerColor = server.addClientColor(playerId); + int playerSeat = server.addClient(playerId); + auto playerColor = static_cast(playerSeat); - if (playerColor == RType::PLAYER_COLOR::NONE) { - world.killEntity(playerId); + if (playerColor == RType::PLAYER_COLOR::NONE) { + world.killEntity(playerId); + toRemove.push_back(i); + continue; + } + + aPos.insertAt(playerId, ECS::Utils::Vector2f {10, 10}); + aSpeed.insertAt(playerId, Component::Speed {PLAYER_SPEED}); + aType.insertAt(playerId, Component::TypeEntity {true, false, false, false, false, false, false}); + aHitBox.insertAt(playerId, Component::HitBox {PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}); + aIsAlive.insertAt(playerId, Component::IsAlive {true, 0}); + aConnection.insertAt(playerId, Component::Connection {ECS::Network::ConnectionStatus::CONNECTED}); + + RType::Server::PlayerJoinedPayload payloadToBroadcast(playerId, false, playerColor, 10, 10); + + server.broadcastExcept(RType::ClientEventType::PLAYER_SPAWN, + payloadToBroadcast, aConnection, playerId); + + RType::Server::PlayerJoinedPayload payload(playerId, true, playerColor, 10, 10); + server.send(RType::ClientEventType::PLAYER_SPAWN, payload, playerId, aConnection); + + const auto posSize = aPos.size(); + for (size_t idx = 0; idx < posSize; idx++) { + if (!aType[idx].has_value() || !aPos[idx].has_value()) { continue; } - aPos.insertAt(playerId, ECS::Utils::Vector2f {10, 10}); - aSpeed.insertAt(playerId, Component::Speed {PLAYER_SPEED}); - aType.insertAt(playerId, Component::TypeEntity {true, false, false, false, false, false, false}); - aHitBox.insertAt(playerId, Component::HitBox {PLAYER_TEX_WIDTH, PLAYER_TEX_HEIGHT}); - aIsAlive.insertAt(playerId, Component::IsAlive {true, 0}); - aConnection.insertAt(playerId, Component::Connection {Network::ConnectionStatus::CONNECTED}); - - std::cout << "Welcome " << playerId << " !" << std::endl; - - server.broadcast(static_cast(RType::ClientEventType::PLAYER_SPAWN), - {static_cast(playerId), 0, static_cast(playerColor), 10, 10}, - aConnection); - server.addClient(playerId, gameEvent.getClientEndpoint()); - server.send(RType::Packet(static_cast(RType::ClientEventType::PLAYER_SPAWN), - {static_cast(playerId), 1, static_cast(playerColor), 10, 10}), - playerId, aConnection); - - int aPosSize = aPos.size(); - for (std::size_t i = 0; i < aPosSize; i++) { - if (!aType[i].has_value() || !aPos[i].has_value()) { - continue; - } - if (i != playerId && aType[i]->isPlayer) { - float color = static_cast(server.getClientColor(i)); - server.send(RType::Packet(static_cast(RType::ClientEventType::PLAYER_SPAWN), - {static_cast(i), 0, color, aPos[i]->x, aPos[i]->y}), - playerId, aConnection); - } - if (aType[i]->isEnemy) { - server.send(RType::Packet(static_cast(RType::ClientEventType::ENEMY_SPAWN), - {static_cast(i), aPos[i]->x, aPos[i]->y}), - playerId, aConnection); - } - } + auto &type = aType[idx].value(); + auto &pos = aPos[idx].value(); + + if (idx != playerId && type.isPlayer) { + auto color = static_cast(server.getClientSeat(idx)); - eventManager->removeEvent(event); + RType::Server::PlayerJoinedPayload playersPayload(idx, false, color, pos.x, pos.y); + server.send(RType::ClientEventType::PLAYER_SPAWN, playersPayload, playerId, aConnection); + } + if (type.isEnemy) { + RType::Server::EnemySpawnedPayload enemiesPayload(idx, pos.x, pos.y); + server.send(RType::ClientEventType::ENEMY_SPAWN, enemiesPayload, playerId, aConnection); + } } + toRemove.push_back(i); } + eventManager->removeEvent(toRemove); } } // namespace ECS diff --git a/src/server/timers/CMakeLists.txt b/src/server/timers/CMakeLists.txt index 122ffe6a..99f4dd47 100644 --- a/src/server/timers/CMakeLists.txt +++ b/src/server/timers/CMakeLists.txt @@ -1,5 +1,3 @@ -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") - target_sources(server PRIVATE Timer.hpp Timer.cpp @@ -9,7 +7,3 @@ target_sources(server PRIVATE target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) - -set_target_properties(server PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) diff --git a/src/server/timers/Timer+SpawnWall.hpp b/src/server/timers/Timer+SpawnWall.hpp new file mode 100644 index 00000000..a84e28b9 --- /dev/null +++ b/src/server/timers/Timer+SpawnWall.hpp @@ -0,0 +1,23 @@ +#include "Timer.hpp" + +#ifndef TIMER_SPAWNENEMY_HPP + #define TIMER_SPAWNENEMY_HPP + +namespace Timer { + class TimerSpawnWall : public Timer + { + public: + TimerSpawnWall() + {} + + TimerSpawnWall(const TimerSpawnWall &) = delete; + + static TimerSpawnWall &getInstance() + { + static TimerSpawnWall instance; + return instance; + } + }; +} // namespace Timer + +#endif \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d800204e..084e9a93 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,10 +11,6 @@ if(PROJECT_IS_TOP_LEVEL OR TEST_INSTALLED_VERSION) find_package(R_Type CONFIG REQUIRED) # for intro, project_options, ... - if(NOT TARGET R_Type_options) - message(FATAL_ERROR "Requiered config package not found!") - return() # be strictly paranoid for Template Janitor github action! CK - endif() endif() # ---- Dependencies ---- @@ -25,7 +21,6 @@ add_executable(tests tests.cpp tests+World.cpp) target_link_libraries( tests PRIVATE R_Type::R_Type_warnings - R_Type::R_Type_options Catch2::Catch2WithMain) if(WIN32 AND BUILD_SHARED_LIBS)