This commit is contained in:
Andrey Sharshov
2025-11-16 18:48:06 +01:00
commit c02d04073f
481 changed files with 52066 additions and 0 deletions

6
.babelrc Normal file
View File

@@ -0,0 +1,6 @@
{
"presets": [
"@babel/preset-env",
"@babel/preset-typescript"
]
}

6
.barrelsby.json Normal file
View File

@@ -0,0 +1,6 @@
{
"directory": "./src",
"exclude": ["index.ts","**/stories/**"],
"delete": true,
"exportDefault": false
}

12
.editorconfig Normal file
View File

@@ -0,0 +1,12 @@
# This file is for unifying the coding style for different editors and IDEs.
# More information at http://EditorConfig.org
root = true
[*]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[{*.json,bower.json,.travis.yml}]

8
.eslintignore Normal file
View File

@@ -0,0 +1,8 @@
/docs/**
**/dist/**
**/lib/**
**/types/**
temp
docs
dist
node_modules

51
.eslintrc.json Normal file
View File

@@ -0,0 +1,51 @@
{
"extends": ["@pixi/eslint-config"],
"plugins": ["jsdoc", "no-mixed-operators"],
"settings": {
"jsdoc": {
"mode": "typescript",
"tagNamePreference": {
"method": "method",
"function": "function",
"extends": "extends",
"typeParam": "typeParam",
"api": "api"
}
}
},
"rules": {
"@typescript-eslint/no-unused-expressions": [1, {"allowShortCircuit": true, "allowTernary": true}],
"no-mixed-operators": "off",
"no-mixed-operators/no-mixed-operators": 1,
"@typescript-eslint/type-annotation-spacing": 1,
"jsdoc/multiline-blocks": [
1,
{ "noMultilineBlocks": true, "minimumLengthForMultiline": 115 }
],
"jsdoc/check-access": 1,
"jsdoc/check-alignment": 1,
"jsdoc/check-param-names": 1,
"jsdoc/check-property-names": 1,
"jsdoc/check-tag-names": 1,
"jsdoc/check-types": 1,
"jsdoc/check-values": 1,
"jsdoc/empty-tags": 1,
"jsdoc/implements-on-classes": 1,
"jsdoc/no-multi-asterisks": [1, { "allowWhitespace": true }],
"jsdoc/require-param": 1,
"jsdoc/require-param-description": 0,
"jsdoc/require-param-name": 1,
"jsdoc/require-param-type": [
"warn",
{ "contexts": ["TSMethodSignature"] }
],
"jsdoc/require-property": 1,
"jsdoc/require-property-description": 1,
"jsdoc/require-property-name": 1,
"jsdoc/require-property-type": 1,
"jsdoc/require-returns-description": 1,
"jsdoc/tag-lines": 1,
"jsdoc/valid-types": 1,
"max-len": ["warn", { "code": 150 }]
}
}

7
.gitattributes vendored Normal file
View File

@@ -0,0 +1,7 @@
*.js text eol=lf
*.ts text eol=lf
*.json text eol=lf
*.yml text eol=lf
*.md text eol=lf
*.txt text eol=lf

43
.gitignore vendored Normal file
View File

@@ -0,0 +1,43 @@
# sublime text files
*.sublime*
*.vscode*
*.*~*.TMP
test/lib
# temp files
.DS_Store
Thumbs.db
Desktop.ini
npm-debug.log
# project files
.project
# vim swap files
*.sw*
# emacs temp files
*~
\#*#
# project ignores
!.gitkeep
*__temp
node_modules
bin/
lib/
dist/
coverage/
temp
yarn.lock
pnpm-lock.yaml
# jetBrains IDE ignores
.idea
.vs-code
.eslintcache
docs/
example.api.json*
.npmrc

6
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,6 @@
include:
- project: infrastructure/gitlab_ci_templates
file: entrypoints/front/npm-entrypoint.gitlab-ci.yml
ref: main

37
.storybook/main.js Normal file
View File

@@ -0,0 +1,37 @@
const path = require('path');
module.exports = {
stories: ['../src/stories/**/*.stories.@(ts|tsx|js|jsx|mdx)'],
staticDirs: ['../src/stories/assets'],
output: '../docs/',
logLevel: 'debug',
addons: [
'@storybook/addon-docs',
'@storybook/addon-actions',
'@storybook/addon-backgrounds',
'@storybook/addon-controls',
'@storybook/addon-viewport',
'@storybook/addon-links',
'@storybook/addon-highlight',
'@storybook/addon-storysource',
'@storybook/addon-webpack5-compiler-babel',
'@chromatic-com/storybook'
],
core: {
channelOptions: { allowFunction: false, maxDepth: 10 },
disableTelemetry: true,
},
features: {
buildStoriesJson: true,
breakingChangesV7: true,
babelModeV7: true,
},
framework: '@pixi/storybook-webpack5',
webpackFinal: async (config) => {
config.resolve.alias = {
...config.resolve.alias,
src: path.resolve(__dirname, '../src'),
};
return config;
},
};

26
.storybook/preview.js Normal file
View File

@@ -0,0 +1,26 @@
export const parameters = {
layout: 'fullscreen',
pixi: {
applicationOptions: {
backgroundAlpha: 0,
resolution: 2,
antialias: true,
},
},
backgrounds: {
default: 'Dark',
values: [
{
name: 'Dark',
value: '#1b1c1d',
},
{
name: 'Light',
value: '#dddddd',
},
],
},
docs: {
iframeHeight: 600, // Устанавливает высоту для всех историй в документации
},
};

263
README.md Normal file
View File

@@ -0,0 +1,263 @@
# Slot Game Kit CLI
This CLI provides tools to simplify the development and building of HTML5 games. It is based on Webpack and offers pre-configured commands for development, building, and testing projects.
## Installation
1. Install the package via npm:
```bash
npm install @popiplay/slot-game-kit --save-dev
```
2. Ensure Webpack and its dependencies are installed in your project:
```bash
npm install webpack webpack-cli webpack-dev-server --save-dev
```
## Commands
The CLI provides the following commands:
### 1. **Start Development**
Launches the development server (using `webpack-dev-server`) and automatically updates the project when files are changed.
```bash
npx slotgamekit watch
```
Or add it to your project's `package.json`:
```json
"scripts": {
"watch": "slotgamekit watch"
}
```
Run:
```bash
npm run watch
```
---
### 2. **Build for Development**
Creates a build in development mode using `webpack.dev.js`. Suitable for local testing.
```bash
npx slotgamekit dev
```
Or add it to your project's `package.json`:
```json
"scripts": {
"dev": "slotgamekit dev"
}
```
Run:
```bash
npm run dev
```
---
### 3. **Build for Production**
Creates an optimized build for production using `webpack.prod.js`.
```bash
npx slotgamekit prod
```
Or add it to your project's `package.json`:
```json
"scripts": {
"prod": "slotgamekit prod"
}
```
Run:
```bash
npm run prod
```
---
### 4. **Build for Staging**
Creates a build for testing in staging environments using `webpack.staging.js`.
```bash
npx slotgamekit staging
```
Or add it to your project's `package.json`:
```json
"scripts": {
"staging": "slotgamekit staging"
}
```
Run:
```bash
npm run staging
```
---
## Webpack Configuration
### Supported Configurations:
1. `webpack.common.js` shared settings.
2. `webpack.dev.js` development configuration.
3. `webpack.prod.js` production configuration.
4. `webpack.staging.js` staging configuration.
## Feature multipliers
The CLI ships with a default set of feature multipliers (`bonusBuy`, `freespinBuy`, `bonusChance`).
When backend pricing is unavailable for Bonus Chance the runtime keeps the multiplier at `1` so the
stake displayed to players remains unchanged while the feature is temporarily disabled.
Call `Model.resolveFeatureStake(bet)` whenever the UI needs to present the wager with Bonus Chance
enabled—the helper automatically applies the active multiplier so Wild Spin toggles stay in sync.
All configurations are located in the `bundler/` folder inside the package.
### Optional line configuration
Cluster and ways titles are no longer required to ship a `lines` array in the init payload or machine configuration. When both values are missing the runtime now boots with an empty definition and keeps `Mode.lines` consistent. Provide a line matrix only for payline-based games.
---
## Additional Settings
### Babel
The `.babelrc` configuration file is provided with the package. Make sure it is used in your project.
### Browserslist
The `.browserslistrc` file defines browser support and is also included in the package.
To use it, specify its path via the environment variable:
```bash
BROWSERSLIST_CONFIG=node_modules/@popiplay/slot-game-kit/.browserslistrc
```
---
## Overview
The project is organized into the following key folders:
- **`activities/`**: Manages a queue of activities to be executed sequentially. Activities are added to the queue and automatically processed when the runner is idle. Each activity should be an object with a `name` property and an asynchronous `execute` method.
Besides the main `ActivityRunner` and `Activity` classes implementing this functionality, there are also commands for pausing and resuming the game clock, displaying error popups, and similar actions.
- **`constants/`**: Contains fixed values used throughout the project to enhance readability and maintainability. These include viewport and renderer settings, and scene names.
- **`controllers/`**: Houses the `BaseGameController`, which is intended to be extended by the game-specific controller. This class is designed to handle all user interactions, such as opening the game rules or paytable, and launching the buy bonus screen. Additionally, it includes methods responsible for displaying big win, max win, and similar in-game screens or animations.
- **`devtools/`**:
- **`errors/`**: Contains the `ErrorProcessor`, used by controllers to display corresponding error popups.
- **`extensions/`**: Includes PixiJS extensions that add features beyond the core library. The `extensions` object from PixiJS manages these additions. Specific extensions include:
- `AudioSpriteLoader`: A simple loader plugin for audio sprite files.
- `BasePathInjector`: Modifies asset paths by adding the `baseAssetsUrl` fetched from the backend.
- `GlobalPointerEvents`: A class representing the global events system, emitting pointer events through `Locator.events`.
- `loadHtml`: A simple loader plugin for loading rules content from HTML files.
- **`fairyScenes/`**:
- **`game/`**: Contains the `BaseGame` class, which is intended to be extended by the game-specific class. It is responsible for creating scenes, models, and the controller. The `start` method initiates the game clock, and the `update` and `resize` methods handle rendering and adjusting the game's dimensions.
- **`helpers/`**: Contains simple `scaleToFit` methods used to resize text to fit within given bounds.
- **`models/`**: Defines the data representation of various elements within the game world. Models store the state and properties of game objects, characters, environments, and game rules, independent of their visual rendering or behavior. Specific models include:
- `AutoGameModel`: Manages auto-spin functionality, including spin limits, balance tracking, and stop conditions.
- `BalanceModel`: Manages the player's in-game balance, handling updates, validation, and affordability checks. Its `add`
method now accepts zero so callers can record settled rounds without mutating the balance.
- `BetModel`: Manages available bet options, allowing for increasing, decreasing, and setting specific bet values, with support for locking betting actions.
- `EndRoundModel`: Determines the next game state after a round ends (e.g., big win, max win, free spins trigger, bonus exit).
- `Model`: Base class for models, providing methods for initialization and loading data from the backend using `Locator.network` and `ModelDataInitializer`.
- Space-bar spin preferences persist through `Locator.storage`, mirroring the legacy runtime so toggles survive reloads.
- `ModelDataInitializer`: Used by the `Model` class to parse raw data received from the backend.
- `PaytableModel`: Represents a collection of paytables.
- `VolumeModel`: Controls the volume levels for sound and music, including muting.
- `Currency`: Provides formatting utilities for currency values.
- `Lines`: Represents a collection of line configurations. The model now accepts empty definitions so cluster and ways games can omit lines entirely without breaking initialization.
- `ModeStack`: Manages a stack of game modes for handling nested game states.
- **`scene/`**: Contains the `Scene` class, which serves as the base class for all scenes within the game.
- **`services/`**: Contains classes that provide various services accessible through the `Locator` service locator:
- `Locator`: A service locator class providing access to all registered services.
- `audio`:
- `AudioSprites`: Responsible for playing sounds, accessible via `Locator.audio.play()`.
- `LogAudio`: A simple audio logger.
- `clock`:
- `Clock`: Represents the game ticker, driven by `requestAnimationFrame`.
- `DevClock`: Extends the `Clock` class for development purposes.
- `events`:
- `Events`: Extends `EventEmitter` from the `eventemitter3` library, used for inter-component communication.
- `locales`:
- Handles loading translation files and retrieving translations for given string IDs (e.g., `Locator.locales.get("total_win")`).
- `manifest`:
- `ManifestService`: Merges PixiJS manifests and can prepend a `basePath` and append `defaultSearchParams` to every remote manifest source, mirroring the `Assets.init` configuration.
- `network`:
- `LocalNetwork`: A class for handling network requests, with `createRequest` calling the `fetch` API.
- `ReplayNetwork`: Replays recorded backend responses from a static `replayUrl` for deterministic sessions.
- `renderer`:
- `Renderer2D`: Extends PixiJS's `Renderer`, created in the main game file (`index.js`) and used for rendering the game (`Locator.renderer.render()`).
- `scenes`:
- `Scenes`: A class representing a collection of scenes, implementing the `IScenes` interface.
- `storage`:
- `StorageService`: Uses `localStorage` to read and write flags (e.g., `Locator.storage.set('introHasBeenShown', true)`). `localStorage` is a persistent client-side storage API for key/value pairs within the user's browser.
- `user`:
- `DevUser`:
- `viewport`:
- `Viewport`: Extends PixiJS's `Container` (also known as `Viewport`), responsible for holding all game elements and managing game resizing.
- **`types/`**: Contains TypeScript definition files (e.g., `ViewportOptions`).
- **`utils/`**: Contains reusable helper functions and utility classes for common tasks like data manipulation, formatting, and mathematical operations. `waitForEventOnce` is used throughout the project to block the execution flow until a specific event occurs.
- **`viewmodels/`**: Contains classes that prepare and manage data for the views:
- `BuyBonusViewModel`: Manages data and logic for the buy bonus/buy free spins feature, coercing undefined bonus toggle values to disabled, clearing cached bet lists whenever the bonus chance toggle changes, and re-evaluating availability with `resolveFeatureStake` so the `BetPicker` reflects the latest stakes and balance guardrails.
- `GameplayViewModel`: Provides various getters from the game models that are important for gameplay, such as currency, round start/end status, and turbo mode activation.
## Usage
This section provides guidance on how to integrate and use the various components and features of the framework within your game project.
### Devtools Feature: Back Panel
The `BackPanel` creates a customizable back panel with user and service controls
that can be added dynamically.
- Manages user controls for server URL, shared player, custom player, and user switching with options stored in local storage.
- Provides functionality for managing audio settings and inspecting sounds in a web application.
- Creates a user interface for controlling the timescale and pause functionality of a clock.
*- Adds cheat controls to a pane and allows for testing cheats by making POST requests to a specified URL.* WIP?
To utilize the `BackPanel` in your game project, you need to instantiate its primary class and integrate it into your game logic.
**Instantiation:**
```javascript
// In your game project's index.js file
import {BackPanel} from "@popiplay/slot-game-kit";
const backPanel = new BackPanel();
backPanel.addUserControls();
// after Locator.provide() calls add this line
backPanel.addOtherControls();
```
You can toggle the visibility of the back panel by pressing H or h on your keyboard.
## Support
If you have any questions or issues using this CLI, refer to the documentation or create an issue in the package's repository.

2
art/SGKUI/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.DS_Store
.objs/

2
art/SGKUI/SGKUI.fairy Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<projectDescription id="fa67bc4b5eae30d412f4b4d39e4b4519" type="DOM" version="5.0"/>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="150,60" pivot="0.5,0.5" extention="Button">
<controller name="button" pages="0,up,1,down,2,over,3,selectedOver" selected="0"/>
<displayList>
<graph id="n0_e4sn" name="n0" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff252525" corner="10">
<gearDisplay controller="button" pages="0"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<graph id="n1_e4sn" name="n1" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff303030" corner="10">
<gearDisplay controller="button" pages="2"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<graph id="n2_e4sn" name="n2" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff303030" corner="10">
<gearDisplay controller="button" pages="1,3"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<text id="n3_e4sn" name="title" xy="0,0" size="150,60" font="ui://bccvco04rdld4" fontSize="24" color="#ffffff" align="center" vAlign="middle" autoSize="none" bold="true" singleLine="true" text="Deposit">
<relation target="" sidePair="width-width,height-height"/>
</text>
</displayList>
<Button downEffect="scale" downEffectValue=".9"/>
</component>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="400,270" pivot="0.5,0.5" anchor="true">
<controller name="type" exported="true" pages="0,ok,1,ok_deposit" selected="0"/>
<displayList>
<graph id="n0_e4sn" name="background" xy="0,0" size="400,271" type="rect" lineSize="0" fillColor="#cc000000" corner="15">
<relation target="n2_e4sn" sidePair="height-height"/>
</graph>
<text id="n2_e4sn" name="message" xy="35,52" size="330,121" font="ui://bccvco04rdld4" fontSize="20" color="#ffffff" align="center" vAlign="middle" autoSize="none" bold="true" text="Error Message&#xA;"/>
<graph id="n3_e4sn" name="n3" xy="14,10" size="8,23" group="n7_e4sn" type="rect" corner="4"/>
<graph id="n6_e4sn" name="n6" xy="14,35" size="8,8" group="n7_e4sn" type="eclipse"/>
<group id="n7_e4sn" name="icon" xy="14,10" size="8,33"/>
<component id="n8_e4sn" name="ok" src="e4sn3" fileName="OkButton.xml" xy="125,181">
<gearDisplay controller="type" pages="0,1"/>
<gearXY controller="type" pages="0,1" values="125,181|34,181"/>
<relation target="n0_e4sn" sidePair="bottom-bottom"/>
</component>
<component id="n9_n8rc" name="deposit" src="n8rc7" fileName="DepositButton.xml" xy="214,180">
<gearDisplay controller="type" pages="1"/>
</component>
</displayList>
</component>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="1920,1080">
<controller name="layout" pages="0,portrait,1,landscape,2,desktop" selected="0"/>
<displayList>
<component id="n0_pznw" name="overlay" src="n8rc8" fileName="Overlay.xml" xy="0,0" size="1920,1080">
<relation target="" sidePair="width-width,height-height"/>
</component>
<component id="n2_pznw" name="popup" src="n8rc6" fileName="ErrorPopup.xml" xy="960,540" size="400,246">
<gearDisplay controller="layout" pages=""/>
<gearSize controller="layout" pages="0,1" values="400,246,1,1|400,270,2,2" default="400,270,1,1"/>
<relation target="" sidePair="center-center,middle-middle"/>
</component>
</displayList>
</component>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="150,60" pivot="0.5,0.5" extention="Button">
<controller name="button" pages="0,up,1,down,2,over,3,selectedOver" selected="0"/>
<displayList>
<graph id="n0_e4sn" name="n0" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff252525" corner="10">
<gearDisplay controller="button" pages="0"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<graph id="n1_e4sn" name="n1" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff303030" corner="10">
<gearDisplay controller="button" pages="2"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<graph id="n2_e4sn" name="n2" xy="0,0" size="150,60" touchable="false" type="rect" lineSize="0" fillColor="#ff303030" corner="10">
<gearDisplay controller="button" pages="1,3"/>
<relation target="" sidePair="width-width,height-height"/>
</graph>
<text id="n3_e4sn" name="title" xy="0,0" size="150,60" font="ui://bccvco04rdld4" fontSize="24" color="#ffffff" align="center" vAlign="middle" autoSize="none" bold="true" singleLine="true" text="Ok">
<relation target="" sidePair="width-width,height-height"/>
</text>
</displayList>
<Button downEffect="scale" downEffectValue=".9"/>
<customProperty target="label" propertyId="0" label="label"/>
</component>

Binary file not shown.

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="800,600">
<displayList>
<graph id="n0_n8rc" name="n0" xy="0,0" size="800,600" alpha="0.7" type="rect" lineSize="0" fillColor="#ff000000">
<relation target="" sidePair="width-width,height-height"/>
</graph>
</displayList>
</component>

Binary file not shown.

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<packageDescription id="bccvco04">
<resources>
<component id="e4sn3" name="OkButton.xml" path="/" exported="true"/>
<font id="rdld4" name="Oxanium.ttf" path="/" exported="true" renderMode="" samplePointSize="16"/>
<font id="rdld5" name="Opensans.ttf" path="/" exported="true" renderMode="" samplePointSize="16"/>
<component id="n8rc6" name="ErrorPopup.xml" path="/" exported="true"/>
<component id="n8rc7" name="DepositButton.xml" path="/" exported="true"/>
<component id="n8rc8" name="Overlay.xml" path="/" exported="true"/>
<component id="pznw9" name="ErrorPopupWindow.xml" path="/" exported="true"/>
</resources>
<publish name="" path="/Users/aleksandarjovanovic/FW/slot-game-kit/art/SGKUI/export" packageCount="2" genCode="true" codePath="/Users/aleksandarjovanovic/FW/slot-game-kit/art/SGKUI/export"/>
</packageDescription>

Binary file not shown.

View File

@@ -0,0 +1,8 @@
{
"scaleMode": "ConstantPixelSize",
"screenMathMode": "MatchHeight",
"designResolutionX": 1920,
"designResolutionY": 1080,
"devices": [],
"fileName": "Adaptation"
}

View File

@@ -0,0 +1,35 @@
{
"path": "/Users/aleksandarjovanovic/FW/slot-game-kit/art/SGKUI/export/ErrorPopups/ErrorPopups",
"branchPath": "",
"fileExtension": "zip",
"packageCount": 2,
"compressDesc": true,
"binaryFormat": true,
"jpegQuality": 80,
"compressPNG": true,
"codeGeneration": {
"allowGenCode": true,
"codePath": "/Users/aleksandarjovanovic/FW/slot-game-kit/art/SGKUI/export/ErrorPopups/ErrorPopups",
"classNamePrefix": "UI_",
"memberNamePrefix": "m_",
"packageName": null,
"ignoreNoname": true,
"getMemberByName": false,
"codeType": ""
},
"includeHighResolution": 0,
"branchProcessing": 0,
"seperatedAtlasForBranch": false,
"atlasSetting": {
"maxSize": 2048,
"paging": true,
"sizeOption": "pot",
"forceSquare": false,
"allowRotation": false,
"trimImage": true
},
"include2x": false,
"include3x": false,
"include4x": false,
"fileName": "Publish"
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Some files were not shown because too many files have changed in this diff Show More