mpflash 1.25.0rc2__py3-none-any.whl → 1.25.0rc3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mpflash/ask_input.py +2 -3
- mpflash/cli_flash.py +14 -2
- mpflash/common.py +1 -2
- mpflash/download/jid.py +14 -11
- mpflash/downloaded.py +1 -1
- mpflash/flash/stm32.py +1 -1
- mpflash/logger.py +37 -7
- mpflash/mpboard_id/known.py +1 -1
- mpflash/vendor/pydfu.py +29 -1
- {mpflash-1.25.0rc2.dist-info → mpflash-1.25.0rc3.dist-info}/METADATA +1 -1
- {mpflash-1.25.0rc2.dist-info → mpflash-1.25.0rc3.dist-info}/RECORD +14 -14
- {mpflash-1.25.0rc2.dist-info → mpflash-1.25.0rc3.dist-info}/LICENSE +0 -0
- {mpflash-1.25.0rc2.dist-info → mpflash-1.25.0rc3.dist-info}/WHEEL +0 -0
- {mpflash-1.25.0rc2.dist-info → mpflash-1.25.0rc3.dist-info}/entry_points.txt +0 -0
mpflash/ask_input.py
CHANGED
@@ -11,8 +11,7 @@ from loguru import logger as log
|
|
11
11
|
|
12
12
|
from .common import DownloadParams, FlashParams, ParamType
|
13
13
|
from .config import config
|
14
|
-
from .mpboard_id import
|
15
|
-
known_stored_boards)
|
14
|
+
from .mpboard_id import get_known_boards_for_port, known_ports, known_stored_boards
|
16
15
|
from .mpremoteboard import MPRemoteBoard
|
17
16
|
from .versions import micropython_versions
|
18
17
|
|
@@ -227,7 +226,7 @@ def ask_serialport(*, multi_select: bool = False, bluetooth: bool = False):
|
|
227
226
|
# import only when needed to reduce load time
|
228
227
|
import inquirer
|
229
228
|
|
230
|
-
comports = MPRemoteBoard.connected_boards(bluetooth=bluetooth, description=True)
|
229
|
+
comports = MPRemoteBoard.connected_boards(bluetooth=bluetooth, description=True) + ["auto"]
|
231
230
|
return inquirer.List(
|
232
231
|
"serial",
|
233
232
|
message="Which serial port do you want to {action} ?",
|
mpflash/cli_flash.py
CHANGED
@@ -124,6 +124,14 @@ from mpflash.versions import clean_version
|
|
124
124
|
show_default=True,
|
125
125
|
help="""How to enter the (MicroPython) bootloader before flashing.""",
|
126
126
|
)
|
127
|
+
@click.option(
|
128
|
+
"--force",
|
129
|
+
"-f",
|
130
|
+
default=False,
|
131
|
+
is_flag=True,
|
132
|
+
show_default=True,
|
133
|
+
help="""Force download of firmware even if it already exists.""",
|
134
|
+
)
|
127
135
|
@click.option(
|
128
136
|
"--flash_mode",
|
129
137
|
"-fm",
|
@@ -150,8 +158,12 @@ def cli_flash_board(**kwargs) -> int:
|
|
150
158
|
params.bootloader = BootloaderMethod(params.bootloader)
|
151
159
|
|
152
160
|
# make it simple for the user to flash one board by asking for the serial port if not specified
|
153
|
-
if params.boards == ["?"]
|
161
|
+
if params.boards == ["?"] or params.serial == "?":
|
154
162
|
params.serial = ["?"]
|
163
|
+
if params.boards == ["*"]:
|
164
|
+
# No bard specified
|
165
|
+
params.boards = ["?"]
|
166
|
+
|
155
167
|
if params.fw_folder:
|
156
168
|
config.firmware_folder = Path(params.fw_folder)
|
157
169
|
# Detect connected boards if not specified,
|
@@ -214,7 +226,7 @@ def cli_flash_board(**kwargs) -> int:
|
|
214
226
|
serial=params.serial[0],
|
215
227
|
version=params.versions[0],
|
216
228
|
)
|
217
|
-
jid.ensure_firmware_downloaded(worklist, version=params.versions[0])
|
229
|
+
jid.ensure_firmware_downloaded(worklist, version=params.versions[0], force=params.force)
|
218
230
|
if flashed := flash_list(
|
219
231
|
worklist,
|
220
232
|
params.erase,
|
mpflash/common.py
CHANGED
@@ -10,7 +10,6 @@ from typing import List, Optional, Union
|
|
10
10
|
from serial.tools import list_ports
|
11
11
|
from serial.tools.list_ports_common import ListPortInfo
|
12
12
|
|
13
|
-
|
14
13
|
# from mpflash.flash.esp import FlashMode
|
15
14
|
from .logger import log
|
16
15
|
|
@@ -41,6 +40,7 @@ class Params:
|
|
41
40
|
serial: List[str] = field(default_factory=list)
|
42
41
|
ignore: List[str] = field(default_factory=list)
|
43
42
|
bluetooth: bool = False
|
43
|
+
force: bool = False
|
44
44
|
|
45
45
|
|
46
46
|
@dataclass
|
@@ -48,7 +48,6 @@ class DownloadParams(Params):
|
|
48
48
|
"""Parameters for downloading firmware"""
|
49
49
|
|
50
50
|
clean: bool = False
|
51
|
-
force: bool = False
|
52
51
|
|
53
52
|
|
54
53
|
class BootloaderMethod(Enum):
|
mpflash/download/jid.py
CHANGED
@@ -9,7 +9,7 @@ from mpflash.flash.worklist import WorkList
|
|
9
9
|
from mpflash.mpboard_id.alternate import alternate_board_names
|
10
10
|
|
11
11
|
|
12
|
-
def ensure_firmware_downloaded(worklist: WorkList, version: str) -> None:
|
12
|
+
def ensure_firmware_downloaded(worklist: WorkList, version: str, force: bool) -> None:
|
13
13
|
"""
|
14
14
|
Ensure all firmware in the worklist is downloaded for the given version.
|
15
15
|
|
@@ -21,16 +21,19 @@ def ensure_firmware_downloaded(worklist: WorkList, version: str) -> None:
|
|
21
21
|
# iterate over the worklist ann update missing firmware
|
22
22
|
newlist: WorkList = []
|
23
23
|
for mcu, firmware in worklist:
|
24
|
-
if
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
24
|
+
if force:
|
25
|
+
board_firmwares = []
|
26
|
+
else:
|
27
|
+
if firmware:
|
28
|
+
# firmware is already downloaded
|
29
|
+
newlist.append((mcu, firmware))
|
30
|
+
continue
|
31
|
+
# check if the firmware is already downloaded
|
32
|
+
board_firmwares = find_downloaded_firmware(
|
33
|
+
board_id=f"{mcu.board}-{mcu.variant}" if mcu.variant else mcu.board,
|
34
|
+
version=version,
|
35
|
+
port=mcu.port,
|
36
|
+
)
|
34
37
|
if not board_firmwares:
|
35
38
|
# download the firmware
|
36
39
|
log.info(f"Downloading {version} firmware for {mcu.board} on {mcu.serialport}.")
|
mpflash/downloaded.py
CHANGED
@@ -51,7 +51,7 @@ def clean_downloaded_firmwares() -> None:
|
|
51
51
|
|
52
52
|
# Warn about files on disk not in DB
|
53
53
|
for fw_file in firmware_files_on_disk - db_firmware_files:
|
54
|
-
log.
|
54
|
+
log.debug(f"Found file in firmware folder but not in DB: {fw_file}")
|
55
55
|
|
56
56
|
|
57
57
|
def find_downloaded_firmware(
|
mpflash/flash/stm32.py
CHANGED
@@ -15,5 +15,5 @@ def flash_stm32(mcu: MPRemoteBoard, fw_file: Path, *, erase: bool):
|
|
15
15
|
dfu_init()
|
16
16
|
if updated := flash_stm32_dfu(mcu, fw_file=fw_file, erase=erase):
|
17
17
|
mcu.wait_for_restart()
|
18
|
-
log.success(f"Flashed {mcu.version} to {mcu.
|
18
|
+
log.success(f"Flashed {mcu.board_id} {mcu.version} to {mcu.serialport}.")
|
19
19
|
return updated
|
mpflash/logger.py
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
"""
|
1
|
+
"""
|
2
|
+
Logger setup for CLI tools with Unicode-safe output.
|
3
|
+
|
4
|
+
Ensures log messages are compatible with the current console encoding.
|
5
|
+
Removes or replaces Unicode icons if the encoding is not UTF-8.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import sys
|
2
9
|
|
3
10
|
from loguru import logger as log
|
4
11
|
from rich.console import Console
|
@@ -7,9 +14,20 @@ from .config import config
|
|
7
14
|
|
8
15
|
console = Console()
|
9
16
|
|
17
|
+
# Detect if the output encoding supports Unicode (UTF-8)
|
18
|
+
def _is_utf8_encoding() -> bool:
|
19
|
+
encoding = getattr(sys.stdout, "encoding", None)
|
20
|
+
if encoding is None:
|
21
|
+
return False
|
22
|
+
return encoding.lower().replace("-", "") == "utf8"
|
23
|
+
|
10
24
|
|
11
25
|
def _log_formatter(record: dict) -> str:
|
12
|
-
"""
|
26
|
+
"""
|
27
|
+
Log message formatter for loguru and rich.
|
28
|
+
|
29
|
+
Removes Unicode icons if console encoding is not UTF-8.
|
30
|
+
"""
|
13
31
|
color_map = {
|
14
32
|
"TRACE": "cyan",
|
15
33
|
"DEBUG": "orange",
|
@@ -20,11 +38,21 @@ def _log_formatter(record: dict) -> str:
|
|
20
38
|
"CRITICAL": "bold white on red",
|
21
39
|
}
|
22
40
|
lvl_color = color_map.get(record["level"].name, "cyan")
|
23
|
-
|
41
|
+
# Remove icon if not UTF-8
|
42
|
+
if _is_utf8_encoding():
|
43
|
+
icon = record["level"].icon
|
44
|
+
else:
|
45
|
+
icon = record["level"].name # fallback to text
|
46
|
+
# Insert color directly using f-string
|
47
|
+
return f"[not bold green]{{time:HH:mm:ss}}[/not bold green] | {icon} [{lvl_color}]{record['message']}[/{lvl_color}]"
|
48
|
+
|
24
49
|
|
50
|
+
def set_loglevel(loglevel: str) -> None:
|
51
|
+
"""
|
52
|
+
Set the log level for the logger.
|
25
53
|
|
26
|
-
|
27
|
-
"""
|
54
|
+
Ensures Unicode safety for log output.
|
55
|
+
"""
|
28
56
|
try:
|
29
57
|
log.remove()
|
30
58
|
except ValueError:
|
@@ -32,8 +60,10 @@ def set_loglevel(loglevel: str):
|
|
32
60
|
log.add(console.print, level=loglevel.upper(), colorize=False, format=_log_formatter) # type: ignore
|
33
61
|
|
34
62
|
|
35
|
-
def make_quiet():
|
36
|
-
"""
|
63
|
+
def make_quiet() -> None:
|
64
|
+
"""
|
65
|
+
Make the logger quiet.
|
66
|
+
"""
|
37
67
|
config.quiet = True
|
38
68
|
console.quiet = True
|
39
69
|
set_loglevel("CRITICAL")
|
mpflash/mpboard_id/known.py
CHANGED
@@ -59,7 +59,7 @@ def known_stored_boards(port: str, versions: List[str] = []) -> List[Tuple[str,
|
|
59
59
|
"""
|
60
60
|
mp_boards = get_known_boards_for_port(port, versions)
|
61
61
|
|
62
|
-
boards = set({(f"{board.version} {board.description}", board.board_id) for board in mp_boards})
|
62
|
+
boards = set({(f"{board.version} {board.board_id:<30} {board.description}", board.board_id) for board in mp_boards})
|
63
63
|
return sorted(list(boards))
|
64
64
|
|
65
65
|
|
mpflash/vendor/pydfu.py
CHANGED
@@ -406,6 +406,20 @@ def read_dfu_file(filename):
|
|
406
406
|
return elements
|
407
407
|
|
408
408
|
|
409
|
+
def read_bin_file(filename, address):
|
410
|
+
"""Reads binary file(.bin) and stores it as single
|
411
|
+
element in element array just like read_dfu_file() would.
|
412
|
+
"""
|
413
|
+
element = {}
|
414
|
+
print("File: {}".format(filename))
|
415
|
+
with open(filename, "rb") as fin:
|
416
|
+
element["data"] = fin.read()
|
417
|
+
element["size"] = len(element["data"])
|
418
|
+
element["num"] = 0
|
419
|
+
element["addr"] = address
|
420
|
+
return [element]
|
421
|
+
|
422
|
+
|
409
423
|
class FilterDFU(object):
|
410
424
|
"""Class for filtering USB devices to identify devices which are in DFU
|
411
425
|
mode.
|
@@ -541,6 +555,13 @@ def main():
|
|
541
555
|
parser.add_argument("--pid", help="USB Product ID", type=lambda x: int(x, 0), default=None)
|
542
556
|
parser.add_argument("-m", "--mass-erase", help="mass erase device", action="store_true", default=False)
|
543
557
|
parser.add_argument("-u", "--upload", help="read file from DFU device", dest="path", default=False)
|
558
|
+
parser.add_argument(
|
559
|
+
"-a",
|
560
|
+
"--address",
|
561
|
+
help="specify target memory address(hex or dec) when uploading .bin files",
|
562
|
+
type=lambda x: int(x, 0),
|
563
|
+
default=None,
|
564
|
+
)
|
544
565
|
parser.add_argument("-x", "--exit", help="Exit DFU", action="store_true", default=False)
|
545
566
|
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true", default=False)
|
546
567
|
args = parser.parse_args()
|
@@ -567,7 +588,14 @@ def main():
|
|
567
588
|
command_run = True
|
568
589
|
|
569
590
|
if args.path:
|
570
|
-
|
591
|
+
if str(args.path).endswith(".bin"):
|
592
|
+
if args.address is None:
|
593
|
+
raise ValueError("Address must be specified using -a when uploading binary")
|
594
|
+
|
595
|
+
elements = read_bin_file(args.path, args.addr)
|
596
|
+
else:
|
597
|
+
elements = read_dfu_file(args.path)
|
598
|
+
|
571
599
|
if not elements:
|
572
600
|
print("No data in dfu file")
|
573
601
|
return
|
@@ -1,6 +1,6 @@
|
|
1
1
|
mpflash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
2
|
mpflash/add_firmware.py,sha256=P1yaNUdExfzC_qnhE-P5ALZg1Uh7XT6Xf7NYccJP7Rc,4317
|
3
|
-
mpflash/ask_input.py,sha256=
|
3
|
+
mpflash/ask_input.py,sha256=YUx65Xwj6dNPwWcbQiWG7U4wDW69zEdno2HcT1KwPBg,8886
|
4
4
|
mpflash/basicgit.py,sha256=Aiz6rF6PVhQir-FU-T1NhbjsW803y39Js6xnWs8-yu4,9676
|
5
5
|
mpflash/bootloader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
6
|
mpflash/bootloader/activate.py,sha256=orQOw4XTkXVZI-rMInRb0T5Wp3qA_BlzbJUA2gyBToU,2361
|
@@ -9,11 +9,11 @@ mpflash/bootloader/manual.py,sha256=WYC4x-dxrSwVUfgnKTlu34pCzckrWJKZnWsARDocycI,
|
|
9
9
|
mpflash/bootloader/micropython.py,sha256=v_kZkvg0uWZDbMrT78gmiYHbD83QLdnrctvEClI8iRg,529
|
10
10
|
mpflash/bootloader/touch1200.py,sha256=VND7_YniS9Vx6WEaAxjI72RZZ6WBOwmBTsKJkbuaAHk,1105
|
11
11
|
mpflash/cli_download.py,sha256=sMMIVTE4P9O2GpWB9jcbOiKQX-XJ0nu2bBylRbWu0X8,3872
|
12
|
-
mpflash/cli_flash.py,sha256=
|
12
|
+
mpflash/cli_flash.py,sha256=QQ7fml84UBK_dUDb1G7DT5_MBDbZbXcWEhkgOq2P8gA,7962
|
13
13
|
mpflash/cli_group.py,sha256=Uf_1ZmeeSIsaGLuuKn3KPPPVi8fJVbIacJYFZx_oPHc,2684
|
14
14
|
mpflash/cli_list.py,sha256=ZuRalXXjDGo6FhgMTv54BQD_PNss7eeopeZQ_uE1J90,2632
|
15
15
|
mpflash/cli_main.py,sha256=NMhEtMtSe7ApE-210Q4p-g7ZgewgO-4z1Q-vNKLQ47Y,1277
|
16
|
-
mpflash/common.py,sha256=
|
16
|
+
mpflash/common.py,sha256=iKDoc6Ut8XbZ8fYLEI2XsoU7GuG_pFG0KGcRWXPl1wE,5922
|
17
17
|
mpflash/config.py,sha256=bmwNSJzk27iHcI-r3C6hm6-TeOat2ymzbbv-Q-xuO2o,3048
|
18
18
|
mpflash/connected.py,sha256=oxZdk1o-AfNPhJsSxr3KrMH_gdYfrjqc_IpT6J8Ng9k,3496
|
19
19
|
mpflash/db/__init__.py,sha256=wnIlO4nOXsPGXMbn2OCqHRsR-hUmtJsko8VdqjH3ZUE,45
|
@@ -27,12 +27,12 @@ mpflash/db/tools.py,sha256=6SEGfshNob4yRQ4h-Cj_xcWMRY28sbA8CWauNXV_uMI,814
|
|
27
27
|
mpflash/download/__init__.py,sha256=zidXvsSFCfR-BZCZ6TiB7uEucEuUqXnZhKSfTs60lzU,7930
|
28
28
|
mpflash/download/from_web.py,sha256=PVJDaFfYLJGXlPva5fExh4Yg2H7j3idyJEcfOiVVJBs,7608
|
29
29
|
mpflash/download/fwinfo.py,sha256=gpa92PkysT1B7mxPAFJ-b_6y03QCNgHKm-J6T_RFNMI,1852
|
30
|
-
mpflash/download/jid.py,sha256=
|
31
|
-
mpflash/downloaded.py,sha256=
|
30
|
+
mpflash/download/jid.py,sha256=503HW4jIB22fsb9vYphXqqO33LTMtvPdENG81wKDgMs,2334
|
31
|
+
mpflash/downloaded.py,sha256=508sqROPf0Ymz7UxMzReXtK6mG1EcoXA-ysGdzV-VM0,4040
|
32
32
|
mpflash/errors.py,sha256=IAidY3qkZsXy6Pm1rdmVFmGyg81ywHhse3itaPctA2w,247
|
33
33
|
mpflash/flash/__init__.py,sha256=jif7-ifsXMabidjNdqUQyl1CwD5_USjCAZFhU5W-Aw8,2992
|
34
34
|
mpflash/flash/esp.py,sha256=4977E1hDqJ4-EIkLzwrUtgZuc0ZTD7NvP1PQZgZ2DoU,3227
|
35
|
-
mpflash/flash/stm32.py,sha256=
|
35
|
+
mpflash/flash/stm32.py,sha256=jNgMpJaxUwtJ-v6VU1luD1t41AQprCUeNVCVEovxQe0,595
|
36
36
|
mpflash/flash/stm32_dfu.py,sha256=W-3JsRQyf3DduoIRXDmGZ35RogqtjQgcJnk-GOtQoLE,3090
|
37
37
|
mpflash/flash/uf2/__init__.py,sha256=haL84hP2p1ZjKF6dXJJHAB_NTf7jT91MuZvmvg9SpIA,3617
|
38
38
|
mpflash/flash/uf2/boardid.py,sha256=U5wGM8VA3wEpUxQCMtuXpMZZomdVH8J_Zd5_GekUMuU,423
|
@@ -42,13 +42,13 @@ mpflash/flash/uf2/uf2disk.py,sha256=4_P2l-kedM7VSliA2u706LQLxvu3xWSod1-lj-xjZis,
|
|
42
42
|
mpflash/flash/uf2/windows.py,sha256=S---sVjVrC00ZcnpOewtJIBfSCj2cr7FGQwEm_ZEDnY,1334
|
43
43
|
mpflash/flash/worklist.py,sha256=ZqbgYChXFGEVLVlGKeS9eJJDToxBYqjrfWE2NIa7Cck,5622
|
44
44
|
mpflash/list.py,sha256=NNhKpRh3ARZMdq56GLJgJ67GeuUf9SxjTzFhQjDsi9A,4008
|
45
|
-
mpflash/logger.py,sha256=
|
45
|
+
mpflash/logger.py,sha256=oMGBhfHv0edPJaUxiqAjkQ5Na2B687f94LqE-IR7C-U,1885
|
46
46
|
mpflash/mpboard_id/__init__.py,sha256=Z6gDDWTCSKPp2fsuaUz80zgrklBR9XDlSLF9y_evR9A,391
|
47
47
|
mpflash/mpboard_id/alternate.py,sha256=ZhqfdA9sLJmyOfJ6WwK9wrzzUn6JQdkAreiL0q5XEQg,1913
|
48
48
|
mpflash/mpboard_id/board_id.py,sha256=dGbYnqaGHm6Z68P6aCq5bv95pyhi9KKhQleQXmlyO8Y,2046
|
49
49
|
mpflash/mpboard_id/board_info.json,sha256=A3ZIt38KvAy2NMB5srHorSBd3Q3wOZIXufWiIs3XLrs,1019745
|
50
50
|
mpflash/mpboard_id/board_info.zip,sha256=-2bnQGRsIQuJUfz-7_-GQ8pMWJ1evhCez6yfjhXocNw,23213
|
51
|
-
mpflash/mpboard_id/known.py,sha256=
|
51
|
+
mpflash/mpboard_id/known.py,sha256=GrNe4FtzVIdi9L9xuJ1gzorzXTvdfrugX1iVc_Nblb8,3325
|
52
52
|
mpflash/mpboard_id/resolve.py,sha256=5KCZ0Tcg3FYZ3HK_zux5EguwoSC2E03kCpW2fh4rN2A,779
|
53
53
|
mpflash/mpremoteboard/__init__.py,sha256=kZ-MziZPwx6UOs_ybLYEYeUDndC1XyylMcpGTiEHpTk,12043
|
54
54
|
mpflash/mpremoteboard/mpy_fw_info.py,sha256=ZDEPJN9XJnoG_oeWcLNiLJAD5bkVX2yI_j4K7msUxWM,5196
|
@@ -59,11 +59,11 @@ mpflash/vendor/click_aliases.py,sha256=adLhqLxNpJEPjSCIRSTkR-QzSgavGFKT0cwRbjxpz
|
|
59
59
|
mpflash/vendor/dfu.py,sha256=6rqGCBS8mTxxaLtkdzJ8O6nc74kFk8jrkmKvxw-x-u8,5693
|
60
60
|
mpflash/vendor/pico-universal-flash-nuke/LICENSE.txt,sha256=Zkc2iTNbib2NCMwtLjMEz0vFCPglgvaw6Mj7QiWldpQ,1484
|
61
61
|
mpflash/vendor/pico-universal-flash-nuke/universal_flash_nuke.uf2,sha256=QuPMppqHMVOt3vDVU0bikHRLsTiDRQYNUcGQ_OLRFGI,28160
|
62
|
-
mpflash/vendor/pydfu.py,sha256=
|
62
|
+
mpflash/vendor/pydfu.py,sha256=KD1RHHuhvhWi-l1UB6GyggkxouDKtZgkG4ivRbIfwC4,21264
|
63
63
|
mpflash/vendor/readme.md,sha256=BQ7Uxf8joeYMjTUuSLLBG49ob6a9MgFPIEwuc72-Mfw,415
|
64
64
|
mpflash/versions.py,sha256=HuujLNdMKY_mQXyEqwXVHcU8nbuXeBiWP2TMA5JQhr4,4884
|
65
|
-
mpflash-1.25.
|
66
|
-
mpflash-1.25.
|
67
|
-
mpflash-1.25.
|
68
|
-
mpflash-1.25.
|
69
|
-
mpflash-1.25.
|
65
|
+
mpflash-1.25.0rc3.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
|
66
|
+
mpflash-1.25.0rc3.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
|
67
|
+
mpflash-1.25.0rc3.dist-info/METADATA,sha256=mEXilzRfCv3IpCReXC9MiydCTo_XVD81flx9E6zFtnI,23938
|
68
|
+
mpflash-1.25.0rc3.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
69
|
+
mpflash-1.25.0rc3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|