From 09d8871ac32ae37f39555f4fbd16a32a9f43c092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Justinas=20Petravi=C4=8Dius?= Date: Mon, 7 Jul 2025 09:01:37 +0300 Subject: [PATCH] Update README.md to provide detailed project description, features, installation instructions, usage guidelines, and technical details for WebCounter - a Flask WebSocket server. --- README.md | 112 +- app.py | 135 ++ fonts/OpenGost Type A/COPYRIGHT.txt | 3 + fonts/OpenGost Type A/LICENSE.txt | 91 ++ fonts/OpenGost Type A/OpenGostTypeA.ttf | Bin 0 -> 80160 bytes fonts/OpenGost Type B/COPYRIGHT.txt | 4 + fonts/OpenGost Type B/LICENSE.txt | 91 ++ fonts/OpenGost Type B/OpenGostTypeB.ttf | Bin 0 -> 66852 bytes pyproject.toml | 14 + static/fonts/OpenGost Type B/COPYRIGHT.txt | 4 + static/fonts/OpenGost Type B/LICENSE.txt | 91 ++ .../fonts/OpenGost Type B/OpenGostTypeB.ttf | Bin 0 -> 66852 bytes templates/client.html | 155 ++ templates/controller.html | 333 ++++ templates/index.html | 86 ++ templates/mechanical_counter.html | 578 +++++++ templates/mechanical_counter_controller.html | 1363 +++++++++++++++++ uv.lock | 433 ++++++ 18 files changed, 3492 insertions(+), 1 deletion(-) create mode 100644 app.py create mode 100644 fonts/OpenGost Type A/COPYRIGHT.txt create mode 100644 fonts/OpenGost Type A/LICENSE.txt create mode 100644 fonts/OpenGost Type A/OpenGostTypeA.ttf create mode 100644 fonts/OpenGost Type B/COPYRIGHT.txt create mode 100644 fonts/OpenGost Type B/LICENSE.txt create mode 100644 fonts/OpenGost Type B/OpenGostTypeB.ttf create mode 100644 pyproject.toml create mode 100644 static/fonts/OpenGost Type B/COPYRIGHT.txt create mode 100644 static/fonts/OpenGost Type B/LICENSE.txt create mode 100644 static/fonts/OpenGost Type B/OpenGostTypeB.ttf create mode 100644 templates/client.html create mode 100644 templates/controller.html create mode 100644 templates/index.html create mode 100644 templates/mechanical_counter.html create mode 100644 templates/mechanical_counter_controller.html create mode 100644 uv.lock diff --git a/README.md b/README.md index 5548b04..98e2735 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,112 @@ -# webcounter +# WebCounter - WebSocket Server + +A Python Flask webserver with WebSocket support that serves two pages - a client and a controller. The controller can send events to connected clients via WebSocket. + +## Features + +- **Client Page**: Receives and displays events from the controller +- **Controller Page**: Sends events to all connected clients +- **Mechanical Counter**: Vintage-style 6-digit counter with animated number wheels +- **Real-time Communication**: WebSocket-based event broadcasting +- **Modern UI**: Clean, responsive design +- **Event Types**: Support for different event types (message, notification, update, alert, custom) +- **Quick Actions**: Pre-defined buttons for common events + +## Dependency Management with uv + +This project uses [`uv`](https://github.com/astral-sh/uv) for fast Python dependency management. + +### Install uv + +If you don't have `uv` installed, you can install it with: +```bash +pip install uv +``` +Or see the [uv installation guide](https://github.com/astral-sh/uv#installation) for more options. + +### Install dependencies +```bash +uv pip install -r pyproject.toml +``` + +Or, to create a lockfile and install: +```bash +uv pip install --sync +``` + +## Running the Server + +1. Start the server: +```bash +python app.py +``` + +2. The server will start on port 8079. You'll see output like: +``` +Starting webserver on port 8079... +Client page: http://localhost:8079/client +Controller page: http://localhost:8079/controller +``` + +## Usage + +1. **Main Page**: Visit `http://localhost:8079/` to see the navigation page +2. **Client Page**: Visit `http://localhost:8079/client` to open a client that receives events +3. **Controller Page**: Visit `http://localhost:8079/controller` to open the controller that sends events +4. **Mechanical Counter Display**: Visit `http://localhost:8079/mechanical-counter` to see the vintage counter display +5. **Mechanical Counter Controller**: Visit `http://localhost:8079/mechanical-counter-controller` to control the counter + +### How it Works + +1. Open multiple client pages in different browser tabs/windows +2. Open the controller page +3. Use the controller to send events (messages, notifications, etc.) +4. All connected clients will receive the events in real-time + +### Mechanical Counter + +The mechanical counter simulates a vintage mechanical counter with: +- **6-digit display** with individual animated wheels +- **Vintage styling** with the OpenGost Type B font +- **Smooth animations** that simulate mechanical wheel rotation +- **Real-time updates** via WebSocket +- **Individual digit control** from the controller +- **Quick preset buttons** for common values + +### Event Types + +- **Message**: Simple text messages +- **Notification**: System notifications with different priorities +- **Update**: Data updates +- **Alert**: Important alerts +- **Custom**: Custom JSON data + +### Quick Actions + +The controller page includes quick action buttons for: +- Success notifications +- Warning notifications +- Error notifications +- Counter updates + +## Technical Details + +- **Backend**: Flask with Flask-SocketIO +- **Frontend**: HTML, CSS, JavaScript with Socket.IO client +- **WebSocket**: Real-time bidirectional communication +- **Port**: 8079 (configurable in app.py) +- **Dependency Management**: [uv](https://github.com/astral-sh/uv) + +## File Structure + +``` +webcounter/ +├── app.py # Main Flask application +├── pyproject.toml # Project metadata and dependencies +├── templates/ # HTML templates +│ ├── index.html # Main navigation page +│ ├── client.html # Client page +│ └── controller.html # Controller page +└── README.md # This file +``` diff --git a/app.py b/app.py new file mode 100644 index 0000000..7e72440 --- /dev/null +++ b/app.py @@ -0,0 +1,135 @@ +from flask import Flask, render_template, request, send_from_directory +from flask_socketio import SocketIO, emit, join_room +import json + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'your-secret-key-here' +socketio = SocketIO(app, cors_allowed_origins="*") + +# Store connected clients +connected_clients = set() + +@app.route('/') +def index(): + """Main page - redirects to client""" + return render_template('index.html') + +@app.route('/client') +def client(): + """Client page that receives events""" + return render_template('client.html') + +@app.route('/controller') +def controller(): + """Controller page that sends events""" + return render_template('controller.html') + +@app.route('/mechanical-counter') +def mechanical_counter(): + """Mechanical counter client page""" + return render_template('mechanical_counter.html') + +@app.route('/mechanical-counter-controller') +def mechanical_counter_controller(): + """Mechanical counter controller page""" + return render_template('mechanical_counter_controller.html') + +@app.route('/static/') +def static_files(filename): + """Serve static files""" + return send_from_directory('static', filename) + +@socketio.on('connect') +def handle_connect(): + """Handle client connection""" + print(f'Client connected: {request.sid}') + connected_clients.add(request.sid) + emit('status', {'message': 'Connected to server'}) + +@socketio.on('disconnect') +def handle_disconnect(): + """Handle client disconnection""" + print(f'Client disconnected: {request.sid}') + connected_clients.discard(request.sid) + +@socketio.on('send_event') +def handle_send_event(data): + """Handle event from controller to broadcast to clients""" + print(f'Broadcasting event: {data}') + # Broadcast to all connected clients except sender + emit('receive_event', data, broadcast=True, include_self=False) + +@socketio.on('counter_update') +def handle_counter_update(data): + """Handle counter updates from controller""" + print(f'Counter update: {data}') + # Broadcast counter update to all clients + emit('counter_update', data, broadcast=True, include_self=False) + +@socketio.on('position_update') +def handle_position_update(data): + """Handle position updates from controller""" + print(f'Position update received: {data}') + print(f'Broadcasting to {len(connected_clients)} clients') + # Broadcast position update to all clients + emit('position_update', data, broadcast=True, include_self=False) + +@socketio.on('viewport_update') +def handle_viewport_update(data): + """Handle viewport updates from client""" + print(f'Viewport update received: {data}') + print(f'Broadcasting viewport update to {len(connected_clients)} clients') + # Broadcast viewport update to all clients (including controller) + emit('viewport_update', data, broadcast=True, include_self=False) + +@socketio.on('request_viewport') +def handle_request_viewport(data): + """Handle viewport request from controller""" + print(f'Viewport request received: {data}') + # Broadcast viewport request to all clients + emit('request_viewport', data, broadcast=True, include_self=False) + +@socketio.on('font_size_update') +def handle_font_size_update(data): + """Handle font size updates from controller""" + print(f'Font size update received: {data}') + print(f'Broadcasting font size update to {len(connected_clients)} clients') + # Broadcast font size update to all clients + emit('font_size_update', data, broadcast=True, include_self=False) + +@socketio.on('wheel_size_update') +def handle_wheel_size_update(data): + """Handle wheel size updates from controller""" + print(f'Wheel size update received: {data}') + print(f'Broadcasting wheel size update to {len(connected_clients)} clients') + # Broadcast wheel size update to all clients + emit('wheel_size_update', data, broadcast=True, include_self=False) + +@socketio.on('animation_speed_update') +def handle_animation_speed_update(data): + """Handle animation speed updates from controller""" + print(f'Animation speed update received: {data}') + print(f'Broadcasting animation speed update to {len(connected_clients)} clients') + # Broadcast animation speed update to all clients + emit('animation_speed_update', data, broadcast=True, include_self=False) + +@socketio.on('join_room') +def handle_join_room(data): + """Handle client joining a specific room""" + room = data.get('room', 'default') + join_room(room) + emit('status', {'message': f'Joined room: {room}'}) + +@socketio.on('send_to_room') +def handle_send_to_room(data): + """Handle sending event to specific room""" + room = data.get('room', 'default') + event_data = data.get('event', {}) + print(f'Sending to room {room}: {event_data}') + emit('receive_event', event_data, room=room, include_self=False) + +if __name__ == '__main__': + print("Starting webserver on port 8079...") + print("Client page: http://localhost:8079/client") + print("Controller page: http://localhost:8079/controller") + socketio.run(app, host='0.0.0.0', port=8079, debug=True) \ No newline at end of file diff --git a/fonts/OpenGost Type A/COPYRIGHT.txt b/fonts/OpenGost Type A/COPYRIGHT.txt new file mode 100644 index 0000000..ac9a160 --- /dev/null +++ b/fonts/OpenGost Type A/COPYRIGHT.txt @@ -0,0 +1,3 @@ +Copyright (c) 2011-2012, Nikita Volchenkov + +Created with FontForge 2.0 (http://fontforge.sf.net) \ No newline at end of file diff --git a/fonts/OpenGost Type A/LICENSE.txt b/fonts/OpenGost Type A/LICENSE.txt new file mode 100644 index 0000000..075d1ae --- /dev/null +++ b/fonts/OpenGost Type A/LICENSE.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/OpenGost Type A/OpenGostTypeA.ttf b/fonts/OpenGost Type A/OpenGostTypeA.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c74000fe12f1e62ed6f325feefd2064babd4763 GIT binary patch literal 80160 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�AEPt=uKlPhA>5&Rq)c<}O9IQ%5-%?BSq(>FMyY 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 Q7H!(`G~YNLK69M^3(>mT-~a#s literal 0 HcmV?d00001 diff --git a/fonts/OpenGost Type B/COPYRIGHT.txt b/fonts/OpenGost Type B/COPYRIGHT.txt new file mode 100644 index 0000000..5587fb9 --- /dev/null +++ b/fonts/OpenGost Type B/COPYRIGHT.txt @@ -0,0 +1,4 @@ +Copyright (c) 2011-2012, Nikita Volchenkov +Copyright (c) 2012, Valek Filippov + +Created with FontForge 2.0 (http://fontforge.sf.net) \ No newline at end of file diff --git a/fonts/OpenGost Type B/LICENSE.txt b/fonts/OpenGost Type B/LICENSE.txt new file mode 100644 index 0000000..075d1ae --- /dev/null +++ b/fonts/OpenGost Type B/LICENSE.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/OpenGost Type B/OpenGostTypeB.ttf b/fonts/OpenGost Type B/OpenGostTypeB.ttf new file mode 100644 index 0000000000000000000000000000000000000000..22dfa7877cb33b0db6bf7051a579ded831c2d3df GIT binary patch literal 66852 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 HvFH6eX!MsX literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ee09cf2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "webcounter" +version = "0.1.0" +description = "A Flask webserver with WebSocket support for client/controller communication." +authors = [ + { name = "Your Name", email = "your@email.com" } +] +requires-python = ">=3.8" +dependencies = [ + "Flask==2.3.3", + "Flask-SocketIO==5.3.6", + "python-socketio==5.8.0", + "python-engineio==4.7.1" +] \ No newline at end of file diff --git a/static/fonts/OpenGost Type B/COPYRIGHT.txt b/static/fonts/OpenGost Type B/COPYRIGHT.txt new file mode 100644 index 0000000..5587fb9 --- /dev/null +++ b/static/fonts/OpenGost Type B/COPYRIGHT.txt @@ -0,0 +1,4 @@ +Copyright (c) 2011-2012, Nikita Volchenkov +Copyright (c) 2012, Valek Filippov + +Created with FontForge 2.0 (http://fontforge.sf.net) \ No newline at end of file diff --git a/static/fonts/OpenGost Type B/LICENSE.txt b/static/fonts/OpenGost Type B/LICENSE.txt new file mode 100644 index 0000000..075d1ae --- /dev/null +++ b/static/fonts/OpenGost Type B/LICENSE.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/static/fonts/OpenGost Type B/OpenGostTypeB.ttf b/static/fonts/OpenGost Type B/OpenGostTypeB.ttf new file mode 100644 index 0000000000000000000000000000000000000000..22dfa7877cb33b0db6bf7051a579ded831c2d3df GIT binary patch literal 66852 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 HvFH6eX!MsX literal 0 HcmV?d00001 diff --git a/templates/client.html b/templates/client.html new file mode 100644 index 0000000..488fe24 --- /dev/null +++ b/templates/client.html @@ -0,0 +1,155 @@ + + + + + + WebCounter - Client + + + + +

+

WebCounter - Client

+
Disconnected
+ +
+

Received Events:

+
+
+ + ← Back to Home +
+ + + + \ No newline at end of file diff --git a/templates/controller.html b/templates/controller.html new file mode 100644 index 0000000..88c9a97 --- /dev/null +++ b/templates/controller.html @@ -0,0 +1,333 @@ + + + + + + WebCounter - Controller + + + + +
+

WebCounter - Controller

+
Disconnected
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ +
+

Quick Actions

+ + + + +
+ +
+

Sent Events:

+
+
+ + ← Back to Home +
+ + + + \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..6de17ba --- /dev/null +++ b/templates/index.html @@ -0,0 +1,86 @@ + + + + + + WebCounter - WebSocket Server + + + +
+

WebCounter WebSocket Server

+
+

Welcome to the WebSocket server! Choose your role:

+
    +
  • Client: Receives events from the controller
  • +
  • Controller: Sends events to connected clients
  • +
  • Mechanical Counter: Vintage-style 6-digit counter with animated wheels
  • +
+
+ + + +
+ + \ No newline at end of file diff --git a/templates/mechanical_counter.html b/templates/mechanical_counter.html new file mode 100644 index 0000000..92fa958 --- /dev/null +++ b/templates/mechanical_counter.html @@ -0,0 +1,578 @@ + + + + + + Mechanical Counter - Client + + + + +
Disconnected
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ +
+ Mechanical Counter Display +
+ + + + \ No newline at end of file diff --git a/templates/mechanical_counter_controller.html b/templates/mechanical_counter_controller.html new file mode 100644 index 0000000..985d3ad --- /dev/null +++ b/templates/mechanical_counter_controller.html @@ -0,0 +1,1363 @@ + + + + + + Mechanical Counter - Controller + + + + +
+

Mechanical Counter Controller

+
Disconnected
+ +
+

Global Font Size

+
+
Font Size:
+ + 48px +
+ 123 +
+
+
+ + +
+
+ +
+

Global Animation Speed Control

+
+
Speed:
+ + 0.5s +
+
+
+
0
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+
+
+
+ + + +
+
+ +
+

Digit Wheel Size

+
+
Width:
+ + 80px +
Height:
+ + 120px +
+
+
+
+
8
+
+
+
+
+ + +
+
+ +
+

Digit Positions

+
+
Digit 1:
+
+ X: + + 50 + Y: + + 200 +
+
+
+
Digit 2:
+
+ X: + + 150 + Y: + + 200 +
+
+
+
Digit 3:
+
+ X: + + 250 + Y: + + 200 +
+
+
+
Digit 4:
+
+ X: + + 350 + Y: + + 200 +
+
+
+
Digit 5:
+
+ X: + + 450 + Y: + + 200 +
+
+
+
Digit 6:
+
+ X: + + 550 + Y: + + 200 +
+
+
+
+ Viewport: 800 x 600 +
+ + + +
+
+ +
+

Current Counter Value

+
+
0
+
0
+
0
+
0
+
0
+
0
+
+
+ +
+
+ + +
+ + +
+
+
+ + +
+ + +
+
+
+ + +
+ + +
+
+
+ + +
+ + +
+
+
+ + +
+ + +
+
+
+ + +
+ + +
+
+
+ +
+ + + +
+ +
+

Quick Actions

+
+ + + + + +
+
+ +
+

Sent Updates

+
+
+ + ← Back to Home +
+ + + + \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..37100f9 --- /dev/null +++ b/uv.lock @@ -0,0 +1,433 @@ +version = 1 +revision = 2 +requires-python = ">=3.8" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] + +[[package]] +name = "bidict" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093, upload-time = "2024-02-18T19:09:05.748Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764, upload-time = "2024-02-18T19:09:04.156Z" }, +] + +[[package]] +name = "blinker" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/57/a6a1721eff09598fb01f3c7cda070c1b6a0f12d63c83236edf79a440abcc/blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83", size = 23161, upload-time = "2024-05-06T17:04:10.101Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01", size = 9456, upload-time = "2024-05-06T17:04:08.444Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "flask" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker", version = "1.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "blinker", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "click", version = "8.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "werkzeug", version = "3.0.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "werkzeug", version = "3.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/4ace17e37abd9c21715dea5ee11774a25e404c486a7893fa18e764326ead/flask-2.3.3.tar.gz", hash = "sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc", size = 672756, upload-time = "2023-08-21T19:52:35.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/56/26f0be8adc2b4257df20c1c4260ddd0aa396cf8e75d90ab2f7ff99bc34f9/flask-2.3.3-py3-none-any.whl", hash = "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b", size = 96112, upload-time = "2023-08-21T19:52:33.115Z" }, +] + +[[package]] +name = "flask-socketio" +version = "5.3.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flask" }, + { name = "python-socketio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/b2/aa882384d130523d7d2d6eed33403aed68a438622df388d92171d7657960/Flask-SocketIO-5.3.6.tar.gz", hash = "sha256:bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c", size = 17167, upload-time = "2023-09-05T09:35:25.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/c8/dc0be9e26272dc89342868ecc2d9ddb9e31002b4b8e49fdb754aa0f9ecbf/Flask_SocketIO-5.3.6-py3-none-any.whl", hash = "sha256:9e62d2131842878ae6bfdd7067dfc3be397c1f2b117ab1dc74e6fe74aad7a579", size = 18098, upload-time = "2023-09-05T09:35:23.601Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514, upload-time = "2024-09-11T14:56:07.019Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "zipp", version = "3.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", version = "2.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "markupsafe", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384, upload-time = "2024-02-02T16:31:22.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206, upload-time = "2024-02-02T16:30:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079, upload-time = "2024-02-02T16:30:06.5Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620, upload-time = "2024-02-02T16:30:08.31Z" }, + { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818, upload-time = "2024-02-02T16:30:09.577Z" }, + { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493, upload-time = "2024-02-02T16:30:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630, upload-time = "2024-02-02T16:30:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745, upload-time = "2024-02-02T16:30:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021, upload-time = "2024-02-02T16:30:16.032Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659, upload-time = "2024-02-02T16:30:17.079Z" }, + { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213, upload-time = "2024-02-02T16:30:18.251Z" }, + { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219, upload-time = "2024-02-02T16:30:19.988Z" }, + { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098, upload-time = "2024-02-02T16:30:21.063Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014, upload-time = "2024-02-02T16:30:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220, upload-time = "2024-02-02T16:30:24.76Z" }, + { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756, upload-time = "2024-02-02T16:30:25.877Z" }, + { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988, upload-time = "2024-02-02T16:30:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718, upload-time = "2024-02-02T16:30:28.111Z" }, + { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317, upload-time = "2024-02-02T16:30:29.214Z" }, + { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670, upload-time = "2024-02-02T16:30:30.915Z" }, + { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224, upload-time = "2024-02-02T16:30:32.09Z" }, + { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215, upload-time = "2024-02-02T16:30:33.081Z" }, + { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069, upload-time = "2024-02-02T16:30:34.148Z" }, + { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452, upload-time = "2024-02-02T16:30:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462, upload-time = "2024-02-02T16:30:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869, upload-time = "2024-02-02T16:30:37.834Z" }, + { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906, upload-time = "2024-02-02T16:30:39.366Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296, upload-time = "2024-02-02T16:30:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038, upload-time = "2024-02-02T16:30:42.243Z" }, + { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572, upload-time = "2024-02-02T16:30:43.326Z" }, + { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127, upload-time = "2024-02-02T16:30:44.418Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", size = 18192, upload-time = "2024-02-02T16:30:57.715Z" }, + { url = "https://files.pythonhosted.org/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", size = 14072, upload-time = "2024-02-02T16:30:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", size = 26928, upload-time = "2024-02-02T16:30:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", size = 26106, upload-time = "2024-02-02T16:31:01.582Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68", size = 25781, upload-time = "2024-02-02T16:31:02.71Z" }, + { url = "https://files.pythonhosted.org/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", size = 30518, upload-time = "2024-02-02T16:31:04.392Z" }, + { url = "https://files.pythonhosted.org/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", size = 29669, upload-time = "2024-02-02T16:31:05.53Z" }, + { url = "https://files.pythonhosted.org/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", size = 29933, upload-time = "2024-02-02T16:31:06.636Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f3/ecb00fc8ab02b7beae8699f34db9357ae49d9f21d4d3de6f305f34fa949e/MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", size = 16656, upload-time = "2024-02-02T16:31:07.767Z" }, + { url = "https://files.pythonhosted.org/packages/92/21/357205f03514a49b293e214ac39de01fadd0970a6e05e4bf1ddd0ffd0881/MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", size = 17206, upload-time = "2024-02-02T16:31:08.843Z" }, + { url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193, upload-time = "2024-02-02T16:31:10.155Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073, upload-time = "2024-02-02T16:31:11.442Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486, upload-time = "2024-02-02T16:31:12.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685, upload-time = "2024-02-02T16:31:13.726Z" }, + { url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338, upload-time = "2024-02-02T16:31:14.812Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439, upload-time = "2024-02-02T16:31:15.946Z" }, + { url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531, upload-time = "2024-02-02T16:31:17.13Z" }, + { url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823, upload-time = "2024-02-02T16:31:18.247Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658, upload-time = "2024-02-02T16:31:19.583Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211, upload-time = "2024-02-02T16:31:20.96Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload-time = "2024-10-18T15:20:51.44Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload-time = "2024-10-18T15:20:52.426Z" }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload-time = "2024-10-18T15:20:53.578Z" }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload-time = "2024-10-18T15:20:55.06Z" }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload-time = "2024-10-18T15:20:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload-time = "2024-10-18T15:20:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload-time = "2024-10-18T15:20:58.235Z" }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload-time = "2024-10-18T15:20:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload-time = "2024-10-18T15:21:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload-time = "2024-10-18T15:21:01.122Z" }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344, upload-time = "2024-10-18T15:21:43.721Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389, upload-time = "2024-10-18T15:21:44.666Z" }, + { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607, upload-time = "2024-10-18T15:21:45.452Z" }, + { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728, upload-time = "2024-10-18T15:21:46.295Z" }, + { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826, upload-time = "2024-10-18T15:21:47.134Z" }, + { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843, upload-time = "2024-10-18T15:21:48.334Z" }, + { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219, upload-time = "2024-10-18T15:21:49.587Z" }, + { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946, upload-time = "2024-10-18T15:21:50.441Z" }, + { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063, upload-time = "2024-10-18T15:21:51.385Z" }, + { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload-time = "2024-10-18T15:21:52.974Z" }, +] + +[[package]] +name = "python-engineio" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "simple-websocket" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/47/e7700d320c633191e86b516c8aa535e2fafdd3cd2020ed44ef0eb4d546b6/python-engineio-4.7.1.tar.gz", hash = "sha256:a8422e345cd9a21451303380b160742ff02197975b1c3a02cef115febe2b1b20", size = 44115, upload-time = "2023-09-12T10:37:01.43Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/69/1e5985404fdc7873cef612ae7451ba5d3c00b2daa0aa1d9a4f6a5265532a/python_engineio-4.7.1-py3-none-any.whl", hash = "sha256:52499e8ab94fea1a6525ffe872fe7028d04b575799c5fa8e2cf7880e032de42e", size = 55016, upload-time = "2023-09-12T10:36:59.48Z" }, +] + +[[package]] +name = "python-socketio" +version = "5.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bidict" }, + { name = "python-engineio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/4e/69e98ca93a7aa59b5e868afe54b133c7675828af710805ee5cde955fd732/python-socketio-5.8.0.tar.gz", hash = "sha256:e714f4dddfaaa0cb0e37a1e2deef2bb60590a5b9fea9c343dd8ca5e688416fd9", size = 47872, upload-time = "2023-03-16T22:45:34.797Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/e9/f296186e2a91f1472b9da74346163411196dc1b17f425acf088f293b32cc/python_socketio-5.8.0-py3-none-any.whl", hash = "sha256:7adb8867aac1c2929b9c1429f1c02e12ca4c36b67c807967393e367dfbb01441", size = 56982, upload-time = "2023-03-16T22:45:33.155Z" }, +] + +[[package]] +name = "simple-websocket" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300, upload-time = "2024-10-10T22:39:31.412Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842, upload-time = "2024-10-10T22:39:29.645Z" }, +] + +[[package]] +name = "webcounter" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "flask" }, + { name = "flask-socketio" }, + { name = "python-engineio" }, + { name = "python-socketio" }, +] + +[package.metadata] +requires-dist = [ + { name = "flask", specifier = "==2.3.3" }, + { name = "flask-socketio", specifier = "==5.3.6" }, + { name = "python-engineio", specifier = "==4.7.1" }, + { name = "python-socketio", specifier = "==5.8.0" }, +] + +[[package]] +name = "werkzeug" +version = "3.0.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "markupsafe", version = "2.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/f9/0ba83eaa0df9b9e9d1efeb2ea351d0677c37d41ee5d0f91e98423c7281c9/werkzeug-3.0.6.tar.gz", hash = "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d", size = 805170, upload-time = "2024-10-25T18:52:31.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/69/05837f91dfe42109203ffa3e488214ff86a6d68b2ed6c167da6cdc42349b/werkzeug-3.0.6-py3-none-any.whl", hash = "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", size = 227979, upload-time = "2024-10-25T18:52:30.129Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "markupsafe", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload-time = "2024-11-08T15:52:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload-time = "2024-11-08T15:52:16.132Z" }, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload-time = "2022-08-23T19:58:21.447Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226, upload-time = "2022-08-23T19:58:19.96Z" }, +] + +[[package]] +name = "zipp" +version = "3.20.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199, upload-time = "2024-09-13T13:44:16.101Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200, upload-time = "2024-09-13T13:44:14.38Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +]