From f8042571b2790a1371b83a9af9884ad7270a18ca Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 20 Oct 2024 15:27:53 -0400 Subject: [PATCH] gitignore --- .gitignore | 1 - bin/Activate.ps1 | 247 - bin/activate | 70 - bin/activate.csh | 27 - bin/activate.fish | 69 - bin/flask | 8 - bin/pip | 8 - bin/pip3 | 8 - bin/pip3.12 | 8 - bin/python | 1 - bin/python3 | 1 - bin/python3.12 | 1 - .../APScheduler-3.10.4.dist-info/INSTALLER | 1 - .../APScheduler-3.10.4.dist-info/LICENSE.txt | 19 - .../APScheduler-3.10.4.dist-info/METADATA | 138 - .../APScheduler-3.10.4.dist-info/RECORD | 84 - .../APScheduler-3.10.4.dist-info/REQUESTED | 0 .../APScheduler-3.10.4.dist-info/WHEEL | 5 - .../entry_points.txt | 23 - .../top_level.txt | 1 - .../MarkupSafe-3.0.1.dist-info/INSTALLER | 1 - .../MarkupSafe-3.0.1.dist-info/LICENSE.txt | 28 - .../MarkupSafe-3.0.1.dist-info/METADATA | 92 - .../MarkupSafe-3.0.1.dist-info/RECORD | 14 - .../MarkupSafe-3.0.1.dist-info/WHEEL | 6 - .../MarkupSafe-3.0.1.dist-info/top_level.txt | 1 - .../site-packages/PIL/BdfFontFile.py | 133 - .../site-packages/PIL/BlpImagePlugin.py | 493 - .../site-packages/PIL/BmpImagePlugin.py | 511 - .../site-packages/PIL/BufrStubImagePlugin.py | 76 - .../site-packages/PIL/ContainerIO.py | 173 - .../site-packages/PIL/CurImagePlugin.py | 75 - .../site-packages/PIL/DcxImagePlugin.py | 80 - .../site-packages/PIL/DdsImagePlugin.py | 575 -- .../site-packages/PIL/EpsImagePlugin.py | 474 - lib/python3.12/site-packages/PIL/ExifTags.py | 381 - .../site-packages/PIL/FitsImagePlugin.py | 152 - .../site-packages/PIL/FliImagePlugin.py | 175 - lib/python3.12/site-packages/PIL/FontFile.py | 134 - .../site-packages/PIL/FpxImagePlugin.py | 257 - .../site-packages/PIL/FtexImagePlugin.py | 115 - .../site-packages/PIL/GbrImagePlugin.py | 103 - .../site-packages/PIL/GdImageFile.py | 102 - .../site-packages/PIL/GifImagePlugin.py | 1197 --- .../site-packages/PIL/GimpGradientFile.py | 149 - .../site-packages/PIL/GimpPaletteFile.py | 58 - .../site-packages/PIL/GribStubImagePlugin.py | 76 - .../site-packages/PIL/Hdf5StubImagePlugin.py | 76 - .../site-packages/PIL/IcnsImagePlugin.py | 412 - .../site-packages/PIL/IcoImagePlugin.py | 381 - .../site-packages/PIL/ImImagePlugin.py | 386 - lib/python3.12/site-packages/PIL/Image.py | 4198 -------- .../site-packages/PIL/ImageChops.py | 311 - lib/python3.12/site-packages/PIL/ImageCms.py | 1125 --- .../site-packages/PIL/ImageColor.py | 320 - lib/python3.12/site-packages/PIL/ImageDraw.py | 1218 --- .../site-packages/PIL/ImageDraw2.py | 243 - .../site-packages/PIL/ImageEnhance.py | 113 - lib/python3.12/site-packages/PIL/ImageFile.py | 832 -- .../site-packages/PIL/ImageFilter.py | 605 -- lib/python3.12/site-packages/PIL/ImageFont.py | 1338 --- lib/python3.12/site-packages/PIL/ImageGrab.py | 194 - lib/python3.12/site-packages/PIL/ImageMath.py | 368 - lib/python3.12/site-packages/PIL/ImageMode.py | 92 - .../site-packages/PIL/ImageMorph.py | 265 - lib/python3.12/site-packages/PIL/ImageOps.py | 730 -- .../site-packages/PIL/ImagePalette.py | 285 - lib/python3.12/site-packages/PIL/ImagePath.py | 20 - lib/python3.12/site-packages/PIL/ImageQt.py | 216 - .../site-packages/PIL/ImageSequence.py | 86 - lib/python3.12/site-packages/PIL/ImageShow.py | 360 - lib/python3.12/site-packages/PIL/ImageStat.py | 160 - lib/python3.12/site-packages/PIL/ImageTk.py | 290 - .../site-packages/PIL/ImageTransform.py | 136 - lib/python3.12/site-packages/PIL/ImageWin.py | 247 - .../site-packages/PIL/ImtImagePlugin.py | 103 - .../site-packages/PIL/IptcImagePlugin.py | 249 - .../site-packages/PIL/Jpeg2KImagePlugin.py | 443 - .../site-packages/PIL/JpegImagePlugin.py | 895 -- .../site-packages/PIL/JpegPresets.py | 242 - .../site-packages/PIL/McIdasImagePlugin.py | 80 - .../site-packages/PIL/MicImagePlugin.py | 107 - .../site-packages/PIL/MpegImagePlugin.py | 88 - .../site-packages/PIL/MpoImagePlugin.py | 190 - .../site-packages/PIL/MspImagePlugin.py | 200 - lib/python3.12/site-packages/PIL/PSDraw.py | 234 - .../site-packages/PIL/PaletteFile.py | 54 - .../site-packages/PIL/PalmImagePlugin.py | 232 - .../site-packages/PIL/PcdImagePlugin.py | 64 - .../site-packages/PIL/PcfFontFile.py | 254 - .../site-packages/PIL/PcxImagePlugin.py | 229 - .../site-packages/PIL/PdfImagePlugin.py | 311 - lib/python3.12/site-packages/PIL/PdfParser.py | 1073 -- .../site-packages/PIL/PixarImagePlugin.py | 74 - .../site-packages/PIL/PngImagePlugin.py | 1544 --- .../site-packages/PIL/PpmImagePlugin.py | 375 - .../site-packages/PIL/PsdImagePlugin.py | 332 - .../site-packages/PIL/QoiImagePlugin.py | 115 - .../site-packages/PIL/SgiImagePlugin.py | 247 - .../site-packages/PIL/SpiderImagePlugin.py | 329 - .../site-packages/PIL/SunImagePlugin.py | 145 - lib/python3.12/site-packages/PIL/TarIO.py | 57 - .../site-packages/PIL/TgaImagePlugin.py | 264 - .../site-packages/PIL/TiffImagePlugin.py | 2271 ----- lib/python3.12/site-packages/PIL/TiffTags.py | 562 -- .../site-packages/PIL/WalImageFile.py | 127 - .../site-packages/PIL/WebPImagePlugin.py | 323 - .../site-packages/PIL/WmfImagePlugin.py | 181 - .../site-packages/PIL/XVThumbImagePlugin.py | 85 - .../site-packages/PIL/XbmImagePlugin.py | 98 - .../site-packages/PIL/XpmImagePlugin.py | 127 - lib/python3.12/site-packages/PIL/__init__.py | 86 - lib/python3.12/site-packages/PIL/__main__.py | 7 - .../__pycache__/BdfFontFile.cpython-312.pyc | Bin 4375 -> 0 bytes .../BlpImagePlugin.cpython-312.pyc | Bin 24089 -> 0 bytes .../BmpImagePlugin.cpython-312.pyc | Bin 17950 -> 0 bytes .../BufrStubImagePlugin.cpython-312.pyc | Bin 2695 -> 0 bytes .../__pycache__/ContainerIO.cpython-312.pyc | Bin 7023 -> 0 bytes .../CurImagePlugin.cpython-312.pyc | Bin 2373 -> 0 bytes .../DcxImagePlugin.cpython-312.pyc | Bin 2704 -> 0 bytes .../DdsImagePlugin.cpython-312.pyc | Bin 22697 -> 0 bytes .../EpsImagePlugin.cpython-312.pyc | Bin 15658 -> 0 bytes .../PIL/__pycache__/ExifTags.cpython-312.pyc | Bin 11558 -> 0 bytes .../FitsImagePlugin.cpython-312.pyc | Bin 6019 -> 0 bytes .../FliImagePlugin.cpython-312.pyc | Bin 6770 -> 0 bytes .../PIL/__pycache__/FontFile.cpython-312.pyc | Bin 4494 -> 0 bytes .../FpxImagePlugin.cpython-312.pyc | Bin 7693 -> 0 bytes .../FtexImagePlugin.cpython-312.pyc | Bin 5305 -> 0 bytes .../GbrImagePlugin.cpython-312.pyc | Bin 3706 -> 0 bytes .../__pycache__/GdImageFile.cpython-312.pyc | Bin 3438 -> 0 bytes .../GifImagePlugin.cpython-312.pyc | Bin 44809 -> 0 bytes .../GimpGradientFile.cpython-312.pyc | Bin 5460 -> 0 bytes .../GimpPaletteFile.cpython-312.pyc | Bin 2112 -> 0 bytes .../GribStubImagePlugin.cpython-312.pyc | Bin 2693 -> 0 bytes .../Hdf5StubImagePlugin.cpython-312.pyc | Bin 2668 -> 0 bytes .../IcnsImagePlugin.cpython-312.pyc | Bin 17271 -> 0 bytes .../IcoImagePlugin.cpython-312.pyc | Bin 15169 -> 0 bytes .../__pycache__/ImImagePlugin.cpython-312.pyc | Bin 12729 -> 0 bytes .../PIL/__pycache__/Image.cpython-312.pyc | Bin 172275 -> 0 bytes .../__pycache__/ImageChops.cpython-312.pyc | Bin 11243 -> 0 bytes .../PIL/__pycache__/ImageCms.cpython-312.pyc | Bin 43995 -> 0 bytes .../__pycache__/ImageColor.cpython-312.pyc | Bin 12492 -> 0 bytes .../PIL/__pycache__/ImageDraw.cpython-312.pyc | Bin 44205 -> 0 bytes .../__pycache__/ImageDraw2.cpython-312.pyc | Bin 9800 -> 0 bytes .../__pycache__/ImageEnhance.cpython-312.pyc | Bin 5405 -> 0 bytes .../PIL/__pycache__/ImageFile.cpython-312.pyc | Bin 31241 -> 0 bytes .../__pycache__/ImageFilter.cpython-312.pyc | Bin 23174 -> 0 bytes .../PIL/__pycache__/ImageFont.cpython-312.pyc | Bin 69183 -> 0 bytes .../PIL/__pycache__/ImageGrab.cpython-312.pyc | Bin 7012 -> 0 bytes .../PIL/__pycache__/ImageMath.cpython-312.pyc | Bin 16319 -> 0 bytes .../PIL/__pycache__/ImageMode.cpython-312.pyc | Bin 2817 -> 0 bytes .../__pycache__/ImageMorph.cpython-312.pyc | Bin 11330 -> 0 bytes .../PIL/__pycache__/ImageOps.cpython-312.pyc | Bin 29360 -> 0 bytes .../__pycache__/ImagePalette.cpython-312.pyc | Bin 12170 -> 0 bytes .../PIL/__pycache__/ImagePath.cpython-312.pyc | Bin 353 -> 0 bytes .../PIL/__pycache__/ImageQt.cpython-312.pyc | Bin 8453 -> 0 bytes .../__pycache__/ImageSequence.cpython-312.pyc | Bin 3384 -> 0 bytes .../PIL/__pycache__/ImageShow.cpython-312.pyc | Bin 13674 -> 0 bytes .../PIL/__pycache__/ImageStat.cpython-312.pyc | Bin 7376 -> 0 bytes .../PIL/__pycache__/ImageTk.cpython-312.pyc | Bin 10848 -> 0 bytes .../ImageTransform.cpython-312.pyc | Bin 5356 -> 0 bytes .../PIL/__pycache__/ImageWin.cpython-312.pyc | Bin 11866 -> 0 bytes .../ImtImagePlugin.cpython-312.pyc | Bin 2565 -> 0 bytes .../IptcImagePlugin.cpython-312.pyc | Bin 8877 -> 0 bytes .../Jpeg2KImagePlugin.cpython-312.pyc | Bin 18165 -> 0 bytes .../JpegImagePlugin.cpython-312.pyc | Bin 33081 -> 0 bytes .../__pycache__/JpegPresets.cpython-312.pyc | Bin 8132 -> 0 bytes .../McIdasImagePlugin.cpython-312.pyc | Bin 2237 -> 0 bytes .../MicImagePlugin.cpython-312.pyc | Bin 3802 -> 0 bytes .../MpegImagePlugin.cpython-312.pyc | Bin 3686 -> 0 bytes .../MpoImagePlugin.cpython-312.pyc | Bin 8129 -> 0 bytes .../MspImagePlugin.cpython-312.pyc | Bin 5961 -> 0 bytes .../PIL/__pycache__/PSDraw.cpython-312.pyc | Bin 7948 -> 0 bytes .../__pycache__/PaletteFile.cpython-312.pyc | Bin 1913 -> 0 bytes .../PalmImagePlugin.cpython-312.pyc | Bin 9702 -> 0 bytes .../PcdImagePlugin.cpython-312.pyc | Bin 2046 -> 0 bytes .../__pycache__/PcfFontFile.cpython-312.pyc | Bin 9915 -> 0 bytes .../PcxImagePlugin.cpython-312.pyc | Bin 7385 -> 0 bytes .../PdfImagePlugin.cpython-312.pyc | Bin 9774 -> 0 bytes .../PIL/__pycache__/PdfParser.cpython-312.pyc | Bin 52810 -> 0 bytes .../PixarImagePlugin.cpython-312.pyc | Bin 1970 -> 0 bytes .../PngImagePlugin.cpython-312.pyc | Bin 61924 -> 0 bytes .../PpmImagePlugin.cpython-312.pyc | Bin 14120 -> 0 bytes .../PsdImagePlugin.cpython-312.pyc | Bin 10839 -> 0 bytes .../QoiImagePlugin.cpython-312.pyc | Bin 6054 -> 0 bytes .../SgiImagePlugin.cpython-312.pyc | Bin 8425 -> 0 bytes .../SpiderImagePlugin.cpython-312.pyc | Bin 12240 -> 0 bytes .../SunImagePlugin.cpython-312.pyc | Bin 3424 -> 0 bytes .../PIL/__pycache__/TarIO.cpython-312.pyc | Bin 1909 -> 0 bytes .../TgaImagePlugin.cpython-312.pyc | Bin 8100 -> 0 bytes .../TiffImagePlugin.cpython-312.pyc | Bin 99262 -> 0 bytes .../PIL/__pycache__/TiffTags.cpython-312.pyc | Bin 18814 -> 0 bytes .../__pycache__/WalImageFile.cpython-312.pyc | Bin 4094 -> 0 bytes .../WebPImagePlugin.cpython-312.pyc | Bin 13222 -> 0 bytes .../WmfImagePlugin.cpython-312.pyc | Bin 6176 -> 0 bytes .../XVThumbImagePlugin.cpython-312.pyc | Bin 2612 -> 0 bytes .../XbmImagePlugin.cpython-312.pyc | Bin 4101 -> 0 bytes .../XpmImagePlugin.cpython-312.pyc | Bin 4251 -> 0 bytes .../PIL/__pycache__/__init__.cpython-312.pyc | Bin 2032 -> 0 bytes .../PIL/__pycache__/__main__.cpython-312.pyc | Bin 397 -> 0 bytes .../PIL/__pycache__/_binary.cpython-312.pyc | Bin 3440 -> 0 bytes .../__pycache__/_deprecate.cpython-312.pyc | Bin 2474 -> 0 bytes .../_tkinter_finder.cpython-312.pyc | Bin 770 -> 0 bytes .../PIL/__pycache__/_typing.cpython-312.pyc | Bin 2109 -> 0 bytes .../PIL/__pycache__/_util.cpython-312.pyc | Bin 1549 -> 0 bytes .../PIL/__pycache__/_version.cpython-312.pyc | Bin 269 -> 0 bytes .../PIL/__pycache__/features.cpython-312.pyc | Bin 13854 -> 0 bytes .../PIL/__pycache__/report.cpython-312.pyc | Bin 331 -> 0 bytes lib/python3.12/site-packages/PIL/_binary.py | 112 - .../site-packages/PIL/_deprecate.py | 69 - .../_imaging.cpython-312-x86_64-linux-gnu.so | Bin 3115489 -> 0 bytes lib/python3.12/site-packages/PIL/_imaging.pyi | 31 - ...imagingcms.cpython-312-x86_64-linux-gnu.so | Bin 145465 -> 0 bytes .../site-packages/PIL/_imagingcms.pyi | 143 - ..._imagingft.cpython-312-x86_64-linux-gnu.so | Bin 298281 -> 0 bytes .../site-packages/PIL/_imagingft.pyi | 69 - ...magingmath.cpython-312-x86_64-linux-gnu.so | Bin 156856 -> 0 bytes .../site-packages/PIL/_imagingmath.pyi | 3 - ...agingmorph.cpython-312-x86_64-linux-gnu.so | Bin 36112 -> 0 bytes .../site-packages/PIL/_imagingmorph.pyi | 3 - ..._imagingtk.cpython-312-x86_64-linux-gnu.so | Bin 46352 -> 0 bytes .../site-packages/PIL/_imagingtk.pyi | 3 - .../site-packages/PIL/_tkinter_finder.py | 21 - lib/python3.12/site-packages/PIL/_typing.py | 53 - lib/python3.12/site-packages/PIL/_util.py | 26 - lib/python3.12/site-packages/PIL/_version.py | 4 - .../PIL/_webp.cpython-312-x86_64-linux-gnu.so | Bin 84193 -> 0 bytes lib/python3.12/site-packages/PIL/_webp.pyi | 3 - lib/python3.12/site-packages/PIL/features.py | 352 - lib/python3.12/site-packages/PIL/py.typed | 0 lib/python3.12/site-packages/PIL/report.py | 5 - .../__pycache__/colorthief.cpython-312.pyc | Bin 21079 -> 0 bytes .../__pycache__/six.cpython-312.pyc | Bin 41208 -> 0 bytes .../site-packages/apscheduler/__init__.py | 15 - .../__pycache__/__init__.cpython-312.pyc | Bin 1238 -> 0 bytes .../__pycache__/events.cpython-312.pyc | Bin 4428 -> 0 bytes .../__pycache__/job.cpython-312.pyc | Bin 13413 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 16399 -> 0 bytes .../site-packages/apscheduler/events.py | 94 - .../apscheduler/executors/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 3303 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 7879 -> 0 bytes .../__pycache__/base_py3.cpython-312.pyc | Bin 2534 -> 0 bytes .../__pycache__/debug.cpython-312.pyc | Bin 1332 -> 0 bytes .../__pycache__/gevent.cpython-312.pyc | Bin 1769 -> 0 bytes .../__pycache__/pool.cpython-312.pyc | Bin 4656 -> 0 bytes .../__pycache__/tornado.cpython-312.pyc | Bin 3219 -> 0 bytes .../__pycache__/twisted.cpython-312.pyc | Bin 1841 -> 0 bytes .../apscheduler/executors/asyncio.py | 52 - .../apscheduler/executors/base.py | 146 - .../apscheduler/executors/base_py3.py | 43 - .../apscheduler/executors/debug.py | 20 - .../apscheduler/executors/gevent.py | 30 - .../apscheduler/executors/pool.py | 71 - .../apscheduler/executors/tornado.py | 54 - .../apscheduler/executors/twisted.py | 25 - .../site-packages/apscheduler/job.py | 302 - .../apscheduler/jobstores/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 208 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 6928 -> 0 bytes .../__pycache__/memory.cpython-312.pyc | Bin 5479 -> 0 bytes .../__pycache__/mongodb.cpython-312.pyc | Bin 8414 -> 0 bytes .../__pycache__/redis.cpython-312.pyc | Bin 9749 -> 0 bytes .../__pycache__/rethinkdb.cpython-312.pyc | Bin 11355 -> 0 bytes .../__pycache__/sqlalchemy.cpython-312.pyc | Bin 11670 -> 0 bytes .../__pycache__/zookeeper.cpython-312.pyc | Bin 10271 -> 0 bytes .../apscheduler/jobstores/base.py | 143 - .../apscheduler/jobstores/memory.py | 108 - .../apscheduler/jobstores/mongodb.py | 141 - .../apscheduler/jobstores/redis.py | 150 - .../apscheduler/jobstores/rethinkdb.py | 155 - .../apscheduler/jobstores/sqlalchemy.py | 161 - .../apscheduler/jobstores/zookeeper.py | 178 - .../apscheduler/schedulers/__init__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 1069 -> 0 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 3798 -> 0 bytes .../__pycache__/background.cpython-312.pyc | Bin 2695 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 49869 -> 0 bytes .../__pycache__/blocking.cpython-312.pyc | Bin 2246 -> 0 bytes .../__pycache__/gevent.cpython-312.pyc | Bin 2081 -> 0 bytes .../schedulers/__pycache__/qt.cpython-312.pyc | Bin 2622 -> 0 bytes .../__pycache__/tornado.cpython-312.pyc | Bin 3693 -> 0 bytes .../__pycache__/twisted.cpython-312.pyc | Bin 3541 -> 0 bytes .../apscheduler/schedulers/asyncio.py | 66 - .../apscheduler/schedulers/background.py | 43 - .../apscheduler/schedulers/base.py | 1037 -- .../apscheduler/schedulers/blocking.py | 35 - .../apscheduler/schedulers/gevent.py | 35 - .../apscheduler/schedulers/qt.py | 48 - .../apscheduler/schedulers/tornado.py | 63 - .../apscheduler/schedulers/twisted.py | 62 - .../apscheduler/triggers/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 0 bytes .../triggers/__pycache__/base.cpython-312.pyc | Bin 1998 -> 0 bytes .../__pycache__/combining.cpython-312.pyc | Bin 5805 -> 0 bytes .../triggers/__pycache__/date.cpython-312.pyc | Bin 2783 -> 0 bytes .../__pycache__/interval.cpython-312.pyc | Bin 5886 -> 0 bytes .../apscheduler/triggers/base.py | 37 - .../apscheduler/triggers/combining.py | 95 - .../apscheduler/triggers/cron/__init__.py | 239 - .../cron/__pycache__/__init__.cpython-312.pyc | Bin 11314 -> 0 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 15260 -> 0 bytes .../cron/__pycache__/fields.cpython-312.pyc | Bin 6301 -> 0 bytes .../apscheduler/triggers/cron/expressions.py | 251 - .../apscheduler/triggers/cron/fields.py | 111 - .../apscheduler/triggers/date.py | 51 - .../apscheduler/triggers/interval.py | 108 - .../site-packages/apscheduler/util.py | 411 - .../blinker-1.8.2.dist-info/INSTALLER | 1 - .../blinker-1.8.2.dist-info/LICENSE.txt | 20 - .../blinker-1.8.2.dist-info/METADATA | 60 - .../blinker-1.8.2.dist-info/RECORD | 12 - .../blinker-1.8.2.dist-info/WHEEL | 4 - .../site-packages/blinker/__init__.py | 60 - .../__pycache__/__init__.cpython-312.pyc | Bin 1811 -> 0 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 2733 -> 0 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 25425 -> 0 bytes .../site-packages/blinker/_utilities.py | 64 - lib/python3.12/site-packages/blinker/base.py | 621 -- lib/python3.12/site-packages/blinker/py.typed | 0 .../click-8.1.7.dist-info/INSTALLER | 1 - .../click-8.1.7.dist-info/LICENSE.rst | 28 - .../click-8.1.7.dist-info/METADATA | 103 - .../click-8.1.7.dist-info/RECORD | 39 - .../site-packages/click-8.1.7.dist-info/WHEEL | 5 - .../click-8.1.7.dist-info/top_level.txt | 1 - .../site-packages/click/__init__.py | 73 - .../__pycache__/__init__.cpython-312.pyc | Bin 2711 -> 0 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 27456 -> 0 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 30534 -> 0 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 2452 -> 0 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 11991 -> 0 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 135512 -> 0 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 23984 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14747 -> 0 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 14066 -> 0 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 3131 -> 0 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 21496 -> 0 bytes .../shell_completion.cpython-312.pyc | Bin 22768 -> 0 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 32801 -> 0 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 24573 -> 0 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 49453 -> 0 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 26303 -> 0 bytes lib/python3.12/site-packages/click/_compat.py | 623 -- .../site-packages/click/_termui_impl.py | 739 -- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_winconsole.py | 279 - lib/python3.12/site-packages/click/core.py | 3042 ------ .../site-packages/click/decorators.py | 561 -- .../site-packages/click/exceptions.py | 288 - .../site-packages/click/formatting.py | 301 - lib/python3.12/site-packages/click/globals.py | 68 - lib/python3.12/site-packages/click/parser.py | 529 - lib/python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 596 -- lib/python3.12/site-packages/click/termui.py | 784 -- lib/python3.12/site-packages/click/testing.py | 479 - lib/python3.12/site-packages/click/types.py | 1089 --- lib/python3.12/site-packages/click/utils.py | 624 -- .../DESCRIPTION.rst | 14 - .../colorthief-0.2.1.dist-info/INSTALLER | 1 - .../colorthief-0.2.1.dist-info/METADATA | 31 - .../colorthief-0.2.1.dist-info/RECORD | 10 - .../colorthief-0.2.1.dist-info/REQUESTED | 0 .../colorthief-0.2.1.dist-info/WHEEL | 6 - .../colorthief-0.2.1.dist-info/metadata.json | 1 - .../colorthief-0.2.1.dist-info/top_level.txt | 1 - lib/python3.12/site-packages/colorthief.py | 422 - .../flask-3.0.3.dist-info/INSTALLER | 1 - .../flask-3.0.3.dist-info/LICENSE.txt | 28 - .../flask-3.0.3.dist-info/METADATA | 101 - .../flask-3.0.3.dist-info/RECORD | 58 - .../flask-3.0.3.dist-info/REQUESTED | 0 .../site-packages/flask-3.0.3.dist-info/WHEEL | 4 - .../flask-3.0.3.dist-info/entry_points.txt | 3 - .../site-packages/flask/__init__.py | 60 - .../site-packages/flask/__main__.py | 3 - .../__pycache__/__init__.cpython-312.pyc | Bin 2485 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 246 -> 0 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 61111 -> 0 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 4900 -> 0 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 42261 -> 0 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 16223 -> 0 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 19832 -> 0 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 9137 -> 0 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 1870 -> 0 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 24814 -> 0 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 3275 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 16319 -> 0 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 1227 -> 0 bytes .../__pycache__/templating.cpython-312.pyc | Bin 9912 -> 0 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 13685 -> 0 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 4282 -> 0 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 7007 -> 0 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 6128 -> 0 bytes lib/python3.12/site-packages/flask/app.py | 1498 --- .../site-packages/flask/blueprints.py | 129 - lib/python3.12/site-packages/flask/cli.py | 1109 --- lib/python3.12/site-packages/flask/config.py | 370 - lib/python3.12/site-packages/flask/ctx.py | 449 - .../site-packages/flask/debughelpers.py | 178 - lib/python3.12/site-packages/flask/globals.py | 51 - lib/python3.12/site-packages/flask/helpers.py | 621 -- .../site-packages/flask/json/__init__.py | 170 - .../json/__pycache__/__init__.cpython-312.pyc | Bin 6698 -> 0 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 9265 -> 0 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 13960 -> 0 bytes .../site-packages/flask/json/provider.py | 215 - .../site-packages/flask/json/tag.py | 327 - lib/python3.12/site-packages/flask/logging.py | 79 - lib/python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 - .../sansio/__pycache__/app.cpython-312.pyc | Bin 33592 -> 0 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 31189 -> 0 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 30494 -> 0 bytes .../site-packages/flask/sansio/app.py | 964 -- .../site-packages/flask/sansio/blueprints.py | 632 -- .../site-packages/flask/sansio/scaffold.py | 801 -- .../site-packages/flask/sessions.py | 379 - lib/python3.12/site-packages/flask/signals.py | 17 - .../site-packages/flask/templating.py | 219 - lib/python3.12/site-packages/flask/testing.py | 298 - lib/python3.12/site-packages/flask/typing.py | 90 - lib/python3.12/site-packages/flask/views.py | 191 - .../site-packages/flask/wrappers.py | 174 - .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 - .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 - .../itsdangerous-2.2.0.dist-info/METADATA | 60 - .../itsdangerous-2.2.0.dist-info/RECORD | 22 - .../itsdangerous-2.2.0.dist-info/WHEEL | 4 - .../site-packages/itsdangerous/__init__.py | 38 - .../__pycache__/__init__.cpython-312.pyc | Bin 1637 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 1191 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2691 -> 0 bytes .../__pycache__/exc.cpython-312.pyc | Bin 3951 -> 0 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 15419 -> 0 bytes .../__pycache__/signer.cpython-312.pyc | Bin 11296 -> 0 bytes .../__pycache__/timed.cpython-312.pyc | Bin 8740 -> 0 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 3541 -> 0 bytes .../site-packages/itsdangerous/_json.py | 18 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 106 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 - .../site-packages/itsdangerous/signer.py | 266 - .../site-packages/itsdangerous/timed.py | 228 - .../site-packages/itsdangerous/url_safe.py | 83 - .../jinja2-3.1.4.dist-info/INSTALLER | 1 - .../jinja2-3.1.4.dist-info/LICENSE.txt | 28 - .../jinja2-3.1.4.dist-info/METADATA | 76 - .../jinja2-3.1.4.dist-info/RECORD | 57 - .../jinja2-3.1.4.dist-info/WHEEL | 4 - .../jinja2-3.1.4.dist-info/entry_points.txt | 3 - .../site-packages/jinja2/__init__.py | 38 - .../__pycache__/__init__.cpython-312.pyc | Bin 1662 -> 0 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 2143 -> 0 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 4087 -> 0 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 19334 -> 0 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 102267 -> 0 bytes .../__pycache__/constants.cpython-312.pyc | Bin 1565 -> 0 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 6575 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1615 -> 0 bytes .../__pycache__/environment.cpython-312.pyc | Bin 76711 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7724 -> 0 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 41877 -> 0 bytes .../__pycache__/filters.cpython-312.pyc | Bin 72029 -> 0 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 19158 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 32046 -> 0 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 30972 -> 0 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 5479 -> 0 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 7028 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 58228 -> 0 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 2698 -> 0 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 60820 -> 0 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 48501 -> 0 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 17899 -> 0 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 9059 -> 0 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 34477 -> 0 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 5362 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 84 - .../site-packages/jinja2/bccache.py | 408 - .../site-packages/jinja2/compiler.py | 1960 ---- .../site-packages/jinja2/constants.py | 20 - lib/python3.12/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1675 ---- .../site-packages/jinja2/exceptions.py | 166 - lib/python3.12/site-packages/jinja2/ext.py | 870 -- .../site-packages/jinja2/filters.py | 1866 ---- .../site-packages/jinja2/idtracking.py | 318 - lib/python3.12/site-packages/jinja2/lexer.py | 868 -- .../site-packages/jinja2/loaders.py | 667 -- lib/python3.12/site-packages/jinja2/meta.py | 112 - .../site-packages/jinja2/nativetypes.py | 130 - lib/python3.12/site-packages/jinja2/nodes.py | 1206 --- .../site-packages/jinja2/optimizer.py | 48 - lib/python3.12/site-packages/jinja2/parser.py | 1041 -- lib/python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1056 -- .../site-packages/jinja2/sandbox.py | 429 - lib/python3.12/site-packages/jinja2/tests.py | 256 - lib/python3.12/site-packages/jinja2/utils.py | 755 -- .../site-packages/jinja2/visitor.py | 92 - .../site-packages/markupsafe/__init__.py | 395 - .../__pycache__/__init__.cpython-312.pyc | Bin 20962 -> 0 bytes .../__pycache__/_native.cpython-312.pyc | Bin 624 -> 0 bytes .../site-packages/markupsafe/_native.py | 8 - .../site-packages/markupsafe/_speedups.c | 204 - .../_speedups.cpython-312-x86_64-linux-gnu.so | Bin 44536 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 1 - .../site-packages/markupsafe/py.typed | 0 .../piexif-1.1.3.dist-info/INSTALLER | 1 - .../piexif-1.1.3.dist-info/LICENSE.txt | 21 - .../piexif-1.1.3.dist-info/METADATA | 117 - .../piexif-1.1.3.dist-info/RECORD | 29 - .../piexif-1.1.3.dist-info/REQUESTED | 0 .../piexif-1.1.3.dist-info/WHEEL | 6 - .../piexif-1.1.3.dist-info/top_level.txt | 1 - .../site-packages/piexif/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 468 -> 0 bytes .../__pycache__/_common.cpython-312.pyc | Bin 3304 -> 0 bytes .../piexif/__pycache__/_dump.cpython-312.pyc | Bin 14221 -> 0 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 395 -> 0 bytes .../piexif/__pycache__/_exif.cpython-312.pyc | Bin 31025 -> 0 bytes .../__pycache__/_insert.cpython-312.pyc | Bin 2512 -> 0 bytes .../piexif/__pycache__/_load.cpython-312.pyc | Bin 15259 -> 0 bytes .../__pycache__/_remove.cpython-312.pyc | Bin 2207 -> 0 bytes .../__pycache__/_transplant.cpython-312.pyc | Bin 1935 -> 0 bytes .../piexif/__pycache__/_webp.cpython-312.pyc | Bin 9498 -> 0 bytes .../piexif/__pycache__/helper.cpython-312.pyc | Bin 3226 -> 0 bytes .../site-packages/piexif/_common.py | 94 - lib/python3.12/site-packages/piexif/_dump.py | 346 - .../site-packages/piexif/_exceptions.py | 2 - lib/python3.12/site-packages/piexif/_exif.py | 638 -- .../site-packages/piexif/_insert.py | 60 - lib/python3.12/site-packages/piexif/_load.py | 270 - .../site-packages/piexif/_remove.py | 56 - .../site-packages/piexif/_transplant.py | 45 - lib/python3.12/site-packages/piexif/_webp.py | 240 - lib/python3.12/site-packages/piexif/helper.py | 66 - .../pillow-11.0.0.dist-info/INSTALLER | 1 - .../pillow-11.0.0.dist-info/LICENSE | 1343 --- .../pillow-11.0.0.dist-info/METADATA | 175 - .../pillow-11.0.0.dist-info/RECORD | 229 - .../pillow-11.0.0.dist-info/REQUESTED | 0 .../pillow-11.0.0.dist-info/WHEEL | 5 - .../pillow-11.0.0.dist-info/top_level.txt | 1 - .../pillow-11.0.0.dist-info/zip-safe | 1 - .../pillow.libs/libXau-154567c4.so.6.0.0 | Bin 22081 -> 0 bytes .../pillow.libs/libbrotlicommon-3ecfe81c.so.1 | Bin 144425 -> 0 bytes .../pillow.libs/libbrotlidec-ba690955.so.1 | Bin 58225 -> 0 bytes .../libfreetype-e7d5437d.so.6.20.1 | Bin 1422625 -> 0 bytes .../pillow.libs/libharfbuzz-144af51e.so.0 | Bin 1583281 -> 0 bytes .../pillow.libs/libjpeg-45e70d75.so.62.4.0 | Bin 815793 -> 0 bytes .../pillow.libs/liblcms2-e69eef39.so.2.0.16 | Bin 514977 -> 0 bytes .../pillow.libs/liblzma-c9407571.so.5.6.3 | Bin 266201 -> 0 bytes .../pillow.libs/libopenjp2-05423b53.so | Bin 581737 -> 0 bytes .../pillow.libs/libpng16-4cc6a9fc.so.16.44.0 | Bin 281913 -> 0 bytes .../pillow.libs/libsharpyuv-898c0cb5.so.0.1.0 | Bin 42049 -> 0 bytes .../pillow.libs/libtiff-0a86184d.so.6.0.2 | Bin 725697 -> 0 bytes .../pillow.libs/libwebp-2fd3cdca.so.7.1.9 | Bin 759849 -> 0 bytes .../libwebpdemux-f2642bcc.so.2.0.15 | Bin 26121 -> 0 bytes .../pillow.libs/libwebpmux-d524b4d5.so.3.1.0 | Bin 54521 -> 0 bytes .../pillow.libs/libxcb-b8a56d01.so.1.1.0 | Bin 251425 -> 0 bytes .../pip-24.2.dist-info/AUTHORS.txt | 796 -- .../pip-24.2.dist-info/INSTALLER | 1 - .../pip-24.2.dist-info/LICENSE.txt | 20 - .../site-packages/pip-24.2.dist-info/METADATA | 89 - .../site-packages/pip-24.2.dist-info/RECORD | 853 -- .../pip-24.2.dist-info/REQUESTED | 0 .../site-packages/pip-24.2.dist-info/WHEEL | 5 - .../pip-24.2.dist-info/entry_points.txt | 3 - .../pip-24.2.dist-info/top_level.txt | 1 - lib/python3.12/site-packages/pip/__init__.py | 13 - lib/python3.12/site-packages/pip/__main__.py | 24 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-312.pyc | Bin 699 -> 0 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 855 -> 0 bytes .../__pip-runner__.cpython-312.pyc | Bin 2219 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 801 -> 0 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14486 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12681 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17646 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 35565 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 684 -> 0 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 5132 -> 0 bytes .../self_outdated_check.cpython-312.pyc | Bin 10222 -> 0 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13629 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 315 - .../site-packages/pip/_internal/cache.py | 290 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 292 -> 0 bytes .../autocompletion.cpython-312.pyc | Bin 8620 -> 0 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10208 -> 0 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30409 -> 0 bytes .../command_context.cpython-312.pyc | Bin 1788 -> 0 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 7138 -> 0 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2314 -> 0 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4920 -> 0 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15027 -> 0 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 3848 -> 0 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 12255 -> 0 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7847 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 389 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 176 - .../pip/_internal/cli/base_command.py | 231 - .../pip/_internal/cli/cmdoptions.py | 1075 --- .../pip/_internal/cli/command_context.py | 27 - .../pip/_internal/cli/index_command.py | 170 - .../site-packages/pip/_internal/cli/main.py | 80 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 94 - .../pip/_internal/cli/req_command.py | 329 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-312.pyc | Bin 4016 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9715 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 2606 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5207 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13177 -> 0 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10082 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 7517 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4399 -> 0 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 2982 -> 0 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1687 -> 0 bytes .../__pycache__/index.cpython-312.pyc | Bin 6685 -> 0 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3994 -> 0 bytes .../__pycache__/install.cpython-312.pyc | Bin 29128 -> 0 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15771 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 7532 -> 0 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 10491 -> 0 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4723 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8879 -> 0 bytes .../pip/_internal/commands/cache.py | 225 - .../pip/_internal/commands/check.py | 67 - .../pip/_internal/commands/completion.py | 130 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 201 - .../pip/_internal/commands/download.py | 146 - .../pip/_internal/commands/freeze.py | 109 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 783 -- .../pip/_internal/commands/list.py | 375 - .../pip/_internal/commands/search.py | 172 - .../pip/_internal/commands/show.py | 217 - .../pip/_internal/commands/uninstall.py | 114 - .../pip/_internal/commands/wheel.py | 182 - .../pip/_internal/configuration.py | 383 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-312.pyc | Bin 955 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 2907 -> 0 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1714 -> 0 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8441 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2295 -> 0 bytes .../pip/_internal/distributions/base.py | 53 - .../pip/_internal/distributions/installed.py | 29 - .../pip/_internal/distributions/sdist.py | 158 - .../pip/_internal/distributions/wheel.py | 42 - .../site-packages/pip/_internal/exceptions.py | 777 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 246 -> 0 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21631 -> 0 bytes .../package_finder.cpython-312.pyc | Bin 40662 -> 0 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12602 -> 0 bytes .../pip/_internal/index/collector.py | 494 - .../pip/_internal/index/package_finder.py | 1020 -- .../pip/_internal/index/sources.py | 285 - .../pip/_internal/locations/__init__.py | 456 - .../__pycache__/__init__.cpython-312.pyc | Bin 16454 -> 0 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6866 -> 0 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8042 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3795 -> 0 bytes .../pip/_internal/locations/_distutils.py | 172 - .../pip/_internal/locations/_sysconfig.py | 214 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 128 - .../__pycache__/__init__.cpython-312.pyc | Bin 5883 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2940 -> 0 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35212 -> 0 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 16098 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 688 -- .../_internal/metadata/importlib/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 372 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 4505 -> 0 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 12579 -> 0 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11093 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 85 - .../_internal/metadata/importlib/_dists.py | 221 - .../pip/_internal/metadata/importlib/_envs.py | 189 - .../pip/_internal/metadata/pkg_resources.py | 301 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 280 -> 0 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1618 -> 0 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 10858 -> 0 bytes .../format_control.cpython-312.pyc | Bin 4237 -> 0 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1708 -> 0 bytes .../installation_report.cpython-312.pyc | Bin 2291 -> 0 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26631 -> 0 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1037 -> 0 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5001 -> 0 bytes .../selection_prefs.cpython-312.pyc | Bin 1865 -> 0 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4967 -> 0 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5774 -> 0 bytes .../pip/_internal/models/candidate.py | 25 - .../pip/_internal/models/direct_url.py | 224 - .../pip/_internal/models/format_control.py | 78 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 56 - .../pip/_internal/models/link.py | 590 -- .../pip/_internal/models/scheme.py | 25 - .../pip/_internal/models/search_scope.py | 127 - .../pip/_internal/models/selection_prefs.py | 53 - .../pip/_internal/models/target_python.py | 121 - .../pip/_internal/models/wheel.py | 93 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 268 -> 0 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 22113 -> 0 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6465 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 8493 -> 0 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11621 -> 0 bytes .../__pycache__/session.cpython-312.pyc | Bin 18888 -> 0 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2269 -> 0 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2963 -> 0 bytes .../pip/_internal/network/auth.py | 566 -- .../pip/_internal/network/cache.py | 106 - .../pip/_internal/network/download.py | 187 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 522 - .../pip/_internal/network/utils.py | 98 - .../pip/_internal/network/xmlrpc.py | 62 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 7118 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10142 -> 0 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25786 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 0 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7681 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1871 -> 0 bytes .../metadata_editable.cpython-312.pyc | Bin 1905 -> 0 bytes .../metadata_legacy.cpython-312.pyc | Bin 3025 -> 0 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1691 -> 0 bytes .../wheel_editable.cpython-312.pyc | Bin 2030 -> 0 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3860 -> 0 bytes .../operations/build/build_tracker.py | 138 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 181 - .../pip/_internal/operations/freeze.py | 258 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 280 -> 0 bytes .../editable_legacy.cpython-312.pyc | Bin 1812 -> 0 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 34117 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../pip/_internal/operations/install/wheel.py | 741 -- .../pip/_internal/operations/prepare.py | 732 -- .../site-packages/pip/_internal/pyproject.py | 185 - .../pip/_internal/req/__init__.py | 90 - .../req/__pycache__/__init__.cpython-312.pyc | Bin 3459 -> 0 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21232 -> 0 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21446 -> 0 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38489 -> 0 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 5497 -> 0 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32108 -> 0 bytes .../pip/_internal/req/constructors.py | 560 -- .../pip/_internal/req/req_file.py | 551 -- .../pip/_internal/req/req_install.py | 934 -- .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 633 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 1199 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22593 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 597 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 222 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 8163 -> 0 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 29186 -> 0 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32300 -> 0 bytes .../found_candidates.cpython-312.pyc | Bin 6807 -> 0 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10537 -> 0 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 5054 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 15370 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12328 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 139 - .../resolution/resolvelib/candidates.py | 569 -- .../resolution/resolvelib/factory.py | 817 -- .../resolution/resolvelib/found_candidates.py | 174 - .../resolution/resolvelib/provider.py | 258 - .../resolution/resolvelib/reporter.py | 81 - .../resolution/resolvelib/requirements.py | 245 - .../resolution/resolvelib/resolver.py | 317 - .../pip/_internal/self_outdated_check.py | 244 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 206 -> 0 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4541 -> 0 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1877 -> 0 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2421 -> 0 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2918 -> 0 bytes .../compatibility_tags.cpython-312.pyc | Bin 5574 -> 0 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 695 -> 0 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4202 -> 0 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3547 -> 0 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3217 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2159 -> 0 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 4004 -> 0 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7340 -> 0 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1175 -> 0 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2430 -> 0 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7614 -> 0 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13569 -> 0 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 33562 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2594 -> 0 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 2119 -> 0 bytes .../setuptools_build.cpython-312.pyc | Bin 4561 -> 0 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8650 -> 0 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12035 -> 0 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 13509 -> 0 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2088 -> 0 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4477 -> 0 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5914 -> 0 bytes .../pip/_internal/utils/_jaraco_text.py | 109 - .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 79 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 124 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/egg_link.py | 80 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 149 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 101 - .../pip/_internal/utils/hashes.py | 147 - .../pip/_internal/utils/logging.py | 347 - .../site-packages/pip/_internal/utils/misc.py | 777 -- .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/retry.py | 42 - .../pip/_internal/utils/setuptools_build.py | 146 - .../pip/_internal/utils/subprocess.py | 245 - .../pip/_internal/utils/temp_dir.py | 296 - .../pip/_internal/utils/unpacking.py | 337 - .../site-packages/pip/_internal/utils/urls.py | 55 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 134 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 545 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5066 -> 0 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 19031 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7619 -> 0 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12538 -> 0 bytes .../versioncontrol.cpython-312.pyc | Bin 29011 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 527 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 688 -- .../pip/_internal/wheel_builder.py | 354 - .../site-packages/pip/_vendor/__init__.py | 116 - .../__pycache__/__init__.cpython-312.pyc | Bin 4564 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 139466 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 917 -> 0 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2661 -> 0 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6479 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3802 -> 0 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16239 -> 0 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4362 -> 0 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6709 -> 0 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 5276 -> 0 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1689 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 - .../pip/_vendor/cachecontrol/adapter.py | 161 - .../pip/_vendor/cachecontrol/cache.py | 74 - .../_vendor/cachecontrol/caches/__init__.py | 8 - .../__pycache__/__init__.cpython-312.pyc | Bin 450 -> 0 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7778 -> 0 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2748 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 182 - .../cachecontrol/caches/redis_cache.py | 48 - .../pip/_vendor/cachecontrol/controller.py | 499 - .../pip/_vendor/cachecontrol/filewrapper.py | 119 - .../pip/_vendor/cachecontrol/heuristics.py | 154 - .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 - .../pip/_vendor/cachecontrol/wrapper.py | 43 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 333 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 660 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3226 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4798 --------- .../site-packages/pip/_vendor/certifi/core.py | 114 - .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 - .../__pycache__/__init__.cpython-312.pyc | Bin 1284 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45546 -> 0 bytes .../__pycache__/database.cpython-312.pyc | Bin 65696 -> 0 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24331 -> 0 bytes .../__pycache__/locators.cpython-312.pyc | Bin 59945 -> 0 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15091 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7693 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41681 -> 0 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17327 -> 0 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19784 -> 0 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88032 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 30360 -> 0 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51463 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1138 --- .../pip/_vendor/distlib/database.py | 1359 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1303 --- .../pip/_vendor/distlib/manifest.py | 384 - .../pip/_vendor/distlib/markers.py | 167 - .../pip/_vendor/distlib/metadata.py | 1068 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 466 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 108032 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 2025 ---- .../pip/_vendor/distlib/version.py | 751 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1099 --- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 975 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 307 -> 0 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53807 -> 0 bytes .../pip/_vendor/distro/distro.py | 1403 --- .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 896 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4991 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 902 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 15806 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99491 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2648 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 231 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158863 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 395 - .../pip/_vendor/idna/idnadata.py | 4245 -------- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8598 ----------------- .../pip/_vendor/msgpack/__init__.py | 55 - .../__pycache__/__init__.cpython-312.pyc | Bin 1756 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2040 -> 0 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8185 -> 0 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 42058 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 168 - .../pip/_vendor/msgpack/fallback.py | 951 -- .../pip/_vendor/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-312.pyc | Bin 573 -> 0 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 4982 -> 0 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 9700 -> 0 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 4569 -> 0 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 14000 -> 0 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3256 -> 0 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 7930 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 11026 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 24968 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 4425 -> 0 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 38754 -> 0 bytes .../__pycache__/tags.cpython-312.pyc | Bin 21359 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 7356 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 19522 -> 0 bytes .../pip/_vendor/packaging/_elffile.py | 110 - .../pip/_vendor/packaging/_manylinux.py | 262 - .../pip/_vendor/packaging/_musllinux.py | 85 - .../pip/_vendor/packaging/_parser.py | 354 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/_tokenizer.py | 194 - .../pip/_vendor/packaging/markers.py | 325 - .../pip/_vendor/packaging/metadata.py | 804 -- .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 - .../pip/_vendor/packaging/specifiers.py | 1009 -- .../pip/_vendor/packaging/tags.py | 568 -- .../pip/_vendor/packaging/utils.py | 174 - .../pip/_vendor/packaging/version.py | 563 -- .../pip/_vendor/pkg_resources/__init__.py | 3676 ------- .../__pycache__/__init__.cpython-312.pyc | Bin 161276 -> 0 bytes .../pip/_vendor/platformdirs/__init__.py | 627 -- .../pip/_vendor/platformdirs/__main__.py | 55 - .../__pycache__/__init__.cpython-312.pyc | Bin 19844 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1963 -> 0 bytes .../__pycache__/android.cpython-312.pyc | Bin 10712 -> 0 bytes .../__pycache__/api.cpython-312.pyc | Bin 12926 -> 0 bytes .../__pycache__/macos.cpython-312.pyc | Bin 8022 -> 0 bytes .../__pycache__/unix.cpython-312.pyc | Bin 15052 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 612 -> 0 bytes .../__pycache__/windows.cpython-312.pyc | Bin 13689 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 249 - .../pip/_vendor/platformdirs/api.py | 292 - .../pip/_vendor/platformdirs/macos.py | 130 - .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 275 - .../pip/_vendor/platformdirs/version.py | 16 - .../pip/_vendor/platformdirs/windows.py | 272 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 3504 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 750 -> 0 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26600 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2644 -> 0 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3237 -> 0 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4736 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38377 -> 0 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1575 -> 0 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 2624 -> 0 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4093 -> 0 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4772 -> 0 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 12114 -> 0 bytes .../__pycache__/style.cpython-312.pyc | Bin 6709 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 8205 -> 0 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32988 -> 0 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14085 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 -- .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 70 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-312.pyc | Bin 37927 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 129 - .../_vendor/pygments/formatters/__init__.py | 157 - .../__pycache__/__init__.cpython-312.pyc | Bin 6918 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4231 -> 0 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4238 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7309 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 41042 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 28564 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6071 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 20141 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6893 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2974 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 13789 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9155 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5835 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15134 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 987 -- .../pip/_vendor/pygments/formatters/img.py | 685 -- .../pip/_vendor/pygments/formatters/irc.py | 154 - .../pip/_vendor/pygments/formatters/latex.py | 518 - .../pip/_vendor/pygments/formatters/other.py | 160 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 349 - .../pip/_vendor/pygments/formatters/svg.py | 185 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 963 -- .../pip/_vendor/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-312.pyc | Bin 14637 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 68279 -> 0 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42983 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 589 -- .../pip/_vendor/pygments/lexers/python.py | 1198 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 72 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 247 - .../pip/_vendor/pygments/style.py | 203 - .../pip/_vendor/pygments/styles/__init__.py | 61 - .../__pycache__/__init__.cpython-312.pyc | Bin 2680 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 3664 -> 0 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 - .../pip/_vendor/pygments/token.py | 214 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 324 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-312.pyc | Bin 629 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 390 -> 0 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14709 -> 0 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 330 - .../pyproject_hooks/_in_process/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 1096 -> 0 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14369 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 179 - .../__pycache__/__init__.cpython-312.pyc | Bin 5269 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 600 -> 0 bytes .../_internal_utils.cpython-312.pyc | Bin 2040 -> 0 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 28447 -> 0 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7207 -> 0 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13937 -> 0 bytes .../__pycache__/certs.cpython-312.pyc | Bin 938 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1693 -> 0 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25214 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7614 -> 0 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4244 -> 0 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1067 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 35444 -> 0 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1282 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27862 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 6039 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5639 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36382 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 50 - .../pip/_vendor/requests/adapters.py | 719 -- .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 314 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 78 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 151 - .../pip/_vendor/requests/help.py | 127 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1037 -- .../pip/_vendor/requests/packages.py | 25 - .../pip/_vendor/requests/sessions.py | 831 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1096 --- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-312.pyc | Bin 650 -> 0 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6867 -> 0 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2670 -> 0 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25896 -> 0 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10516 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 216 -> 0 bytes .../collections_abc.cpython-312.pyc | Bin 436 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 547 -- .../pip/_vendor/resolvelib/structs.py | 170 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 273 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7031 -> 0 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10308 -> 0 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7888 -> 0 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205992 -> 0 bytes .../_emoji_replace.cpython-312.pyc | Bin 1745 -> 0 bytes .../_export_format.cpython-312.pyc | Bin 2365 -> 0 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 553 -> 0 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 871 -> 0 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12089 -> 0 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4163 -> 0 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1886 -> 0 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3636 -> 0 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5176 -> 0 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 737 -> 0 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6586 -> 0 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13195 -> 0 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 981 -> 0 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 881 -> 0 bytes .../_win32_console.cpython-312.pyc | Bin 28992 -> 0 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2506 -> 0 bytes .../_windows_renderer.cpython-312.pyc | Bin 3579 -> 0 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 3342 -> 0 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1624 -> 0 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12303 -> 0 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9082 -> 0 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4288 -> 0 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11854 -> 0 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5826 -> 0 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26585 -> 0 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1717 -> 0 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8600 -> 0 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113452 -> 0 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2274 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9226 -> 0 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10957 -> 0 bytes .../default_styles.cpython-312.pyc | Bin 10382 -> 0 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1504 -> 0 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4228 -> 0 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1861 -> 0 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3587 -> 0 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3088 -> 0 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9903 -> 0 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6051 -> 0 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5224 -> 0 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20174 -> 0 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19025 -> 0 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4905 -> 0 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13570 -> 0 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9583 -> 0 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6394 -> 0 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7140 -> 0 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1827 -> 0 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5313 -> 0 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12199 -> 0 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40163 -> 0 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 74951 -> 0 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10393 -> 0 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14803 -> 0 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1808 -> 0 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 583 -> 0 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6629 -> 0 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6584 -> 0 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3841 -> 0 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2495 -> 0 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28131 -> 0 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6080 -> 0 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6077 -> 0 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33516 -> 0 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2155 -> 0 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39964 -> 0 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43555 -> 0 bytes .../terminal_theme.cpython-312.pyc | Bin 3364 -> 0 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 60865 -> 0 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6351 -> 0 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 330 -> 0 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31527 -> 0 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11452 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 454 - .../pip/_vendor/rich/_emoji_codes.py | 3610 ------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 76 - .../pip/_vendor/rich/_extension.py | 10 - .../site-packages/pip/_vendor/rich/_fileno.py | 24 - .../pip/_vendor/rich/_inspect.py | 270 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_null_file.py | 69 - .../pip/_vendor/rich/_palettes.py | 309 - .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 159 - .../pip/_vendor/rich/_spinners.py | 482 - .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 662 -- .../pip/_vendor/rich/_windows.py | 71 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 93 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 240 - .../site-packages/pip/_vendor/rich/bar.py | 93 - .../site-packages/pip/_vendor/rich/box.py | 480 - .../site-packages/pip/_vendor/rich/cells.py | 167 - .../site-packages/pip/_vendor/rich/color.py | 621 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2633 ----- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 190 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 57 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 139 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 442 - .../site-packages/pip/_vendor/rich/live.py | 375 - .../pip/_vendor/rich/live_render.py | 112 - .../site-packages/pip/_vendor/rich/logging.py | 289 - .../site-packages/pip/_vendor/rich/markup.py | 251 - .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 312 - .../site-packages/pip/_vendor/rich/pretty.py | 995 -- .../pip/_vendor/rich/progress.py | 1699 ---- .../pip/_vendor/rich/progress_bar.py | 223 - .../site-packages/pip/_vendor/rich/prompt.py | 375 - .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 149 - .../site-packages/pip/_vendor/rich/rule.py | 130 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 738 -- .../site-packages/pip/_vendor/rich/spinner.py | 137 - .../site-packages/pip/_vendor/rich/status.py | 131 - .../site-packages/pip/_vendor/rich/style.py | 796 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 958 -- .../site-packages/pip/_vendor/rich/table.py | 1000 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1357 --- .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 753 -- .../site-packages/pip/_vendor/rich/tree.py | 249 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 400 -> 0 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26915 -> 0 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3924 -> 0 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 382 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 -- .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../site-packages/pip/_vendor/tomli/py.typed | 1 - .../pip/_vendor/truststore/__init__.py | 13 - .../__pycache__/__init__.cpython-312.pyc | Bin 634 -> 0 bytes .../__pycache__/_api.cpython-312.pyc | Bin 16556 -> 0 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16588 -> 0 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2221 -> 0 bytes .../_ssl_constants.cpython-312.pyc | Bin 1115 -> 0 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15756 -> 0 bytes .../pip/_vendor/truststore/_api.py | 313 - .../pip/_vendor/truststore/_macos.py | 499 - .../pip/_vendor/truststore/_openssl.py | 66 - .../pip/_vendor/truststore/_ssl_constants.py | 31 - .../pip/_vendor/truststore/_windows.py | 564 -- .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3641 ------- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-312.pyc | Bin 3421 -> 0 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 16380 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 234 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20419 -> 0 bytes .../connectionpool.cpython-312.pyc | Bin 36453 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13509 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10418 -> 0 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4028 -> 0 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20445 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 7310 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 33959 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 355 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 572 -- .../pip/_vendor/urllib3/connectionpool.py | 1137 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 0 bytes .../_appengine_environ.cpython-312.pyc | Bin 1864 -> 0 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11580 -> 0 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5730 -> 0 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24464 -> 0 bytes .../securetransport.cpython-312.pyc | Bin 35517 -> 0 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7527 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 0 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17443 -> 0 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14779 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 - .../urllib3/contrib/securetransport.py | 920 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 0 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41271 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 0 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1841 -> 0 bytes .../weakref_finalize.cpython-312.pyc | Bin 7352 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../packages/backports/weakref_finalize.py | 155 - .../pip/_vendor/urllib3/packages/six.py | 1076 --- .../pip/_vendor/urllib3/poolmanager.py | 540 -- .../pip/_vendor/urllib3/request.py | 191 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-312.pyc | Bin 1162 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4763 -> 0 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1568 -> 0 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1368 -> 0 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4199 -> 0 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 3008 -> 0 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21717 -> 0 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15100 -> 0 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5067 -> 0 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10769 -> 0 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11155 -> 0 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15801 -> 0 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4419 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 620 -- .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 271 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../site-packages/pip/_vendor/vendor.txt | 18 - lib/python3.12/site-packages/pip/py.typed | 4 - .../pytz-2024.2.dist-info/INSTALLER | 1 - .../pytz-2024.2.dist-info/LICENSE.txt | 19 - .../pytz-2024.2.dist-info/METADATA | 650 -- .../pytz-2024.2.dist-info/RECORD | 622 -- .../site-packages/pytz-2024.2.dist-info/WHEEL | 6 - .../pytz-2024.2.dist-info/top_level.txt | 1 - .../pytz-2024.2.dist-info/zip-safe | 1 - lib/python3.12/site-packages/pytz/__init__.py | 1554 --- .../pytz/__pycache__/__init__.cpython-312.pyc | Bin 30503 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2316 -> 0 bytes .../pytz/__pycache__/lazy.cpython-312.pyc | Bin 7692 -> 0 bytes .../__pycache__/reference.cpython-312.pyc | Bin 5549 -> 0 bytes .../pytz/__pycache__/tzfile.cpython-312.pyc | Bin 5272 -> 0 bytes .../pytz/__pycache__/tzinfo.cpython-312.pyc | Bin 19280 -> 0 bytes .../site-packages/pytz/exceptions.py | 59 - lib/python3.12/site-packages/pytz/lazy.py | 172 - .../site-packages/pytz/reference.py | 140 - lib/python3.12/site-packages/pytz/tzfile.py | 133 - lib/python3.12/site-packages/pytz/tzinfo.py | 580 -- .../pytz/zoneinfo/Africa/Abidjan | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 735 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 194 -> 0 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 2399 -> 0 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 2429 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 2052 -> 0 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 2295 -> 0 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 246 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 679 -> 0 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 679 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 208 -> 0 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 254 -> 0 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 625 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 689 -> 0 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 955 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 2356 -> 0 bytes .../pytz/zoneinfo/America/Anchorage | Bin 2371 -> 0 bytes .../pytz/zoneinfo/America/Anguilla | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Antigua | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Araguaina | Bin 870 -> 0 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 1062 -> 0 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 1034 -> 0 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 1062 -> 0 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 1034 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 1088 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 1090 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 1062 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Asuncion | Bin 2030 -> 0 bytes .../pytz/zoneinfo/America/Atikokan | Bin 182 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 1010 -> 0 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 1100 -> 0 bytes .../pytz/zoneinfo/America/Barbados | Bin 436 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 562 -> 0 bytes .../pytz/zoneinfo/America/Belize | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 618 -> 0 bytes .../pytz/zoneinfo/America/Bogota | Bin 232 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 2410 -> 0 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 2254 -> 0 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 1430 -> 0 bytes .../pytz/zoneinfo/America/Cancun | Bin 864 -> 0 bytes .../pytz/zoneinfo/America/Caracas | Bin 250 -> 0 bytes .../pytz/zoneinfo/America/Catamarca | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Cayenne | Bin 184 -> 0 bytes .../pytz/zoneinfo/America/Cayman | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Chicago | Bin 3592 -> 0 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 1102 -> 0 bytes .../pytz/zoneinfo/America/Ciudad_Juarez | Bin 1538 -> 0 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Cordoba | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 316 -> 0 bytes .../pytz/zoneinfo/America/Creston | Bin 360 -> 0 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 1402 -> 0 bytes .../pytz/zoneinfo/America/Curacao | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 698 -> 0 bytes .../pytz/zoneinfo/America/Dawson | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 1050 -> 0 bytes .../pytz/zoneinfo/America/Denver | Bin 2460 -> 0 bytes .../pytz/zoneinfo/America/Detroit | Bin 2230 -> 0 bytes .../pytz/zoneinfo/America/Dominica | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Edmonton | Bin 2332 -> 0 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 642 -> 0 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 224 -> 0 bytes .../pytz/zoneinfo/America/Ensenada | Bin 2458 -> 0 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 2240 -> 0 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 1682 -> 0 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 702 -> 0 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 2192 -> 0 bytes .../pytz/zoneinfo/America/Godthab | Bin 1889 -> 0 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 3210 -> 0 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 1834 -> 0 bytes .../pytz/zoneinfo/America/Grenada | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guatemala | Bin 280 -> 0 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 232 -> 0 bytes .../pytz/zoneinfo/America/Guyana | Bin 248 -> 0 bytes .../pytz/zoneinfo/America/Halifax | Bin 3424 -> 0 bytes .../pytz/zoneinfo/America/Havana | Bin 2416 -> 0 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 388 -> 0 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 1682 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 2444 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 1738 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 1920 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 1700 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 1430 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 1710 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 1794 -> 0 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 1682 -> 0 bytes .../pytz/zoneinfo/America/Inuvik | Bin 2074 -> 0 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 2202 -> 0 bytes .../pytz/zoneinfo/America/Jamaica | Bin 482 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 1034 -> 0 bytes .../pytz/zoneinfo/America/Juneau | Bin 2353 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 2788 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 2368 -> 0 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 2444 -> 0 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/La_Paz | Bin 218 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 392 -> 0 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 2852 -> 0 bytes .../pytz/zoneinfo/America/Louisville | Bin 2788 -> 0 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Maceio | Bin 730 -> 0 bytes .../pytz/zoneinfo/America/Managua | Bin 430 -> 0 bytes .../pytz/zoneinfo/America/Manaus | Bin 590 -> 0 bytes .../pytz/zoneinfo/America/Marigot | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Martinique | Bin 232 -> 0 bytes .../pytz/zoneinfo/America/Matamoros | Bin 1418 -> 0 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 1060 -> 0 bytes .../pytz/zoneinfo/America/Mendoza | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Menominee | Bin 2274 -> 0 bytes .../pytz/zoneinfo/America/Merida | Bin 1004 -> 0 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 1423 -> 0 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 1222 -> 0 bytes .../pytz/zoneinfo/America/Miquelon | Bin 1652 -> 0 bytes .../pytz/zoneinfo/America/Moncton | Bin 3154 -> 0 bytes .../pytz/zoneinfo/America/Monterrey | Bin 1114 -> 0 bytes .../pytz/zoneinfo/America/Montevideo | Bin 1496 -> 0 bytes .../pytz/zoneinfo/America/Montreal | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Montserrat | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Nassau | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/New_York | Bin 3552 -> 0 bytes .../pytz/zoneinfo/America/Nipigon | Bin 3494 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 2367 -> 0 bytes .../pytz/zoneinfo/America/Noronha | Bin 702 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 2396 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 2396 -> 0 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 2396 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 1889 -> 0 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 1524 -> 0 bytes .../pytz/zoneinfo/America/Panama | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 2202 -> 0 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 248 -> 0 bytes .../pytz/zoneinfo/America/Phoenix | Bin 360 -> 0 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 1434 -> 0 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 614 -> 0 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 562 -> 0 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 1902 -> 0 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 2868 -> 0 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 2066 -> 0 bytes .../pytz/zoneinfo/America/Recife | Bin 702 -> 0 bytes .../pytz/zoneinfo/America/Regina | Bin 980 -> 0 bytes .../pytz/zoneinfo/America/Resolute | Bin 2066 -> 0 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 614 -> 0 bytes .../pytz/zoneinfo/America/Rosario | Bin 1062 -> 0 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 2458 -> 0 bytes .../pytz/zoneinfo/America/Santarem | Bin 588 -> 0 bytes .../pytz/zoneinfo/America/Santiago | Bin 2515 -> 0 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 458 -> 0 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 1430 -> 0 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 1935 -> 0 bytes .../pytz/zoneinfo/America/Shiprock | Bin 2460 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 2329 -> 0 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Johns | Bin 3655 -> 0 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 560 -> 0 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 252 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 1502 -> 0 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Tijuana | Bin 2458 -> 0 bytes .../pytz/zoneinfo/America/Toronto | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Tortola | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Vancouver | Bin 2892 -> 0 bytes .../pytz/zoneinfo/America/Virgin | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 2868 -> 0 bytes .../pytz/zoneinfo/America/Yakutat | Bin 2305 -> 0 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 2332 -> 0 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 423 -> 0 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 283 -> 0 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 172 -> 0 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 2260 -> 0 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 185 -> 0 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 1404 -> 0 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 150 -> 0 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 151 -> 0 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 1148 -> 0 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 213 -> 0 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 2298 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 1433 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 1174 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 969 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 997 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 605 -> 0 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 605 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 977 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 969 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 185 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 1213 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 185 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 1207 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 2154 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 969 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 469 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 285 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 1207 -> 0 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 877 -> 0 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 358 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 323 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 1873 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 323 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 257 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 577 -> 0 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 2028 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 3844 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 3872 -> 0 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 337 -> 0 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 1233 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 877 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 1229 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 1933 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 383 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 221 -> 0 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 194 -> 0 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 1152 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 379 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 151 -> 0 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 198 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 198 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 1257 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 285 -> 0 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 1193 -> 0 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 401 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 469 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 1208 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 254 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 328 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 2002 -> 0 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 1151 -> 0 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 1207 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 1193 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 991 -> 0 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 185 -> 0 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 353 -> 0 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 237 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 185 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 1025 -> 0 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 1011 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 254 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 337 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 1188 -> 0 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 563 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 617 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 401 -> 0 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 1194 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 761 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 577 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 1021 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 1248 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 189 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 189 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 309 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 1207 -> 0 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 254 -> 0 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 877 -> 0 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 877 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 1238 -> 0 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 185 -> 0 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 1194 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 1193 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 254 -> 0 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 1229 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 1137 -> 0 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 3442 -> 0 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 2396 -> 0 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 1897 -> 0 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 256 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 3377 -> 0 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 148 -> 0 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 150 -> 0 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 148 -> 0 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 1200 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 2229 -> 0 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Currie | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 456 -> 0 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 2358 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 1846 -> 0 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 475 -> 0 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 1846 -> 0 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 2190 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/North | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Perth | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/South | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/West | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 2229 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 614 -> 0 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 702 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 1430 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 590 -> 0 bytes .../site-packages/pytz/zoneinfo/CET | Bin 2933 -> 0 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 3592 -> 0 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 3424 -> 0 bytes .../pytz/zoneinfo/Canada/Central | Bin 2868 -> 0 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 3494 -> 0 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 2332 -> 0 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 3655 -> 0 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 2892 -> 0 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 980 -> 0 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 1614 -> 0 bytes .../pytz/zoneinfo/Chile/Continental | Bin 2515 -> 0 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 2219 -> 0 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 2416 -> 0 bytes .../site-packages/pytz/zoneinfo/EET | Bin 2262 -> 0 bytes .../site-packages/pytz/zoneinfo/EST | Bin 182 -> 0 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 3552 -> 0 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 2399 -> 0 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 3492 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 114 -> 0 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 2933 -> 0 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 1742 -> 0 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 1151 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 2262 -> 0 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 2301 -> 0 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 2933 -> 0 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 2184 -> 0 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 2368 -> 0 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 2298 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 3492 -> 0 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 3068 -> 0 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 1900 -> 0 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 1933 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 1493 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 1185 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 3527 -> 0 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 2933 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 2614 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 2620 -> 0 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 1900 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 1307 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 2962 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 1535 -> 0 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 2002 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 2298 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 2962 -> 0 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 2301 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 2198 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 1201 -> 0 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 2641 -> 0 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 1169 -> 0 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 1469 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 2077 -> 0 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 2148 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 2084 -> 0 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 1253 -> 0 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 2200 -> 0 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 2162 -> 0 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 1193 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 2654 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 1909 -> 0 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 116 -> 0 bytes lib/python3.12/site-packages/pytz/zoneinfo/GB | Bin 3664 -> 0 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 3664 -> 0 bytes .../site-packages/pytz/zoneinfo/GMT | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/HST | Bin 329 -> 0 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 1233 -> 0 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 148 -> 0 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 185 -> 0 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 185 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 254 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 185 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 151 -> 0 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 185 -> 0 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 227 -> 0 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 151 -> 0 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 1248 -> 0 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 482 -> 0 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 309 -> 0 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 302 -> 0 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 625 -> 0 bytes .../site-packages/pytz/zoneinfo/MET | Bin 2933 -> 0 bytes .../site-packages/pytz/zoneinfo/MST | Bin 360 -> 0 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 2460 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 2458 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 1060 -> 0 bytes .../pytz/zoneinfo/Mexico/General | Bin 1222 -> 0 bytes lib/python3.12/site-packages/pytz/zoneinfo/NZ | Bin 2437 -> 0 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 2054 -> 0 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 2460 -> 0 bytes .../site-packages/pytz/zoneinfo/PRC | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 2852 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 598 -> 0 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 254 -> 0 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 2054 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 172 -> 0 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 2219 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 524 -> 0 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 220 -> 0 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 186 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 564 -> 0 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 224 -> 0 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 150 -> 0 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 152 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 494 -> 0 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 220 -> 0 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 224 -> 0 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 337 -> 0 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 302 -> 0 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 159 -> 0 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 238 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 189 -> 0 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 866 -> 0 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 290 -> 0 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 188 -> 0 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 172 -> 0 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 589 -> 0 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 494 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 175 -> 0 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 151 -> 0 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 358 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 172 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 152 -> 0 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 152 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 172 -> 0 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 2654 -> 0 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 3527 -> 0 bytes .../site-packages/pytz/zoneinfo/ROC | Bin 761 -> 0 bytes .../site-packages/pytz/zoneinfo/ROK | Bin 617 -> 0 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 401 -> 0 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 1933 -> 0 bytes .../site-packages/pytz/zoneinfo/UCT | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 2371 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 360 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 3592 -> 0 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 1682 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 3552 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 329 -> 0 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 2444 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 2230 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 2460 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 2852 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/UTC | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 1535 -> 0 bytes .../site-packages/pytz/zoneinfo/WET | Bin 3527 -> 0 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 279 - .../site-packages/pytz/zoneinfo/leapseconds | 79 - .../site-packages/pytz/zoneinfo/tzdata.zi | 4281 -------- .../site-packages/pytz/zoneinfo/zone.tab | 447 - .../site-packages/pytz/zoneinfo/zone1970.tab | 374 - .../site-packages/pytz/zoneinfo/zonenow.tab | 299 - .../six-1.16.0.dist-info/INSTALLER | 1 - .../six-1.16.0.dist-info/LICENSE | 18 - .../six-1.16.0.dist-info/METADATA | 49 - .../site-packages/six-1.16.0.dist-info/RECORD | 8 - .../site-packages/six-1.16.0.dist-info/WHEEL | 6 - .../six-1.16.0.dist-info/top_level.txt | 1 - lib/python3.12/site-packages/six.py | 998 -- .../tzlocal-5.2.dist-info/INSTALLER | 1 - .../tzlocal-5.2.dist-info/LICENSE.txt | 19 - .../tzlocal-5.2.dist-info/METADATA | 248 - .../tzlocal-5.2.dist-info/RECORD | 17 - .../site-packages/tzlocal-5.2.dist-info/WHEEL | 5 - .../tzlocal-5.2.dist-info/top_level.txt | 1 - .../site-packages/tzlocal/__init__.py | 19 - .../__pycache__/__init__.cpython-312.pyc | Bin 532 -> 0 bytes .../tzlocal/__pycache__/unix.cpython-312.pyc | Bin 9151 -> 0 bytes .../tzlocal/__pycache__/utils.cpython-312.pyc | Bin 4481 -> 0 bytes .../tzlocal/__pycache__/win32.cpython-312.pyc | Bin 4879 -> 0 bytes .../__pycache__/windows_tz.cpython-312.pyc | Bin 30042 -> 0 bytes lib/python3.12/site-packages/tzlocal/py.typed | 0 lib/python3.12/site-packages/tzlocal/unix.py | 231 - lib/python3.12/site-packages/tzlocal/utils.py | 112 - lib/python3.12/site-packages/tzlocal/win32.py | 147 - .../site-packages/tzlocal/windows_tz.py | 736 -- .../werkzeug-3.0.4.dist-info/INSTALLER | 1 - .../werkzeug-3.0.4.dist-info/LICENSE.txt | 28 - .../werkzeug-3.0.4.dist-info/METADATA | 99 - .../werkzeug-3.0.4.dist-info/RECORD | 125 - .../werkzeug-3.0.4.dist-info/WHEEL | 4 - .../site-packages/werkzeug/__init__.py | 25 - .../__pycache__/__init__.cpython-312.pyc | Bin 1096 -> 0 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 9772 -> 0 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 20230 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 32950 -> 0 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 16811 -> 0 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 49602 -> 0 bytes .../__pycache__/local.cpython-312.pyc | Bin 28473 -> 0 bytes .../__pycache__/security.cpython-312.pyc | Bin 6987 -> 0 bytes .../__pycache__/serving.cpython-312.pyc | Bin 46036 -> 0 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 59851 -> 0 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 8872 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 8273 -> 0 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 2162 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 28141 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 25218 -> 0 bytes .../site-packages/werkzeug/_internal.py | 211 - .../site-packages/werkzeug/_reloader.py | 460 - .../werkzeug/datastructures/__init__.py | 34 - .../__pycache__/__init__.cpython-312.pyc | Bin 1611 -> 0 bytes .../__pycache__/accept.cpython-312.pyc | Bin 13801 -> 0 bytes .../__pycache__/auth.cpython-312.pyc | Bin 14416 -> 0 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 7895 -> 0 bytes .../__pycache__/csp.cpython-312.pyc | Bin 5268 -> 0 bytes .../__pycache__/etag.cpython-312.pyc | Bin 5061 -> 0 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 7929 -> 0 bytes .../__pycache__/headers.cpython-312.pyc | Bin 23204 -> 0 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 11402 -> 0 bytes .../__pycache__/range.cpython-312.pyc | Bin 8247 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 48375 -> 0 bytes .../werkzeug/datastructures/accept.py | 326 - .../werkzeug/datastructures/accept.pyi | 54 - .../werkzeug/datastructures/auth.py | 316 - .../werkzeug/datastructures/cache_control.py | 175 - .../werkzeug/datastructures/cache_control.pyi | 115 - .../werkzeug/datastructures/csp.py | 94 - .../werkzeug/datastructures/csp.pyi | 169 - .../werkzeug/datastructures/etag.py | 95 - .../werkzeug/datastructures/etag.pyi | 30 - .../werkzeug/datastructures/file_storage.py | 196 - .../werkzeug/datastructures/file_storage.pyi | 49 - .../werkzeug/datastructures/headers.py | 515 - .../werkzeug/datastructures/headers.pyi | 109 - .../werkzeug/datastructures/mixins.py | 242 - .../werkzeug/datastructures/mixins.pyi | 97 - .../werkzeug/datastructures/range.py | 180 - .../werkzeug/datastructures/range.pyi | 57 - .../werkzeug/datastructures/structures.py | 1010 -- .../werkzeug/datastructures/structures.pyi | 206 - .../site-packages/werkzeug/debug/__init__.py | 564 -- .../__pycache__/__init__.cpython-312.pyc | Bin 23399 -> 0 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 11641 -> 0 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 13783 -> 0 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 16958 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 219 - .../site-packages/werkzeug/debug/repr.py | 282 - .../werkzeug/debug/shared/ICON_LICENSE.md | 6 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 344 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/style.css | 150 - .../site-packages/werkzeug/debug/tbtools.py | 450 - .../site-packages/werkzeug/exceptions.py | 881 -- .../site-packages/werkzeug/formparser.py | 419 - lib/python3.12/site-packages/werkzeug/http.py | 1387 --- .../site-packages/werkzeug/local.py | 653 -- .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 206 -> 0 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 3324 -> 0 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 9420 -> 0 bytes .../__pycache__/lint.cpython-312.pyc | Bin 17792 -> 0 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 7210 -> 0 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 7207 -> 0 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 12709 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 81 - .../werkzeug/middleware/http_proxy.py | 236 - .../site-packages/werkzeug/middleware/lint.py | 439 - .../werkzeug/middleware/profiler.py | 155 - .../werkzeug/middleware/proxy_fix.py | 183 - .../werkzeug/middleware/shared_data.py | 282 - .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 - .../__pycache__/__init__.cpython-312.pyc | Bin 4679 -> 0 bytes .../__pycache__/converters.cpython-312.pyc | Bin 10926 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7922 -> 0 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 39807 -> 0 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 8245 -> 0 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 39091 -> 0 bytes .../werkzeug/routing/converters.py | 261 - .../werkzeug/routing/exceptions.py | 152 - .../site-packages/werkzeug/routing/map.py | 951 -- .../site-packages/werkzeug/routing/matcher.py | 202 - .../site-packages/werkzeug/routing/rules.py | 928 -- .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 202 -> 0 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 5726 -> 0 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 14049 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 21895 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 31407 -> 0 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 6021 -> 0 bytes .../site-packages/werkzeug/sansio/http.py | 171 - .../werkzeug/sansio/multipart.py | 321 - .../site-packages/werkzeug/sansio/request.py | 536 - .../site-packages/werkzeug/sansio/response.py | 754 -- .../site-packages/werkzeug/sansio/utils.py | 159 - .../site-packages/werkzeug/security.py | 161 - .../site-packages/werkzeug/serving.py | 1123 --- lib/python3.12/site-packages/werkzeug/test.py | 1464 --- .../site-packages/werkzeug/testapp.py | 194 - lib/python3.12/site-packages/werkzeug/urls.py | 203 - .../site-packages/werkzeug/user_agent.py | 47 - .../site-packages/werkzeug/utils.py | 691 -- .../werkzeug/wrappers/__init__.py | 3 - .../__pycache__/__init__.cpython-312.pyc | Bin 326 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 26130 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 34567 -> 0 bytes .../werkzeug/wrappers/request.py | 647 -- .../werkzeug/wrappers/response.py | 831 -- lib/python3.12/site-packages/werkzeug/wsgi.py | 595 -- lib64 | 1 - 2188 files changed, 252443 deletions(-) delete mode 100644 bin/Activate.ps1 delete mode 100644 bin/activate delete mode 100644 bin/activate.csh delete mode 100644 bin/activate.fish delete mode 100755 bin/flask delete mode 100755 bin/pip delete mode 100755 bin/pip3 delete mode 100755 bin/pip3.12 delete mode 120000 bin/python delete mode 120000 bin/python3 delete mode 120000 bin/python3.12 delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/entry_points.txt delete mode 100644 lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/PIL/BdfFontFile.py delete mode 100644 lib/python3.12/site-packages/PIL/BlpImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/BmpImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/ContainerIO.py delete mode 100644 lib/python3.12/site-packages/PIL/CurImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/DcxImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/DdsImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/EpsImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/ExifTags.py delete mode 100644 lib/python3.12/site-packages/PIL/FitsImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/FliImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/FontFile.py delete mode 100644 lib/python3.12/site-packages/PIL/FpxImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/FtexImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/GbrImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/GdImageFile.py delete mode 100644 lib/python3.12/site-packages/PIL/GifImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/GimpGradientFile.py delete mode 100644 lib/python3.12/site-packages/PIL/GimpPaletteFile.py delete mode 100644 lib/python3.12/site-packages/PIL/GribStubImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/IcnsImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/IcoImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/ImImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/Image.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageChops.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageCms.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageColor.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageDraw.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageDraw2.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageEnhance.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageFile.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageFilter.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageFont.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageGrab.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageMath.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageMode.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageMorph.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageOps.py delete mode 100644 lib/python3.12/site-packages/PIL/ImagePalette.py delete mode 100644 lib/python3.12/site-packages/PIL/ImagePath.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageQt.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageSequence.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageShow.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageStat.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageTk.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageTransform.py delete mode 100644 lib/python3.12/site-packages/PIL/ImageWin.py delete mode 100644 lib/python3.12/site-packages/PIL/ImtImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/IptcImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/JpegImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/JpegPresets.py delete mode 100644 lib/python3.12/site-packages/PIL/McIdasImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/MicImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/MpegImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/MpoImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/MspImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PSDraw.py delete mode 100644 lib/python3.12/site-packages/PIL/PaletteFile.py delete mode 100644 lib/python3.12/site-packages/PIL/PalmImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PcdImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PcfFontFile.py delete mode 100644 lib/python3.12/site-packages/PIL/PcxImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PdfImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PdfParser.py delete mode 100644 lib/python3.12/site-packages/PIL/PixarImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PngImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PpmImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/PsdImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/QoiImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/SgiImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/SpiderImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/SunImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/TarIO.py delete mode 100644 lib/python3.12/site-packages/PIL/TgaImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/TiffImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/TiffTags.py delete mode 100644 lib/python3.12/site-packages/PIL/WalImageFile.py delete mode 100644 lib/python3.12/site-packages/PIL/WebPImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/WmfImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/XbmImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/XpmImagePlugin.py delete mode 100644 lib/python3.12/site-packages/PIL/__init__.py delete mode 100644 lib/python3.12/site-packages/PIL/__main__.py delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/__pycache__/report.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/PIL/_binary.py delete mode 100644 lib/python3.12/site-packages/PIL/_deprecate.py delete mode 100755 lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imaging.pyi delete mode 100755 lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imagingcms.pyi delete mode 100755 lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imagingft.pyi delete mode 100755 lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imagingmath.pyi delete mode 100755 lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imagingmorph.pyi delete mode 100755 lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_imagingtk.pyi delete mode 100644 lib/python3.12/site-packages/PIL/_tkinter_finder.py delete mode 100644 lib/python3.12/site-packages/PIL/_typing.py delete mode 100644 lib/python3.12/site-packages/PIL/_util.py delete mode 100644 lib/python3.12/site-packages/PIL/_version.py delete mode 100755 lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/PIL/_webp.pyi delete mode 100644 lib/python3.12/site-packages/PIL/features.py delete mode 100644 lib/python3.12/site-packages/PIL/py.typed delete mode 100644 lib/python3.12/site-packages/PIL/report.py delete mode 100644 lib/python3.12/site-packages/__pycache__/colorthief.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/__pycache__/events.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/__pycache__/job.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/__pycache__/util.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/events.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/asyncio.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/base_py3.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/debug.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/gevent.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/pool.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/tornado.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/__pycache__/twisted.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/asyncio.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/base.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/base_py3.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/debug.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/gevent.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/pool.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/tornado.py delete mode 100644 lib/python3.12/site-packages/apscheduler/executors/twisted.py delete mode 100644 lib/python3.12/site-packages/apscheduler/job.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/memory.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/mongodb.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/redis.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/rethinkdb.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/sqlalchemy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/zookeeper.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/base.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/memory.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/mongodb.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/redis.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/rethinkdb.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.py delete mode 100644 lib/python3.12/site-packages/apscheduler/jobstores/zookeeper.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/asyncio.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/background.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/blocking.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/gevent.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/qt.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/tornado.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/twisted.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/asyncio.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/background.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/base.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/blocking.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/gevent.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/qt.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/tornado.py delete mode 100644 lib/python3.12/site-packages/apscheduler/schedulers/twisted.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__pycache__/combining.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__pycache__/date.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/__pycache__/interval.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/base.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/combining.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/__init__.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/expressions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/fields.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/expressions.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/cron/fields.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/date.py delete mode 100644 lib/python3.12/site-packages/apscheduler/triggers/interval.py delete mode 100644 lib/python3.12/site-packages/apscheduler/util.py delete mode 100644 lib/python3.12/site-packages/blinker-1.8.2.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/blinker-1.8.2.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/blinker-1.8.2.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/blinker-1.8.2.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/blinker-1.8.2.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/blinker/__init__.py delete mode 100644 lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/blinker/_utilities.py delete mode 100644 lib/python3.12/site-packages/blinker/base.py delete mode 100644 lib/python3.12/site-packages/blinker/py.typed delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/LICENSE.rst delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/click-8.1.7.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/click/__init__.py delete mode 100644 lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/click/_compat.py delete mode 100644 lib/python3.12/site-packages/click/_termui_impl.py delete mode 100644 lib/python3.12/site-packages/click/_textwrap.py delete mode 100644 lib/python3.12/site-packages/click/_winconsole.py delete mode 100644 lib/python3.12/site-packages/click/core.py delete mode 100644 lib/python3.12/site-packages/click/decorators.py delete mode 100644 lib/python3.12/site-packages/click/exceptions.py delete mode 100644 lib/python3.12/site-packages/click/formatting.py delete mode 100644 lib/python3.12/site-packages/click/globals.py delete mode 100644 lib/python3.12/site-packages/click/parser.py delete mode 100644 lib/python3.12/site-packages/click/py.typed delete mode 100644 lib/python3.12/site-packages/click/shell_completion.py delete mode 100644 lib/python3.12/site-packages/click/termui.py delete mode 100644 lib/python3.12/site-packages/click/testing.py delete mode 100644 lib/python3.12/site-packages/click/types.py delete mode 100644 lib/python3.12/site-packages/click/utils.py delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/DESCRIPTION.rst delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/metadata.json delete mode 100644 lib/python3.12/site-packages/colorthief-0.2.1.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/colorthief.py delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt delete mode 100644 lib/python3.12/site-packages/flask/__init__.py delete mode 100644 lib/python3.12/site-packages/flask/__main__.py delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/app.py delete mode 100644 lib/python3.12/site-packages/flask/blueprints.py delete mode 100644 lib/python3.12/site-packages/flask/cli.py delete mode 100644 lib/python3.12/site-packages/flask/config.py delete mode 100644 lib/python3.12/site-packages/flask/ctx.py delete mode 100644 lib/python3.12/site-packages/flask/debughelpers.py delete mode 100644 lib/python3.12/site-packages/flask/globals.py delete mode 100644 lib/python3.12/site-packages/flask/helpers.py delete mode 100644 lib/python3.12/site-packages/flask/json/__init__.py delete mode 100644 lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/json/provider.py delete mode 100644 lib/python3.12/site-packages/flask/json/tag.py delete mode 100644 lib/python3.12/site-packages/flask/logging.py delete mode 100644 lib/python3.12/site-packages/flask/py.typed delete mode 100644 lib/python3.12/site-packages/flask/sansio/README.md delete mode 100644 lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/flask/sansio/app.py delete mode 100644 lib/python3.12/site-packages/flask/sansio/blueprints.py delete mode 100644 lib/python3.12/site-packages/flask/sansio/scaffold.py delete mode 100644 lib/python3.12/site-packages/flask/sessions.py delete mode 100644 lib/python3.12/site-packages/flask/signals.py delete mode 100644 lib/python3.12/site-packages/flask/templating.py delete mode 100644 lib/python3.12/site-packages/flask/testing.py delete mode 100644 lib/python3.12/site-packages/flask/typing.py delete mode 100644 lib/python3.12/site-packages/flask/views.py delete mode 100644 lib/python3.12/site-packages/flask/wrappers.py delete mode 100644 lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/itsdangerous/__init__.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/itsdangerous/_json.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/encoding.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/exc.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/py.typed delete mode 100644 lib/python3.12/site-packages/itsdangerous/serializer.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/signer.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/timed.py delete mode 100644 lib/python3.12/site-packages/itsdangerous/url_safe.py delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/jinja2-3.1.4.dist-info/entry_points.txt delete mode 100644 lib/python3.12/site-packages/jinja2/__init__.py delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/jinja2/_identifier.py delete mode 100644 lib/python3.12/site-packages/jinja2/async_utils.py delete mode 100644 lib/python3.12/site-packages/jinja2/bccache.py delete mode 100644 lib/python3.12/site-packages/jinja2/compiler.py delete mode 100644 lib/python3.12/site-packages/jinja2/constants.py delete mode 100644 lib/python3.12/site-packages/jinja2/debug.py delete mode 100644 lib/python3.12/site-packages/jinja2/defaults.py delete mode 100644 lib/python3.12/site-packages/jinja2/environment.py delete mode 100644 lib/python3.12/site-packages/jinja2/exceptions.py delete mode 100644 lib/python3.12/site-packages/jinja2/ext.py delete mode 100644 lib/python3.12/site-packages/jinja2/filters.py delete mode 100644 lib/python3.12/site-packages/jinja2/idtracking.py delete mode 100644 lib/python3.12/site-packages/jinja2/lexer.py delete mode 100644 lib/python3.12/site-packages/jinja2/loaders.py delete mode 100644 lib/python3.12/site-packages/jinja2/meta.py delete mode 100644 lib/python3.12/site-packages/jinja2/nativetypes.py delete mode 100644 lib/python3.12/site-packages/jinja2/nodes.py delete mode 100644 lib/python3.12/site-packages/jinja2/optimizer.py delete mode 100644 lib/python3.12/site-packages/jinja2/parser.py delete mode 100644 lib/python3.12/site-packages/jinja2/py.typed delete mode 100644 lib/python3.12/site-packages/jinja2/runtime.py delete mode 100644 lib/python3.12/site-packages/jinja2/sandbox.py delete mode 100644 lib/python3.12/site-packages/jinja2/tests.py delete mode 100644 lib/python3.12/site-packages/jinja2/utils.py delete mode 100644 lib/python3.12/site-packages/jinja2/visitor.py delete mode 100644 lib/python3.12/site-packages/markupsafe/__init__.py delete mode 100644 lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/markupsafe/__pycache__/_native.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/markupsafe/_native.py delete mode 100644 lib/python3.12/site-packages/markupsafe/_speedups.c delete mode 100755 lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so delete mode 100644 lib/python3.12/site-packages/markupsafe/_speedups.pyi delete mode 100644 lib/python3.12/site-packages/markupsafe/py.typed delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/piexif-1.1.3.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/piexif/__init__.py delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_common.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_dump.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_exif.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_insert.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_load.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_remove.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_transplant.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/_webp.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/__pycache__/helper.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/piexif/_common.py delete mode 100644 lib/python3.12/site-packages/piexif/_dump.py delete mode 100644 lib/python3.12/site-packages/piexif/_exceptions.py delete mode 100644 lib/python3.12/site-packages/piexif/_exif.py delete mode 100644 lib/python3.12/site-packages/piexif/_insert.py delete mode 100644 lib/python3.12/site-packages/piexif/_load.py delete mode 100644 lib/python3.12/site-packages/piexif/_remove.py delete mode 100644 lib/python3.12/site-packages/piexif/_transplant.py delete mode 100644 lib/python3.12/site-packages/piexif/_webp.py delete mode 100644 lib/python3.12/site-packages/piexif/helper.py delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/LICENSE delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/pillow-11.0.0.dist-info/zip-safe delete mode 100755 lib/python3.12/site-packages/pillow.libs/libXau-154567c4.so.6.0.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libbrotlicommon-3ecfe81c.so.1 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libbrotlidec-ba690955.so.1 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libfreetype-e7d5437d.so.6.20.1 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libharfbuzz-144af51e.so.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libjpeg-45e70d75.so.62.4.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/liblcms2-e69eef39.so.2.0.16 delete mode 100755 lib/python3.12/site-packages/pillow.libs/liblzma-c9407571.so.5.6.3 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libopenjp2-05423b53.so delete mode 100755 lib/python3.12/site-packages/pillow.libs/libpng16-4cc6a9fc.so.16.44.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libsharpyuv-898c0cb5.so.0.1.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libtiff-0a86184d.so.6.0.2 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libwebp-2fd3cdca.so.7.1.9 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libwebpdemux-f2642bcc.so.2.0.15 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libwebpmux-d524b4d5.so.3.1.0 delete mode 100755 lib/python3.12/site-packages/pillow.libs/libxcb-b8a56d01.so.1.1.0 delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/AUTHORS.txt delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/REQUESTED delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/entry_points.txt delete mode 100644 lib/python3.12/site-packages/pip-24.2.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/pip/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/__pip-runner__.py delete mode 100644 lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/build_env.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cache.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/base_command.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/command_context.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/index_command.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/main.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/parser.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/req_command.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/spinners.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/cache.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/check.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/completion.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/configuration.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/debug.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/download.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/freeze.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/hash.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/help.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/index.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/inspect.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/install.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/list.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/search.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/show.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/commands/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/configuration.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/base.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/installed.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/exceptions.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/collector.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/package_finder.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/index/sources.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/locations/base.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/main.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/_json.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/base.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/candidate.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/direct_url.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/format_control.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/index.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/installation_report.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/link.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/scheme.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/search_scope.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/target_python.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/models/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/auth.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/cache.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/download.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/session.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/utils.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/check.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/freeze.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/operations/prepare.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/pyproject.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/constructors.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/req_file.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/req_install.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/req_set.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/base.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/_log.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/compat.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/datetime.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/encoding.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/glibc.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/hashes.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/logging.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/misc.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/packaging.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/retry.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/urls.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/utils/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/git.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 lib/python3.12/site-packages/pip/_internal/wheel_builder.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/core.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/certifi/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/database.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/index.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/util.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/version.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/distro.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/distro/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/codec.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/compat.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/core.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/packaging/version.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/console.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/style.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/token.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pygments/util.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/api.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/auth.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/certs.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/compat.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/help.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/models.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/packages.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/structures.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/requests/utils.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/abc.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/align.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/bar.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/box.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/cells.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/color.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/columns.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/console.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/containers.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/control.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/errors.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/json.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/layout.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/live.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/logging.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/markup.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/measure.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/padding.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/pager.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/palette.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/panel.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/progress.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/region.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/repr.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/rule.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/scope.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/screen.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/segment.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/status.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/style.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/styled.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/table.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/text.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/theme.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/themes.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/rich/tree.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/tomli/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/_api.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/truststore/py.typed delete mode 100644 lib/python3.12/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 lib/python3.12/site-packages/pip/_vendor/vendor.txt delete mode 100644 lib/python3.12/site-packages/pip/py.typed delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/pytz-2024.2.dist-info/zip-safe delete mode 100644 lib/python3.12/site-packages/pytz/__init__.py delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/lazy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/reference.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/tzfile.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/__pycache__/tzinfo.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/pytz/exceptions.py delete mode 100644 lib/python3.12/site-packages/pytz/lazy.py delete mode 100644 lib/python3.12/site-packages/pytz/reference.py delete mode 100644 lib/python3.12/site-packages/pytz/tzfile.py delete mode 100644 lib/python3.12/site-packages/pytz/tzinfo.py delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Abidjan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Accra delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Addis_Ababa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Algiers delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Asmara delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Asmera delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bamako delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bangui delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Banjul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bissau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Blantyre delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Brazzaville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Bujumbura delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Cairo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Casablanca delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ceuta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Conakry delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Dakar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Djibouti delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Douala delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/El_Aaiun delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Freetown delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Gaborone delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Harare delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Johannesburg delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Juba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kampala delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Khartoum delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kigali delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Kinshasa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lagos delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Libreville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lome delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Luanda delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lubumbashi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Lusaka delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Malabo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Maputo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Maseru delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Mbabane delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Mogadishu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Monrovia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Nairobi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ndjamena delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Niamey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Nouakchott delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Ouagadougou delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Porto-Novo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Sao_Tome delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Timbuktu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Tripoli delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Tunis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Africa/Windhoek delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Adak delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Anchorage delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Anguilla delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Antigua delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Araguaina delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Catamarca delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Cordoba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Jujuy delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Mendoza delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Salta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/San_Juan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/San_Luis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Tucuman delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Aruba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Asuncion delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Atikokan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Atka delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Bahia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Bahia_Banderas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Barbados delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Belem delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Belize delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Blanc-Sablon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Boa_Vista delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Bogota delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Boise delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Buenos_Aires delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cambridge_Bay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Campo_Grande delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cancun delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Caracas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Catamarca delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cayenne delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cayman delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Chicago delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Chihuahua delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Ciudad_Juarez delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Coral_Harbour delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cordoba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Costa_Rica delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Creston delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Cuiaba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Curacao delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Danmarkshavn delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Dawson delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Dawson_Creek delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Denver delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Detroit delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Dominica delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Edmonton delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Eirunepe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/El_Salvador delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Ensenada delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Fort_Nelson delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Fort_Wayne delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Fortaleza delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Glace_Bay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Godthab delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Goose_Bay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Grand_Turk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Grenada delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Guadeloupe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Guatemala delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Guayaquil delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Guyana delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Halifax delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Havana delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Hermosillo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Knox delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Marengo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Petersburg delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Tell_City delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Vevay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Vincennes delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indiana/Winamac delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Indianapolis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Inuvik delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Iqaluit delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Jamaica delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Jujuy delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Juneau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Kentucky/Louisville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Kentucky/Monticello delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Knox_IN delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Kralendijk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/La_Paz delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Lima delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Los_Angeles delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Louisville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Lower_Princes delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Maceio delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Managua delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Manaus delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Marigot delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Martinique delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Matamoros delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Mazatlan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Mendoza delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Menominee delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Merida delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Metlakatla delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Mexico_City delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Miquelon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Moncton delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Monterrey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Montevideo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Montreal delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Montserrat delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Nassau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/New_York delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Nipigon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Nome delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Noronha delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/Center delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Nuuk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Ojinaga delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Panama delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Pangnirtung delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Paramaribo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Phoenix delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Port-au-Prince delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Port_of_Spain delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Porto_Acre delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Porto_Velho delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Puerto_Rico delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Punta_Arenas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Rainy_River delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Rankin_Inlet delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Recife delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Regina delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Resolute delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Rio_Branco delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Rosario delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Santa_Isabel delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Santarem delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Santiago delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Santo_Domingo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Sao_Paulo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Scoresbysund delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Shiprock delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Sitka delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Barthelemy delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Johns delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Kitts delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Lucia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Thomas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/St_Vincent delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Swift_Current delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Tegucigalpa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Thule delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Thunder_Bay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Tijuana delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Toronto delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Tortola delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Vancouver delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Virgin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Whitehorse delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Winnipeg delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Yakutat delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/America/Yellowknife delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Casey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Davis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Macquarie delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Mawson delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/McMurdo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Palmer delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Rothera delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/South_Pole delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Syowa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Troll delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Antarctica/Vostok delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Arctic/Longyearbyen delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aden delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Almaty delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Amman delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Anadyr delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aqtau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Aqtobe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ashgabat delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ashkhabad delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Atyrau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Baghdad delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bahrain delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Baku delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bangkok delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Barnaul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Beirut delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Bishkek delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Brunei delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Calcutta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chita delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Choibalsan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chongqing delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Chungking delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Colombo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dacca delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Damascus delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dhaka delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dili delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dubai delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Dushanbe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Famagusta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Gaza delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Harbin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hebron delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hong_Kong delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Hovd delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Irkutsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Istanbul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jakarta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jayapura delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Jerusalem delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kabul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kamchatka delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Karachi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kashgar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kathmandu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Katmandu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Khandyga delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kolkata delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuching delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Kuwait delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Macao delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Macau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Magadan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Makassar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Manila delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Muscat delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Nicosia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Novokuznetsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Novosibirsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Omsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Oral delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Phnom_Penh delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Pontianak delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Pyongyang delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qatar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qostanay delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Qyzylorda delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Rangoon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Riyadh delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Saigon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Sakhalin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Samarkand delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Seoul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Shanghai delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Singapore delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Srednekolymsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Taipei delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tashkent delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tbilisi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tehran delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tel_Aviv delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Thimbu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Thimphu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tokyo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Tomsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ulan_Bator delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Urumqi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Ust-Nera delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Vientiane delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Vladivostok delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yakutsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yangon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yekaterinburg delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Asia/Yerevan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Azores delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Bermuda delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Canary delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Faeroe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Faroe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Madeira delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Reykjavik delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/South_Georgia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/St_Helena delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Atlantic/Stanley delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/ACT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Adelaide delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Brisbane delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Broken_Hill delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Canberra delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Currie delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Darwin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Eucla delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Hobart delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/LHI delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Lindeman delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Lord_Howe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Melbourne delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/NSW delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/North delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Perth delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Queensland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/South delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Sydney delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Tasmania delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Victoria delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/West delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Australia/Yancowinna delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Brazil/Acre delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Brazil/DeNoronha delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Brazil/East delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Brazil/West delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/CET delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/CST6CDT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Atlantic delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Central delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Eastern delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Mountain delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Newfoundland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Pacific delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Saskatchewan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Canada/Yukon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Chile/Continental delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Chile/EasterIsland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Cuba delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/EET delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/EST delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/EST5EDT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Egypt delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Eire delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+1 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+10 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+11 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+12 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+2 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+3 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+4 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+5 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+6 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+7 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+8 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT+9 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-1 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-10 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-11 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-12 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-13 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-14 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-2 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-3 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-4 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-5 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-6 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-7 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-8 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT-9 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/GMT0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/Greenwich delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/UCT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/UTC delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/Universal delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Etc/Zulu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Amsterdam delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Andorra delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Astrakhan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Athens delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Belfast delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Belgrade delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Berlin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Bratislava delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Brussels delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Bucharest delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Budapest delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Busingen delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Chisinau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Copenhagen delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Dublin delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Gibraltar delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Guernsey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Helsinki delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Isle_of_Man delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Istanbul delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Jersey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kaliningrad delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kiev delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kirov delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Kyiv delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Lisbon delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Ljubljana delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/London delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Luxembourg delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Madrid delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Malta delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Mariehamn delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Minsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Monaco delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Moscow delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Nicosia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Oslo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Paris delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Podgorica delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Prague delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Riga delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Rome delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Samara delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/San_Marino delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Sarajevo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Saratov delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Simferopol delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Skopje delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Sofia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Stockholm delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tallinn delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tirane delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Tiraspol delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Ulyanovsk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Uzhgorod delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vaduz delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vatican delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vienna delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Vilnius delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Volgograd delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Warsaw delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zagreb delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zaporozhye delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Europe/Zurich delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Factory delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GB delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GB-Eire delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GMT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GMT+0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GMT-0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/GMT0 delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Greenwich delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/HST delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Hongkong delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Iceland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Antananarivo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Chagos delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Christmas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Cocos delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Comoro delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Kerguelen delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mahe delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Maldives delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mauritius delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Mayotte delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Indian/Reunion delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Iran delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Israel delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Jamaica delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Japan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Kwajalein delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Libya delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/MET delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/MST delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/MST7MDT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Mexico/BajaNorte delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Mexico/BajaSur delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Mexico/General delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/NZ delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/NZ-CHAT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Navajo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/PRC delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/PST8PDT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Apia delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Auckland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Bougainville delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Chatham delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Chuuk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Easter delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Efate delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Enderbury delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Fakaofo delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Fiji delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Funafuti delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Galapagos delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Gambier delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Guadalcanal delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Guam delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Honolulu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Johnston delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kanton delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kiritimati delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kosrae delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Kwajalein delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Majuro delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Marquesas delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Midway delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Nauru delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Niue delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Norfolk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Noumea delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pago_Pago delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Palau delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pitcairn delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Pohnpei delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Ponape delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Port_Moresby delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Rarotonga delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Saipan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Samoa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tahiti delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tarawa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Tongatapu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Truk delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Wake delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Wallis delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Pacific/Yap delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Poland delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Portugal delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/ROC delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/ROK delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Singapore delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Turkey delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/UCT delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Alaska delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Aleutian delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Arizona delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Central delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/East-Indiana delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Eastern delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Hawaii delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Indiana-Starke delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Michigan delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Mountain delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Pacific delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/US/Samoa delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/UTC delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Universal delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/W-SU delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/WET delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/Zulu delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/iso3166.tab delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/leapseconds delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/tzdata.zi delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/zone.tab delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/zone1970.tab delete mode 100644 lib/python3.12/site-packages/pytz/zoneinfo/zonenow.tab delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/LICENSE delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/six-1.16.0.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/six.py delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/tzlocal-5.2.dist-info/top_level.txt delete mode 100644 lib/python3.12/site-packages/tzlocal/__init__.py delete mode 100644 lib/python3.12/site-packages/tzlocal/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/tzlocal/__pycache__/unix.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/tzlocal/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/tzlocal/__pycache__/win32.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/tzlocal/__pycache__/windows_tz.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/tzlocal/py.typed delete mode 100644 lib/python3.12/site-packages/tzlocal/unix.py delete mode 100644 lib/python3.12/site-packages/tzlocal/utils.py delete mode 100644 lib/python3.12/site-packages/tzlocal/win32.py delete mode 100644 lib/python3.12/site-packages/tzlocal/windows_tz.py delete mode 100644 lib/python3.12/site-packages/werkzeug-3.0.4.dist-info/INSTALLER delete mode 100644 lib/python3.12/site-packages/werkzeug-3.0.4.dist-info/LICENSE.txt delete mode 100644 lib/python3.12/site-packages/werkzeug-3.0.4.dist-info/METADATA delete mode 100644 lib/python3.12/site-packages/werkzeug-3.0.4.dist-info/RECORD delete mode 100644 lib/python3.12/site-packages/werkzeug-3.0.4.dist-info/WHEEL delete mode 100644 lib/python3.12/site-packages/werkzeug/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/http.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/local.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/security.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/_internal.py delete mode 100644 lib/python3.12/site-packages/werkzeug/_reloader.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/accept.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/accept.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/auth.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/cache_control.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/csp.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/csp.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/etag.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/etag.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/file_storage.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/headers.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/headers.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/mixins.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/mixins.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/range.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/range.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/structures.py delete mode 100644 lib/python3.12/site-packages/werkzeug/datastructures/structures.pyi delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/console.py delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/repr.py delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/console.png delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/less.png delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/more.png delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/shared/style.css delete mode 100644 lib/python3.12/site-packages/werkzeug/debug/tbtools.py delete mode 100644 lib/python3.12/site-packages/werkzeug/exceptions.py delete mode 100644 lib/python3.12/site-packages/werkzeug/formparser.py delete mode 100644 lib/python3.12/site-packages/werkzeug/http.py delete mode 100644 lib/python3.12/site-packages/werkzeug/local.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/lint.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/lint.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/profiler.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 lib/python3.12/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 lib/python3.12/site-packages/werkzeug/py.typed delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/converters.py delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/exceptions.py delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/map.py delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/matcher.py delete mode 100644 lib/python3.12/site-packages/werkzeug/routing/rules.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/http.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/multipart.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/request.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/response.py delete mode 100644 lib/python3.12/site-packages/werkzeug/sansio/utils.py delete mode 100644 lib/python3.12/site-packages/werkzeug/security.py delete mode 100644 lib/python3.12/site-packages/werkzeug/serving.py delete mode 100644 lib/python3.12/site-packages/werkzeug/test.py delete mode 100644 lib/python3.12/site-packages/werkzeug/testapp.py delete mode 100644 lib/python3.12/site-packages/werkzeug/urls.py delete mode 100644 lib/python3.12/site-packages/werkzeug/user_agent.py delete mode 100644 lib/python3.12/site-packages/werkzeug/utils.py delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/request.py delete mode 100644 lib/python3.12/site-packages/werkzeug/wrappers/response.py delete mode 100644 lib/python3.12/site-packages/werkzeug/wsgi.py delete mode 120000 lib64 diff --git a/.gitignore b/.gitignore index 77914a2..e304d8d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ lib/ lib64/ local/ share/ -<<<<<<< HEAD lib64 uploads/ diff --git a/bin/Activate.ps1 b/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/bin/activate b/bin/activate deleted file mode 100644 index cd0384c..0000000 --- a/bin/activate +++ /dev/null @@ -1,70 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# You cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath "/home/dubey/projects/photoportfolio/pythonserver") -else - # use the path as-is - export VIRTUAL_ENV="/home/dubey/projects/photoportfolio/pythonserver" -fi - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1="(pythonserver) ${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT="(pythonserver) " - export VIRTUAL_ENV_PROMPT -fi - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/bin/activate.csh b/bin/activate.csh deleted file mode 100644 index fee4592..0000000 --- a/bin/activate.csh +++ /dev/null @@ -1,27 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. - -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/home/dubey/projects/photoportfolio/pythonserver" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = "(pythonserver) $prompt" - setenv VIRTUAL_ENV_PROMPT "(pythonserver) " -endif - -alias pydoc python -m pydoc - -rehash diff --git a/bin/activate.fish b/bin/activate.fish deleted file mode 100644 index ff09d57..0000000 --- a/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/). You cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/home/dubey/projects/photoportfolio/pythonserver" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) "(pythonserver) " (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT "(pythonserver) " -end diff --git a/bin/flask b/bin/flask deleted file mode 100755 index 4b9ba55..0000000 --- a/bin/flask +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/dubey/projects/photoportfolio/pythonserver/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from flask.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/bin/pip b/bin/pip deleted file mode 100755 index d7f99e4..0000000 --- a/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/dubey/projects/photoportfolio/pythonserver/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/bin/pip3 b/bin/pip3 deleted file mode 100755 index d7f99e4..0000000 --- a/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/dubey/projects/photoportfolio/pythonserver/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/bin/pip3.12 b/bin/pip3.12 deleted file mode 100755 index d7f99e4..0000000 --- a/bin/pip3.12 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/dubey/projects/photoportfolio/pythonserver/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/bin/python b/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/bin/python3 b/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/bin/python3.12 b/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/INSTALLER b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/LICENSE.txt b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/LICENSE.txt deleted file mode 100644 index 07806f8..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -This is the MIT license: http://www.opensource.org/licenses/mit-license.php - -Copyright (c) Alex Grönholm - -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/METADATA b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/METADATA deleted file mode 100644 index 62df97e..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/METADATA +++ /dev/null @@ -1,138 +0,0 @@ -Metadata-Version: 2.1 -Name: APScheduler -Version: 3.10.4 -Summary: In-process task scheduler with Cron-like capabilities -Home-page: https://github.com/agronholm/apscheduler -Author: Alex Grönholm -Author-email: apscheduler@nextday.fi -License: MIT -Keywords: scheduling cron -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Requires-Python: >=3.6 -License-File: LICENSE.txt -Requires-Dist: six >=1.4.0 -Requires-Dist: pytz -Requires-Dist: tzlocal !=3.*,>=2.0 -Requires-Dist: importlib-metadata >=3.6.0 ; python_version < "3.8" -Provides-Extra: doc -Requires-Dist: sphinx ; extra == 'doc' -Requires-Dist: sphinx-rtd-theme ; extra == 'doc' -Provides-Extra: gevent -Requires-Dist: gevent ; extra == 'gevent' -Provides-Extra: mongodb -Requires-Dist: pymongo >=3.0 ; extra == 'mongodb' -Provides-Extra: redis -Requires-Dist: redis >=3.0 ; extra == 'redis' -Provides-Extra: rethinkdb -Requires-Dist: rethinkdb >=2.4.0 ; extra == 'rethinkdb' -Provides-Extra: sqlalchemy -Requires-Dist: sqlalchemy >=1.4 ; extra == 'sqlalchemy' -Provides-Extra: testing -Requires-Dist: pytest ; extra == 'testing' -Requires-Dist: pytest-asyncio ; extra == 'testing' -Requires-Dist: pytest-cov ; extra == 'testing' -Requires-Dist: pytest-tornado5 ; extra == 'testing' -Provides-Extra: tornado -Requires-Dist: tornado >=4.3 ; extra == 'tornado' -Provides-Extra: twisted -Requires-Dist: twisted ; extra == 'twisted' -Provides-Extra: zookeeper -Requires-Dist: kazoo ; extra == 'zookeeper' - -.. image:: https://github.com/agronholm/apscheduler/workflows/Python%20codeqa/test/badge.svg?branch=3.x - :target: https://github.com/agronholm/apscheduler/actions?query=workflow%3A%22Python+codeqa%2Ftest%22+branch%3A3.x - :alt: Build Status -.. image:: https://coveralls.io/repos/github/agronholm/apscheduler/badge.svg?branch=3.x - :target: https://coveralls.io/github/agronholm/apscheduler?branch=3.x - :alt: Code Coverage -.. image:: https://readthedocs.org/projects/apscheduler/badge/?version=3.x - :target: https://apscheduler.readthedocs.io/en/master/?badge=3.x - :alt: Documentation - -Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code -to be executed later, either just once or periodically. You can add new jobs or remove old ones on -the fly as you please. If you store your jobs in a database, they will also survive scheduler -restarts and maintain their state. When the scheduler is restarted, it will then run all the jobs -it should have run while it was offline [#f1]_. - -Among other things, APScheduler can be used as a cross-platform, application specific replacement -to platform specific schedulers, such as the cron daemon or the Windows task scheduler. Please -note, however, that APScheduler is **not** a daemon or service itself, nor does it come with any -command line tools. It is primarily meant to be run inside existing applications. That said, -APScheduler does provide some building blocks for you to build a scheduler service or to run a -dedicated scheduler process. - -APScheduler has three built-in scheduling systems you can use: - -* Cron-style scheduling (with optional start/end times) -* Interval-based execution (runs jobs on even intervals, with optional start/end times) -* One-off delayed execution (runs jobs once, on a set date/time) - -You can mix and match scheduling systems and the backends where the jobs are stored any way you -like. Supported backends for storing jobs include: - -* Memory -* `SQLAlchemy `_ (any RDBMS supported by SQLAlchemy works) -* `MongoDB `_ -* `Redis `_ -* `RethinkDB `_ -* `ZooKeeper `_ - -APScheduler also integrates with several common Python frameworks, like: - -* `asyncio `_ (:pep:`3156`) -* `gevent `_ -* `Tornado `_ -* `Twisted `_ -* `Qt `_ (using either - `PyQt `_ , - `PySide6 `_ , - `PySide2 `_ or - `PySide `_) - -There are third party solutions for integrating APScheduler with other frameworks: - -* `Django `_ -* `Flask `_ - - -.. [#f1] The cutoff period for this is also configurable. - - -Documentation -------------- - -Documentation can be found `here `_. - - -Source ------- - -The source can be browsed at `Github `_. - - -Reporting bugs --------------- - -A `bug tracker `_ is provided by Github. - - -Getting help ------------- - -If you have problems or other questions, you can either: - -* Ask in the `apscheduler `_ room on Gitter -* Ask on the `APScheduler GitHub discussion forum `_, or -* Ask on `StackOverflow `_ and tag your - question with the ``apscheduler`` tag diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/RECORD b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/RECORD deleted file mode 100644 index b31a6e1..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/RECORD +++ /dev/null @@ -1,84 +0,0 @@ -APScheduler-3.10.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -APScheduler-3.10.4.dist-info/LICENSE.txt,sha256=YWP3mH37ONa8MgzitwsvArhivEESZRbVUu8c1DJH51g,1130 -APScheduler-3.10.4.dist-info/METADATA,sha256=ITYjDYv8SBO2ynuPiXmySCDJPjfvrFElLJoKQr58h8U,5695 -APScheduler-3.10.4.dist-info/RECORD,, -APScheduler-3.10.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -APScheduler-3.10.4.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92 -APScheduler-3.10.4.dist-info/entry_points.txt,sha256=KMxTUp2QykDNL6w-WBU5xrk8ebroCPEBN0eZtyL3x2w,1147 -APScheduler-3.10.4.dist-info/top_level.txt,sha256=O3oMCWxG-AHkecUoO6Ze7-yYjWrttL95uHO8-RFdYvE,12 -apscheduler/__init__.py,sha256=c_KXMg1QziacYqUpDuzLY5g1mcEZvBLq1dJY7NjLoKc,452 -apscheduler/__pycache__/__init__.cpython-312.pyc,, -apscheduler/__pycache__/events.cpython-312.pyc,, -apscheduler/__pycache__/job.cpython-312.pyc,, -apscheduler/__pycache__/util.cpython-312.pyc,, -apscheduler/events.py,sha256=KRMTDQUS6d2uVnrQvPoz3ZPV5V9XKsCAZLsgx913FFo,3593 -apscheduler/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apscheduler/executors/__pycache__/__init__.cpython-312.pyc,, -apscheduler/executors/__pycache__/asyncio.cpython-312.pyc,, -apscheduler/executors/__pycache__/base.cpython-312.pyc,, -apscheduler/executors/__pycache__/base_py3.cpython-312.pyc,, -apscheduler/executors/__pycache__/debug.cpython-312.pyc,, -apscheduler/executors/__pycache__/gevent.cpython-312.pyc,, -apscheduler/executors/__pycache__/pool.cpython-312.pyc,, -apscheduler/executors/__pycache__/tornado.cpython-312.pyc,, -apscheduler/executors/__pycache__/twisted.cpython-312.pyc,, -apscheduler/executors/asyncio.py,sha256=9m4wvRHSSYplllxAQyxWkPVcFdyFG5aZbHt5nfWKIAc,1859 -apscheduler/executors/base.py,sha256=hogiMc_t-huw6BMod0HEeY2FhRNmAAUyNNuBHvIX31M,5336 -apscheduler/executors/base_py3.py,sha256=8WOpTeX1NA-spdbEQ1oJMh5T2O_t2UdsaSnAh-iEWe0,1831 -apscheduler/executors/debug.py,sha256=15_ogSBzl8RRCfBYDnkIV2uMH8cLk1KImYmBa_NVGpc,573 -apscheduler/executors/gevent.py,sha256=aulrNmoefyBgrOkH9awRhFiXIDnSCnZ4U0o0_JXIXgc,777 -apscheduler/executors/pool.py,sha256=h4cYgKMRhjpNHmkhlogHLbmT4O_q6HePXVLmiJIHC3c,2484 -apscheduler/executors/tornado.py,sha256=DU75VaQ9R6nBuy8lbPUvDKUgsuJcZqwAvURC5vg3r6w,1780 -apscheduler/executors/twisted.py,sha256=bRoU0C4BoVcS6_BjKD5wfUs0IJpGkmLsRAcMH2rJJss,778 -apscheduler/job.py,sha256=JCRERBpfWLuomPiNNHX-jrluEwfHkdscEmz4i0Y8rao,11216 -apscheduler/jobstores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apscheduler/jobstores/__pycache__/__init__.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/base.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/memory.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/mongodb.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/redis.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/rethinkdb.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/sqlalchemy.cpython-312.pyc,, -apscheduler/jobstores/__pycache__/zookeeper.cpython-312.pyc,, -apscheduler/jobstores/base.py,sha256=DXzSW9XscueHZHMvy1qFiG-vYqUl_MMv0n0uBSZWXGo,4523 -apscheduler/jobstores/memory.py,sha256=ZxWiKsqfsCHFvac-6X9BztuhnuSxlOYi1dhT6g-pjQo,3655 -apscheduler/jobstores/mongodb.py,sha256=r9t2neNuzfPuf_omDm0KdkLGPZXLksiH-U3j13MIBlM,5347 -apscheduler/jobstores/redis.py,sha256=kjQDIzPXz-Yq976U9HK3aMkcCI_QRLKgTADQWKewtik,5483 -apscheduler/jobstores/rethinkdb.py,sha256=k1rSLYJqejuhQxJY3pXwHAQYcpZ1QFJsoQ8n0oEu5MM,5863 -apscheduler/jobstores/sqlalchemy.py,sha256=LIA9iSGMvuPTVqGHdztgQs4YFmYN1xqXvpJauYNK470,6529 -apscheduler/jobstores/zookeeper.py,sha256=avGLXaJGjHD0F7uG6rLJ2gg_TXNqXDEM4PqOu56f-Xg,6363 -apscheduler/schedulers/__init__.py,sha256=jM63xA_K7GSToBenhsz-SCcqfhk1pdEVb6ajwoO5Kqg,406 -apscheduler/schedulers/__pycache__/__init__.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/asyncio.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/background.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/base.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/blocking.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/gevent.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/qt.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/tornado.cpython-312.pyc,, -apscheduler/schedulers/__pycache__/twisted.cpython-312.pyc,, -apscheduler/schedulers/asyncio.py,sha256=iJO6QUo1oW16giOU_nW8WMu2b9NTWT4Tg2gY586G08w,1994 -apscheduler/schedulers/background.py,sha256=751p-f5Di6pY4x6UXlZggpxQ5k2ObJ_Q5wSeWmKHS8o,1566 -apscheduler/schedulers/base.py,sha256=hCchDyhEXCoVmCfGgD3QMrKumYYLAUwY4456tQrukAY,43780 -apscheduler/schedulers/blocking.py,sha256=8nubfJ4PoUnAkEY6WRQG4COzG4SxGyW9PjuVPhDAbsk,985 -apscheduler/schedulers/gevent.py,sha256=csPBvV75FGcboXXsdex6fCD7J54QgBddYNdWj62ZO9g,1031 -apscheduler/schedulers/qt.py,sha256=jy58cP5roWOv68ytg8fiwtxMVnZKw7a8tkCHbLWeUs8,1329 -apscheduler/schedulers/tornado.py,sha256=D9Vaq3Ee9EFiXa1jDy9tedI048gR_YT_LAFUWqO_uEw,1926 -apscheduler/schedulers/twisted.py,sha256=D5EBjjMRtMBxy0_aAURcULAI8Ky2IvCTr9tK9sO1rYk,1844 -apscheduler/triggers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apscheduler/triggers/__pycache__/__init__.cpython-312.pyc,, -apscheduler/triggers/__pycache__/base.cpython-312.pyc,, -apscheduler/triggers/__pycache__/combining.cpython-312.pyc,, -apscheduler/triggers/__pycache__/date.cpython-312.pyc,, -apscheduler/triggers/__pycache__/interval.cpython-312.pyc,, -apscheduler/triggers/base.py,sha256=BvBJdOnIeVClXPXeInzYK25cN64jAc4a9IiEQucSiVk,1355 -apscheduler/triggers/combining.py,sha256=klaSoBp1kyrPX5D3gBpNTlsGKjks5QeKPW5JN_MVs30,3449 -apscheduler/triggers/cron/__init__.py,sha256=D39BQ63qWyk6XZcSuWth46ELQ3VIFpYjUHh7Kj65Z9M,9251 -apscheduler/triggers/cron/__pycache__/__init__.cpython-312.pyc,, -apscheduler/triggers/cron/__pycache__/expressions.cpython-312.pyc,, -apscheduler/triggers/cron/__pycache__/fields.cpython-312.pyc,, -apscheduler/triggers/cron/expressions.py,sha256=hu1kq0mKvivIw7U0D0Nnrbuk3q01dCuhZ7SHRPw6qhI,9184 -apscheduler/triggers/cron/fields.py,sha256=NWPClh1NgSOpTlJ3sm1TXM_ViC2qJGKWkd_vg0xsw7o,3510 -apscheduler/triggers/date.py,sha256=RrfB1PNO9G9e91p1BOf-y_TseVHQQR-KJPhNdPpAHcU,1705 -apscheduler/triggers/interval.py,sha256=ABjcZFaGYAAgdAaUQIuLr9_dLszIifu88qaXrJmdxQ4,4377 -apscheduler/util.py,sha256=aCLu_v8-c7rpY6sD7EKgxH2zYjZARiBdqKFZktaxO68,13260 diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/REQUESTED b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/WHEEL b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/WHEEL deleted file mode 100644 index 2c08da0..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/entry_points.txt b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/entry_points.txt deleted file mode 100644 index 0adfe3e..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/entry_points.txt +++ /dev/null @@ -1,23 +0,0 @@ -[apscheduler.executors] -asyncio = apscheduler.executors.asyncio:AsyncIOExecutor [asyncio] -debug = apscheduler.executors.debug:DebugExecutor -gevent = apscheduler.executors.gevent:GeventExecutor [gevent] -processpool = apscheduler.executors.pool:ProcessPoolExecutor -threadpool = apscheduler.executors.pool:ThreadPoolExecutor -tornado = apscheduler.executors.tornado:TornadoExecutor [tornado] -twisted = apscheduler.executors.twisted:TwistedExecutor [twisted] - -[apscheduler.jobstores] -memory = apscheduler.jobstores.memory:MemoryJobStore -mongodb = apscheduler.jobstores.mongodb:MongoDBJobStore [mongodb] -redis = apscheduler.jobstores.redis:RedisJobStore [redis] -rethinkdb = apscheduler.jobstores.rethinkdb:RethinkDBJobStore [rethinkdb] -sqlalchemy = apscheduler.jobstores.sqlalchemy:SQLAlchemyJobStore [sqlalchemy] -zookeeper = apscheduler.jobstores.zookeeper:ZooKeeperJobStore [zookeeper] - -[apscheduler.triggers] -and = apscheduler.triggers.combining:AndTrigger -cron = apscheduler.triggers.cron:CronTrigger -date = apscheduler.triggers.date:DateTrigger -interval = apscheduler.triggers.interval:IntervalTrigger -or = apscheduler.triggers.combining:OrTrigger diff --git a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/top_level.txt b/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/top_level.txt deleted file mode 100644 index d31d10d..0000000 --- a/lib/python3.12/site-packages/APScheduler-3.10.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -apscheduler diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/INSTALLER b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/LICENSE.txt b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/LICENSE.txt deleted file mode 100644 index 9d227a0..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/METADATA b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/METADATA deleted file mode 100644 index cbf0cfe..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/METADATA +++ /dev/null @@ -1,92 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 3.0.1 -Summary: Safely add untrusted strings to HTML/XML markup. -Maintainer-email: Pallets -License: Copyright 2010 Pallets - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://markupsafe.palletsprojects.com/ -Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ -Project-URL: Source, https://github.com/pallets/markupsafe/ -Project-URL: Chat, https://discord.gg/pallets -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Typing :: Typed -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-File: LICENSE.txt - -# MarkupSafe - -MarkupSafe implements a text object that escapes characters so it is -safe to use in HTML and XML. Characters that have special meanings are -replaced so that they display as the actual characters. This mitigates -injection attacks, meaning untrusted user input can safely be displayed -on a page. - - -## Examples - -```pycon ->>> from markupsafe import Markup, escape - ->>> # escape replaces special characters and wraps in Markup ->>> escape("") -Markup('<script>alert(document.cookie);</script>') - ->>> # wrap in Markup to mark text "safe" and prevent escaping ->>> Markup("Hello") -Markup('hello') - ->>> escape(Markup("Hello")) -Markup('hello') - ->>> # Markup is a str subclass ->>> # methods and operators escape their arguments ->>> template = Markup("Hello {name}") ->>> template.format(name='"World"') -Markup('Hello "World"') -``` - -## Donate - -The Pallets organization develops and supports MarkupSafe and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -[please donate today][]. - -[please donate today]: https://palletsprojects.com/donate diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/RECORD b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/RECORD deleted file mode 100644 index b3972f2..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-3.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-3.0.1.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-3.0.1.dist-info/METADATA,sha256=wGwihiqdL2I8R2A5A829_C-xNqpIln1plgzTSqwNflY,3975 -MarkupSafe-3.0.1.dist-info/RECORD,, -MarkupSafe-3.0.1.dist-info/WHEEL,sha256=7B4nnId14TToQHuAKpxbDLCJbNciqBsV-mvXE2hVLJc,151 -MarkupSafe-3.0.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 -markupsafe/__pycache__/__init__.cpython-312.pyc,, -markupsafe/__pycache__/_native.cpython-312.pyc,, -markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 -markupsafe/_speedups.c,sha256=75yiBvklVsTr_3EL3vH0tpjdBH2QaQ2JH8pg6WER8X8,4154 -markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so,sha256=3Rl01ODAVUyJaZFC3BiH6kp1lPnhwLTjh5iJWU-AlaY,44536 -markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/WHEEL b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/WHEEL deleted file mode 100644 index 3e81182..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.1.0) -Root-Is-Purelib: false -Tag: cp312-cp312-manylinux_2_17_x86_64 -Tag: cp312-cp312-manylinux2014_x86_64 - diff --git a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/top_level.txt b/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/lib/python3.12/site-packages/MarkupSafe-3.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/lib/python3.12/site-packages/PIL/BdfFontFile.py b/lib/python3.12/site-packages/PIL/BdfFontFile.py deleted file mode 100644 index bc1416c..0000000 --- a/lib/python3.12/site-packages/PIL/BdfFontFile.py +++ /dev/null @@ -1,133 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# bitmap distribution font (bdf) file parser -# -# history: -# 1996-05-16 fl created (as bdf2pil) -# 1997-08-25 fl converted to FontFile driver -# 2001-05-25 fl removed bogus __init__ call -# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) -# 2003-04-22 fl more robustification (from Graham Dumpleton) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -Parse X Bitmap Distribution Format (BDF) -""" -from __future__ import annotations - -from typing import BinaryIO - -from . import FontFile, Image - -bdf_slant = { - "R": "Roman", - "I": "Italic", - "O": "Oblique", - "RI": "Reverse Italic", - "RO": "Reverse Oblique", - "OT": "Other", -} - -bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} - - -def bdf_char( - f: BinaryIO, -) -> ( - tuple[ - str, - int, - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], - Image.Image, - ] - | None -): - # skip to STARTCHAR - while True: - s = f.readline() - if not s: - return None - if s[:9] == b"STARTCHAR": - break - id = s[9:].strip().decode("ascii") - - # load symbol properties - props = {} - while True: - s = f.readline() - if not s or s[:6] == b"BITMAP": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - - # load bitmap - bitmap = bytearray() - while True: - s = f.readline() - if not s or s[:7] == b"ENDCHAR": - break - bitmap += s[:-1] - - # The word BBX - # followed by the width in x (BBw), height in y (BBh), - # and x and y displacement (BBxoff0, BByoff0) - # of the lower left corner from the origin of the character. - width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) - - # The word DWIDTH - # followed by the width in x and y of the character in device pixels. - dwx, dwy = (int(p) for p in props["DWIDTH"].split()) - - bbox = ( - (dwx, dwy), - (x_disp, -y_disp - height, width + x_disp, -y_disp), - (0, 0, width, height), - ) - - try: - im = Image.frombytes("1", (width, height), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (width, height)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp: BinaryIO) -> None: - super().__init__() - - s = fp.readline() - if s[:13] != b"STARTFONT 2.1": - msg = "not a valid BDF file" - raise SyntaxError(msg) - - props = {} - comments = [] - - while True: - s = fp.readline() - if not s or s[:13] == b"ENDPROPERTIES": - break - i = s.find(b" ") - props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") - if s[:i] in [b"COMMENT", b"COPYRIGHT"]: - if s.find(b"LogicalFontDescription") < 0: - comments.append(s[i + 1 : -1].decode("ascii")) - - while True: - c = bdf_char(fp) - if not c: - break - id, ch, (xy, dst, src), im = c - if 0 <= ch < len(self.glyph): - self.glyph[ch] = xy, dst, src, im diff --git a/lib/python3.12/site-packages/PIL/BlpImagePlugin.py b/lib/python3.12/site-packages/PIL/BlpImagePlugin.py deleted file mode 100644 index e560563..0000000 --- a/lib/python3.12/site-packages/PIL/BlpImagePlugin.py +++ /dev/null @@ -1,493 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -from __future__ import annotations - -import abc -import os -import struct -from enum import IntEnum -from io import BytesIO -from typing import IO - -from . import Image, ImageFile - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def unpack_565(i: int) -> tuple[int, int, int]: - return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 - - -def decode_dxt1( - data: bytes, alpha: bool = False -) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - # Decode next 8-byte block. - idx = block_index * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] in (b"BLP1", b"BLP2") - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self) -> None: - self.magic = self.fp.read(4) - - self.fp.seek(5, os.SEEK_CUR) - (self._blp_alpha_depth,) = struct.unpack(" tuple[int, int]: - try: - self._read_blp_header() - self._load() - except struct.error as e: - msg = "Truncated BLP file" - raise OSError(msg) from e - return -1, 0 - - @abc.abstractmethod - def _load(self) -> None: - pass - - def _read_blp_header(self) -> None: - assert self.fd is not None - self.fd.seek(4) - (self._blp_compression,) = struct.unpack(" bytes: - assert self.fd is not None - return ImageFile._safe_read(self.fd, length) - - def _read_palette(self) -> list[tuple[int, int, int, int]]: - ret = [] - for i in range(256): - try: - b, g, r, a = struct.unpack("<4B", self._safe_read(4)) - except struct.error: - break - ret.append((b, g, r, a)) - return ret - - def _read_bgra(self, palette: list[tuple[int, int, int, int]]) -> bytearray: - data = bytearray() - _data = BytesIO(self._safe_read(self._blp_lengths[0])) - while True: - try: - (offset,) = struct.unpack(" None: - if self._blp_compression == Format.JPEG: - self._decode_jpeg_stream() - - elif self._blp_compression == 1: - if self._blp_encoding in (4, 5): - palette = self._read_palette() - data = self._read_bgra(palette) - self.set_as_raw(data) - else: - msg = f"Unsupported BLP encoding {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unsupported BLP compression {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - - def _decode_jpeg_stream(self) -> None: - from .JpegImagePlugin import JpegImageFile - - (jpeg_header_size,) = struct.unpack(" None: - palette = self._read_palette() - - assert self.fd is not None - self.fd.seek(self._blp_offsets[0]) - - if self._blp_compression == 1: - # Uncompressed or DirectX compression - - if self._blp_encoding == Encoding.UNCOMPRESSED: - data = self._read_bgra(palette) - - elif self._blp_encoding == Encoding.DXT: - data = bytearray() - if self._blp_alpha_encoding == AlphaEncoding.DXT1: - linesize = (self.size[0] + 3) // 4 * 8 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt1( - self._safe_read(linesize), alpha=bool(self._blp_alpha_depth) - ): - data += d - - elif self._blp_alpha_encoding == AlphaEncoding.DXT3: - linesize = (self.size[0] + 3) // 4 * 16 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt3(self._safe_read(linesize)): - data += d - - elif self._blp_alpha_encoding == AlphaEncoding.DXT5: - linesize = (self.size[0] + 3) // 4 * 16 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt5(self._safe_read(linesize)): - data += d - else: - msg = f"Unsupported alpha encoding {repr(self._blp_alpha_encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unknown BLP encoding {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - - else: - msg = f"Unknown BLP compression {repr(self._blp_compression)}" - raise BLPFormatError(msg) - - self.set_as_raw(data) - - -class BLPEncoder(ImageFile.PyEncoder): - _pushes_fd = True - - def _write_palette(self) -> bytes: - data = b"" - assert self.im is not None - palette = self.im.getpalette("RGBA", "RGBA") - for i in range(len(palette) // 4): - r, g, b, a = palette[i * 4 : (i + 1) * 4] - data += struct.pack("<4B", b, g, r, a) - while len(data) < 256 * 4: - data += b"\x00" * 4 - return data - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - palette_data = self._write_palette() - - offset = 20 + 16 * 4 * 2 + len(palette_data) - data = struct.pack("<16I", offset, *((0,) * 15)) - - assert self.im is not None - w, h = self.im.size - data += struct.pack("<16I", w * h, *((0,) * 15)) - - data += palette_data - - for y in range(h): - for x in range(w): - data += struct.pack(" None: - if im.mode != "P": - msg = "Unsupported BLP image mode" - raise ValueError(msg) - - magic = b"BLP1" if im.encoderinfo.get("blp_version") == "BLP1" else b"BLP2" - fp.write(magic) - - assert im.palette is not None - fp.write(struct.pack(" mode, rawmode - 1: ("P", "P;1"), - 4: ("P", "P;4"), - 8: ("P", "P"), - 16: ("RGB", "BGR;15"), - 24: ("RGB", "BGR"), - 32: ("RGB", "BGRX"), -} - - -def _accept(prefix: bytes) -> bool: - return prefix[:2] == b"BM" - - -def _dib_accept(prefix: bytes) -> bool: - return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] - - -# ============================================================================= -# Image plugin for the Windows BMP format. -# ============================================================================= -class BmpImageFile(ImageFile.ImageFile): - """Image plugin for the Windows Bitmap format (BMP)""" - - # ------------------------------------------------------------- Description - format_description = "Windows Bitmap" - format = "BMP" - - # -------------------------------------------------- BMP Compression values - COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - def _bitmap(self, header: int = 0, offset: int = 0) -> None: - """Read relevant info about the BMP""" - read, seek = self.fp.read, self.fp.seek - if header: - seek(header) - # read bmp header size @offset 14 (this is part of the header size) - file_info: dict[str, bool | int | tuple[int, ...]] = { - "header_size": i32(read(4)), - "direction": -1, - } - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - assert isinstance(file_info["header_size"], int) - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.COMPRESSIONS["RAW"] - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v3 to v5 - # 40: BITMAPINFOHEADER - # 52: BITMAPV2HEADER - # 56: BITMAPV3HEADER - # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER - # 108: BITMAPV4HEADER - # 124: BITMAPV5HEADER - elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - assert isinstance(file_info["pixels_per_meter"], tuple) - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: - masks = ["r_mask", "g_mask", "b_mask"] - if len(header_data) >= 48: - if len(header_data) >= 52: - masks.append("a_mask") - else: - file_info["a_mask"] = 0x0 - for idx, mask in enumerate(masks): - file_info[mask] = i32(header_data, 36 + idx * 4) - else: - # 40 byte headers only have the three components in the - # bitfields masks, ref: - # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also - # https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha - # location, but it is listed as a reserved component, - # and it is not generally an alpha channel - file_info["a_mask"] = 0x0 - for mask in masks: - file_info[mask] = i32(read(4)) - assert isinstance(file_info["r_mask"], int) - assert isinstance(file_info["g_mask"], int) - assert isinstance(file_info["b_mask"], int) - assert isinstance(file_info["a_mask"], int) - file_info["rgb_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - ) - file_info["rgba_mask"] = ( - file_info["r_mask"], - file_info["g_mask"], - file_info["b_mask"], - file_info["a_mask"], - ) - else: - msg = f"Unsupported BMP header type ({file_info['header_size']})" - raise OSError(msg) - - # ------------------ Special case : header is reported 40, which - # ---------------------- is shorter than real size for bpp >= 16 - assert isinstance(file_info["width"], int) - assert isinstance(file_info["height"], int) - self._size = file_info["width"], file_info["height"] - - # ------- If color count was not found in the header, compute from bits - assert isinstance(file_info["bits"], int) - file_info["colors"] = ( - file_info["colors"] - if file_info.get("colors", 0) - else (1 << file_info["bits"]) - ) - assert isinstance(file_info["colors"], int) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self._mode, raw_mode = BIT2MODE.get(file_info["bits"], ("", "")) - if not self.mode: - msg = f"Unsupported BMP pixel depth ({file_info['bits']})" - raise OSError(msg) - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: - SUPPORTED: dict[int, list[tuple[int, ...]]] = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - (0xFF000000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0xFF), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0xFF000000, 0xFF00, 0xFF, 0xFF0000), - (0x0, 0x0, 0x0, 0x0), - ], - 24: [(0xFF0000, 0xFF00, 0xFF)], - 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], - } - MASK_MODES = { - (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", - (32, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", - (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", - (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", - (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", - (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", - } - if file_info["bits"] in SUPPORTED: - if ( - file_info["bits"] == 32 - and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] - ): - assert isinstance(file_info["rgba_mask"], tuple) - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] - self._mode = "RGBA" if "A" in raw_mode else self.mode - elif ( - file_info["bits"] in (24, 16) - and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] - ): - assert isinstance(file_info["rgb_mask"], tuple) - raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - elif file_info["compression"] == self.COMPRESSIONS["RAW"]: - if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset - raw_mode, self._mode = "BGRA", "RGBA" - elif file_info["compression"] in ( - self.COMPRESSIONS["RLE8"], - self.COMPRESSIONS["RLE4"], - ): - decoder_name = "bmp_rle" - else: - msg = f"Unsupported BMP compression ({file_info['compression']})" - raise OSError(msg) - - # --------------- Once the header is processed, process the palette/LUT - if self.mode == "P": # Paletted for 1, 4 and 8 bit images - # ---------------------------------------------------- 1-bit images - if not (0 < file_info["colors"] <= 65536): - msg = f"Unsupported BMP Palette size ({file_info['colors']})" - raise OSError(msg) - else: - assert isinstance(file_info["palette_padding"], int) - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - grayscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if grayscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - grayscale = False - - # ------- If all colors are gray, white or black, ditch palette - if grayscale: - self._mode = "1" if file_info["colors"] == 2 else "L" - raw_mode = self.mode - else: - self._mode = "P" - self.palette = ImagePalette.raw( - "BGRX" if padding == 4 else "BGR", palette - ) - - # ---------------------------- Finally set the tile data for the plugin - self.info["compression"] = file_info["compression"] - args: list[Any] = [raw_mode] - if decoder_name == "bmp_rle": - args.append(file_info["compression"] == self.COMPRESSIONS["RLE4"]) - else: - assert isinstance(file_info["width"], int) - args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) - args.append(file_info["direction"]) - self.tile = [ - ImageFile._Tile( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - tuple(args), - ) - ] - - def _open(self) -> None: - """Open file, check magic number and read header""" - # read 14 bytes: magic number, filesize, reserved, header final offset - head_data = self.fp.read(14) - # choke if the file does not have the required magic bytes - if not _accept(head_data): - msg = "Not a BMP file" - raise SyntaxError(msg) - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - rle4 = self.args[1] - data = bytearray() - x = 0 - dest_length = self.state.xsize * self.state.ysize - while len(data) < dest_length: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - if rle4: - first_pixel = o8(byte[0] >> 4) - second_pixel = o8(byte[0] & 0x0F) - for index in range(num_pixels): - if index % 2 == 0: - data += first_pixel - else: - data += second_pixel - else: - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - if rle4: - # 2 pixels per byte - byte_count = byte[0] // 2 - bytes_read = self.fd.read(byte_count) - for byte_read in bytes_read: - data += o8(byte_read >> 4) - data += o8(byte_read & 0x0F) - else: - byte_count = byte[0] - bytes_read = self.fd.read(byte_count) - data += bytes_read - if len(bytes_read) < byte_count: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - rawmode = "L" if self.mode == "L" else "P" - self.set_as_raw(bytes(data), rawmode, (0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self) -> None: - self._bitmap() - - -# -# -------------------------------------------------------------------- -# Write BMP file - - -SAVE = { - "1": ("1", 1, 2), - "L": ("L", 8, 256), - "P": ("P", 8, 256), - "RGB": ("BGR", 24, 0), - "RGBA": ("BGRA", 32, 0), -} - - -def _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, False) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True -) -> None: - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as BMP" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - if im.mode == "1": - palette = b"".join(o8(i) * 4 for i in (0, 255)) - elif im.mode == "L": - palette = b"".join(o8(i) * 4 for i in range(256)) - elif im.mode == "P": - palette = im.im.getpalette("RGB", "BGRX") - colors = len(palette) // 4 - else: - palette = None - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - msg = "File size is too large for the BMP format" - raise ValueError(msg) - fp.write( - b"BM" # file type (magic) - + o32(file_size) # file size - + o32(0) # reserved - + o32(offset) # image data offset - ) - - # bitmap info header - fp.write( - o32(header) # info header size - + o32(im.size[0]) # width - + o32(im.size[1]) # height - + o16(1) # planes - + o16(bits) # depth - + o32(0) # compression (0=uncompressed) - + o32(image) # size of bitmap - + o32(ppm[0]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if palette: - fp.write(palette) - - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))] - ) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(BmpImageFile.format, BmpImageFile, _accept) -Image.register_save(BmpImageFile.format, _save) - -Image.register_extension(BmpImageFile.format, ".bmp") - -Image.register_mime(BmpImageFile.format, "image/bmp") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py b/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py deleted file mode 100644 index 0ee2f65..0000000 --- a/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# BUFR stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" - - -class BufrStubImageFile(ImageFile.StubImageFile): - format = "BUFR" - format_description = "BUFR" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(4)): - msg = "Not a BUFR file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "BUFR save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) -Image.register_save(BufrStubImageFile.format, _save) - -Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/lib/python3.12/site-packages/PIL/ContainerIO.py b/lib/python3.12/site-packages/PIL/ContainerIO.py deleted file mode 100644 index ec9e66c..0000000 --- a/lib/python3.12/site-packages/PIL/ContainerIO.py +++ /dev/null @@ -1,173 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a class to read from a container file -# -# History: -# 1995-06-18 fl Created -# 1995-09-07 fl Added readline(), readlines() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from collections.abc import Iterable -from typing import IO, AnyStr, NoReturn - - -class ContainerIO(IO[AnyStr]): - """ - A file object that provides read access to a part of an existing - file (for example a TAR file). - """ - - def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: - """ - Create file object. - - :param file: Existing file. - :param offset: Start of region, in bytes. - :param length: Size of region, in bytes. - """ - self.fh: IO[AnyStr] = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self) -> bool: - return False - - def seekable(self) -> bool: - return True - - def seek(self, offset: int, mode: int = io.SEEK_SET) -> int: - """ - Move file pointer. - - :param offset: Offset in bytes. - :param mode: Starting position. Use 0 for beginning of region, 1 - for current offset, and 2 for end of region. You cannot move - the pointer outside the defined region. - :returns: Offset from start of region, in bytes. - """ - if mode == 1: - self.pos = self.pos + offset - elif mode == 2: - self.pos = self.length + offset - else: - self.pos = offset - # clamp - self.pos = max(0, min(self.pos, self.length)) - self.fh.seek(self.offset + self.pos) - return self.pos - - def tell(self) -> int: - """ - Get current file pointer. - - :returns: Offset from start of region, in bytes. - """ - return self.pos - - def readable(self) -> bool: - return True - - def read(self, n: int = -1) -> AnyStr: - """ - Read data. - - :param n: Number of bytes to read. If omitted, zero or negative, - read until end of region. - :returns: An 8-bit string. - """ - if n > 0: - n = min(n, self.length - self.pos) - else: - n = self.length - self.pos - if n <= 0: # EOF - return b"" if "b" in self.fh.mode else "" # type: ignore[return-value] - self.pos = self.pos + n - return self.fh.read(n) - - def readline(self, n: int = -1) -> AnyStr: - """ - Read a line of text. - - :param n: Number of bytes to read. If omitted, zero or negative, - read until end of line. - :returns: An 8-bit string. - """ - s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] - newline_character = b"\n" if "b" in self.fh.mode else "\n" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == newline_character or len(s) == n: - break - return s - - def readlines(self, n: int | None = -1) -> list[AnyStr]: - """ - Read multiple lines of text. - - :param n: Number of lines to read. If omitted, zero, negative or None, - read until end of region. - :returns: A list of 8-bit strings. - """ - lines = [] - while True: - s = self.readline() - if not s: - break - lines.append(s) - if len(lines) == n: - break - return lines - - def writable(self) -> bool: - return False - - def write(self, b: AnyStr) -> NoReturn: - raise NotImplementedError() - - def writelines(self, lines: Iterable[AnyStr]) -> NoReturn: - raise NotImplementedError() - - def truncate(self, size: int | None = None) -> int: - raise NotImplementedError() - - def __enter__(self) -> ContainerIO[AnyStr]: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def __iter__(self) -> ContainerIO[AnyStr]: - return self - - def __next__(self) -> AnyStr: - line = self.readline() - if not line: - msg = "end of region" - raise StopIteration(msg) - return line - - def fileno(self) -> int: - return self.fh.fileno() - - def flush(self) -> None: - self.fh.flush() - - def close(self) -> None: - self.fh.close() diff --git a/lib/python3.12/site-packages/PIL/CurImagePlugin.py b/lib/python3.12/site-packages/PIL/CurImagePlugin.py deleted file mode 100644 index c4be0ce..0000000 --- a/lib/python3.12/site-packages/PIL/CurImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Cursor support for PIL -# -# notes: -# uses BmpImagePlugin.py to read the bitmap data. -# -# history: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import BmpImagePlugin, Image, ImageFile -from ._binary import i16le as i16 -from ._binary import i32le as i32 - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"\0\0\2\0" - - -## -# Image plugin for Windows Cursor files. - - -class CurImageFile(BmpImagePlugin.BmpImageFile): - format = "CUR" - format_description = "Windows Cursor" - - def _open(self) -> None: - offset = self.fp.tell() - - # check magic - s = self.fp.read(6) - if not _accept(s): - msg = "not a CUR file" - raise SyntaxError(msg) - - # pick the largest cursor in the file - m = b"" - for i in range(i16(s, 4)): - s = self.fp.read(16) - if not m: - m = s - elif s[0] > m[0] and s[1] > m[1]: - m = s - if not m: - msg = "No cursors were found" - raise TypeError(msg) - - # load as bitmap - self._bitmap(i32(m, 12) + offset) - - # patch up the bitmap height - self._size = self.size[0], self.size[1] // 2 - d, e, o, a = self.tile[0] - self.tile[0] = ImageFile._Tile(d, (0, 0) + self.size, o, a) - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/lib/python3.12/site-packages/PIL/DcxImagePlugin.py b/lib/python3.12/site-packages/PIL/DcxImagePlugin.py deleted file mode 100644 index f67f27d..0000000 --- a/lib/python3.12/site-packages/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# DCX file handling -# -# DCX is a container file format defined by Intel, commonly used -# for fax applications. Each DCX file consists of a directory -# (a list of file offsets) followed by a set of (usually 1-bit) -# PCX files. -# -# History: -# 1995-09-09 fl Created -# 1996-03-20 fl Properly derived from PcxImageFile. -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2002-07-30 fl Fixed file handling -# -# Copyright (c) 1997-98 by Secret Labs AB. -# Copyright (c) 1995-96 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image -from ._binary import i32le as i32 -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 4 and i32(prefix) == MAGIC - - -## -# Image plugin for the Intel DCX format. - - -class DcxImageFile(PcxImageFile): - format = "DCX" - format_description = "Intel DCX" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # Header - s = self.fp.read(4) - if not _accept(s): - msg = "not a DCX file" - raise SyntaxError(msg) - - # Component directory - self._offset = [] - for i in range(1024): - offset = i32(self.fp.read(4)) - if not offset: - break - self._offset.append(offset) - - self._fp = self.fp - self.frame = -1 - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - self.frame = frame - self.fp = self._fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self) -> int: - return self.frame - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/lib/python3.12/site-packages/PIL/DdsImagePlugin.py b/lib/python3.12/site-packages/PIL/DdsImagePlugin.py deleted file mode 100644 index 1b64082..0000000 --- a/lib/python3.12/site-packages/PIL/DdsImagePlugin.py +++ /dev/null @@ -1,575 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: -https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: -https://creativecommons.org/publicdomain/zero/1.0/ -""" - -from __future__ import annotations - -import io -import struct -import sys -from enum import IntEnum, IntFlag -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - - -# DDS flags -class DDSD(IntFlag): - CAPS = 0x1 - HEIGHT = 0x2 - WIDTH = 0x4 - PITCH = 0x8 - PIXELFORMAT = 0x1000 - MIPMAPCOUNT = 0x20000 - LINEARSIZE = 0x80000 - DEPTH = 0x800000 - - -# DDS caps -class DDSCAPS(IntFlag): - COMPLEX = 0x8 - TEXTURE = 0x1000 - MIPMAP = 0x400000 - - -class DDSCAPS2(IntFlag): - CUBEMAP = 0x200 - CUBEMAP_POSITIVEX = 0x400 - CUBEMAP_NEGATIVEX = 0x800 - CUBEMAP_POSITIVEY = 0x1000 - CUBEMAP_NEGATIVEY = 0x2000 - CUBEMAP_POSITIVEZ = 0x4000 - CUBEMAP_NEGATIVEZ = 0x8000 - VOLUME = 0x200000 - - -# Pixel Format -class DDPF(IntFlag): - ALPHAPIXELS = 0x1 - ALPHA = 0x2 - FOURCC = 0x4 - PALETTEINDEXED8 = 0x20 - RGB = 0x40 - LUMINANCE = 0x20000 - - -# dxgiformat.h -class DXGI_FORMAT(IntEnum): - UNKNOWN = 0 - R32G32B32A32_TYPELESS = 1 - R32G32B32A32_FLOAT = 2 - R32G32B32A32_UINT = 3 - R32G32B32A32_SINT = 4 - R32G32B32_TYPELESS = 5 - R32G32B32_FLOAT = 6 - R32G32B32_UINT = 7 - R32G32B32_SINT = 8 - R16G16B16A16_TYPELESS = 9 - R16G16B16A16_FLOAT = 10 - R16G16B16A16_UNORM = 11 - R16G16B16A16_UINT = 12 - R16G16B16A16_SNORM = 13 - R16G16B16A16_SINT = 14 - R32G32_TYPELESS = 15 - R32G32_FLOAT = 16 - R32G32_UINT = 17 - R32G32_SINT = 18 - R32G8X24_TYPELESS = 19 - D32_FLOAT_S8X24_UINT = 20 - R32_FLOAT_X8X24_TYPELESS = 21 - X32_TYPELESS_G8X24_UINT = 22 - R10G10B10A2_TYPELESS = 23 - R10G10B10A2_UNORM = 24 - R10G10B10A2_UINT = 25 - R11G11B10_FLOAT = 26 - R8G8B8A8_TYPELESS = 27 - R8G8B8A8_UNORM = 28 - R8G8B8A8_UNORM_SRGB = 29 - R8G8B8A8_UINT = 30 - R8G8B8A8_SNORM = 31 - R8G8B8A8_SINT = 32 - R16G16_TYPELESS = 33 - R16G16_FLOAT = 34 - R16G16_UNORM = 35 - R16G16_UINT = 36 - R16G16_SNORM = 37 - R16G16_SINT = 38 - R32_TYPELESS = 39 - D32_FLOAT = 40 - R32_FLOAT = 41 - R32_UINT = 42 - R32_SINT = 43 - R24G8_TYPELESS = 44 - D24_UNORM_S8_UINT = 45 - R24_UNORM_X8_TYPELESS = 46 - X24_TYPELESS_G8_UINT = 47 - R8G8_TYPELESS = 48 - R8G8_UNORM = 49 - R8G8_UINT = 50 - R8G8_SNORM = 51 - R8G8_SINT = 52 - R16_TYPELESS = 53 - R16_FLOAT = 54 - D16_UNORM = 55 - R16_UNORM = 56 - R16_UINT = 57 - R16_SNORM = 58 - R16_SINT = 59 - R8_TYPELESS = 60 - R8_UNORM = 61 - R8_UINT = 62 - R8_SNORM = 63 - R8_SINT = 64 - A8_UNORM = 65 - R1_UNORM = 66 - R9G9B9E5_SHAREDEXP = 67 - R8G8_B8G8_UNORM = 68 - G8R8_G8B8_UNORM = 69 - BC1_TYPELESS = 70 - BC1_UNORM = 71 - BC1_UNORM_SRGB = 72 - BC2_TYPELESS = 73 - BC2_UNORM = 74 - BC2_UNORM_SRGB = 75 - BC3_TYPELESS = 76 - BC3_UNORM = 77 - BC3_UNORM_SRGB = 78 - BC4_TYPELESS = 79 - BC4_UNORM = 80 - BC4_SNORM = 81 - BC5_TYPELESS = 82 - BC5_UNORM = 83 - BC5_SNORM = 84 - B5G6R5_UNORM = 85 - B5G5R5A1_UNORM = 86 - B8G8R8A8_UNORM = 87 - B8G8R8X8_UNORM = 88 - R10G10B10_XR_BIAS_A2_UNORM = 89 - B8G8R8A8_TYPELESS = 90 - B8G8R8A8_UNORM_SRGB = 91 - B8G8R8X8_TYPELESS = 92 - B8G8R8X8_UNORM_SRGB = 93 - BC6H_TYPELESS = 94 - BC6H_UF16 = 95 - BC6H_SF16 = 96 - BC7_TYPELESS = 97 - BC7_UNORM = 98 - BC7_UNORM_SRGB = 99 - AYUV = 100 - Y410 = 101 - Y416 = 102 - NV12 = 103 - P010 = 104 - P016 = 105 - OPAQUE_420 = 106 - YUY2 = 107 - Y210 = 108 - Y216 = 109 - NV11 = 110 - AI44 = 111 - IA44 = 112 - P8 = 113 - A8P8 = 114 - B4G4R4A4_UNORM = 115 - P208 = 130 - V208 = 131 - V408 = 132 - SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 - SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 - - -class D3DFMT(IntEnum): - UNKNOWN = 0 - R8G8B8 = 20 - A8R8G8B8 = 21 - X8R8G8B8 = 22 - R5G6B5 = 23 - X1R5G5B5 = 24 - A1R5G5B5 = 25 - A4R4G4B4 = 26 - R3G3B2 = 27 - A8 = 28 - A8R3G3B2 = 29 - X4R4G4B4 = 30 - A2B10G10R10 = 31 - A8B8G8R8 = 32 - X8B8G8R8 = 33 - G16R16 = 34 - A2R10G10B10 = 35 - A16B16G16R16 = 36 - A8P8 = 40 - P8 = 41 - L8 = 50 - A8L8 = 51 - A4L4 = 52 - V8U8 = 60 - L6V5U5 = 61 - X8L8V8U8 = 62 - Q8W8V8U8 = 63 - V16U16 = 64 - A2W10V10U10 = 67 - D16_LOCKABLE = 70 - D32 = 71 - D15S1 = 73 - D24S8 = 75 - D24X8 = 77 - D24X4S4 = 79 - D16 = 80 - D32F_LOCKABLE = 82 - D24FS8 = 83 - D32_LOCKABLE = 84 - S8_LOCKABLE = 85 - L16 = 81 - VERTEXDATA = 100 - INDEX16 = 101 - INDEX32 = 102 - Q16W16V16U16 = 110 - R16F = 111 - G16R16F = 112 - A16B16G16R16F = 113 - R32F = 114 - G32R32F = 115 - A32B32G32R32F = 116 - CxV8U8 = 117 - A1 = 118 - A2B10G10R10_XR_BIAS = 119 - BINARYBUFFER = 199 - - UYVY = i32(b"UYVY") - R8G8_B8G8 = i32(b"RGBG") - YUY2 = i32(b"YUY2") - G8R8_G8B8 = i32(b"GRGB") - DXT1 = i32(b"DXT1") - DXT2 = i32(b"DXT2") - DXT3 = i32(b"DXT3") - DXT4 = i32(b"DXT4") - DXT5 = i32(b"DXT5") - DX10 = i32(b"DX10") - BC4S = i32(b"BC4S") - BC4U = i32(b"BC4U") - BC5S = i32(b"BC5S") - BC5U = i32(b"BC5U") - ATI1 = i32(b"ATI1") - ATI2 = i32(b"ATI2") - MULTI2_ARGB8 = i32(b"MET1") - - -# Backward compatibility layer -module = sys.modules[__name__] -for item in DDSD: - assert item.name is not None - setattr(module, f"DDSD_{item.name}", item.value) -for item1 in DDSCAPS: - assert item1.name is not None - setattr(module, f"DDSCAPS_{item1.name}", item1.value) -for item2 in DDSCAPS2: - assert item2.name is not None - setattr(module, f"DDSCAPS2_{item2.name}", item2.value) -for item3 in DDPF: - assert item3.name is not None - setattr(module, f"DDPF_{item3.name}", item3.value) - -DDS_FOURCC = DDPF.FOURCC -DDS_RGB = DDPF.RGB -DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS -DDS_LUMINANCE = DDPF.LUMINANCE -DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS -DDS_ALPHA = DDPF.ALPHA -DDS_PAL8 = DDPF.PALETTEINDEXED8 - -DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT -DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT -DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH -DDS_HEADER_FLAGS_PITCH = DDSD.PITCH -DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE - -DDS_HEIGHT = DDSD.HEIGHT -DDS_WIDTH = DDSD.WIDTH - -DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE -DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP -DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX - -DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX -DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX -DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY -DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY -DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ -DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ - -DXT1_FOURCC = D3DFMT.DXT1 -DXT3_FOURCC = D3DFMT.DXT3 -DXT5_FOURCC = D3DFMT.DXT5 - -DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS -DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB -DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS -DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM -DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM -DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 -DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 -DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS -DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM -DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a DDS file" - raise SyntaxError(msg) - (header_size,) = struct.unpack(" None: - pass - - -class DdsRgbDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - bitcount, masks = self.args - - # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 - # Calculate how many zeros each mask is padded with - mask_offsets = [] - # And the maximum value of each channel without the padding - mask_totals = [] - for mask in masks: - offset = 0 - if mask != 0: - while mask >> (offset + 1) << (offset + 1) == mask: - offset += 1 - mask_offsets.append(offset) - mask_totals.append(mask >> offset) - - data = bytearray() - bytecount = bitcount // 8 - dest_length = self.state.xsize * self.state.ysize * len(masks) - while len(data) < dest_length: - value = int.from_bytes(self.fd.read(bytecount), "little") - for i, mask in enumerate(masks): - masked_value = value & mask - # Remove the zero padding, and scale it to 8 bits - data += o8( - int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) - ) - self.set_as_raw(data) - return -1, 0 - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in ("RGB", "RGBA", "L", "LA"): - msg = f"cannot write mode {im.mode} as DDS" - raise OSError(msg) - - alpha = im.mode[-1] == "A" - if im.mode[0] == "L": - pixel_flags = DDPF.LUMINANCE - rawmode = im.mode - if alpha: - rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] - else: - rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] - else: - pixel_flags = DDPF.RGB - rawmode = im.mode[::-1] - rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] - - if alpha: - r, g, b, a = im.split() - im = Image.merge("RGBA", (a, r, g, b)) - if alpha: - pixel_flags |= DDPF.ALPHAPIXELS - rgba_mask.append(0xFF000000 if alpha else 0) - - flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PITCH | DDSD.PIXELFORMAT - bitcount = len(im.getbands()) * 8 - pitch = (im.width * bitcount + 7) // 8 - - fp.write( - o32(DDS_MAGIC) - + struct.pack( - "<7I", - 124, # header size - flags, # flags - im.height, - im.width, - pitch, - 0, # depth - 0, # mipmaps - ) - + struct.pack("11I", *((0,) * 11)) # reserved - # pfsize, pfflags, fourcc, bitcount - + struct.pack("<4I", 32, pixel_flags, 0, bitcount) - + struct.pack("<4I", *rgba_mask) # dwRGBABitMask - + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) - ) - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] - ) - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"DDS " - - -Image.register_open(DdsImageFile.format, DdsImageFile, _accept) -Image.register_decoder("dds_rgb", DdsRgbDecoder) -Image.register_save(DdsImageFile.format, _save) -Image.register_extension(DdsImageFile.format, ".dds") diff --git a/lib/python3.12/site-packages/PIL/EpsImagePlugin.py b/lib/python3.12/site-packages/PIL/EpsImagePlugin.py deleted file mode 100644 index fb1e301..0000000 --- a/lib/python3.12/site-packages/PIL/EpsImagePlugin.py +++ /dev/null @@ -1,474 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EPS file handling -# -# History: -# 1995-09-01 fl Created (0.1) -# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) -# 1996-08-22 fl Don't choke on floating point BoundingBox values -# 1996-08-23 fl Handle files from Macintosh (0.3) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) -# 2014-05-07 e Handling of EPS with binary preview and fixed resolution -# resizing -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import re -import subprocess -import sys -import tempfile -from typing import IO - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# -------------------------------------------------------------------- - - -split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") -field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") - -gs_binary: str | bool | None = None -gs_windows_binary = None - - -def has_ghostscript() -> bool: - global gs_binary, gs_windows_binary - if gs_binary is None: - if sys.platform.startswith("win"): - if gs_windows_binary is None: - import shutil - - for binary in ("gswin32c", "gswin64c", "gs"): - if shutil.which(binary) is not None: - gs_windows_binary = binary - break - else: - gs_windows_binary = False - gs_binary = gs_windows_binary - else: - try: - subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) - gs_binary = "gs" - except OSError: - gs_binary = False - return gs_binary is not False - - -def Ghostscript( - tile: list[ImageFile._Tile], - size: tuple[int, int], - fp: IO[bytes], - scale: int = 1, - transparency: bool = False, -) -> Image.core.ImagingCore: - """Render an image using Ghostscript""" - global gs_binary - if not has_ghostscript(): - msg = "Unable to locate Ghostscript on paths" - raise OSError(msg) - assert isinstance(gs_binary, str) - - # Unpack decoder tile - args = tile[0].args - assert isinstance(args, tuple) - length, bbox = args - - # Hack to support hi-res rendering - scale = int(scale) or 1 - width = size[0] * scale - height = size[1] * scale - # resolution is dependent on bbox and size - res_x = 72.0 * width / (bbox[2] - bbox[0]) - res_y = 72.0 * height / (bbox[3] - bbox[1]) - - out_fd, outfile = tempfile.mkstemp() - os.close(out_fd) - - infile_temp = None - if hasattr(fp, "name") and os.path.exists(fp.name): - infile = fp.name - else: - in_fd, infile_temp = tempfile.mkstemp() - os.close(in_fd) - infile = infile_temp - - # Ignore length and offset! - # Ghostscript can read it - # Copy whole file to read in Ghostscript - with open(infile_temp, "wb") as f: - # fetch length of fp - fp.seek(0, io.SEEK_END) - fsize = fp.tell() - # ensure start position - # go back - fp.seek(0) - lengthfile = fsize - while lengthfile > 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - if transparency: - # "RGBA" - device = "pngalpha" - else: - # "pnmraw" automatically chooses between - # PBM ("1"), PGM ("L"), and PPM ("RGB"). - device = "pnmraw" - - # Build Ghostscript command - command = [ - gs_binary, - "-q", # quiet mode - f"-g{width:d}x{height:d}", # set output geometry (pixels) - f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - with Image.open(outfile) as out_im: - out_im.load() - return out_im.im.copy() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) - - -## -# Image plugin for Encapsulated PostScript. This plugin supports only -# a few variants of this format. - - -class EpsImageFile(ImageFile.ImageFile): - """EPS File Parser for the Python Imaging Library""" - - format = "EPS" - format_description = "Encapsulated Postscript" - - mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} - - def _open(self) -> None: - (length, offset) = self._find_offset(self.fp) - - # go to offset - start of "%!PS" - self.fp.seek(offset) - - self._mode = "RGB" - - # When reading header comments, the first comment is used. - # When reading trailer comments, the last comment is used. - bounding_box: list[int] | None = None - imagedata_size: tuple[int, int] | None = None - - byte_arr = bytearray(255) - bytes_mv = memoryview(byte_arr) - bytes_read = 0 - reading_header_comments = True - reading_trailer_comments = False - trailer_reached = False - - def check_required_header_comments() -> None: - """ - The EPS specification requires that some headers exist. - This should be checked when the header comments formally end, - when image data starts, or when the file ends, whichever comes first. - """ - if "PS-Adobe" not in self.info: - msg = 'EPS header missing "%!PS-Adobe" comment' - raise SyntaxError(msg) - if "BoundingBox" not in self.info: - msg = 'EPS header missing "%%BoundingBox" comment' - raise SyntaxError(msg) - - def read_comment(s: str) -> bool: - nonlocal bounding_box, reading_trailer_comments - try: - m = split.match(s) - except re.error as e: - msg = "not an EPS file" - raise SyntaxError(msg) from e - - if not m: - return False - - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - if v == "(atend)": - reading_trailer_comments = True - elif not bounding_box or (trailer_reached and reading_trailer_comments): - try: - # Note: The DSC spec says that BoundingBox - # fields should be integers, but some drivers - # put floating point values there anyway. - bounding_box = [int(float(i)) for i in v.split()] - except Exception: - pass - return True - - while True: - byte = self.fp.read(1) - if byte == b"": - # if we didn't read a byte we must be at the end of the file - if bytes_read == 0: - if reading_header_comments: - check_required_header_comments() - break - elif byte in b"\r\n": - # if we read a line ending character, ignore it and parse what - # we have already read. if we haven't read any other characters, - # continue reading - if bytes_read == 0: - continue - else: - # ASCII/hexadecimal lines in an EPS file must not exceed - # 255 characters, not including line ending characters - if bytes_read >= 255: - # only enforce this for lines starting with a "%", - # otherwise assume it's binary data - if byte_arr[0] == ord("%"): - msg = "not an EPS file" - raise SyntaxError(msg) - else: - if reading_header_comments: - check_required_header_comments() - reading_header_comments = False - # reset bytes_read so we can keep reading - # data until the end of the line - bytes_read = 0 - byte_arr[bytes_read] = byte[0] - bytes_read += 1 - continue - - if reading_header_comments: - # Load EPS header - - # if this line doesn't start with a "%", - # or does start with "%%EndComments", - # then we've reached the end of the header/comments - if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": - check_required_header_comments() - reading_header_comments = False - continue - - s = str(bytes_mv[:bytes_read], "latin-1") - if not read_comment(s): - m = field.match(s) - if m: - k = m.group(1) - if k[:8] == "PS-Adobe": - self.info["PS-Adobe"] = k[9:] - else: - self.info[k] = "" - elif s[0] == "%": - # handle non-DSC PostScript comments that some - # tools mistakenly put in the Comments section - pass - else: - msg = "bad EPS header" - raise OSError(msg) - elif bytes_mv[:11] == b"%ImageData:": - # Check for an "ImageData" descriptor - # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 - - # If we've already read an "ImageData" descriptor, - # don't read another one. - if imagedata_size: - bytes_read = 0 - continue - - # Values: - # columns - # rows - # bit depth (1 or 8) - # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) - # number of padding channels - # block size (number of bytes per row per channel) - # binary/ascii (1: binary, 2: ascii) - # data start identifier (the image data follows after a single line - # consisting only of this quoted value) - image_data_values = byte_arr[11:bytes_read].split(None, 7) - columns, rows, bit_depth, mode_id = ( - int(value) for value in image_data_values[:4] - ) - - if bit_depth == 1: - self._mode = "1" - elif bit_depth == 8: - try: - self._mode = self.mode_map[mode_id] - except ValueError: - break - else: - break - - # Parse the columns and rows after checking the bit depth and mode - # in case the bit depth and/or mode are invalid. - imagedata_size = columns, rows - elif bytes_mv[:5] == b"%%EOF": - break - elif trailer_reached and reading_trailer_comments: - # Load EPS trailer - s = str(bytes_mv[:bytes_read], "latin-1") - read_comment(s) - elif bytes_mv[:9] == b"%%Trailer": - trailer_reached = True - bytes_read = 0 - - # A "BoundingBox" is always required, - # even if an "ImageData" descriptor size exists. - if not bounding_box: - msg = "cannot determine EPS bounding box" - raise OSError(msg) - - # An "ImageData" size takes precedence over the "BoundingBox". - self._size = imagedata_size or ( - bounding_box[2] - bounding_box[0], - bounding_box[3] - bounding_box[1], - ) - - self.tile = [ - ImageFile._Tile("eps", (0, 0) + self.size, offset, (length, bounding_box)) - ] - - def _find_offset(self, fp: IO[bytes]) -> tuple[int, int]: - s = fp.read(4) - - if s == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s) == 0xC6D3D0C5: - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # more info see: - # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - s = fp.read(8) - offset = i32(s) - length = i32(s, 4) - else: - msg = "not an EPS file" - raise SyntaxError(msg) - - return length, offset - - def load( - self, scale: int = 1, transparency: bool = False - ) -> Image.core.PixelAccess | None: - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self._mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, pos: int) -> None: - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -> None: - """EPS Writer for the Python Imaging Library.""" - - # make sure image data is available - im.load() - - # determine PostScript image mode - if im.mode == "L": - operator = (8, 1, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - msg = "image mode is not supported" - raise ValueError(msg) - - if eps: - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [ImageFile._Tile("eps", (0, 0) + im.size, 0, None)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- - - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/lib/python3.12/site-packages/PIL/ExifTags.py b/lib/python3.12/site-packages/PIL/ExifTags.py deleted file mode 100644 index 39b4aa5..0000000 --- a/lib/python3.12/site-packages/PIL/ExifTags.py +++ /dev/null @@ -1,381 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EXIF tags -# -# Copyright (c) 2003 by Secret Labs AB -# -# See the README file for information on usage and redistribution. -# - -""" -This module provides constants and clear-text names for various -well-known EXIF tags. -""" -from __future__ import annotations - -from enum import IntEnum - - -class Base(IntEnum): - # possibly incomplete - InteropIndex = 0x0001 - ProcessingSoftware = 0x000B - NewSubfileType = 0x00FE - SubfileType = 0x00FF - ImageWidth = 0x0100 - ImageLength = 0x0101 - BitsPerSample = 0x0102 - Compression = 0x0103 - PhotometricInterpretation = 0x0106 - Thresholding = 0x0107 - CellWidth = 0x0108 - CellLength = 0x0109 - FillOrder = 0x010A - DocumentName = 0x010D - ImageDescription = 0x010E - Make = 0x010F - Model = 0x0110 - StripOffsets = 0x0111 - Orientation = 0x0112 - SamplesPerPixel = 0x0115 - RowsPerStrip = 0x0116 - StripByteCounts = 0x0117 - MinSampleValue = 0x0118 - MaxSampleValue = 0x0119 - XResolution = 0x011A - YResolution = 0x011B - PlanarConfiguration = 0x011C - PageName = 0x011D - FreeOffsets = 0x0120 - FreeByteCounts = 0x0121 - GrayResponseUnit = 0x0122 - GrayResponseCurve = 0x0123 - T4Options = 0x0124 - T6Options = 0x0125 - ResolutionUnit = 0x0128 - PageNumber = 0x0129 - TransferFunction = 0x012D - Software = 0x0131 - DateTime = 0x0132 - Artist = 0x013B - HostComputer = 0x013C - Predictor = 0x013D - WhitePoint = 0x013E - PrimaryChromaticities = 0x013F - ColorMap = 0x0140 - HalftoneHints = 0x0141 - TileWidth = 0x0142 - TileLength = 0x0143 - TileOffsets = 0x0144 - TileByteCounts = 0x0145 - SubIFDs = 0x014A - InkSet = 0x014C - InkNames = 0x014D - NumberOfInks = 0x014E - DotRange = 0x0150 - TargetPrinter = 0x0151 - ExtraSamples = 0x0152 - SampleFormat = 0x0153 - SMinSampleValue = 0x0154 - SMaxSampleValue = 0x0155 - TransferRange = 0x0156 - ClipPath = 0x0157 - XClipPathUnits = 0x0158 - YClipPathUnits = 0x0159 - Indexed = 0x015A - JPEGTables = 0x015B - OPIProxy = 0x015F - JPEGProc = 0x0200 - JpegIFOffset = 0x0201 - JpegIFByteCount = 0x0202 - JpegRestartInterval = 0x0203 - JpegLosslessPredictors = 0x0205 - JpegPointTransforms = 0x0206 - JpegQTables = 0x0207 - JpegDCTables = 0x0208 - JpegACTables = 0x0209 - YCbCrCoefficients = 0x0211 - YCbCrSubSampling = 0x0212 - YCbCrPositioning = 0x0213 - ReferenceBlackWhite = 0x0214 - XMLPacket = 0x02BC - RelatedImageFileFormat = 0x1000 - RelatedImageWidth = 0x1001 - RelatedImageLength = 0x1002 - Rating = 0x4746 - RatingPercent = 0x4749 - ImageID = 0x800D - CFARepeatPatternDim = 0x828D - BatteryLevel = 0x828F - Copyright = 0x8298 - ExposureTime = 0x829A - FNumber = 0x829D - IPTCNAA = 0x83BB - ImageResources = 0x8649 - ExifOffset = 0x8769 - InterColorProfile = 0x8773 - ExposureProgram = 0x8822 - SpectralSensitivity = 0x8824 - GPSInfo = 0x8825 - ISOSpeedRatings = 0x8827 - OECF = 0x8828 - Interlace = 0x8829 - TimeZoneOffset = 0x882A - SelfTimerMode = 0x882B - SensitivityType = 0x8830 - StandardOutputSensitivity = 0x8831 - RecommendedExposureIndex = 0x8832 - ISOSpeed = 0x8833 - ISOSpeedLatitudeyyy = 0x8834 - ISOSpeedLatitudezzz = 0x8835 - ExifVersion = 0x9000 - DateTimeOriginal = 0x9003 - DateTimeDigitized = 0x9004 - OffsetTime = 0x9010 - OffsetTimeOriginal = 0x9011 - OffsetTimeDigitized = 0x9012 - ComponentsConfiguration = 0x9101 - CompressedBitsPerPixel = 0x9102 - ShutterSpeedValue = 0x9201 - ApertureValue = 0x9202 - BrightnessValue = 0x9203 - ExposureBiasValue = 0x9204 - MaxApertureValue = 0x9205 - SubjectDistance = 0x9206 - MeteringMode = 0x9207 - LightSource = 0x9208 - Flash = 0x9209 - FocalLength = 0x920A - Noise = 0x920D - ImageNumber = 0x9211 - SecurityClassification = 0x9212 - ImageHistory = 0x9213 - TIFFEPStandardID = 0x9216 - MakerNote = 0x927C - UserComment = 0x9286 - SubsecTime = 0x9290 - SubsecTimeOriginal = 0x9291 - SubsecTimeDigitized = 0x9292 - AmbientTemperature = 0x9400 - Humidity = 0x9401 - Pressure = 0x9402 - WaterDepth = 0x9403 - Acceleration = 0x9404 - CameraElevationAngle = 0x9405 - XPTitle = 0x9C9B - XPComment = 0x9C9C - XPAuthor = 0x9C9D - XPKeywords = 0x9C9E - XPSubject = 0x9C9F - FlashPixVersion = 0xA000 - ColorSpace = 0xA001 - ExifImageWidth = 0xA002 - ExifImageHeight = 0xA003 - RelatedSoundFile = 0xA004 - ExifInteroperabilityOffset = 0xA005 - FlashEnergy = 0xA20B - SpatialFrequencyResponse = 0xA20C - FocalPlaneXResolution = 0xA20E - FocalPlaneYResolution = 0xA20F - FocalPlaneResolutionUnit = 0xA210 - SubjectLocation = 0xA214 - ExposureIndex = 0xA215 - SensingMethod = 0xA217 - FileSource = 0xA300 - SceneType = 0xA301 - CFAPattern = 0xA302 - CustomRendered = 0xA401 - ExposureMode = 0xA402 - WhiteBalance = 0xA403 - DigitalZoomRatio = 0xA404 - FocalLengthIn35mmFilm = 0xA405 - SceneCaptureType = 0xA406 - GainControl = 0xA407 - Contrast = 0xA408 - Saturation = 0xA409 - Sharpness = 0xA40A - DeviceSettingDescription = 0xA40B - SubjectDistanceRange = 0xA40C - ImageUniqueID = 0xA420 - CameraOwnerName = 0xA430 - BodySerialNumber = 0xA431 - LensSpecification = 0xA432 - LensMake = 0xA433 - LensModel = 0xA434 - LensSerialNumber = 0xA435 - CompositeImage = 0xA460 - CompositeImageCount = 0xA461 - CompositeImageExposureTimes = 0xA462 - Gamma = 0xA500 - PrintImageMatching = 0xC4A5 - DNGVersion = 0xC612 - DNGBackwardVersion = 0xC613 - UniqueCameraModel = 0xC614 - LocalizedCameraModel = 0xC615 - CFAPlaneColor = 0xC616 - CFALayout = 0xC617 - LinearizationTable = 0xC618 - BlackLevelRepeatDim = 0xC619 - BlackLevel = 0xC61A - BlackLevelDeltaH = 0xC61B - BlackLevelDeltaV = 0xC61C - WhiteLevel = 0xC61D - DefaultScale = 0xC61E - DefaultCropOrigin = 0xC61F - DefaultCropSize = 0xC620 - ColorMatrix1 = 0xC621 - ColorMatrix2 = 0xC622 - CameraCalibration1 = 0xC623 - CameraCalibration2 = 0xC624 - ReductionMatrix1 = 0xC625 - ReductionMatrix2 = 0xC626 - AnalogBalance = 0xC627 - AsShotNeutral = 0xC628 - AsShotWhiteXY = 0xC629 - BaselineExposure = 0xC62A - BaselineNoise = 0xC62B - BaselineSharpness = 0xC62C - BayerGreenSplit = 0xC62D - LinearResponseLimit = 0xC62E - CameraSerialNumber = 0xC62F - LensInfo = 0xC630 - ChromaBlurRadius = 0xC631 - AntiAliasStrength = 0xC632 - ShadowScale = 0xC633 - DNGPrivateData = 0xC634 - MakerNoteSafety = 0xC635 - CalibrationIlluminant1 = 0xC65A - CalibrationIlluminant2 = 0xC65B - BestQualityScale = 0xC65C - RawDataUniqueID = 0xC65D - OriginalRawFileName = 0xC68B - OriginalRawFileData = 0xC68C - ActiveArea = 0xC68D - MaskedAreas = 0xC68E - AsShotICCProfile = 0xC68F - AsShotPreProfileMatrix = 0xC690 - CurrentICCProfile = 0xC691 - CurrentPreProfileMatrix = 0xC692 - ColorimetricReference = 0xC6BF - CameraCalibrationSignature = 0xC6F3 - ProfileCalibrationSignature = 0xC6F4 - AsShotProfileName = 0xC6F6 - NoiseReductionApplied = 0xC6F7 - ProfileName = 0xC6F8 - ProfileHueSatMapDims = 0xC6F9 - ProfileHueSatMapData1 = 0xC6FA - ProfileHueSatMapData2 = 0xC6FB - ProfileToneCurve = 0xC6FC - ProfileEmbedPolicy = 0xC6FD - ProfileCopyright = 0xC6FE - ForwardMatrix1 = 0xC714 - ForwardMatrix2 = 0xC715 - PreviewApplicationName = 0xC716 - PreviewApplicationVersion = 0xC717 - PreviewSettingsName = 0xC718 - PreviewSettingsDigest = 0xC719 - PreviewColorSpace = 0xC71A - PreviewDateTime = 0xC71B - RawImageDigest = 0xC71C - OriginalRawFileDigest = 0xC71D - SubTileBlockSize = 0xC71E - RowInterleaveFactor = 0xC71F - ProfileLookTableDims = 0xC725 - ProfileLookTableData = 0xC726 - OpcodeList1 = 0xC740 - OpcodeList2 = 0xC741 - OpcodeList3 = 0xC74E - NoiseProfile = 0xC761 - - -"""Maps EXIF tags to tag names.""" -TAGS = { - **{i.value: i.name for i in Base}, - 0x920C: "SpatialFrequencyResponse", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x828E: "CFAPattern", - 0x920B: "FlashEnergy", - 0x9216: "TIFF/EPStandardID", -} - - -class GPS(IntEnum): - GPSVersionID = 0 - GPSLatitudeRef = 1 - GPSLatitude = 2 - GPSLongitudeRef = 3 - GPSLongitude = 4 - GPSAltitudeRef = 5 - GPSAltitude = 6 - GPSTimeStamp = 7 - GPSSatellites = 8 - GPSStatus = 9 - GPSMeasureMode = 10 - GPSDOP = 11 - GPSSpeedRef = 12 - GPSSpeed = 13 - GPSTrackRef = 14 - GPSTrack = 15 - GPSImgDirectionRef = 16 - GPSImgDirection = 17 - GPSMapDatum = 18 - GPSDestLatitudeRef = 19 - GPSDestLatitude = 20 - GPSDestLongitudeRef = 21 - GPSDestLongitude = 22 - GPSDestBearingRef = 23 - GPSDestBearing = 24 - GPSDestDistanceRef = 25 - GPSDestDistance = 26 - GPSProcessingMethod = 27 - GPSAreaInformation = 28 - GPSDateStamp = 29 - GPSDifferential = 30 - GPSHPositioningError = 31 - - -"""Maps EXIF GPS tags to tag names.""" -GPSTAGS = {i.value: i.name for i in GPS} - - -class Interop(IntEnum): - InteropIndex = 1 - InteropVersion = 2 - RelatedImageFileFormat = 4096 - RelatedImageWidth = 4097 - RelatedImageHeight = 4098 - - -class IFD(IntEnum): - Exif = 34665 - GPSInfo = 34853 - Makernote = 37500 - Interop = 40965 - IFD1 = -1 - - -class LightSource(IntEnum): - Unknown = 0 - Daylight = 1 - Fluorescent = 2 - Tungsten = 3 - Flash = 4 - Fine = 9 - Cloudy = 10 - Shade = 11 - DaylightFluorescent = 12 - DayWhiteFluorescent = 13 - CoolWhiteFluorescent = 14 - WhiteFluorescent = 15 - StandardLightA = 17 - StandardLightB = 18 - StandardLightC = 19 - D55 = 20 - D65 = 21 - D75 = 22 - D50 = 23 - ISO = 24 - Other = 255 diff --git a/lib/python3.12/site-packages/PIL/FitsImagePlugin.py b/lib/python3.12/site-packages/PIL/FitsImagePlugin.py deleted file mode 100644 index 6bbd264..0000000 --- a/lib/python3.12/site-packages/PIL/FitsImagePlugin.py +++ /dev/null @@ -1,152 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS file handling -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import gzip -import math - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix[:6] == b"SIMPLE" - - -class FitsImageFile(ImageFile.ImageFile): - format = "FITS" - format_description = "FITS" - - def _open(self) -> None: - assert self.fp is not None - - headers: dict[bytes, bytes] = {} - header_in_progress = False - decoder_name = "" - while True: - header = self.fp.read(80) - if not header: - msg = "Truncated FITS file" - raise OSError(msg) - keyword = header[:8].strip() - if keyword in (b"SIMPLE", b"XTENSION"): - header_in_progress = True - elif headers and not header_in_progress: - # This is now a data unit - break - elif keyword == b"END": - # Seek to the end of the header unit - self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) - if not decoder_name: - decoder_name, offset, args = self._parse_headers(headers) - - header_in_progress = False - continue - - if decoder_name: - # Keep going to read past the headers - continue - - value = header[8:].split(b"/")[0].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - msg = "Not a FITS file" - raise SyntaxError(msg) - headers[keyword] = value - - if not decoder_name: - msg = "No image data" - raise ValueError(msg) - - offset += self.fp.tell() - 80 - self.tile = [ImageFile._Tile(decoder_name, (0, 0) + self.size, offset, args)] - - def _get_size( - self, headers: dict[bytes, bytes], prefix: bytes - ) -> tuple[int, int] | None: - naxis = int(headers[prefix + b"NAXIS"]) - if naxis == 0: - return None - - if naxis == 1: - return 1, int(headers[prefix + b"NAXIS1"]) - else: - return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) - - def _parse_headers( - self, headers: dict[bytes, bytes] - ) -> tuple[str, int, tuple[str | int, ...]]: - prefix = b"" - decoder_name = "raw" - offset = 0 - if ( - headers.get(b"XTENSION") == b"'BINTABLE'" - and headers.get(b"ZIMAGE") == b"T" - and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" - ): - no_prefix_size = self._get_size(headers, prefix) or (0, 0) - number_of_bits = int(headers[b"BITPIX"]) - offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) - - prefix = b"Z" - decoder_name = "fits_gzip" - - size = self._get_size(headers, prefix) - if not size: - return "", 0, () - - self._size = size - - number_of_bits = int(headers[prefix + b"BITPIX"]) - if number_of_bits == 8: - self._mode = "L" - elif number_of_bits == 16: - self._mode = "I;16" - elif number_of_bits == 32: - self._mode = "I" - elif number_of_bits in (-32, -64): - self._mode = "F" - - args: tuple[str | int, ...] - if decoder_name == "raw": - args = (self.mode, 0, -1) - else: - args = (number_of_bits,) - return decoder_name, offset, args - - -class FitsGzipDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - value = gzip.decompress(self.fd.read()) - - rows = [] - offset = 0 - number_of_bits = min(self.args[0] // 8, 4) - for y in range(self.state.ysize): - row = bytearray() - for x in range(self.state.xsize): - row += value[offset + (4 - number_of_bits) : offset + 4] - offset += 4 - rows.append(row) - self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) - return -1, 0 - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) -Image.register_decoder("fits_gzip", FitsGzipDecoder) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/lib/python3.12/site-packages/PIL/FliImagePlugin.py b/lib/python3.12/site-packages/PIL/FliImagePlugin.py deleted file mode 100644 index 666390b..0000000 --- a/lib/python3.12/site-packages/PIL/FliImagePlugin.py +++ /dev/null @@ -1,175 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# FLI/FLC file handling. -# -# History: -# 95-09-01 fl Created -# 97-01-03 fl Fixed parser, setup decoder tile -# 98-07-15 fl Renamed offset attribute to avoid name clash -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 - -# -# decoder - - -def _accept(prefix: bytes) -> bool: - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# Image plugin for the FLI/FLC animation format. Use the seek -# method to load individual frames. - - -class FliImageFile(ImageFile.ImageFile): - format = "FLI" - format_description = "Autodesk FLI/FLC Animation" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # HEAD - s = self.fp.read(128) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - msg = "not an FLI/FLC file" - raise SyntaxError(msg) - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self._mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - if magic == 0xAF11: - duration = (duration * 1000) // 70 - self.info["duration"] = duration - - # look for palette - palette = [(a, a, a) for a in range(256)] - - s = self.fp.read(16) - - self.__offset = 128 - - if i16(s, 4) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - self.fp.seek(self.__offset) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - number_of_subchunks = i16(s, 6) - chunk_size: int | None = None - for _ in range(number_of_subchunks): - if chunk_size is not None: - self.fp.seek(chunk_size - 6, os.SEEK_CUR) - s = self.fp.read(6) - chunk_type = i16(s, 4) - if chunk_type in (4, 11): - self._palette(palette, 2 if chunk_type == 11 else 0) - break - chunk_size = i32(s) - if not chunk_size: - break - - self.palette = ImagePalette.raw( - "RGB", b"".join(o8(r) + o8(g) + o8(b) for (r, g, b) in palette) - ) - - # set things up to decode first frame - self.__frame = -1 - self._fp = self.fp - self.__rewind = self.fp.tell() - self.seek(0) - - def _palette(self, palette: list[tuple[int, int, int]], shift: int) -> None: - # load palette - - i = 0 - for e in range(i16(self.fp.read(2))): - s = self.fp.read(2) - i = i + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0) - - for f in range(self.__frame + 1, frame + 1): - self._seek(f) - - def _seek(self, frame: int) -> None: - if frame == 0: - self.__frame = -1 - self._fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - self.__frame = frame - - # move to next frame - self.fp = self._fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - msg = "missing frame size" - raise EOFError(msg) - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [ImageFile._Tile("fli", (0, 0) + self.size, self.__offset, None)] - - self.__offset += framesize - - def tell(self) -> int: - return self.__frame - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/lib/python3.12/site-packages/PIL/FontFile.py b/lib/python3.12/site-packages/PIL/FontFile.py deleted file mode 100644 index 1e0c1c1..0000000 --- a/lib/python3.12/site-packages/PIL/FontFile.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# base class for raster font file parsers -# -# history: -# 1997-06-05 fl created -# 1997-08-19 fl restrict image width -# -# Copyright (c) 1997-1998 by Secret Labs AB -# Copyright (c) 1997-1998 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -from typing import BinaryIO - -from . import Image, _binary - -WIDTH = 800 - - -def puti16( - fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] -) -> None: - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap: Image.Image | None = None - - def __init__(self) -> None: - self.info: dict[bytes, bytes | int] = {} - self.glyph: list[ - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ] = [None] * 256 - - def __getitem__(self, ix: int) -> ( - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ): - return self.glyph[ix] - - def compile(self) -> None: - """Create metrics and bitmap""" - - if self.bitmap: - return - - # create bitmap large enough to hold all data - h = w = maxwidth = 0 - lines = 1 - for glyph in self.glyph: - if glyph: - d, dst, src, im = glyph - h = max(h, src[3] - src[1]) - w = w + (src[2] - src[0]) - if w > WIDTH: - lines += 1 - w = src[2] - src[0] - maxwidth = max(maxwidth, w) - - xsize = maxwidth - ysize = lines * h - - if xsize == 0 and ysize == 0: - return - - self.ysize = h - - # paste glyphs into bitmap - self.bitmap = Image.new("1", (xsize, ysize)) - self.metrics: list[ - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] - | None - ] = [None] * 256 - x = y = 0 - for i in range(256): - glyph = self[i] - if glyph: - d, dst, src, im = glyph - xx = src[2] - src[0] - x0, y0 = x, y - x = x + xx - if x > WIDTH: - x, y = 0, y + h - x0, y0 = x, y - x = xx - s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 - self.bitmap.paste(im.crop(src), s) - self.metrics[i] = d, dst, s - - def save(self, filename: str) -> None: - """Save font""" - - self.compile() - - # font data - if not self.bitmap: - msg = "No bitmap created" - raise ValueError(msg) - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: - fp.write(b"PILfont\n") - fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! - fp.write(b"DATA\n") - for id in range(256): - m = self.metrics[id] - if not m: - puti16(fp, (0,) * 10) - else: - puti16(fp, m[0] + m[1] + m[2]) diff --git a/lib/python3.12/site-packages/PIL/FpxImagePlugin.py b/lib/python3.12/site-packages/PIL/FpxImagePlugin.py deleted file mode 100644 index 8fef510..0000000 --- a/lib/python3.12/site-packages/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,257 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library. -# $Id$ -# -# FlashPix support for PIL -# -# History: -# 97-01-25 fl Created (reads uncompressed RGB images only) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# we map from colour field tuples to (mode, rawmode) descriptors -MODES = { - # opacity - (0x00007FFE,): ("A", "L"), - # monochrome - (0x00010000,): ("L", "L"), - (0x00018000, 0x00017FFE): ("RGBA", "LA"), - # photo YCC - (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), - (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), - # standard RGB (NIFRGB) - (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), - (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), -} - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for the FlashPix images. - - -class FpxImageFile(ImageFile.ImageFile): - format = "FPX" - format_description = "FlashPix" - - def _open(self) -> None: - # - # read the OLE directory and see if this is a likely - # to be a FlashPix file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an FPX file; invalid OLE file" - raise SyntaxError(msg) from e - - root = self.ole.root - if not root or root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - msg = "not an FPX file; bad root CLSID" - raise SyntaxError(msg) - - self._open_index(1) - - def _open_index(self, index: int = 1) -> None: - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\005Image Contents"] - ) - - # size (highest resolution) - - assert isinstance(prop[0x1000002], int) - assert isinstance(prop[0x1000003], int) - self._size = prop[0x1000002], prop[0x1000003] - - size = max(self.size) - i = 1 - while size > 64: - size = size // 2 - i += 1 - self.maxid = i - 1 - - # mode. instead of using a single field for this, flashpix - # requires you to specify the mode for each channel in each - # resolution subimage, and leaves it to the decoder to make - # sure that they all match. for now, we'll cheat and assume - # that this is always the case. - - id = self.maxid << 16 - - s = prop[0x2000002 | id] - - if not isinstance(s, bytes) or (bands := i32(s, 4)) > 4: - msg = "Invalid number of bands" - raise OSError(msg) - - # note: for now, we ignore the "uncalibrated" flag - colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) - - self._mode, self.rawmode = MODES[colors] - - # load JPEG tables, if any - self.jpeg = {} - for i in range(256): - id = 0x3000001 | (i << 16) - if id in prop: - self.jpeg[i] = prop[id] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "Subimage 0000 Header", - ] - - fp = self.ole.openstream(stream) - - # skip prefix - fp.read(28) - - # header stream - s = fp.read(36) - - size = i32(s, 4), i32(s, 8) - # tilecount = i32(s, 12) - tilesize = i32(s, 16), i32(s, 20) - # channels = i32(s, 24) - offset = i32(s, 28) - length = i32(s, 32) - - if size != self.size: - msg = "subimage mismatch" - raise OSError(msg) - - # get tile descriptors - fp.seek(28 + offset) - s = fp.read(i32(s, 12) * length) - - x = y = 0 - xsize, ysize = size - xtile, ytile = tilesize - self.tile = [] - - for i in range(0, len(s), length): - x1 = min(xsize, x + xtile) - y1 = min(ysize, y + ytile) - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ImageFile._Tile( - "raw", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode,), - ) - ) - - elif compression == 1: - # FIXME: the fill decoder is not implemented - self.tile.append( - ImageFile._Tile( - "fill", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - internal_color_conversion = s[14] - jpeg_tables = s[15] - rawmode = self.rawmode - - if internal_color_conversion: - # The image is stored as usual (usually YCbCr). - if rawmode == "RGBA": - # For "RGBA", data is stored as YCbCrA based on - # negative RGB. The following trick works around - # this problem : - jpegmode, rawmode = "YCbCrK", "CMYK" - else: - jpegmode = None # let the decoder decide - - else: - # The image is stored as defined by rawmode - jpegmode = rawmode - - self.tile.append( - ImageFile._Tile( - "jpeg", - (x, y, x1, y1), - i32(s, i) + 28, - (rawmode, jpegmode), - ) - ) - - # FIXME: jpeg tables are tile dependent; the prefix - # data must be placed in the tile descriptor itself! - - if jpeg_tables: - self.tile_prefix = self.jpeg[jpeg_tables] - - else: - msg = "unknown/invalid compression" - raise OSError(msg) - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self._fp = self.fp - self.fp = None - - def load(self) -> Image.core.PixelAccess | None: - if not self.fp: - self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) - - return ImageFile.ImageFile.load(self) - - def close(self) -> None: - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/lib/python3.12/site-packages/PIL/FtexImagePlugin.py b/lib/python3.12/site-packages/PIL/FtexImagePlugin.py deleted file mode 100644 index ddb469b..0000000 --- a/lib/python3.12/site-packages/PIL/FtexImagePlugin.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -A Pillow loader for .ftc and .ftu files (FTEX) -Jerome Leclanche - -The contents of this file are hereby released in the public domain (CC0) -Full text of the CC0 license: - https://creativecommons.org/publicdomain/zero/1.0/ - -Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 - -The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a -packed custom format called FTEX. This file format uses file extensions FTC -and FTU. -* FTC files are compressed textures (using standard texture compression). -* FTU files are not compressed. -Texture File Format -The FTC and FTU texture files both use the same format. This -has the following structure: -{header} -{format_directory} -{data} -Where: -{header} = { - u32:magic, - u32:version, - u32:width, - u32:height, - u32:mipmap_count, - u32:format_count -} - -* The "magic" number is "FTEX". -* "width" and "height" are the dimensions of the texture. -* "mipmap_count" is the number of mipmaps in the texture. -* "format_count" is the number of texture formats (different versions of the -same texture) in this file. - -{format_directory} = format_count * { u32:format, u32:where } - -The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB -uncompressed textures. -The texture data for a format starts at the position "where" in the file. - -Each set of texture data in the file has the following structure: -{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } -* "mipmap_size" is the number of bytes in that mip level. For compressed -textures this is the size of the texture data compressed with DXT1. For 24 bit -uncompressed textures, this is 3 * width * height. Following this are the image -bytes for that mipmap level. - -Note: All data is stored in little-Endian (Intel) byte order. -""" - -from __future__ import annotations - -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not an FTEX file" - raise SyntaxError(msg) - struct.unpack(" None: - pass - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == MAGIC - - -Image.register_open(FtexImageFile.format, FtexImageFile, _accept) -Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) diff --git a/lib/python3.12/site-packages/PIL/GbrImagePlugin.py b/lib/python3.12/site-packages/PIL/GbrImagePlugin.py deleted file mode 100644 index f319d7e..0000000 --- a/lib/python3.12/site-packages/PIL/GbrImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library -# -# load a GIMP brush file -# -# History: -# 96-03-14 fl Created -# 16-01-08 es Version 2 -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# Copyright (c) Eric Soroos 2016. -# -# See the README file for information on usage and redistribution. -# -# -# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for -# format documentation. -# -# This code Interprets version 1 and 2 .gbr files. -# Version 1 files are obsolete, and should not be used for new -# brushes. -# Version 2 files are saved by GIMP v2.8 (at least) -# Version 3 files have a format specifier of 18 for 16bit floats in -# the color depth field. This is currently unsupported by Pillow. -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - format = "GBR" - format_description = "GIMP brush file" - - def _open(self) -> None: - header_size = i32(self.fp.read(4)) - if header_size < 20: - msg = "not a GIMP brush" - raise SyntaxError(msg) - version = i32(self.fp.read(4)) - if version not in (1, 2): - msg = f"Unsupported GIMP brush version: {version}" - raise SyntaxError(msg) - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - color_depth = i32(self.fp.read(4)) - if width <= 0 or height <= 0: - msg = "not a GIMP brush" - raise SyntaxError(msg) - if color_depth not in (1, 4): - msg = f"Unsupported GIMP brush color depth: {color_depth}" - raise SyntaxError(msg) - - if version == 1: - comment_length = header_size - 20 - else: - comment_length = header_size - 28 - magic_number = self.fp.read(4) - if magic_number != b"GIMP": - msg = "not a GIMP brush, bad magic number" - raise SyntaxError(msg) - self.info["spacing"] = i32(self.fp.read(4)) - - comment = self.fp.read(comment_length)[:-1] - - if color_depth == 1: - self._mode = "L" - else: - self._mode = "RGBA" - - self._size = width, height - - self.info["comment"] = comment - - # Image might not be small - Image._decompression_bomb_check(self.size) - - # Data is an uncompressed block of w * h * bytes/pixel - self._data_size = width * height * color_depth - - def load(self) -> Image.core.PixelAccess | None: - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/lib/python3.12/site-packages/PIL/GdImageFile.py b/lib/python3.12/site-packages/PIL/GdImageFile.py deleted file mode 100644 index f1b4969..0000000 --- a/lib/python3.12/site-packages/PIL/GdImageFile.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GD file handling -# -# History: -# 1996-04-12 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - - -""" -.. note:: - This format cannot be automatically recognized, so the - class is not registered for use with :py:func:`PIL.Image.open()`. To open a - gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. - -.. warning:: - THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This - implementation is provided for convenience and demonstrational - purposes only. -""" -from __future__ import annotations - -from typing import IO - -from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._typing import StrOrBytesPath - - -class GdImageFile(ImageFile.ImageFile): - """ - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard :py:func:`PIL.Image.open()` function. To use - this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and - use the :py:func:`PIL.GdImageFile.open()` function. - """ - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(1037) - - if i16(s) not in [65534, 65535]: - msg = "Not a valid GD 2.x .gd file" - raise SyntaxError(msg) - - self._mode = "L" # FIXME: "P" - self._size = i16(s, 2), i16(s, 4) - - true_color = s[6] - true_color_offset = 2 if true_color else 0 - - # transparency index - tindex = i32(s, 7 + true_color_offset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] - ) - - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - 7 + true_color_offset + 4 + 256 * 4, - ("L", 0, 1), - ) - ] - - -def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: - """ - Load texture from a GD image file. - - :param fp: GD file name, or an opened file handle. - :param mode: Optional mode. In this version, if the mode argument - is given, it must be "r". - :returns: An image instance. - :raises OSError: If the image could not be read. - """ - if mode != "r": - msg = "bad mode" - raise ValueError(msg) - - try: - return GdImageFile(fp) - except SyntaxError as e: - msg = "cannot identify this image file" - raise UnidentifiedImageError(msg) from e diff --git a/lib/python3.12/site-packages/PIL/GifImagePlugin.py b/lib/python3.12/site-packages/PIL/GifImagePlugin.py deleted file mode 100644 index 57c2917..0000000 --- a/lib/python3.12/site-packages/PIL/GifImagePlugin.py +++ /dev/null @@ -1,1197 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# GIF file handling -# -# History: -# 1995-09-01 fl Created -# 1996-12-14 fl Added interlace support -# 1996-12-30 fl Added animation support -# 1997-01-05 fl Added write support, fixed local colour map bug -# 1997-02-23 fl Make sure to load raster data in getdata() -# 1997-07-05 fl Support external decoder (0.4) -# 1998-07-09 fl Handle all modes when saving (0.5) -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) -# 2001-04-17 fl Added palette optimization (0.7) -# 2002-06-06 fl Added transparency support for save (0.8) -# 2004-02-24 fl Disable interlacing for small images -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import math -import os -import subprocess -from enum import IntEnum -from functools import cached_property -from typing import IO, TYPE_CHECKING, Any, Literal, NamedTuple, Union - -from . import ( - Image, - ImageChops, - ImageFile, - ImageMath, - ImageOps, - ImagePalette, - ImageSequence, -) -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -if TYPE_CHECKING: - from . import _imaging - from ._typing import Buffer - - -class LoadingStrategy(IntEnum): - """.. versionadded:: 9.1.0""" - - RGB_AFTER_FIRST = 0 - RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 - RGB_ALWAYS = 2 - - -#: .. versionadded:: 9.1.0 -LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST - -# -------------------------------------------------------------------- -# Identify/read GIF files - - -def _accept(prefix: bytes) -> bool: - return prefix[:6] in [b"GIF87a", b"GIF89a"] - - -## -# Image plugin for GIF images. This plugin supports both GIF87 and -# GIF89 images. - - -class GifImageFile(ImageFile.ImageFile): - format = "GIF" - format_description = "Compuserve GIF" - _close_exclusive_fp_after_loading = False - - global_palette = None - - def data(self) -> bytes | None: - s = self.fp.read(1) - if s and s[0]: - return self.fp.read(s[0]) - return None - - def _is_palette_needed(self, p: bytes) -> bool: - for i in range(0, len(p), 3): - if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): - return True - return False - - def _open(self) -> None: - # Screen - s = self.fp.read(13) - if not _accept(s): - msg = "not a GIF file" - raise SyntaxError(msg) - - self.info["version"] = s[:6] - self._size = i16(s, 6), i16(s, 8) - self.tile = [] - flags = s[10] - bits = (flags & 7) + 1 - - if flags & 128: - # get global palette - self.info["background"] = s[11] - # check if palette contains colour indices - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - p = ImagePalette.raw("RGB", p) - self.global_palette = self.palette = p - - self._fp = self.fp # FIXME: hack - self.__rewind = self.fp.tell() - self._n_frames: int | None = None - self._seek(0) # get ready to read first frame - - @property - def n_frames(self) -> int: - if self._n_frames is None: - current = self.tell() - try: - while True: - self._seek(self.tell() + 1, False) - except EOFError: - self._n_frames = self.tell() + 1 - self.seek(current) - return self._n_frames - - @cached_property - def is_animated(self) -> bool: - if self._n_frames is not None: - return self._n_frames != 1 - - current = self.tell() - if current: - return True - - try: - self._seek(1, False) - is_animated = True - except EOFError: - is_animated = False - - self.seek(current) - return is_animated - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._im = None - self._seek(0) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in GIF file" - raise EOFError(msg) from e - - def _seek(self, frame: int, update_image: bool = True) -> None: - if frame == 0: - # rewind - self.__offset = 0 - self.dispose: _imaging.ImagingCore | None = None - self.__frame = -1 - self._fp.seek(self.__rewind) - self.disposal_method = 0 - if "comment" in self.info: - del self.info["comment"] - else: - # ensure that the previous frame was loaded - if self.tile and update_image: - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - self.fp = self._fp - if self.__offset: - # backup to last frame - self.fp.seek(self.__offset) - while self.data(): - pass - self.__offset = 0 - - s = self.fp.read(1) - if not s or s == b";": - msg = "no more images in GIF file" - raise EOFError(msg) - - palette: ImagePalette.ImagePalette | Literal[False] | None = None - - info: dict[str, Any] = {} - frame_transparency = None - interlace = None - frame_dispose_extent = None - while True: - if not s: - s = self.fp.read(1) - if not s or s == b";": - break - - elif s == b"!": - # - # extensions - # - s = self.fp.read(1) - block = self.data() - if s[0] == 249 and block is not None: - # - # graphic control extension - # - flags = block[0] - if flags & 1: - frame_transparency = block[3] - info["duration"] = i16(block, 1) * 10 - - # disposal method - find the value of bits 4 - 6 - dispose_bits = 0b00011100 & flags - dispose_bits = dispose_bits >> 2 - if dispose_bits: - # only set the dispose if it is not - # unspecified. I'm not sure if this is - # correct, but it seems to prevent the last - # frame from looking odd for some animations - self.disposal_method = dispose_bits - elif s[0] == 254: - # - # comment extension - # - comment = b"" - - # Read this comment block - while block: - comment += block - block = self.data() - - if "comment" in info: - # If multiple comment blocks in frame, separate with \n - info["comment"] += b"\n" + comment - else: - info["comment"] = comment - s = None - continue - elif s[0] == 255 and frame == 0 and block is not None: - # - # application extension - # - info["extension"] = block, self.fp.tell() - if block[:11] == b"NETSCAPE2.0": - block = self.data() - if block and len(block) >= 3 and block[0] == 1: - self.info["loop"] = i16(block, 1) - while self.data(): - pass - - elif s == b",": - # - # local image - # - s = self.fp.read(9) - - # extent - x0, y0 = i16(s, 0), i16(s, 2) - x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) - if (x1 > self.size[0] or y1 > self.size[1]) and update_image: - self._size = max(x1, self.size[0]), max(y1, self.size[1]) - Image._decompression_bomb_check(self._size) - frame_dispose_extent = x0, y0, x1, y1 - flags = s[8] - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - palette = ImagePalette.raw("RGB", p) - else: - palette = False - - # image data - bits = self.fp.read(1)[0] - self.__offset = self.fp.tell() - break - s = None - - if interlace is None: - msg = "image not found in GIF frame" - raise EOFError(msg) - - self.__frame = frame - if not update_image: - return - - self.tile = [] - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - - self._frame_palette = palette if palette is not None else self.global_palette - self._frame_transparency = frame_transparency - if frame == 0: - if self._frame_palette: - if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - self._mode = "RGBA" if frame_transparency is not None else "RGB" - else: - self._mode = "P" - else: - self._mode = "L" - - if palette: - self.palette = palette - elif self.global_palette: - from copy import copy - - self.palette = copy(self.global_palette) - else: - self.palette = None - else: - if self.mode == "P": - if ( - LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY - or palette - ): - if "transparency" in self.info: - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) - self._mode = "RGBA" - del self.info["transparency"] - else: - self._mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - - def _rgb(color: int) -> tuple[int, int, int]: - if self._frame_palette: - if color * 3 + 3 > len(self._frame_palette.palette): - color = 0 - return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) - else: - return (color, color, color) - - self.dispose = None - self.dispose_extent = frame_dispose_extent - if self.dispose_extent and self.disposal_method >= 2: - try: - if self.disposal_method == 2: - # replace with background colour - - # only dispose the extent in this frame - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - - # by convention, attempt to use transparency first - dispose_mode = "P" - color = self.info.get("transparency", frame_transparency) - if color is not None: - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(color) + (0,) - else: - color = self.info.get("background", 0) - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGB" - color = _rgb(color) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - else: - # replace with previous contents - if self._im is not None: - # only dispose the extent in this frame - self.dispose = self._crop(self.im, self.dispose_extent) - elif frame_transparency is not None: - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - dispose_mode = "P" - color = frame_transparency - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(frame_transparency) + (0,) - self.dispose = Image.core.fill( - dispose_mode, dispose_size, color - ) - except AttributeError: - pass - - if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: - self.info["transparency"] = frame_transparency - elif self.mode not in ("RGB", "RGBA"): - transparency = frame_transparency - self.tile = [ - ImageFile._Tile( - "gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, transparency), - ) - ] - - if info.get("comment"): - self.info["comment"] = info["comment"] - for k in ["duration", "extension"]: - if k in info: - self.info[k] = info[k] - elif k in self.info: - del self.info[k] - - def load_prepare(self) -> None: - temp_mode = "P" if self._frame_palette else "L" - self._prev_im = None - if self.__frame == 0: - if self._frame_transparency is not None: - self.im = Image.core.fill( - temp_mode, self.size, self._frame_transparency - ) - elif self.mode in ("RGB", "RGBA"): - self._prev_im = self.im - if self._frame_palette: - self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) - self.im.putpalette("RGB", *self._frame_palette.getdata()) - else: - self._im = None - if not self._prev_im and self._im is not None and self.size != self.im.size: - expanded_im = Image.core.fill(self.im.mode, self.size) - if self._frame_palette: - expanded_im.putpalette("RGB", *self._frame_palette.getdata()) - expanded_im.paste(self.im, (0, 0) + self.im.size) - - self.im = expanded_im - self._mode = temp_mode - self._frame_palette = None - - super().load_prepare() - - def load_end(self) -> None: - if self.__frame == 0: - if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - self._mode = "RGBA" - else: - self._mode = "RGB" - self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) - return - if not self._prev_im: - return - if self.size != self._prev_im.size: - if self._frame_transparency is not None: - expanded_im = Image.core.fill("RGBA", self.size) - else: - expanded_im = Image.core.fill("P", self.size) - expanded_im.putpalette("RGB", "RGB", self.im.getpalette()) - expanded_im = expanded_im.convert("RGB") - expanded_im.paste(self._prev_im, (0, 0) + self._prev_im.size) - - self._prev_im = expanded_im - assert self._prev_im is not None - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") - else: - frame_im = self.im.convert("RGB") - - assert self.dispose_extent is not None - frame_im = self._crop(frame_im, self.dispose_extent) - - self.im = self._prev_im - self._mode = self.im.mode - if frame_im.mode == "RGBA": - self.im.paste(frame_im, self.dispose_extent, frame_im) - else: - self.im.paste(frame_im, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - -# -------------------------------------------------------------------- -# Write GIF files - - -RAWMODE = {"1": "L", "L": "L", "P": "P"} - - -def _normalize_mode(im: Image.Image) -> Image.Image: - """ - Takes an image (or frame), returns an image in a mode that is appropriate - for saving in a Gif. - - It may return the original image, or it may return an image converted to - palette or 'L' mode. - - :param im: Image object - :returns: Image object - """ - if im.mode in RAWMODE: - im.load() - return im - if Image.getmodebase(im.mode) == "RGB": - im = im.convert("P", palette=Image.Palette.ADAPTIVE) - assert im.palette is not None - if im.palette.mode == "RGBA": - for rgba in im.palette.colors: - if rgba[3] == 0: - im.info["transparency"] = im.palette.colors[rgba] - break - return im - return im.convert("L") - - -_Palette = Union[bytes, bytearray, list[int], ImagePalette.ImagePalette] - - -def _normalize_palette( - im: Image.Image, palette: _Palette | None, info: dict[str, Any] -) -> Image.Image: - """ - Normalizes the palette for image. - - Sets the palette to the incoming palette, if provided. - - Ensures that there's a palette for L mode images - - Optimizes the palette if necessary/desired. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: Image object - """ - source_palette = None - if palette: - # a bytes palette - if isinstance(palette, (bytes, bytearray, list)): - source_palette = bytearray(palette[:768]) - if isinstance(palette, ImagePalette.ImagePalette): - source_palette = bytearray(palette.palette) - - if im.mode == "P": - if not source_palette: - im_palette = im.getpalette(None) - assert im_palette is not None - source_palette = bytearray(im_palette) - else: # L-mode - if not source_palette: - source_palette = bytearray(i // 3 for i in range(768)) - im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) - assert source_palette is not None - - if palette: - used_palette_colors: list[int | None] = [] - assert im.palette is not None - for i in range(0, len(source_palette), 3): - source_color = tuple(source_palette[i : i + 3]) - index = im.palette.colors.get(source_color) - if index in used_palette_colors: - index = None - used_palette_colors.append(index) - for i, index in enumerate(used_palette_colors): - if index is None: - for j in range(len(used_palette_colors)): - if j not in used_palette_colors: - used_palette_colors[i] = j - break - dest_map: list[int] = [] - for index in used_palette_colors: - assert index is not None - dest_map.append(index) - im = im.remap_palette(dest_map) - else: - optimized_palette_colors = _get_optimize(im, info) - if optimized_palette_colors is not None: - im = im.remap_palette(optimized_palette_colors, source_palette) - if "transparency" in info: - try: - info["transparency"] = optimized_palette_colors.index( - info["transparency"] - ) - except ValueError: - del info["transparency"] - return im - - assert im.palette is not None - im.palette.palette = source_palette - return im - - -def _write_single_frame( - im: Image.Image, - fp: IO[bytes], - palette: _Palette | None, -) -> None: - im_out = _normalize_mode(im) - for k, v in im_out.info.items(): - if isinstance(k, str): - im.encoderinfo.setdefault(k, v) - im_out = _normalize_palette(im_out, palette, im.encoderinfo) - - for s in _get_global_header(im_out, im.encoderinfo): - fp.write(s) - - # local image header - flags = 0 - if get_interlace(im): - flags = flags | 64 - _write_local_header(fp, im, (0, 0), flags) - - im_out.encoderconfig = (8, get_interlace(im)) - ImageFile._save( - im_out, fp, [ImageFile._Tile("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])] - ) - - fp.write(b"\0") # end of image data - - -def _getbbox( - base_im: Image.Image, im_frame: Image.Image -) -> tuple[Image.Image, tuple[int, int, int, int] | None]: - palette_bytes = [ - bytes(im.palette.palette) if im.palette else b"" for im in (base_im, im_frame) - ] - if palette_bytes[0] != palette_bytes[1]: - im_frame = im_frame.convert("RGBA") - base_im = base_im.convert("RGBA") - delta = ImageChops.subtract_modulo(im_frame, base_im) - return delta, delta.getbbox(alpha_only=False) - - -class _Frame(NamedTuple): - im: Image.Image - bbox: tuple[int, int, int, int] | None - encoderinfo: dict[str, Any] - - -def _write_multiple_frames( - im: Image.Image, fp: IO[bytes], palette: _Palette | None -) -> bool: - duration = im.encoderinfo.get("duration") - disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) - - im_frames: list[_Frame] = [] - previous_im: Image.Image | None = None - frame_count = 0 - background_im = None - for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): - for im_frame in ImageSequence.Iterator(imSequence): - # a copy is required here since seek can still mutate the image - im_frame = _normalize_mode(im_frame.copy()) - if frame_count == 0: - for k, v in im_frame.info.items(): - if k == "transparency": - continue - if isinstance(k, str): - im.encoderinfo.setdefault(k, v) - - encoderinfo = im.encoderinfo.copy() - if "transparency" in im_frame.info: - encoderinfo.setdefault("transparency", im_frame.info["transparency"]) - im_frame = _normalize_palette(im_frame, palette, encoderinfo) - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - frame_count += 1 - - diff_frame = None - if im_frames and previous_im: - # delta frame - delta, bbox = _getbbox(previous_im, im_frame) - if not bbox: - # This frame is identical to the previous frame - if encoderinfo.get("duration"): - im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] - continue - if im_frames[-1].encoderinfo.get("disposal") == 2: - if background_im is None: - color = im.encoderinfo.get( - "transparency", im.info.get("transparency", (0, 0, 0)) - ) - background = _get_background(im_frame, color) - background_im = Image.new("P", im_frame.size, background) - assert im_frames[0].im.palette is not None - background_im.putpalette(im_frames[0].im.palette) - bbox = _getbbox(background_im, im_frame)[1] - elif encoderinfo.get("optimize") and im_frame.mode != "1": - if "transparency" not in encoderinfo: - assert im_frame.palette is not None - try: - encoderinfo["transparency"] = ( - im_frame.palette._new_color_index(im_frame) - ) - except ValueError: - pass - if "transparency" in encoderinfo: - # When the delta is zero, fill the image with transparency - diff_frame = im_frame.copy() - fill = Image.new("P", delta.size, encoderinfo["transparency"]) - if delta.mode == "RGBA": - r, g, b, a = delta.split() - mask = ImageMath.lambda_eval( - lambda args: args["convert"]( - args["max"]( - args["max"]( - args["max"](args["r"], args["g"]), args["b"] - ), - args["a"], - ) - * 255, - "1", - ), - r=r, - g=g, - b=b, - a=a, - ) - else: - if delta.mode == "P": - # Convert to L without considering palette - delta_l = Image.new("L", delta.size) - delta_l.putdata(delta.getdata()) - delta = delta_l - mask = ImageMath.lambda_eval( - lambda args: args["convert"](args["im"] * 255, "1"), - im=delta, - ) - diff_frame.paste(fill, mask=ImageOps.invert(mask)) - else: - bbox = None - previous_im = im_frame - im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) - - if len(im_frames) == 1: - if "duration" in im.encoderinfo: - # Since multiple frames will not be written, use the combined duration - im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] - return False - - for frame_data in im_frames: - im_frame = frame_data.im - if not frame_data.bbox: - # global header - for s in _get_global_header(im_frame, frame_data.encoderinfo): - fp.write(s) - offset = (0, 0) - else: - # compress difference - if not palette: - frame_data.encoderinfo["include_color_table"] = True - - im_frame = im_frame.crop(frame_data.bbox) - offset = frame_data.bbox[:2] - _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo) - return True - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - # header - if "palette" in im.encoderinfo or "palette" in im.info: - palette = im.encoderinfo.get("palette", im.info.get("palette")) - else: - palette = None - im.encoderinfo.setdefault("optimize", True) - - if not save_all or not _write_multiple_frames(im, fp, palette): - _write_single_frame(im, fp, palette) - - fp.write(b";") # end of file - - if hasattr(fp, "flush"): - fp.flush() - - -def get_interlace(im: Image.Image) -> int: - interlace = im.encoderinfo.get("interlace", 1) - - # workaround for @PIL153 - if min(im.size) < 16: - interlace = 0 - - return interlace - - -def _write_local_header( - fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int -) -> None: - try: - transparency = im.encoderinfo["transparency"] - except KeyError: - transparency = None - - if "duration" in im.encoderinfo: - duration = int(im.encoderinfo["duration"] / 10) - else: - duration = 0 - - disposal = int(im.encoderinfo.get("disposal", 0)) - - if transparency is not None or duration != 0 or disposal: - packed_flag = 1 if transparency is not None else 0 - packed_flag |= disposal << 2 - - fp.write( - b"!" - + o8(249) # extension intro - + o8(4) # length - + o8(packed_flag) # packed fields - + o16(duration) # duration - + o8(transparency or 0) # transparency index - + o8(0) - ) - - include_color_table = im.encoderinfo.get("include_color_table") - if include_color_table: - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - if color_table_size: - flags = flags | 128 # local color table flag - flags = flags | color_table_size - - fp.write( - b"," - + o16(offset[0]) # offset - + o16(offset[1]) - + o16(im.size[0]) # size - + o16(im.size[1]) - + o8(flags) # flags - ) - if include_color_table and color_table_size: - fp.write(_get_header_palette(palette_bytes)) - fp.write(o8(8)) # bits - - -def _save_netpbm(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # Unused by default. - # To use, uncomment the register_save call at the end of the file. - # - # If you need real GIF compression and/or RGB quantization, you - # can use the external NETPBM/PBMPLUS utilities. See comments - # below for information on how to enable this. - tempfile = im._dump() - - try: - with open(filename, "wb") as f: - if im.mode != "RGB": - subprocess.check_call( - ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL - ) - else: - # Pipe ppmquant output into ppmtogif - # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) - quant_cmd = ["ppmquant", "256", tempfile] - togif_cmd = ["ppmtogif"] - quant_proc = subprocess.Popen( - quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - togif_proc = subprocess.Popen( - togif_cmd, - stdin=quant_proc.stdout, - stdout=f, - stderr=subprocess.DEVNULL, - ) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - assert quant_proc.stdout is not None - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, togif_cmd) - finally: - try: - os.unlink(tempfile) - except OSError: - pass - - -# Force optimization so that we can test performance against -# cases where it took lots of memory and time previously. -_FORCE_OPTIMIZE = False - - -def _get_optimize(im: Image.Image, info: dict[str, Any]) -> list[int] | None: - """ - Palette optimization is a potentially expensive operation. - - This function determines if the palette should be optimized using - some heuristics, then returns the list of palette entries in use. - - :param im: Image object - :param info: encoderinfo - :returns: list of indexes of palette entries in use, or None - """ - if im.mode in ("P", "L") and info and info.get("optimize"): - # Potentially expensive operation. - - # The palette saves 3 bytes per color not used, but palette - # lengths are restricted to 3*(2**N) bytes. Max saving would - # be 768 -> 6 bytes if we went all the way down to 2 colors. - # * If we're over 128 colors, we can't save any space. - # * If there aren't any holes, it's not worth collapsing. - # * If we have a 'large' image, the palette is in the noise. - - # create the new palette if not every color is used - optimise = _FORCE_OPTIMIZE or im.mode == "L" - if optimise or im.width * im.height < 512 * 512: - # check which colors are used - used_palette_colors = [] - for i, count in enumerate(im.histogram()): - if count: - used_palette_colors.append(i) - - if optimise or max(used_palette_colors) >= len(used_palette_colors): - return used_palette_colors - - assert im.palette is not None - num_palette_colors = len(im.palette.palette) // Image.getmodebands( - im.palette.mode - ) - current_palette_size = 1 << (num_palette_colors - 1).bit_length() - if ( - # check that the palette would become smaller when saved - len(used_palette_colors) <= current_palette_size // 2 - # check that the palette is not already the smallest possible size - and current_palette_size > 2 - ): - return used_palette_colors - return None - - -def _get_color_table_size(palette_bytes: bytes) -> int: - # calculate the palette size for the header - if not palette_bytes: - return 0 - elif len(palette_bytes) < 9: - return 1 - else: - return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 - - -def _get_header_palette(palette_bytes: bytes) -> bytes: - """ - Returns the palette, null padded to the next power of 2 (*3) bytes - suitable for direct inclusion in the GIF header - - :param palette_bytes: Unpadded palette bytes, in RGBRGB form - :returns: Null padded palette - """ - color_table_size = _get_color_table_size(palette_bytes) - - # add the missing amount of bytes - # the palette has to be 2< 0: - palette_bytes += o8(0) * 3 * actual_target_size_diff - return palette_bytes - - -def _get_palette_bytes(im: Image.Image) -> bytes: - """ - Gets the palette for inclusion in the gif header - - :param im: Image object - :returns: Bytes, len<=768 suitable for inclusion in gif header - """ - if not im.palette: - return b"" - - palette = bytes(im.palette.palette) - if im.palette.mode == "RGBA": - palette = b"".join(palette[i * 4 : i * 4 + 3] for i in range(len(palette) // 3)) - return palette - - -def _get_background( - im: Image.Image, - info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, -) -> int: - background = 0 - if info_background: - if isinstance(info_background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - assert im.palette is not None - try: - background = im.palette.getcolor(info_background, im) - except ValueError as e: - if str(e) not in ( - # If all 256 colors are in use, - # then there is no need for the background color - "cannot allocate more than 256 colors", - # Ignore non-opaque WebP background - "cannot add non-opaque RGBA color to RGB palette", - ): - raise - else: - background = info_background - return background - - -def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: - """Return a list of strings representing a GIF header""" - - # Header Block - # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - - version = b"87a" - if im.info.get("version") == b"89a" or ( - info - and ( - "transparency" in info - or info.get("loop") is not None - or info.get("duration") - or info.get("comment") - ) - ): - version = b"89a" - - background = _get_background(im, info.get("background")) - - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - - header = [ - b"GIF" # signature - + version # version - + o16(im.size[0]) # canvas width - + o16(im.size[1]), # canvas height - # Logical Screen Descriptor - # size of global color table + global color table flag - o8(color_table_size + 128), # packed fields - # background + reserved/aspect - o8(background) + o8(0), - # Global Color Table - _get_header_palette(palette_bytes), - ] - if info.get("loop") is not None: - header.append( - b"!" - + o8(255) # extension intro - + o8(11) - + b"NETSCAPE2.0" - + o8(3) - + o8(1) - + o16(info["loop"]) # number of loops - + o8(0) - ) - if info.get("comment"): - comment_block = b"!" + o8(254) # extension intro - - comment = info["comment"] - if isinstance(comment, str): - comment = comment.encode() - for i in range(0, len(comment), 255): - subblock = comment[i : i + 255] - comment_block += o8(len(subblock)) + subblock - - comment_block += o8(0) - header.append(comment_block) - return header - - -def _write_frame_data( - fp: IO[bytes], - im_frame: Image.Image, - offset: tuple[int, int], - params: dict[str, Any], -) -> None: - try: - im_frame.encoderinfo = params - - # local image header - _write_local_header(fp, im_frame, offset, 0) - - ImageFile._save( - im_frame, - fp, - [ImageFile._Tile("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])], - ) - - fp.write(b"\0") # end of image data - finally: - del im_frame.encoderinfo - - -# -------------------------------------------------------------------- -# Legacy GIF utilities - - -def getheader( - im: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None -) -> tuple[list[bytes], list[int] | None]: - """ - Legacy Method to get Gif data from image. - - Warning:: May modify image data. - - :param im: Image object - :param palette: bytes object containing the source palette, or .... - :param info: encoderinfo - :returns: tuple of(list of header items, optimized palette) - - """ - if info is None: - info = {} - - used_palette_colors = _get_optimize(im, info) - - if "background" not in info and "background" in im.info: - info["background"] = im.info["background"] - - im_mod = _normalize_palette(im, palette, info) - im.palette = im_mod.palette - im.im = im_mod.im - header = _get_global_header(im, info) - - return header, used_palette_colors - - -def getdata( - im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any -) -> list[bytes]: - """ - Legacy Method - - Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data. - - To specify duration, add the time in milliseconds, - e.g. ``getdata(im_frame, duration=1000)`` - - :param im: Image object - :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) - :param \\**params: e.g. duration or other encoder info parameters - :returns: List of bytes containing GIF encoded frame data - - """ - from io import BytesIO - - class Collector(BytesIO): - data = [] - - def write(self, data: Buffer) -> int: - self.data.append(data) - return len(data) - - im.load() # make sure raster data is available - - fp = Collector() - - _write_frame_data(fp, im, offset, params) - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GifImageFile.format, GifImageFile, _accept) -Image.register_save(GifImageFile.format, _save) -Image.register_save_all(GifImageFile.format, _save_all) -Image.register_extension(GifImageFile.format, ".gif") -Image.register_mime(GifImageFile.format, "image/gif") - -# -# Uncomment the following line if you wish to use NETPBM/PBMPLUS -# instead of the built-in "uncompressed" GIF encoder - -# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/lib/python3.12/site-packages/PIL/GimpGradientFile.py b/lib/python3.12/site-packages/PIL/GimpGradientFile.py deleted file mode 100644 index 220eac5..0000000 --- a/lib/python3.12/site-packages/PIL/GimpGradientFile.py +++ /dev/null @@ -1,149 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read (and render) GIMP gradient files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -""" -Stuff to translate curve segments to palette values (derived from -the corresponding code in GIMP, written by Federico Mena Quintero. -See the GIMP distribution for more information.) -""" -from __future__ import annotations - -from math import log, pi, sin, sqrt -from typing import IO, Callable - -from ._binary import o8 - -EPSILON = 1e-10 -"""""" # Enable auto-doc for data member - - -def linear(middle: float, pos: float) -> float: - if pos <= middle: - if middle < EPSILON: - return 0.0 - else: - return 0.5 * pos / middle - else: - pos = pos - middle - middle = 1.0 - middle - if middle < EPSILON: - return 1.0 - else: - return 0.5 + 0.5 * pos / middle - - -def curved(middle: float, pos: float) -> float: - return pos ** (log(0.5) / log(max(middle, EPSILON))) - - -def sine(middle: float, pos: float) -> float: - return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 - - -def sphere_increasing(middle: float, pos: float) -> float: - return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) - - -def sphere_decreasing(middle: float, pos: float) -> float: - return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) - - -SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -"""""" # Enable auto-doc for data member - - -class GradientFile: - gradient: ( - list[ - tuple[ - float, - float, - float, - list[float], - list[float], - Callable[[float, float], float], - ] - ] - | None - ) = None - - def getpalette(self, entries: int = 256) -> tuple[bytes, str]: - assert self.gradient is not None - palette = [] - - ix = 0 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - for i in range(entries): - x = i / (entries - 1) - - while x1 < x: - ix += 1 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - w = x1 - x0 - - if w < EPSILON: - scale = segment(0.5, 0.5) - else: - scale = segment((xm - x0) / w, (x - x0) / w) - - # expand to RGBA - r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) - g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) - b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) - a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) - - # add to palette - palette.append(r + g + b + a) - - return b"".join(palette), "RGBA" - - -class GimpGradientFile(GradientFile): - """File handler for GIMP's gradient format.""" - - def __init__(self, fp: IO[bytes]) -> None: - if fp.readline()[:13] != b"GIMP Gradient": - msg = "not a GIMP gradient file" - raise SyntaxError(msg) - - line = fp.readline() - - # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do - if line.startswith(b"Name: "): - line = fp.readline().strip() - - count = int(line) - - self.gradient = [] - - for i in range(count): - s = fp.readline().split() - w = [float(x) for x in s[:11]] - - x0, x1 = w[0], w[2] - xm = w[1] - rgb0 = w[3:7] - rgb1 = w[7:11] - - segment = SEGMENTS[int(s[11])] - cspace = int(s[12]) - - if cspace != 0: - msg = "cannot handle HSV colour space" - raise OSError(msg) - - self.gradient.append((x0, x1, xm, rgb0, rgb1, segment)) diff --git a/lib/python3.12/site-packages/PIL/GimpPaletteFile.py b/lib/python3.12/site-packages/PIL/GimpPaletteFile.py deleted file mode 100644 index 4cad0eb..0000000 --- a/lib/python3.12/site-packages/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read GIMP palette files -# -# History: -# 1997-08-23 fl Created -# 2004-09-07 fl Support GIMP 2.0 palette files. -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1997-2004. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from typing import IO - -from ._binary import o8 - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def __init__(self, fp: IO[bytes]) -> None: - palette = [o8(i) * 3 for i in range(256)] - - if fp.readline()[:12] != b"GIMP Palette": - msg = "not a GIMP palette file" - raise SyntaxError(msg) - - for i in range(256): - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = tuple(map(int, s.split()[:3])) - if len(v) != 3: - msg = "bad palette entry" - raise ValueError(msg) - - palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - self.palette = b"".join(palette) - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py b/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py deleted file mode 100644 index e9aa084..0000000 --- a/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# GRIB stub adapter -# -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"GRIB" and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - format = "GRIB" - format_description = "GRIB" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not a GRIB file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "GRIB save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) -Image.register_save(GribStubImageFile.format, _save) - -Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py b/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index cc9e73d..0000000 --- a/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# HDF5 stub adapter -# -# Copyright (c) 2000-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == b"\x89HDF\r\n\x1a\n" - - -class HDF5StubImageFile(ImageFile.StubImageFile): - format = "HDF5" - format_description = "HDF5" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not an HDF file" - raise SyntaxError(msg) - - self.fp.seek(offset) - - # make something up - self._mode = "F" - self._size = 1, 1 - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "HDF5 save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) -Image.register_save(HDF5StubImageFile.format, _save) - -Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py b/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py deleted file mode 100644 index 9757b2b..0000000 --- a/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,412 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# macOS icns file decoder, based on icns.py by Bob Ippolito. -# -# history: -# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. -# 2020-04-04 Allow saving on all operating systems. -# -# Copyright (c) 2004 by Bob Ippolito. -# Copyright (c) 2004 by Secret Labs. -# Copyright (c) 2004 by Fredrik Lundh. -# Copyright (c) 2014 by Alastair Houghton. -# Copyright (c) 2020 by Pan Jing. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -import sys -from typing import IO - -from . import Image, ImageFile, PngImagePlugin, features -from ._deprecate import deprecate - -enable_jpeg2k = features.check_codec("jpg_2000") -if enable_jpeg2k: - from . import Jpeg2KImagePlugin - -MAGIC = b"icns" -HEADERSIZE = 8 - - -def nextheader(fobj: IO[bytes]) -> tuple[bytes, int]: - return struct.unpack(">4sI", fobj.read(HEADERSIZE)) - - -def read_32t( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - # The 128x128 icon seems to have an extra header for some reason. - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(4) - if sig != b"\x00\x00\x00\x00": - msg = "Unknown signature, expecting 0x00000000" - raise SyntaxError(msg) - return read_32(fobj, (start + 4, length - 4), size) - - -def read_32( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - """ - Read a 32bit RGB icon resource. Seems to be either uncompressed or - an RLE packbits-like scheme. - """ - (start, length) = start_length - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - if length == sizesq * 3: - # uncompressed ("RGBRGBGB") - indata = fobj.read(length) - im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) - else: - # decode image - im = Image.new("RGB", pixel_size, None) - for band_ix in range(3): - data = [] - bytesleft = sizesq - while bytesleft > 0: - byte = fobj.read(1) - if not byte: - break - byte_int = byte[0] - if byte_int & 0x80: - blocksize = byte_int - 125 - byte = fobj.read(1) - for i in range(blocksize): - data.append(byte) - else: - blocksize = byte_int + 1 - data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: - break - if bytesleft != 0: - msg = f"Error reading channel [{repr(bytesleft)} left]" - raise SyntaxError(msg) - band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) - im.im.putband(band.im, band_ix) - return {"RGB": im} - - -def read_mk( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - # Alpha masks seem to be uncompressed - start = start_length[0] - fobj.seek(start) - pixel_size = (size[0] * size[2], size[1] * size[2]) - sizesq = pixel_size[0] * pixel_size[1] - band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) - return {"A": band} - - -def read_png_or_jpeg2000( - fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] -) -> dict[str, Image.Image]: - (start, length) = start_length - fobj.seek(start) - sig = fobj.read(12) - - im: Image.Image - if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": - fobj.seek(start) - im = PngImagePlugin.PngImageFile(fobj) - Image._decompression_bomb_check(im.size) - return {"RGBA": im} - elif ( - sig[:4] == b"\xff\x4f\xff\x51" - or sig[:4] == b"\x0d\x0a\x87\x0a" - or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ): - if not enable_jpeg2k: - msg = ( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - raise ValueError(msg) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - msg = "Unsupported icon subimage format" - raise ValueError(msg) - - -class IcnsFile: - SIZES = { - (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], - (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], - (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], - (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], - (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], - (128, 128, 1): [ - (b"ic07", read_png_or_jpeg2000), - (b"it32", read_32t), - (b"t8mk", read_mk), - ], - (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], - (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], - (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], - (32, 32, 1): [ - (b"icp5", read_png_or_jpeg2000), - (b"il32", read_32), - (b"l8mk", read_mk), - ], - (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], - (16, 16, 1): [ - (b"icp4", read_png_or_jpeg2000), - (b"is32", read_32), - (b"s8mk", read_mk), - ], - } - - def __init__(self, fobj: IO[bytes]) -> None: - """ - fobj is a file-like object as an icns resource - """ - # signature : (start, length) - self.dct = {} - self.fobj = fobj - sig, filesize = nextheader(fobj) - if not _accept(sig): - msg = "not an icns file" - raise SyntaxError(msg) - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - msg = "invalid block header" - raise SyntaxError(msg) - i += HEADERSIZE - blocksize -= HEADERSIZE - self.dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - i += blocksize - - def itersizes(self) -> list[tuple[int, int, int]]: - sizes = [] - for size, fmts in self.SIZES.items(): - for fmt, reader in fmts: - if fmt in self.dct: - sizes.append(size) - break - return sizes - - def bestsize(self) -> tuple[int, int, int]: - sizes = self.itersizes() - if not sizes: - msg = "No 32bit icon resources found" - raise SyntaxError(msg) - return max(sizes) - - def dataforsize(self, size: tuple[int, int, int]) -> dict[str, Image.Image]: - """ - Get an icon resource as {channel: array}. Note that - the arrays are bottom-up like windows bitmaps and will likely - need to be flipped or transposed in some way. - """ - dct = {} - for code, reader in self.SIZES[size]: - desc = self.dct.get(code) - if desc is not None: - dct.update(reader(self.fobj, desc, size)) - return dct - - def getimage( - self, size: tuple[int, int] | tuple[int, int, int] | None = None - ) -> Image.Image: - if size is None: - size = self.bestsize() - elif len(size) == 2: - size = (size[0], size[1], 1) - channels = self.dataforsize(size) - - im = channels.get("RGBA") - if im: - return im - - im = channels["RGB"].copy() - try: - im.putalpha(channels["A"]) - except KeyError: - pass - return im - - -## -# Image plugin for Mac OS icons. - - -class IcnsImageFile(ImageFile.ImageFile): - """ - PIL image support for Mac OS .icns files. - Chooses the best resolution, but will possibly load - a different size image if you mutate the size attribute - before calling 'load'. - - The info dictionary has a key 'sizes' that is a list - of sizes that the icns file has. - """ - - format = "ICNS" - format_description = "Mac OS icns resource" - - def _open(self) -> None: - self.icns = IcnsFile(self.fp) - self._mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property # type: ignore[override] - def size(self) -> tuple[int, int] | tuple[int, int, int]: - return self._size - - @size.setter - def size(self, value: tuple[int, int] | tuple[int, int, int]) -> None: - if len(value) == 3: - deprecate("Setting size to (width, height, scale)", 12, "load(scale)") - if value in self.info["sizes"]: - self._size = value # type: ignore[assignment] - return - else: - # Check that a matching size exists, - # or that there is a scale that would create a size that matches - for size in self.info["sizes"]: - simple_size = size[0] * size[2], size[1] * size[2] - scale = simple_size[0] // value[0] - if simple_size[1] / value[1] == scale: - self._size = value - return - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - - def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: - if scale is not None or len(self.size) == 3: - if scale is None and len(self.size) == 3: - scale = self.size[2] - assert scale is not None - width, height = self.size[:2] - self.size = width * scale, height * scale - self.best_size = width, height, scale - - px = Image.Image.load(self) - if self._im is not None and self.im.size == self.size: - # Already loaded - return px - self.load_prepare() - # This is likely NOT the best way to do it, but whatever. - im = self.icns.getimage(self.best_size) - - # If this is a PNG or JPEG 2000, it won't be loaded yet - px = im.load() - - self.im = im.im - self._mode = im.mode - self.size = im.size - - return px - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append((type, HEADERSIZE + len(stream), stream)) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry[1] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - - # Data - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - fp.write(entry[2]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == MAGIC - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - width, height, scale = imf.size = size - imf.save(f"out-{width}-{height}-{scale}.png") - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/lib/python3.12/site-packages/PIL/IcoImagePlugin.py b/lib/python3.12/site-packages/PIL/IcoImagePlugin.py deleted file mode 100644 index e879f18..0000000 --- a/lib/python3.12/site-packages/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,381 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Windows Icon support for PIL -# -# History: -# 96-05-27 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis -# . -# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki -# -# Icon format references: -# * https://en.wikipedia.org/wiki/ICO_(file_format) -# * https://msdn.microsoft.com/en-us/library/ms997538.aspx -from __future__ import annotations - -import warnings -from io import BytesIO -from math import ceil, log -from typing import IO, NamedTuple - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, - image_io, - [ImageFile._Tile("raw", (0, 0) + size, 0, ("1", 0, -1))], - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == _MAGIC - - -class IconHeader(NamedTuple): - width: int - height: int - nb_color: int - reserved: int - planes: int - bpp: int - size: int - offset: int - dim: tuple[int, int] - square: int - color_depth: int - - -class IcoFile: - def __init__(self, buf: IO[bytes]) -> None: - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - msg = "not an ICO file" - raise SyntaxError(msg) - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - # See Wikipedia - width = s[0] or 256 - height = s[1] or 256 - - # No. of colors in image (0 if >=8bpp) - nb_color = s[2] - bpp = i16(s, 6) - icon_header = IconHeader( - width=width, - height=height, - nb_color=nb_color, - reserved=s[3], - planes=i16(s, 4), - bpp=i16(s, 6), - size=i32(s, 8), - offset=i32(s, 12), - dim=(width, height), - square=width * height, - # See Wikipedia notes about color depth. - # We need this just to differ images with equal sizes - color_depth=bpp or (nb_color != 0 and ceil(log(nb_color, 2))) or 256, - ) - - self.entry.append(icon_header) - - self.entry = sorted(self.entry, key=lambda x: x.color_depth) - # ICO images are usually squares - self.entry = sorted(self.entry, key=lambda x: x.square, reverse=True) - - def sizes(self) -> set[tuple[int, int]]: - """ - Get a set of all available icon sizes and color depths. - """ - return {(h.width, h.height) for h in self.entry} - - def getentryindex(self, size: tuple[int, int], bpp: int | bool = False) -> int: - for i, h in enumerate(self.entry): - if size == h.dim and (bpp is False or bpp == h.color_depth): - return i - return 0 - - def getimage(self, size: tuple[int, int], bpp: int | bool = False) -> Image.Image: - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx: int) -> Image.Image: - """ - Get an image from frame idx - """ - - header = self.entry[idx] - - self.buf.seek(header.offset) - data = self.buf.read(8) - self.buf.seek(header.offset) - - im: Image.Image - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # change tile dimension to only encompass XOR image - im._size = (im.size[0], int(im.size[1] / 2)) - d, e, o, a = im.tile[0] - im.tile[0] = ImageFile._Tile(d, (0, 0) + im.size, o, a) - - # figure out where AND mask image starts - if header.bpp == 32: - # 32-bit color depth icon image allows semitransparent areas - # PIL's DIB format ignores transparency bits, recover them. - # The DIB is packed in BGRX byte order where X is the alpha - # channel. - - # Back up to start of bmp data - self.buf.seek(o) - # extract every 4th byte (eg. 3,7,11,15,...) - alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] - - # convert to an 8bpp grayscale image - try: - mask = Image.frombuffer( - "L", # 8bpp - im.size, # (w, h) - alpha_bytes, # source chars - "raw", # raw decoder - ("L", 0, -1), # 8bpp inverted, unpadded, reversed - ) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - mask = None - else: - raise - else: - # get AND image from end of bitmap - w = im.size[0] - if (w % 32) > 0: - # bitmap row data is aligned to word boundaries - w += 32 - (im.size[0] % 32) - - # the total mask data is - # padded row size * height / bits per char - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header.offset + header.size - total_bytes - - self.buf.seek(and_mask_offset) - mask_data = self.buf.read(total_bytes) - - # convert raw data to image - try: - mask = Image.frombuffer( - "1", # 1 bpp - im.size, # (w, h) - mask_data, # source chars - "raw", # raw decoder - ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed - ) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - mask = None - else: - raise - - # now we have two images, im is XOR image and mask is AND image - - # apply mask image as alpha channel - if mask: - im = im.convert("RGBA") - im.putalpha(mask) - - return im - - -## -# Image plugin for Windows Icon files. - - -class IcoImageFile(ImageFile.ImageFile): - """ - PIL read-only image support for Microsoft Windows .ico files. - - By default the largest resolution image in the file will be loaded. This - can be changed by altering the 'size' attribute before calling 'load'. - - The info dictionary has a key 'sizes' that is a list of the sizes available - in the icon file. - - Handles classic, XP and Vista icon formats. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis - . - https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki - """ - - format = "ICO" - format_description = "Windows Icon" - - def _open(self) -> None: - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0].dim - self.load() - - @property - def size(self) -> tuple[int, int]: - return self._size - - @size.setter - def size(self, value: tuple[int, int]) -> None: - if value not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - def load(self) -> Image.core.PixelAccess | None: - if self._im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.load(self) - im = self.ico.getimage(self.size) - # if tile is PNG, it won't really be loaded yet - im.load() - self.im = im.im - self._mode = im.mode - if im.palette: - self.palette = im.palette - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - return None - - def load_seek(self, pos: int) -> None: - # Flag the ImageFile.Parser so that it - # just does all the decode at the end. - pass - - -# -# -------------------------------------------------------------------- - - -Image.register_open(IcoImageFile.format, IcoImageFile, _accept) -Image.register_save(IcoImageFile.format, _save) -Image.register_extension(IcoImageFile.format, ".ico") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/lib/python3.12/site-packages/PIL/ImImagePlugin.py b/lib/python3.12/site-packages/PIL/ImImagePlugin.py deleted file mode 100644 index f9f4734..0000000 --- a/lib/python3.12/site-packages/PIL/ImImagePlugin.py +++ /dev/null @@ -1,386 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IFUNC IM file handling for PIL -# -# history: -# 1995-09-01 fl Created. -# 1997-01-03 fl Save palette images -# 1997-01-08 fl Added sequence support -# 1997-01-23 fl Added P and RGB save support -# 1997-05-31 fl Read floating point images -# 1997-06-22 fl Save floating point images -# 1997-08-27 fl Read and save 1-bit images -# 1998-06-25 fl Added support for RGB+LUT images -# 1998-07-02 fl Added support for YCC images -# 1998-07-15 fl Renamed offset attribute to avoid name clash -# 1998-12-29 fl Added I;16 support -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# 2003-09-26 fl Added LA/PA support -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -import re -from typing import IO, Any - -from . import Image, ImageFile, ImagePalette - -# -------------------------------------------------------------------- -# Standard tags - -COMMENT = "Comment" -DATE = "Date" -EQUIPMENT = "Digitalization equipment" -FRAMES = "File size (no of images)" -LUT = "Lut" -NAME = "Name" -SCALE = "Scale (x,y)" -SIZE = "Image size (x*y)" -MODE = "Image type" - -TAGS = { - COMMENT: 0, - DATE: 0, - EQUIPMENT: 0, - FRAMES: 0, - LUT: 0, - NAME: 0, - SCALE: 0, - SIZE: 0, - MODE: 0, -} - -OPEN = { - # ifunc93/p3cfunc formats - "0 1 image": ("1", "1"), - "L 1 image": ("1", "1"), - "Greyscale image": ("L", "L"), - "Grayscale image": ("L", "L"), - "RGB image": ("RGB", "RGB;L"), - "RLB image": ("RGB", "RLB"), - "RYB image": ("RGB", "RLB"), - "B1 image": ("1", "1"), - "B2 image": ("P", "P;2"), - "B4 image": ("P", "P;4"), - "X 24 image": ("RGB", "RGB"), - "L 32 S image": ("I", "I;32"), - "L 32 F image": ("F", "F;32"), - # old p3cfunc formats - "RGB3 image": ("RGB", "RGB;T"), - "RYB3 image": ("RGB", "RYB;T"), - # extensions - "LA image": ("LA", "LA;L"), - "PA image": ("LA", "PA;L"), - "RGBA image": ("RGBA", "RGBA;L"), - "RGBX image": ("RGB", "RGBX;L"), - "CMYK image": ("CMYK", "CMYK;L"), - "YCC image": ("YCbCr", "YCbCr;L"), -} - -# ifunc95 extensions -for i in ["8", "8S", "16", "16S", "32", "32F"]: - OPEN[f"L {i} image"] = ("F", f"F;{i}") - OPEN[f"L*{i} image"] = ("F", f"F;{i}") -for i in ["16", "16L", "16B"]: - OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") - OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") -for i in ["32S"]: - OPEN[f"L {i} image"] = ("I", f"I;{i}") - OPEN[f"L*{i} image"] = ("I", f"I;{i}") -for j in range(2, 33): - OPEN[f"L*{j} image"] = ("F", f"F;{j}") - - -# -------------------------------------------------------------------- -# Read IM directory - -split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") - - -def number(s: Any) -> float: - try: - return int(s) - except ValueError: - return float(s) - - -## -# Image plugin for the IFUNC IM file format. - - -class ImImageFile(ImageFile.ImageFile): - format = "IM" - format_description = "IFUNC Image Memory" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # Quick rejection: if there's not an LF among the first - # 100 bytes, this is (probably) not a text header. - - if b"\n" not in self.fp.read(100): - msg = "not an IM file" - raise SyntaxError(msg) - self.fp.seek(0) - - n = 0 - - # Default values - self.info[MODE] = "L" - self.info[SIZE] = (512, 512) - self.info[FRAMES] = 1 - - self.rawmode = "L" - - while True: - s = self.fp.read(1) - - # Some versions of IFUNC uses \n\r instead of \r\n... - if s == b"\r": - continue - - if not s or s == b"\0" or s == b"\x1A": - break - - # FIXME: this may read whole file if not a text file - s = s + self.fp.readline() - - if len(s) > 100: - msg = "not an IM file" - raise SyntaxError(msg) - - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] == b"\n": - s = s[:-1] - - try: - m = split.match(s) - except re.error as e: - msg = "not an IM file" - raise SyntaxError(msg) from e - - if m: - k, v = m.group(1, 2) - - # Don't know if this is the correct encoding, - # but a decent guess (I guess) - k = k.decode("latin-1", "replace") - v = v.decode("latin-1", "replace") - - # Convert value as appropriate - if k in [FRAMES, SCALE, SIZE]: - v = v.replace("*", ",") - v = tuple(map(number, v.split(","))) - if len(v) == 1: - v = v[0] - elif k == MODE and v in OPEN: - v, self.rawmode = OPEN[v] - - # Add to dictionary. Note that COMMENT tags are - # combined into a list of strings. - if k == COMMENT: - if k in self.info: - self.info[k].append(v) - else: - self.info[k] = [v] - else: - self.info[k] = v - - if k in TAGS: - n += 1 - - else: - msg = f"Syntax error in IM header: {s.decode('ascii', 'replace')}" - raise SyntaxError(msg) - - if not n: - msg = "Not an IM file" - raise SyntaxError(msg) - - # Basic attributes - self._size = self.info[SIZE] - self._mode = self.info[MODE] - - # Skip forward to start of image data - while s and s[:1] != b"\x1A": - s = self.fp.read(1) - if not s: - msg = "File truncated" - raise SyntaxError(msg) - - if LUT in self.info: - # convert lookup table to palette or lut attribute - palette = self.fp.read(768) - greyscale = 1 # greyscale palette - linear = 1 # linear greyscale palette - for i in range(256): - if palette[i] == palette[i + 256] == palette[i + 512]: - if palette[i] != i: - linear = 0 - else: - greyscale = 0 - if self.mode in ["L", "LA", "P", "PA"]: - if greyscale: - if not linear: - self.lut = list(palette[:256]) - else: - if self.mode in ["L", "P"]: - self._mode = self.rawmode = "P" - elif self.mode in ["LA", "PA"]: - self._mode = "PA" - self.rawmode = "PA;L" - self.palette = ImagePalette.raw("RGB;L", palette) - elif self.mode == "RGB": - if not greyscale or not linear: - self.lut = list(palette) - - self.frame = 0 - - self.__offset = offs = self.fp.tell() - - self._fp = self.fp # FIXME: hack - - if self.rawmode[:2] == "F;": - # ifunc95 formats - try: - # use bit decoder (if necessary) - bits = int(self.rawmode[2:]) - if bits not in [8, 16, 32]: - self.tile = [ - ImageFile._Tile( - "bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1) - ) - ] - return - except ValueError: - pass - - if self.rawmode in ["RGB;T", "RYB;T"]: - # Old LabEye/3PC files. Would be very surprised if anyone - # ever stumbled upon such a file ;-) - size = self.size[0] * self.size[1] - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, ("G", 0, -1)), - ImageFile._Tile("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), - ImageFile._Tile( - "raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1) - ), - ] - else: - # LabEye/IFUNC files - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) - ] - - @property - def n_frames(self) -> int: - return self.info[FRAMES] - - @property - def is_animated(self) -> bool: - return self.info[FRAMES] > 1 - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - - self.frame = frame - - if self.mode == "1": - bits = 1 - else: - bits = 8 * len(self.mode) - - size = ((self.size[0] * bits + 7) // 8) * self.size[1] - offs = self.__offset + frame * size - - self.fp = self._fp - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) - ] - - def tell(self) -> int: - return self.frame - - -# -# -------------------------------------------------------------------- -# Save IM files - - -SAVE = { - # mode: (im type, raw mode) - "1": ("0 1", "1"), - "L": ("Greyscale", "L"), - "LA": ("LA", "LA;L"), - "P": ("Greyscale", "P"), - "PA": ("LA", "PA;L"), - "I": ("L 32S", "I;32S"), - "I;16": ("L 16", "I;16"), - "I;16L": ("L 16L", "I;16L"), - "I;16B": ("L 16B", "I;16B"), - "F": ("L 32F", "F;32F"), - "RGB": ("RGB", "RGB;L"), - "RGBA": ("RGBA", "RGBA;L"), - "RGBX": ("RGBX", "RGBX;L"), - "CMYK": ("CMYK", "CMYK;L"), - "YCbCr": ("YCC", "YCbCr;L"), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - image_type, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as IM" - raise ValueError(msg) from e - - frames = im.encoderinfo.get("frames", 1) - - fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) - if filename: - # Each line must be 100 characters or less, - # or: SyntaxError("not an IM file") - # 8 characters are used for "Name: " and "\r\n" - # Keep just the filename, ditch the potentially overlong path - if isinstance(filename, bytes): - filename = filename.decode("ascii") - name, ext = os.path.splitext(os.path.basename(filename)) - name = "".join([name[: 92 - len(ext)], ext]) - - fp.write(f"Name: {name}\r\n".encode("ascii")) - fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) - fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) - if im.mode in ["P", "PA"]: - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511 - fp.tell()) + b"\032") - if im.mode in ["P", "PA"]: - im_palette = im.im.getpalette("RGB", "RGB;L") - colors = len(im_palette) // 3 - palette = b"" - for i in range(3): - palette += im_palette[colors * i : colors * (i + 1)] - palette += b"\x00" * (256 - colors) - fp.write(palette) # 768 bytes - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))] - ) - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(ImImageFile.format, ImImageFile) -Image.register_save(ImImageFile.format, _save) - -Image.register_extension(ImImageFile.format, ".im") diff --git a/lib/python3.12/site-packages/PIL/Image.py b/lib/python3.12/site-packages/PIL/Image.py deleted file mode 100644 index 4427039..0000000 --- a/lib/python3.12/site-packages/PIL/Image.py +++ /dev/null @@ -1,4198 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# the Image class wrapper -# -# partial release history: -# 1995-09-09 fl Created -# 1996-03-11 fl PIL release 0.0 (proof of concept) -# 1996-04-30 fl PIL release 0.1b1 -# 1999-07-28 fl PIL release 1.0 final -# 2000-06-07 fl PIL release 1.1 -# 2000-10-20 fl PIL release 1.1.1 -# 2001-05-07 fl PIL release 1.1.2 -# 2002-03-15 fl PIL release 1.1.3 -# 2003-05-10 fl PIL release 1.1.4 -# 2005-03-28 fl PIL release 1.1.5 -# 2006-12-02 fl PIL release 1.1.6 -# 2009-11-15 fl PIL release 1.1.7 -# -# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-2009 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -import abc -import atexit -import builtins -import io -import logging -import math -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, Iterator, MutableMapping, Sequence -from enum import IntEnum -from types import ModuleType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Literal, - Protocol, - cast, -) - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ( - ExifTags, - ImageMode, - TiffTags, - UnidentifiedImageError, - __version__, - _plugins, -) -from ._binary import i32le, o32be, o32le -from ._deprecate import deprecate -from ._util import DeferredError, is_path - -ElementTree: ModuleType | None -try: - from defusedxml import ElementTree -except ImportError: - ElementTree = None - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -WARN_POSSIBLE_FORMATS: bool = False - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) - - -try: - # If the _imaging C module is not present, Pillow will not load. - # Note that other modules should not refer to _imaging directly; - # import Image and use the Image.core variable instead. - # Also note that Image.core is not a publicly documented interface, - # and should be considered private and subject to change. - from . import _imaging as core - - if __version__ != getattr(core, "PILLOW_VERSION", None): - msg = ( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - raise ImportError(msg) - -except ImportError as v: - core = DeferredError.new(ImportError("The _imaging C module is not installed.")) - # Explanations for ways that we know we might have an import error - if str(v).startswith("Module use of python"): - # The _imaging C module is present, but not compiled for - # the right version (windows only). Print a warning, if - # possible. - warnings.warn( - "The _imaging extension was built for another version of Python.", - RuntimeWarning, - ) - elif str(v).startswith("The _imaging extension"): - warnings.warn(str(v), RuntimeWarning) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -def isImageType(t: Any) -> TypeGuard[Image]: - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - deprecate("Image.isImageType(im)", 12, "isinstance(im, Image.Image)") - return hasattr(t, "im") - - -# -# Constants - - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -module = sys.modules[__name__] -for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - for item in enum: - setattr(module, item.name, item.value) - - -if hasattr(core, "DEFAULT_STRATEGY"): - DEFAULT_STRATEGY = core.DEFAULT_STRATEGY - FILTERED = core.FILTERED - HUFFMAN_ONLY = core.HUFFMAN_ONLY - RLE = core.RLE - FIXED = core.FIXED - - -# -------------------------------------------------------------------- -# Registries - -if TYPE_CHECKING: - import mmap - from xml.etree.ElementTree import Element - - from IPython.lib.pretty import PrettyPrinter - - from . import ImageFile, ImageFilter, ImagePalette, ImageQt, TiffImagePlugin - from ._typing import CapsuleType, NumpyArray, StrOrBytesPath, TypeGuard -ID: list[str] = [] -OPEN: dict[ - str, - tuple[ - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - Callable[[bytes], bool | str] | None, - ], -] = {} -MIME: dict[str, str] = {} -SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -EXTENSION: dict[str, str] = {} -DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} -ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im: Image) -> tuple[tuple[int, ...], str]: - m = ImageMode.getmode(im.mode) - shape: tuple[int, ...] = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = [ - "1", - "CMYK", - "F", - "HSV", - "I", - "I;16", - "I;16B", - "I;16L", - "I;16N", - "L", - "LA", - "La", - "LAB", - "P", - "PA", - "RGB", - "RGBA", - "RGBa", - "RGBX", - "YCbCr", -] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode: str) -> str: - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode: str) -> str: - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode: str) -> tuple[str, ...]: - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode: str) -> int: - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit() -> None: - """ - Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. - - It is called when opening or saving images. - """ - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - - _initialized = 1 - - -def init() -> bool: - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - - It is called when opening or saving images if :py:meth:`~preinit()` is - insufficient, and by :py:meth:`~PIL.features.pilinfo`. - """ - - global _initialized - if _initialized >= 2: - return False - - parent_name = __name__.rpartition(".")[0] - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"{parent_name}.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return True - return False - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder( - mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingDecoder | ImageFile.PyDecoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, f"{decoder_name}_decoder") - except AttributeError as e: - msg = f"decoder {decoder_name} not available" - raise OSError(msg) from e - return decoder(mode, *args + extra) - - -def _getencoder( - mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingEncoder | ImageFile.PyEncoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, f"{encoder_name}_encoder") - except AttributeError as e: - msg = f"encoder {encoder_name} not available" - raise OSError(msg) from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -class ImagePointTransform: - """ - Used with :py:meth:`~PIL.Image.Image.point` for single band images with more than - 8 bits, this represents an affine transformation, where the value is multiplied by - ``scale`` and ``offset`` is added. - """ - - def __init__(self, scale: float, offset: float) -> None: - self.scale = scale - self.offset = offset - - def __neg__(self) -> ImagePointTransform: - return ImagePointTransform(-self.scale, -self.offset) - - def __add__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return ImagePointTransform( - self.scale + other.scale, self.offset + other.offset - ) - return ImagePointTransform(self.scale, self.offset + other) - - __radd__ = __add__ - - def __sub__(self, other: ImagePointTransform | float) -> ImagePointTransform: - return self + -other - - def __rsub__(self, other: ImagePointTransform | float) -> ImagePointTransform: - return other + -self - - def __mul__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return NotImplemented - return ImagePointTransform(self.scale * other, self.offset * other) - - __rmul__ = __mul__ - - def __truediv__(self, other: ImagePointTransform | float) -> ImagePointTransform: - if isinstance(other, ImagePointTransform): - return NotImplemented - return ImagePointTransform(self.scale / other, self.offset / other) - - -def _getscaleoffset( - expr: Callable[[ImagePointTransform], ImagePointTransform | float] -) -> tuple[float, float]: - a = expr(ImagePointTransform(1, 0)) - return (a.scale, a.offset) if isinstance(a, ImagePointTransform) else (0, a) - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class SupportsGetData(Protocol): - def getdata( - self, - ) -> tuple[Transform, Sequence[int]]: ... - - -class Image: - """ - This class represents an image object. To create - :py:class:`~PIL.Image.Image` objects, use the appropriate factory - functions. There's hardly ever any reason to call the Image constructor - directly. - - * :py:func:`~PIL.Image.open` - * :py:func:`~PIL.Image.new` - * :py:func:`~PIL.Image.frombytes` - """ - - format: str | None = None - format_description: str | None = None - _close_exclusive_fp_after_loading = True - - def __init__(self) -> None: - # FIXME: take "new" parameters / other image? - # FIXME: turn mode and size into delegating properties? - self._im: core.ImagingCore | DeferredError | None = None - self._mode = "" - self._size = (0, 0) - self.palette: ImagePalette.ImagePalette | None = None - self.info: dict[str | tuple[int, int], Any] = {} - self.readonly = 0 - self._exif: Exif | None = None - - @property - def im(self) -> core.ImagingCore: - if isinstance(self._im, DeferredError): - raise self._im.ex - assert self._im is not None - return self._im - - @im.setter - def im(self, im: core.ImagingCore) -> None: - self._im = im - - @property - def width(self) -> int: - return self.size[0] - - @property - def height(self) -> int: - return self.size[1] - - @property - def size(self) -> tuple[int, int]: - return self._size - - @property - def mode(self) -> str: - return self._mode - - def _new(self, im: core.ImagingCore) -> Image: - new = Image() - new.im = im - new._mode = im.mode - new._size = im.size - if im.mode in ("P", "PA"): - if self.palette: - new.palette = self.palette.copy() - else: - from . import ImagePalette - - new.palette = ImagePalette.ImagePalette() - new.info = self.info.copy() - return new - - # Context manager support - def __enter__(self): - return self - - def _close_fp(self): - if getattr(self, "_fp", False): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - - def __exit__(self, *args): - if hasattr(self, "fp"): - if getattr(self, "_exclusive_fp", False): - self._close_fp() - self.fp = None - - def close(self) -> None: - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release its memory. - The image data will be unusable afterward. - - This function is required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - if hasattr(self, "fp"): - try: - self._close_fp() - self.fp = None - except Exception as msg: - logger.debug("Error closing: %s", msg) - - if getattr(self, "map", None): - self.map: mmap.mmap | None = None - - # Instead of simply setting to None, we're setting up a - # deferred error that will better explain that the core image - # object is gone. - self._im = DeferredError(ValueError("Operation on closed image")) - - def _copy(self) -> None: - self.load() - self.im = self.im.copy() - self.readonly = 0 - - def _ensure_mutable(self) -> None: - if self.readonly: - self._copy() - else: - self.load() - - def _dump( - self, file: str | None = None, format: str | None = None, **options: Any - ) -> str: - suffix = "" - if format: - suffix = f".{format}" - - if not file: - f, filename = tempfile.mkstemp(suffix) - os.close(f) - else: - filename = file - if not filename.endswith(suffix): - filename = filename + suffix - - self.load() - - if not format or format == "PPM": - self.im.save_ppm(filename) - else: - self.save(filename, format, **options) - - return filename - - def __eq__(self, other: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, Image) - return ( - self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self) -> str: - return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - id(self), - ) - - def _repr_pretty_(self, p: PrettyPrinter, cycle: bool) -> None: - """IPython plain text display support""" - - # Same as __repr__ but without unpredictable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - "<%s.%s image mode=%s size=%dx%d>" - % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - ) - ) - - def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: - """Helper function for iPython display hook. - - :param image_format: Image format. - :returns: image as bytes, saved into the given format. - """ - b = io.BytesIO() - try: - self.save(b, image_format, **kwargs) - except Exception: - return None - return b.getvalue() - - def _repr_png_(self) -> bytes | None: - """iPython display hook support for PNG format. - - :returns: PNG version of the image as bytes - """ - return self._repr_image("PNG", compress_level=1) - - def _repr_jpeg_(self) -> bytes | None: - """iPython display hook support for JPEG format. - - :returns: JPEG version of the image as bytes - """ - return self._repr_image("JPEG") - - @property - def __array_interface__(self) -> dict[str, str | bytes | int | tuple[int, ...]]: - # numpy array interface support - new: dict[str, str | bytes | int | tuple[int, ...]] = {"version": 3} - if self.mode == "1": - # Binary images need to be extended from bits to bytes - # See: https://github.com/python-pillow/Pillow/issues/350 - new["data"] = self.tobytes("raw", "L") - else: - new["data"] = self.tobytes() - new["shape"], new["typestr"] = _conv_type_shape(self) - return new - - def __getstate__(self) -> list[Any]: - im_data = self.tobytes() # load image first - return [self.info, self.mode, self.size, self.getpalette(), im_data] - - def __setstate__(self, state: list[Any]) -> None: - Image.__init__(self) - info, mode, size, palette, data = state - self.info = info - self._mode = mode - self._size = size - self.im = core.new(mode, size) - if mode in ("L", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: - """ - Return image as a bytes object. - - .. warning:: - - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. - - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. - - A list of C encoders can be seen under - codecs section of the function array in - :file:`_imaging.c`. Python encoders are - registered within the relevant plugins. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - encoder_args: Any = args - if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): - # may pass tuple instead of argument list - encoder_args = encoder_args[0] - - if encoder_name == "raw" and encoder_args == (): - encoder_args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, encoder_args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - output = [] - while True: - bytes_consumed, errcode, data = e.encode(bufsize) - output.append(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} in tobytes" - raise RuntimeError(msg) - - return b"".join(output) - - def tobitmap(self, name: str = "image") -> bytes: - """ - Returns the image converted to an X11 bitmap. - - .. note:: This method only works for mode "1" images. - - :param name: The name prefix to use for the bitmap variables. - :returns: A string containing an X11 bitmap. - :raises ValueError: If the mode is not "1" - """ - - self.load() - if self.mode != "1": - msg = "not a bitmap" - raise ValueError(msg) - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes( - self, - data: bytes | bytearray | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, - ) -> None: - """ - Loads this image with pixel data from a bytes object. - - This method is similar to the :py:func:`~PIL.Image.frombytes` function, - but loads data into this image instead of creating a new image object. - """ - - if self.width == 0 or self.height == 0: - return - - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - # default format - if decoder_name == "raw" and decoder_args == (): - decoder_args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, decoder_args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - def load(self) -> core.PixelAccess | None: - """ - Allocates storage for the image and loads the pixel data. In - normal cases, you don't need to call this method, since the - Image class automatically loads an opened image when it is - accessed for the first time. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :py:class:`.PixelAccess` - """ - if self._im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(self.palette.mode, mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - self.palette.palette = self.im.getpalette( - self.palette.mode, self.palette.mode - ) - - if self._im is not None: - return self.im.pixel_access(self.readonly) - return None - - def verify(self) -> None: - """ - Verifies the contents of a file. For data read from a file, this - method attempts to determine if the file is broken, without - actually decoding the image data. If this method finds any - problems, it raises suitable exceptions. If you need to load - the image after using this method, you must reopen the image - file. - """ - pass - - def convert( - self, - mode: str | None = None, - matrix: tuple[float, ...] | None = None, - dither: Dither | None = None, - palette: Palette = Palette.WEB, - colors: int = 256, - ) -> Image: - """ - Returns a converted copy of this image. For the "P" mode, this - method translates pixels through the palette. If mode is - omitted, a mode is chosen so that all information in the image - and the palette can be represented without a palette. - - This supports all possible conversions between "L", "RGB" and "CMYK". The - ``matrix`` argument only supports "L" and "RGB". - - When translating a color image to grayscale (mode "L"), - the library uses the ITU-R 601-2 luma transform:: - - L = R * 299/1000 + G * 587/1000 + B * 114/1000 - - The default method of converting a grayscale ("L") or "RGB" - image into a bilevel (mode "1") image uses Floyd-Steinberg - dither to approximate the original image luminosity levels. If - dither is ``None``, all values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - When converting from "PA", if an "RGBA" palette is present, the alpha - channel from the image will be used instead of the values from the palette. - - :param mode: The requested mode. See: :ref:`concept-modes`. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 12-tuple containing floating point values. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - self.load() - - has_transparency = "transparency" in self.info - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - msg = "illegal conversion" - raise ValueError(msg) - im = self.im.convert_matrix(mode, matrix) - new_im = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new_im.info["transparency"] - - def convert_transparency( - m: tuple[float, ...], v: tuple[int, int, int] - ) -> int: - value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(value))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(0, len(transparency)) - ) - new_im.info["transparency"] = transparency - return new_im - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") - ): - # Use transparent conversion to promote from transparent - # color to an alpha channel. - new_im = self._new( - self.im.convert_transparent(mode, self.info["transparency"]) - ) - del new_im.info["transparency"] - return new_im - elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): - t = self.info["transparency"] - if isinstance(t, bytes): - # Dragons. This can't be represented by a single color - warnings.warn( - "Palette images with Transparency expressed in bytes should be " - "converted to RGBA images" - ) - delete_trns = True - else: - # get the new transparency color. - # use existing conversions - trns_im = new(self.mode, (1, 1)) - if self.mode == "P": - assert self.palette is not None - trns_im.putpalette(self.palette, self.palette.mode) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - assert trns_im.palette is not None - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - trns_im.putpixel((0, 0), t) - - if mode in ("L", "RGB"): - trns_im = trns_im.convert(mode) - else: - # can't just retrieve the palette number, got to do it - # after quantization. - trns_im = trns_im.convert("RGB") - trns = trns_im.getpixel((0, 0)) - - elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): - t = self.info["transparency"] - delete_trns = True - - if isinstance(t, bytes): - self.im.putpalettealphas(t) - elif isinstance(t, int): - self.im.putpalettealpha(t, 0) - else: - msg = "Transparency for P mode should be bytes or int" - raise ValueError(msg) - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new_im = self._new(im) - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette( - "RGB", new_im.im.getpalette("RGB") - ) - if delete_trns: - # This could possibly happen if we requantize to fewer colors. - # The transparency would be totally off in that case. - del new_im.info["transparency"] - if trns is not None: - try: - new_im.info["transparency"] = new_im.palette.getcolor( - cast(tuple[int, ...], trns), # trns was converted to RGB - new_im, - ) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new_im.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new_im - - if "LAB" in (self.mode, mode): - im = self - if mode == "LAB": - if im.mode not in ("RGB", "RGBA", "RGBX"): - im = im.convert("RGBA") - other_mode = im.mode - else: - other_mode = mode - if other_mode in ("RGB", "RGBA", "RGBX"): - from . import ImageCms - - srgb = ImageCms.createProfile("sRGB") - lab = ImageCms.createProfile("LAB") - profiles = [lab, srgb] if im.mode == "LAB" else [srgb, lab] - transform = ImageCms.buildTransform( - profiles[0], profiles[1], im.mode, mode - ) - return transform.apply(im) - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - modebase = getmodebase(self.mode) - if modebase == self.mode: - raise - im = self.im.convert(modebase) - im = im.convert(mode, dither) - except KeyError as e: - msg = "illegal conversion" - raise ValueError(msg) from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) - if delete_trns: - # crash fail if we leave a bytes transparency in an rgb/l mode. - del new_im.info["transparency"] - if trns is not None: - if new_im.mode == "P" and new_im.palette: - try: - new_im.info["transparency"] = new_im.palette.getcolor( - cast(tuple[int, ...], trns), new_im # trns was converted to RGB - ) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors: int = 256, - method: int | None = None, - kmeans: int = 0, - palette: Image | None = None, - dither: Dither = Dither.FLOYDSTEINBERG, - ) -> Image: - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer greater than or equal to zero. - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - msg = ( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - raise ValueError(msg) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - msg = "bad mode for palette image" - raise ValueError(msg) - if self.mode not in {"RGB", "L"}: - msg = "only RGB or L mode images can be quantized to a palette" - raise ValueError(msg) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - assert palette.palette is not None - new_im.palette = palette.palette.copy() - return new_im - - if kmeans < 0: - msg = "kmeans must not be negative" - raise ValueError(msg) - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette_data = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette_data) - - return im - - def copy(self) -> Image: - """ - Copies this image. Use this method if you wish to paste things - into an image, but still retain the original. - - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - self.load() - return self._new(self.im.copy()) - - __copy__ = copy - - def crop(self, box: tuple[float, float, float, float] | None = None) -> Image: - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - Note: Prior to Pillow 3.4.0, this was a lazy operation. - - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if box is None: - return self.copy() - - if box[2] < box[0]: - msg = "Coordinate 'right' is less than 'left'" - raise ValueError(msg) - elif box[3] < box[1]: - msg = "Coordinate 'lower' is less than 'upper'" - raise ValueError(msg) - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop( - self, im: core.ImagingCore, box: tuple[float, float, float, float] - ) -> core.ImagingCore: - """ - Returns a rectangular region from the core image object im. - - This is equivalent to calling im.crop((x0, y0, x1, y1)), but - includes additional sanity checks. - - :param im: a core image object - :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. - :returns: A core image object. - """ - - x0, y0, x1, y1 = map(int, map(round, box)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - """ - Configures the image file loader so it returns a version of the - image that as closely as possible matches the given mode and - size. For example, you can use this method to convert a color - JPEG to grayscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - Note that this method modifies the :py:class:`~PIL.Image.Image` object - in place. If the image has already been loaded, this method has no - effect. - - Note: This method is not implemented for most images. It is - currently implemented only for JPEG and MPO images. - - :param mode: The requested mode. - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - """ - pass - - def _expand(self, xmargin: int, ymargin: int | None = None) -> Image: - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin)) - - def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: - """ - Filters this image using the given filter. For a list of - available filters, see the :py:mod:`~PIL.ImageFilter` module. - - :param filter: Filter kernel. - :returns: An :py:class:`~PIL.Image.Image` object.""" - - from . import ImageFilter - - self.load() - - if callable(filter): - filter = filter() - if not hasattr(filter, "filter"): - msg = "filter argument should be ImageFilter.Filter instance or class" - raise TypeError(msg) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [ - self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) - ] - return merge(self.mode, ims) - - def getbands(self) -> tuple[str, ...]: - """ - Returns a tuple containing the name of each band in this image. - For example, ``getbands`` on an RGB image returns ("R", "G", "B"). - - :returns: A tuple containing band names. - :rtype: tuple - """ - return ImageMode.getmode(self.mode).bands - - def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: - """ - Calculates the bounding box of the non-zero regions in the - image. - - :param alpha_only: Optional flag, defaulting to ``True``. - If ``True`` and the image has an alpha channel, trim transparent pixels. - Otherwise, trim pixels when all channels are zero. - Keyword-only argument. - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox(alpha_only) - - def getcolors( - self, maxcolors: int = 256 - ) -> list[tuple[int, tuple[int, ...]]] | list[tuple[int, float]] | None: - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :param maxcolors: Maximum number of colors. If this number is - exceeded, this method returns None. The default limit is - 256 colors. - :returns: An unsorted list of (count, pixel) values. - """ - - self.load() - if self.mode in ("1", "L", "P"): - h = self.im.histogram() - out: list[tuple[int, float]] = [(h[i], i) for i in range(256) if h[i]] - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band: int | None = None) -> core.ImagingCore: - """ - Returns the contents of this image as a sequence object - containing pixel values. The sequence object is flattened, so - that values for line one follow directly after the values of - line zero, and so on. - - Note that the sequence object returned by this method is an - internal PIL data type, which only supports certain sequence - operations. To convert it to an ordinary sequence (e.g. for - printing), use ``list(im.getdata())``. - - :param band: What band to return. The default is to return - all bands. To return a single band, pass in the index - value (e.g. 0 to get the "R" band from an "RGB" image). - :returns: A sequence-like object. - """ - - self.load() - if band is not None: - return self.im.getband(band) - return self.im # could be abused - - def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: - """ - Gets the minimum and maximum pixel values for each band in - the image. - - :returns: For a single-band image, a 2-tuple containing the - minimum and maximum pixel value. For a multi-band image, - a tuple containing one 2-tuple for each band. - """ - - self.load() - if self.im.bands > 1: - return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) - return self.im.getextrema() - - def getxmp(self) -> dict[str, Any]: - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - def get_name(tag: str) -> str: - return re.sub("^{[^}]+}", "", tag) - - def get_value(element: Element) -> str | dict[str, Any] | None: - value: dict[str, Any] = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - if "xmp" not in self.info: - return {} - root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) - return {get_name(root.tag): get_value(root)} - - def getexif(self) -> Exif: - """ - Gets EXIF data from the image. - - :returns: an :py:class:`~PIL.Image.Exif` object. - """ - if self._exif is None: - self._exif = Exif() - elif self._exif._loaded: - return self._exif - self._exif._loaded = True - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if ExifTags.Base.Orientation not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if xmp_tags: - match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) - if match: - self._exif[ExifTags.Base.Orientation] = int(match[2]) - - return self._exif - - def _reload_exif(self) -> None: - if self._exif is None or not self._exif._loaded: - return - self._exif._loaded = False - self.getexif() - - def get_child_images(self) -> list[ImageFile.ImageFile]: - child_images = [] - exif = self.getexif() - ifds = [] - if ExifTags.Base.SubIFDs in exif: - subifd_offsets = exif[ExifTags.Base.SubIFDs] - if subifd_offsets: - if not isinstance(subifd_offsets, tuple): - subifd_offsets = (subifd_offsets,) - for subifd_offset in subifd_offsets: - ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) - ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) - if ifd1 and ifd1.get(513): - assert exif._info is not None - ifds.append((ifd1, exif._info.next)) - - offset = None - for ifd, ifd_offset in ifds: - current_offset = self.fp.tell() - if offset is None: - offset = current_offset - - fp = self.fp - if ifd is not None: - thumbnail_offset = ifd.get(513) - if thumbnail_offset is not None: - thumbnail_offset += getattr(self, "_exif_offset", 0) - self.fp.seek(thumbnail_offset) - data = self.fp.read(ifd.get(514)) - fp = io.BytesIO(data) - - with open(fp) as im: - from . import TiffImagePlugin - - if thumbnail_offset is None and isinstance( - im, TiffImagePlugin.TiffImageFile - ): - im._frame_pos = [ifd_offset] - im._seek(0) - im.load() - child_images.append(im) - - if offset is not None: - self.fp.seek(offset) - return child_images - - def getim(self) -> CapsuleType: - """ - Returns a capsule that points to the internal image memory. - - :returns: A capsule object. - """ - - self.load() - return self.im.ptr - - def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - @property - def has_transparency_data(self) -> bool: - """ - Determine if an image has transparency data, whether in the form of an - alpha channel, a palette with an alpha channel, or a "transparency" key - in the info dictionary. - - Note the image might still appear solid, if all of the values shown - within are opaque. - - :returns: A boolean. - """ - if ( - self.mode in ("LA", "La", "PA", "RGBA", "RGBa") - or "transparency" in self.info - ): - return True - if self.mode == "P": - assert self.palette is not None - return self.palette.mode.endswith("A") - return False - - def apply_transparency(self) -> None: - """ - If a P mode image has a "transparency" key in the info dictionary, - remove the key and instead apply the transparency to the palette. - Otherwise, the image is unchanged. - """ - if self.mode != "P" or "transparency" not in self.info: - return - - from . import ImagePalette - - palette = self.getpalette("RGBA") - assert palette is not None - transparency = self.info["transparency"] - if isinstance(transparency, bytes): - for i, alpha in enumerate(transparency): - palette[i * 4 + 3] = alpha - else: - palette[transparency * 4 + 3] = 0 - self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) - self.palette.dirty = 1 - - del self.info["transparency"] - - def getpixel( - self, xy: tuple[int, int] | list[int] - ) -> float | tuple[int, ...] | None: - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :returns: The pixel value. If the image is a multi-layer image, - this method returns a tuple. - """ - - self.load() - return self.im.getpixel(tuple(xy)) - - def getprojection(self) -> tuple[list[int], list[int]]: - """ - Get projection to x and y axes - - :returns: Two sequences, indicating where there are non-zero - pixels along the X-axis and the Y-axis, respectively. - """ - - self.load() - x, y = self.im.getprojection() - return list(x), list(y) - - def histogram( - self, mask: Image | None = None, extrema: tuple[float, float] | None = None - ) -> list[int]: - """ - Returns a histogram for the image. The histogram is returned as a - list of pixel counts, one for each pixel value in the source - image. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. If the image has more - than one band, the histograms for all bands are concatenated (for - example, the histogram for an "RGB" image contains 768 values). - - A bilevel image (mode "1") is treated as a grayscale ("L") image - by this method. - - If a mask is provided, the method returns a histogram for those - parts of the image where the mask image is non-zero. The mask - image must have the same size as the image, and be either a - bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A list containing pixel counts. - """ - self.load() - if mask: - mask.load() - return self.im.histogram((0, 0), mask.im) - if self.mode in ("I", "F"): - return self.im.histogram( - extrema if extrema is not None else self.getextrema() - ) - return self.im.histogram() - - def entropy( - self, mask: Image | None = None, extrema: tuple[float, float] | None = None - ) -> float: - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a grayscale ("L") - image by this method. - - If a mask is provided, the method employs the histogram for - those parts of the image where the mask image is non-zero. - The mask image must have the same size as the image, and be - either a bi-level image (mode "1") or a grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - return self.im.entropy( - extrema if extrema is not None else self.getextrema() - ) - return self.im.entropy() - - def paste( - self, - im: Image | str | float | tuple[float, ...], - box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, - mask: Image | None = None, - ) -> None: - """ - Pastes another image into this image. The box argument is either - a 2-tuple giving the upper left corner, a 4-tuple defining the - left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size - of the pasted image must match the size of the region. - - If the modes don't match, the pasted image is converted to the mode of - this image (see the :py:meth:`~PIL.Image.Image.convert` method for - details). - - Instead of an image, the source can be a integer or tuple - containing pixel values. The method then fills the region - with the given color. When creating RGB images, you can - also use color strings as supported by the ImageColor module. - - If a mask is given, this method updates only the regions - indicated by the mask. You can use either "1", "L", "LA", "RGBA" - or "RGBa" images (if present, the alpha band is used as mask). - Where the mask is 255, the given image is copied as is. Where - the mask is 0, the current value is preserved. Intermediate - values will mix the two images together, including their alpha - channels if they have them. - - See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to - combine images with respect to their alpha channels. - - :param im: Source image or pixel value (integer, float or tuple). - :param box: An optional 4-tuple giving the region to paste into. - If a 2-tuple is used instead, it's treated as the upper left - corner. If omitted or None, the source is pasted into the - upper left corner. - - If an image is given as the second argument and there is no - third, the box defaults to (0, 0), and the second argument - is interpreted as a mask image. - :param mask: An optional mask image. - """ - - if isinstance(box, Image): - if mask is not None: - msg = "If using second argument as mask, third argument must be None" - raise ValueError(msg) - # abbreviated paste(im, mask) syntax - mask = box - box = None - - if box is None: - box = (0, 0) - - if len(box) == 2: - # upper left corner given; get size from image or mask - if isinstance(im, Image): - size = im.size - elif isinstance(mask, Image): - size = mask.size - else: - # FIXME: use self.size here? - msg = "cannot determine region size; use 4-item box" - raise ValueError(msg) - box += (box[0] + size[0], box[1] + size[1]) - - source: core.ImagingCore | str | float | tuple[float, ...] - if isinstance(im, str): - from . import ImageColor - - source = ImageColor.getcolor(im, self.mode) - elif isinstance(im, Image): - im.load() - if self.mode != im.mode: - if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): - # should use an adapter for this! - im = im.convert(self.mode) - source = im.im - else: - source = im - - self._ensure_mutable() - - if mask: - mask.load() - self.im.paste(source, box, mask.im) - else: - self.im.paste(source, box) - - def alpha_composite( - self, im: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) - ) -> None: - """'In-place' analog of Image.alpha_composite. Composites an image - onto this image. - - :param im: image to composite over this one - :param dest: Optional 2 tuple (left, top) specifying the upper - left corner in this (destination) image. - :param source: Optional 2 (left, top) tuple for the upper left - corner in the overlay source image, or 4 tuple (left, top, right, - bottom) for the bounds of the source rectangle - - Performance Note: Not currently implemented in-place in the core layer. - """ - - if not isinstance(source, (list, tuple)): - msg = "Source must be a list or tuple" - raise ValueError(msg) - if not isinstance(dest, (list, tuple)): - msg = "Destination must be a list or tuple" - raise ValueError(msg) - - if len(source) == 4: - overlay_crop_box = tuple(source) - elif len(source) == 2: - overlay_crop_box = tuple(source) + im.size - else: - msg = "Source must be a sequence of length 2 or 4" - raise ValueError(msg) - - if not len(dest) == 2: - msg = "Destination must be a sequence of length 2" - raise ValueError(msg) - if min(source) < 0: - msg = "Source must be non-negative" - raise ValueError(msg) - - # over image, crop if it's not the whole image. - if overlay_crop_box == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(overlay_crop_box) - - # target for the paste - box = tuple(dest) + (dest[0] + overlay.width, dest[1] + overlay.height) - - # destination image. don't copy if we're using the whole image. - if box == (0, 0) + self.size: - background = self - else: - background = self.crop(box) - - result = alpha_composite(background, overlay) - self.paste(result, box) - - def point( - self, - lut: ( - Sequence[float] - | NumpyArray - | Callable[[int], float] - | Callable[[ImagePointTransform], ImagePointTransform | float] - | ImagePointHandler - ), - mode: str | None = None, - ) -> Image: - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 if - self.mode=="I" and mode == "L") values per band in the - image. A function can be used instead, it should take a - single argument. The function is called once for each - possible pixel value, and the resulting table is applied to - all bands of the image. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, im: Image) -> Image: - # Return result - :param mode: Output mode (default is same as input). This can only be used if - the source image has mode "L" or "P", and the output has mode "1" or the - source image mode is "I" and the output mode is "L". - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - self.load() - - if isinstance(lut, ImagePointHandler): - return lut.point(self) - - if callable(lut): - # if it isn't a list, it should be a function - if self.mode in ("I", "I;16", "F"): - # check if the function can be used with point_transform - # UNDONE wiredfool -- I think this prevents us from ever doing - # a gamma function point transform on > 8bit images. - scale, offset = _getscaleoffset(lut) # type: ignore[arg-type] - return self._new(self.im.point_transform(scale, offset)) - # for other modes, convert the function to a table - flatLut = [lut(i) for i in range(256)] * self.im.bands # type: ignore[arg-type] - else: - flatLut = lut - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - msg = "point operation not supported for this mode" - raise ValueError(msg) - - if mode != "F": - flatLut = [round(i) for i in flatLut] - return self._new(self.im.point(flatLut, mode)) - - def putalpha(self, alpha: Image | int) -> None: - """ - Adds or replaces the alpha layer in this image. If the image - does not have an alpha layer, it's converted to "LA" or "RGBA". - The new layer must be either "L" or "1". - - :param alpha: The new alpha layer. This can either be an "L" or "1" - image having the same size as this image, or an integer. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - msg = "alpha channel could not be added" - raise ValueError(msg) from e # sanity check - self.im = im - self._mode = self.im.mode - except KeyError as e: - msg = "illegal image mode" - raise ValueError(msg) from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isinstance(alpha, Image): - # alpha layer - if alpha.mode not in ("1", "L"): - msg = "illegal image mode" - raise ValueError(msg) - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - try: - self.im.fillband(band, alpha) - except (AttributeError, ValueError): - # do things the hard way - alpha = new("L", self.size, alpha) - else: - return - - self.im.putband(alpha.im, band) - - def putdata( - self, - data: Sequence[float] | Sequence[Sequence[int]] | core.ImagingCore | NumpyArray, - scale: float = 1.0, - offset: float = 0.0, - ) -> None: - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read until either the image or the - sequence ends. The scale and offset values are used to adjust the - sequence values: **pixel = value*scale + offset**. - - :param data: A flattened sequence object. - :param scale: An optional scale value. The default is 1.0. - :param offset: An optional offset value. The default is 0.0. - """ - - self._ensure_mutable() - - self.im.putdata(data, scale, offset) - - def putpalette( - self, - data: ImagePalette.ImagePalette | bytes | Sequence[int], - rawmode: str = "RGB", - ) -> None: - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - msg = "illegal image mode" - raise ValueError(msg) - if isinstance(data, ImagePalette.ImagePalette): - if data.rawmode is not None: - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - palette = ImagePalette.ImagePalette(palette=data.palette) - palette.dirty = 1 - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self._mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGBA" if "A" in rawmode else "RGB" - self.load() # install new palette - - def putpixel( - self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] - ) -> None: - """ - Modifies the pixel at the given position. The color is given as - a single numerical value for single-band images, and a tuple for - multi-band images. In addition to this, RGB and RGBA tuples are - accepted for P and PA images. - - Note that this method is relatively slow. For more extensive changes, - use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` - module instead. - - See: - - * :py:meth:`~PIL.Image.Image.paste` - * :py:meth:`~PIL.Image.Image.putdata` - * :py:mod:`~PIL.ImageDraw` - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if ( - self.mode in ("P", "PA") - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self.mode == "PA": - alpha = value[3] if len(value) == 4 else 255 - value = value[:3] - assert self.palette is not None - palette_index = self.palette.getcolor(tuple(value), self) - value = (palette_index, alpha) if self.mode == "PA" else palette_index - return self.im.putpixel(xy, value) - - def remap_palette( - self, dest_map: list[int], source_palette: bytes | bytearray | None = None - ) -> Image: - """ - Rewrites the image to reorder the palette. - - :param dest_map: A list of indexes into the original palette. - e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` - is the identity transform. - :param source_palette: Bytes or None. - :returns: An :py:class:`~PIL.Image.Image` object. - - """ - from . import ImagePalette - - if self.mode not in ("L", "P"): - msg = "illegal image mode" - raise ValueError(msg) - - bands = 3 - palette_mode = "RGB" - if source_palette is None: - if self.mode == "P": - self.load() - palette_mode = self.im.getpalettemode() - if palette_mode == "RGBA": - bands = 4 - source_palette = self.im.getpalette(palette_mode, palette_mode) - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - elif len(source_palette) > 768: - bands = 4 - palette_mode = "RGBA" - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[ - oldPosition * bands : oldPosition * bands + bands - ] - new_positions[oldPosition] = i - - # replace the palette color id of all pixel with the new id - - # Palette images are [0..255], mapped through a 1 or 3 - # byte/color map. We need to remap the whole image - # from palette 1 to palette 2. New_positions is - # an array of indexes into palette 1. Palette 2 is - # palette 1 with any holes removed. - - # We're going to leverage the convert mechanism to use the - # C code to remap the image from palette 1 to palette 2, - # by forcing the source image into 'L' mode and adding a - # mapping 'L' mode palette, then converting back to 'L' - # sans palette thus converting the image bytes, then - # assigning the optimized RGB palette. - - # perf reference, 9500x4000 gif, w/~135 colors - # 14 sec prepatch, 1 sec postpatch with optimization forced. - - mapping_palette = bytearray(new_positions) - - m_im = self.copy() - m_im._mode = "P" - - m_im.palette = ImagePalette.ImagePalette( - palette_mode, palette=mapping_palette * bands - ) - # possibly set palette dirty, then - # m_im.putpalette(mapping_palette, 'L') # converts to 'P' - # or just force it. - # UNDONE -- this is part of the general issue with palettes - m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - m_im.putpalette(palette_bytes, palette_mode) - m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) - - if "transparency" in self.info: - try: - m_im.info["transparency"] = dest_map.index(self.info["transparency"]) - except ValueError: - if "transparency" in m_im.info: - del m_im.info["transparency"] - - return m_im - - def _get_safe_box( - self, - size: tuple[int, int], - resample: Resampling, - box: tuple[float, float, float, float], - ) -> tuple[int, int, int, int]: - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize( - self, - size: tuple[int, int] | list[int] | NumpyArray, - resample: int | None = None, - box: tuple[float, float, float, float] | None = None, - reducing_gap: float | None = None, - ) -> Image: - """ - Returns a resized copy of this image. - - :param size: The requested size in pixels, as a tuple or array: - (width, height). - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`Resampling.NEAREST`. If the image mode is "BGR;15", - "BGR;16" or "BGR;24", then the default filter is - :py:data:`Resampling.NEAREST`. Otherwise, the default filter is - :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - bgr = self.mode.startswith("BGR;") - resample = Resampling.NEAREST if bgr else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - if reducing_gap is not None and reducing_gap < 1.0: - msg = "reducing_gap must be 1.0 or greater" - raise ValueError(msg) - - if box is None: - box = (0, 0) + self.size - - size = tuple(size) - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, cast(Resampling, resample), box) - factor = (factor_x, factor_y) - self = ( - self.reduce(factor, box=reduce_box) - if callable(self.reduce) - else Image.reduce(self, factor, box=reduce_box) - ) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce( - self, - factor: int | tuple[int, int], - box: tuple[int, int, int, int] | None = None, - ) -> Image: - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle: float, - resample: Resampling = Resampling.NEAREST, - expand: int | bool = False, - center: tuple[float, float] | None = None, - translate: tuple[int, int] | None = None, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - Returns a rotated copy of this image. This method returns a - copy of this image, rotated the given number of degrees counter - clockwise around its centre. - - :param angle: In degrees counter clockwise. - :param resample: An optional resampling filter. This can be - one of :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image has - mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See :ref:`concept-filters`. - :param expand: Optional expansion flag. If true, expands the output - image to make it large enough to hold the entire rotated image. - If false or omitted, make the output image the same size as the - input image. Note that the expand flag assumes rotation around - the center and no translation. - :param center: Optional center of rotation (a 2-tuple). Origin is - the upper left corner. Default is the center of the image. - :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for area outside the rotated image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - angle = angle % 360.0 - - # Fast paths regardless of filter, as long as we're not - # translating or changing the center. - if not (center or translate): - if angle == 0: - return self.copy() - if angle == 180: - return self.transpose(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 - ) - - # Calculate the affine matrix. Note that this is the reverse - # transformation (from destination image to source) because we - # want to interpolate the (discrete) destination pixel from - # the local area around the (floating) source pixel. - - # The matrix we actually want (note that it operates from the right): - # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) - # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) - # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) - - # The reverse matrix is thus: - # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) - # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) - # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) - - # In any case, the final translation may be updated at the end to - # compensate for the expand flag. - - w, h = self.size - - if translate is None: - post_trans = (0, 0) - else: - post_trans = translate - if center is None: - center = (w / 2, h / 2) - - angle = -math.radians(angle) - matrix = [ - round(math.cos(angle), 15), - round(math.sin(angle), 15), - 0.0, - round(-math.sin(angle), 15), - round(math.cos(angle), 15), - 0.0, - ] - - def transform(x: float, y: float, matrix: list[float]) -> tuple[float, float]: - (a, b, c, d, e, f) = matrix - return a * x + b * y + c, d * x + e * y + f - - matrix[2], matrix[5] = transform( - -center[0] - post_trans[0], -center[1] - post_trans[1], matrix - ) - matrix[2] += center[0] - matrix[5] += center[1] - - if expand: - # calculate output size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - transformed_x, transformed_y = transform(x, y, matrix) - xx.append(transformed_x) - yy.append(transformed_y) - nw = math.ceil(max(xx)) - math.floor(min(xx)) - nh = math.ceil(max(yy)) - math.floor(min(yy)) - - # We multiply a translation matrix from the right. Because of its - # special form, this is the same as taking the image of the - # translation vector as new translation vector. - matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) - w, h = nw, nh - - return self.transform( - (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save( - self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any - ) -> None: - """ - Saves this image under the given filename. If no format is - specified, the format to use is determined from the filename - extension, if possible. - - Keyword options can be used to provide additional instructions - to the writer. If a writer doesn't recognise an option, it is - silently ignored. The available options are described in the - :doc:`image format documentation - <../handbook/image-file-formats>` for each writer. - - You can use a file object instead of a filename. In this case, - you must always specify the format. The file object must - implement the ``seek``, ``tell``, and ``write`` - methods, and be opened in binary mode. - - :param fp: A filename (string), os.PathLike object or file object. - :param format: Optional format override. If omitted, the - format to use is determined from the filename extension. - If a file object was used instead of a filename, this - parameter should always be used. - :param params: Extra parameters to the image writer. - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename: str | bytes = "" - open_fp = False - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and is_path(fp.name): - # only set the name for metadata purposes - filename = os.path.realpath(os.fspath(fp.name)) - - # may mutate self! - self._ensure_mutable() - - save_all = params.pop("save_all", False) - self.encoderinfo = params - self.encoderconfig: tuple[Any, ...] = () - - preinit() - - filename_ext = os.path.splitext(filename)[1].lower() - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - msg = f"unknown file extension: {ext}" - raise ValueError(msg) from e - - if format.upper() not in SAVE: - init() - if save_all: - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - else: - fp = cast(IO[bytes], fp) - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - if open_fp: - fp.close() - - def seek(self, frame: int) -> None: - """ - Seeks to the given frame in this sequence file. If you seek - beyond the end of the sequence, the method raises an - ``EOFError`` exception. When a sequence file is opened, the - library automatically seeks to frame 0. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :param frame: Frame number, starting at 0. - :exception EOFError: If the call attempts to seek beyond the end - of the sequence. - """ - - # overridden by file handlers - if frame != 0: - msg = "no more images in file" - raise EOFError(msg) - - def show(self, title: str | None = None) -> None: - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **xdg-open**, **display**, - **gm**, **eog** or **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self) -> tuple[Image, ...]: - """ - Split this image into individual bands. This method returns a - tuple of individual image bands from an image. For example, - splitting an "RGB" image creates three new images each - containing a copy of one of the original bands (red, green, - blue). - - If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` - method can be more convenient and faster. - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - return (self.copy(),) - return tuple(map(self._new, self.im.split())) - - def getchannel(self, channel: int | str) -> Image: - """ - Returns an image containing a single channel of the source image. - - :param channel: What channel to return. Could be index - (0 for "R" channel of "RGB") or channel name - ("A" for alpha channel of "RGBA"). - :returns: An image in "L" mode. - - .. versionadded:: 4.3.0 - """ - self.load() - - if isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - msg = f'The image has no channel "{channel}"' - raise ValueError(msg) from e - - return self._new(self.im.getband(channel)) - - def tell(self) -> int: - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail( - self, - size: tuple[float, float], - resample: Resampling = Resampling.BICUBIC, - reducing_gap: float | None = 2.0, - ) -> None: - """ - Make this image into a thumbnail. This method modifies the - image to contain a thumbnail version of itself, no larger than - the given size. This method calculates an appropriate thumbnail - size to preserve the aspect of the image, calls the - :py:meth:`~PIL.Image.Image.draft` method to configure the file reader - (where applicable), and finally resizes the image. - - Note that this function modifies the :py:class:`~PIL.Image.Image` - object in place. If you need to use the full resolution image as well, - apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original - image. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: Optional resampling filter. This can be one - of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`Resampling.BICUBIC`. - (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - provided_size = tuple(map(math.floor, size)) - - def preserve_aspect_ratio() -> tuple[int, int] | None: - def round_aspect(number: float, key: Callable[[int], float]) -> int: - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - x, y = provided_size - if x >= self.width and y >= self.height: - return None - - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - return x, y - - preserved_size = preserve_aspect_ratio() - if preserved_size is None: - return - final_size = preserved_size - - box = None - if reducing_gap is not None: - res = self.draft( - None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) - ) - if res is not None: - box = res[1] - - if self.size != final_size: - im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = final_size - self._mode = self.im.mode - - self.readonly = 0 - - # FIXME: the different transform methods need further explanation - # instead of bloating the method docs, add a separate chapter. - def transform( - self, - size: tuple[int, int], - method: Transform | ImageTransformHandler | SupportsGetData, - data: Sequence[Any] | None = None, - resample: int = Resampling.NEAREST, - fill: int = 1, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - Transforms this image. This method creates a new image with the - given size, and the same mode as the original, and copies data - to the new image using the given transform. - - :param size: The output size in pixels, as a 2-tuple: - (width, height). - :param method: The transformation method. This is one of - :py:data:`Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`Transform.AFFINE` (affine transform), - :py:data:`Transform.PERSPECTIVE` (perspective transform), - :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - Implementations of :py:class:`~PIL.Image.ImageTransformHandler` - for some of the :py:class:`Transform` methods are provided - in :py:mod:`~PIL.ImageTransform`. - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - if isinstance(method, ImageTransformHandler): - return method.transform(size, self, resample=resample, fill=fill) - - if hasattr(method, "getdata"): - # compatibility w. old-style transform objects - method, data = method.getdata() - - if data is None: - msg = "missing method data" - raise ValueError(msg) - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, - box: tuple[int, int, int, int], - image: Image, - method: Transform, - data: Sequence[float], - resample: int = Resampling.NEAREST, - fill: bool = True, - ) -> None: - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[:2] - sw = data[2:4] - se = data[4:6] - ne = data[6:8] - x0, y0 = nw - As = 1.0 / w - At = 1.0 / h - data = ( - x0, - (ne[0] - x0) * As, - (sw[0] - x0) * At, - (se[0] - sw[0] - ne[0] + x0) * As * At, - y0, - (ne[1] - y0) * As, - (sw[1] - y0) * At, - (se[1] - sw[1] - ne[1] + y0) * As * At, - ) - - else: - msg = "unknown transformation method" - raise ValueError(msg) - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - unusable: dict[int, str] = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - } - msg = unusable[resample] + f" ({resample}) cannot be used." - else: - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform(box, image.im, method, data, resample, fill) - - def transpose(self, method: Transpose) -> Image: - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, - :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, - :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, - :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - return self._new(self.im.transpose(method)) - - def effect_spread(self, distance: int) -> Image: - """ - Randomly spread pixels in an image. - - :param distance: Distance to spread pixels. - """ - self.load() - return self._new(self.im.effect_spread(distance)) - - def toqimage(self) -> ImageQt.ImageQt: - """Returns a QImage copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqimage(self) - - def toqpixmap(self) -> ImageQt.QPixmap: - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler: - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - @abc.abstractmethod - def point(self, im: Image) -> Image: - pass - - -class ImageTransformHandler: - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - @abc.abstractmethod - def transform( - self, - size: tuple[int, int], - image: Image, - **options: Any, - ) -> Image: - pass - - -# -------------------------------------------------------------------- -# Factories - -# -# Debugging - - -def _wedge() -> Image: - """Create grayscale wedge (for debugging only)""" - - return Image()._new(core.wedge("L")) - - -def _check_size(size: Any) -> None: - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: None, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - msg = "Size must be a list or tuple" - raise ValueError(msg) - if len(size) != 2: - msg = "Size must be a sequence of length 2" - raise ValueError(msg) - if size[0] < 0 or size[1] < 0: - msg = "Width and height must be >= 0" - raise ValueError(msg) - - -def new( - mode: str, - size: tuple[int, int] | list[int], - color: float | tuple[float, ...] | str | None = 0, -) -> Image: - """ - Creates a new image with the given mode and size. - - :param mode: The mode to use for the new image. See: - :ref:`concept-modes`. - :param size: A 2-tuple, containing (width, height) in pixels. - :param color: What color to use for the image. Default is black. - If given, this should be a single integer or floating point value - for single-band modes, and a tuple for multi-band modes (one value - per band). When creating RGB or HSV images, you can also use color - strings as supported by the ImageColor module. If the color is - None, the image is not initialised. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if ( - mode == "P" - and isinstance(color, (list, tuple)) - and all(isinstance(i, int) for i in color) - ): - color_ints: tuple[int, ...] = cast(tuple[int, ...], tuple(color)) - if len(color_ints) == 3 or len(color_ints) == 4: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color_ints) - return im._new(core.fill(mode, size, color)) - - -def frombytes( - mode: str, - size: tuple[int, int], - data: bytes | bytearray | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, -) -> Image: - """ - Creates a copy of an image memory from pixel data in a buffer. - - In its simplest form, this function takes three arguments - (mode, size, and unpacked pixel data). - - You can also use any pixel decoder supported by PIL. For more - information on available decoders, see the section - :ref:`Writing Your Own File Codec `. - - Note that this function decodes pixel data only, not entire images. - If you have an entire image in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load - it. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A byte buffer containing raw data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - _check_size(size) - - im = new(mode, size) - if im.width != 0 and im.height != 0: - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - if decoder_name == "raw" and decoder_args == (): - decoder_args = mode - - im.frombytes(data, decoder_name, decoder_args) - return im - - -def frombuffer( - mode: str, - size: tuple[int, int], - data: bytes | SupportsArrayInterface, - decoder_name: str = "raw", - *args: Any, -) -> Image: - """ - Creates an image memory referencing pixel data in a byte buffer. - - This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data - in the byte buffer, where possible. This means that changes to the - original buffer object are reflected in this image). Not all modes can - share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". - - Note that this function decodes pixel data only, not entire images. - If you have an entire image file in a string, wrap it in a - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - The default parameters used for the "raw" decoder differs from that used for - :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a - future release. The current release issues a warning if you do this; to disable - the warning, you should provide the full set of parameters. See below for details. - - :param mode: The image mode. See: :ref:`concept-modes`. - :param size: The image size. - :param data: A bytes or other buffer object containing raw - data for the given mode. - :param decoder_name: What decoder to use. - :param args: Additional parameters for the given decoder. For the - default encoder ("raw"), it's recommended that you provide the - full set of parameters:: - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - :returns: An :py:class:`~PIL.Image.Image` object. - - .. versionadded:: 1.1.4 - """ - - _check_size(size) - - # may pass tuple instead of argument list - if len(args) == 1 and isinstance(args[0], tuple): - args = args[0] - - if decoder_name == "raw": - if args == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (0, 0)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - if mode == "P": - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -class SupportsArrayInterface(Protocol): - """ - An object that has an ``__array_interface__`` dictionary. - """ - - @property - def __array_interface__(self) -> dict[str, Any]: - raise NotImplementedError() - - -def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol):: - - from PIL import Image - import numpy as np - a = np.zeros((5, 5)) - im = Image.fromarray(a) - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - In the case of NumPy, be aware that Pillow modes do not always correspond - to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, - 32-bit signed integer pixels, and 32-bit floating point pixels. - - Pillow images can also be converted to arrays:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - When converting Pillow images to arrays however, only pixel values are - transferred. This means that P and PA mode images will lose their palette. - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about modes. - :returns: An image object. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr["shape"] - ndim = len(shape) - strides = arr.get("strides", None) - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr["typestr"] - except KeyError as e: - msg = "Cannot handle this data type" - raise TypeError(msg) from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - typekey_shape, typestr = typekey - msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" - raise TypeError(msg) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - msg = f"Too many dimensions: {ndim} > {ndmax}." - raise ValueError(msg) - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - elif hasattr(obj, "tostring"): - obj = obj.tostring() - else: - msg = "'strides' requires either tobytes() or tostring()" - raise ValueError(msg) - - return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) - - -def fromqimage(im: ImageQt.QImage) -> ImageFile.ImageFile: - """Creates an image instance from a QImage image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqimage(im) - - -def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile: - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqpixmap(im) - - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - ((1, 1), "|b1"): ("1", "1;8"), - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "u2"): ("I", "I;16B"), - ((1, 1), "i2"): ("I", "I;16BS"), - ((1, 1), "u4"): ("I", "I;32B"), - ((1, 1), "i4"): ("I", "I;32BS"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((1, 1, 2), "|u1"): ("LA", "LA"), - ((1, 1, 3), "|u1"): ("RGB", "RGB"), - ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), - # shortcuts: - ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), - ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), -} - - -def _decompression_bomb_check(size: tuple[int, int]) -> None: - if MAX_IMAGE_PIXELS is None: - return - - pixels = max(1, size[0]) * max(1, size[1]) - - if pixels > 2 * MAX_IMAGE_PIXELS: - msg = ( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - raise DecompressionBombError(msg) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open( - fp: StrOrBytesPath | IO[bytes], - mode: Literal["r"] = "r", - formats: list[str] | tuple[str, ...] | None = None, -) -> ImageFile.ImageFile: - """ - Opens and identifies the given image file. - - This is a lazy operation; this function identifies the file, but - the file remains open and the actual image data is not read from - the file until you try to process the data (or call the - :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. See :ref:`file-handling`. - - :param fp: A filename (string), os.PathLike object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. The file object will also seek to zero - before reading. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] - raise ValueError(msg) - elif isinstance(fp, io.StringIO): - msg = ( # type: ignore[unreachable] - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - raise ValueError(msg) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - msg = "formats must be a list or tuple" # type: ignore[unreachable] - raise TypeError(msg) - - exclusive_fp = False - filename: str | bytes = "" - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - else: - fp = cast(IO[bytes], fp) - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - warning_messages: list[str] = [] - - def _open_core( - fp: IO[bytes], - filename: str | bytes, - prefix: bytes, - formats: list[str] | tuple[str, ...], - ) -> ImageFile.ImageFile | None: - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if isinstance(result, str): - warning_messages.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error) as e: - if WARN_POSSIBLE_FORMATS: - warning_messages.append(i + " opening failed. " + str(e)) - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None and formats is ID: - checked_formats = ID.copy() - if init(): - im = _open_core( - fp, - filename, - prefix, - tuple(format for format in formats if format not in checked_formats), - ) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in warning_messages: - warnings.warn(message) - msg = "cannot identify image file %r" % (filename if filename else fp) - raise UnidentifiedImageError(msg) - - -# -# Image processing. - - -def alpha_composite(im1: Image, im2: Image) -> Image: - """ - Alpha composite im2 over im1. - - :param im1: The first image. Must have mode RGBA. - :param im2: The second image. Must have mode RGBA, and the same size as - the first image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.alpha_composite(im1.im, im2.im)) - - -def blend(im1: Image, im2: Image, alpha: float) -> Image: - """ - Creates a new image by interpolating between two input images, using - a constant alpha:: - - out = image1 * (1.0 - alpha) + image2 * alpha - - :param im1: The first image. - :param im2: The second image. Must have the same mode and size as - the first image. - :param alpha: The interpolation alpha factor. If alpha is 0.0, a - copy of the first image is returned. If alpha is 1.0, a copy of - the second image is returned. There are no restrictions on the - alpha value. If necessary, the result is clipped to fit into - the allowed output range. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - im1.load() - im2.load() - return im1._new(core.blend(im1.im, im2.im, alpha)) - - -def composite(image1: Image, image2: Image, mask: Image) -> Image: - """ - Create composite image by blending images using a transparency mask. - - :param image1: The first image. - :param image2: The second image. Must have the same mode and - size as the first image. - :param mask: A mask image. This image can have mode - "1", "L", or "RGBA", and must have the same size as the - other two images. - """ - - image = image2.copy() - image.paste(image1, None, mask) - return image - - -def eval(image: Image, *args: Callable[[int], float]) -> Image: - """ - Applies the function (which should take one argument) to each pixel - in the given image. If the image has more than one band, the same - function is applied to each band. Note that the function is - evaluated once for each possible pixel value, so you cannot use - random components or other generators. - - :param image: The input image. - :param function: A function object, taking one integer argument. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - return image.point(args[0]) - - -def merge(mode: str, bands: Sequence[Image]) -> Image: - """ - Merge a set of single band images into a new multiband image. - - :param mode: The mode to use for the output image. See: - :ref:`concept-modes`. - :param bands: A sequence containing one single-band image for - each band in the output image. All bands must have the - same size. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if getmodebands(mode) != len(bands) or "*" in mode: - msg = "wrong number of bands" - raise ValueError(msg) - for band in bands[1:]: - if band.mode != getmodetype(mode): - msg = "mode mismatch" - raise ValueError(msg) - if band.size != bands[0].size: - msg = "size mismatch" - raise ValueError(msg) - for band in bands: - band.load() - return bands[0]._new(core.merge(mode, *[b.im for b in bands])) - - -# -------------------------------------------------------------------- -# Plugin registry - - -def register_open( - id: str, - factory: ( - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile] - | type[ImageFile.ImageFile] - ), - accept: Callable[[bytes], bool | str] | None = None, -) -> None: - """ - Register an image file plugin. This function should not be used - in application code. - - :param id: An image format identifier. - :param factory: An image file factory method. - :param accept: An optional function that can be used to quickly - reject images having another format. - """ - id = id.upper() - if id not in ID: - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id: str, mimetype: str) -> None: - """ - Registers an image MIME type by populating ``Image.MIME``. This function - should not be used in application code. - - ``Image.MIME`` provides a mapping from image format identifiers to mime - formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can - provide a different result for specific images. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save( - id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - Registers an image save function. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE[id.upper()] = driver - - -def register_save_all( - id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - Registers an image function to save all the frames - of a multiframe format. This function should not be - used in application code. - - :param id: An image format identifier. - :param driver: A function to save images in this format. - """ - SAVE_ALL[id.upper()] = driver - - -def register_extension(id: str, extension: str) -> None: - """ - Registers an image extension. This function should not be - used in application code. - - :param id: An image format identifier. - :param extension: An extension used for this format. - """ - EXTENSION[extension.lower()] = id.upper() - - -def register_extensions(id: str, extensions: list[str]) -> None: - """ - Registers image extensions. This function should not be - used in application code. - - :param id: An image format identifier. - :param extensions: A list of extensions used for this format. - """ - for extension in extensions: - register_extension(id, extension) - - -def registered_extensions() -> dict[str, str]: - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - init() - return EXTENSION - - -def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: An ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: An ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image: Image, **options: Any) -> None: - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot( - size: tuple[int, int], extent: tuple[float, float, float, float], quality: int -) -> Image: - """ - Generate a Mandelbrot set covering the given extent. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param extent: The extent to cover, as a 4-tuple: - (x0, y0, x1, y1). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size: tuple[int, int], sigma: float) -> Image: - """ - Generate Gaussian noise centered around 128. - - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - :param sigma: Standard deviation of noise. - """ - return Image()._new(core.effect_noise(size, sigma)) - - -def linear_gradient(mode: str) -> Image: - """ - Generate 256x256 linear gradient from black to white, top to bottom. - - :param mode: Input mode. - """ - return Image()._new(core.linear_gradient(mode)) - - -def radial_gradient(mode: str) -> Image: - """ - Generate 256x256 radial gradient from black to white, centre to edge. - - :param mode: Input mode. - """ - return Image()._new(core.radial_gradient(mode)) - - -# -------------------------------------------------------------------- -# Resources - - -def _apply_env_variables(env: dict[str, str] | None = None) -> None: - env_dict = env if env is not None else os.environ - - for var_name, setter in [ - ("PILLOW_ALIGNMENT", core.set_alignment), - ("PILLOW_BLOCK_SIZE", core.set_block_size), - ("PILLOW_BLOCKS_MAX", core.set_blocks_max), - ]: - if var_name not in env_dict: - continue - - var = env_dict[var_name].lower() - - units = 1 - for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: - if var.endswith(postfix): - units = mul - var = var[: -len(postfix)] - - try: - var_int = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var_int) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -if TYPE_CHECKING: - _ExifBase = MutableMapping[int, Any] -else: - _ExifBase = MutableMapping - - -class Exif(_ExifBase): - """ - This class provides read and write access to EXIF image data:: - - from PIL import Image - im = Image.open("exif.png") - exif = im.getexif() # Returns an instance of this class - - Information can be read and written, iterated over or deleted:: - - print(exif[274]) # 1 - exif[274] = 2 - for k, v in exif.items(): - print("Tag", k, "Value", v) # Tag 274 Value 2 - del exif[274] - - To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` - returns a dictionary:: - - from PIL import ExifTags - im = Image.open("exif_gps.jpg") - exif = im.getexif() - gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) - print(gps_ifd) - - Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.Makernote``, - ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. - - :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: - - print(exif[ExifTags.Base.Software]) # PIL - print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 - """ - - endian: str | None = None - bigtiff = False - _loaded = False - - def __init__(self) -> None: - self._data: dict[int, Any] = {} - self._hidden_data: dict[int, Any] = {} - self._ifds: dict[int, dict[int, Any]] = {} - self._info: TiffImagePlugin.ImageFileDirectory_v2 | None = None - self._loaded_exif: bytes | None = None - - def _fixup(self, value: Any) -> Any: - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict: dict[int, Any]) -> dict[int, Any]: - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict( - self, offset: int, group: int | None = None - ) -> dict[int, Any] | None: - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - return None - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) - info.load(self.fp) - return self._fixup_dict(dict(info)) - - def _get_head(self) -> bytes: - version = b"\x2B" if self.bigtiff else b"\x2A" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data: bytes) -> None: - # Extract EXIF information. This is highly experimental, - # and is likely to be replaced with something better in a future - # version. - - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - while data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp: IO[bytes] = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp: IO[bytes], offset: int | None = None) -> None: - self._loaded_exif = None - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.tell() - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self) -> dict[int, Any]: - merged_dict = dict(self) - - # get EXIF extension - if ExifTags.IFD.Exif in self: - ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) - if ifd: - merged_dict.update(ifd) - - # GPS - if ExifTags.IFD.GPSInfo in self: - merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( - self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo - ) - - return merged_dict - - def tobytes(self, offset: int = 8) -> bytes: - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, value in self.items(): - if tag in [ - ExifTags.IFD.Exif, - ExifTags.IFD.GPSInfo, - ] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == ExifTags.IFD.Exif - and ExifTags.IFD.Interop in value - and not isinstance(value[ExifTags.IFD.Interop], dict) - ): - value = value.copy() - value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag: int) -> dict[int, Any]: - if tag not in self._ifds: - if tag == ExifTags.IFD.IFD1: - if self._info is not None and self._info.next != 0: - ifd = self._get_ifd_dict(self._info.next) - if ifd is not None: - self._ifds[tag] = ifd - elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: - offset = self._hidden_data.get(tag, self.get(tag)) - if offset is not None: - ifd = self._get_ifd_dict(offset, tag) - if ifd is not None: - self._ifds[tag] = ifd - elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.Makernote]: - if ExifTags.IFD.Exif not in self._ifds: - self.get_ifd(ExifTags.IFD.Exif) - tag_data = self._ifds[ExifTags.IFD.Exif][tag] - if tag == ExifTags.IFD.Makernote: - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data[:8] == b"FUJIFILM": - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo: dict[str, int | bytes] = { - "ModelID": self.fp.read(4) - } - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - )[0] - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: camerainfo} - self._ifds[tag] = makernote - else: - # Interop - ifd = self._get_ifd_dict(tag_data, tag) - if ifd is not None: - self._ifds[tag] = ifd - ifd = self._ifds.setdefault(tag, {}) - if tag == ExifTags.IFD.Exif and self._hidden_data: - ifd = { - k: v - for (k, v) in ifd.items() - if k not in (ExifTags.IFD.Interop, ExifTags.IFD.Makernote) - } - return ifd - - def hide_offsets(self) -> None: - for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): - if tag in self: - self._hidden_data[tag] = self[tag] - del self[tag] - - def __str__(self) -> str: - if self._info is not None: - # Load all keys into self._data - for tag in self._info: - self[tag] - - return str(self._data) - - def __len__(self) -> int: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag: int) -> Any: - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag: object) -> bool: - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag: int, value: Any) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag: int) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self) -> Iterator[int]: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/lib/python3.12/site-packages/PIL/ImageChops.py b/lib/python3.12/site-packages/PIL/ImageChops.py deleted file mode 100644 index 29a5c99..0000000 --- a/lib/python3.12/site-packages/PIL/ImageChops.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -from . import Image - - -def constant(image: Image.Image, value: int) -> Image.Image: - """Fill a channel with a given gray level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image: Image.Image) -> Image.Image: - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert an image (channel). :: - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. :: - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. :: - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. :: - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. :: - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two inverted images on top of each other. :: - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Add two images, without clipping the result. :: - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Subtract two images, without clipping the result. :: - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. :: - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical OR between two images. - - Both of the images must have mode "1". :: - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical XOR between two images. - - Both of the images must have mode "1". :: - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite( - image1: Image.Image, image2: Image.Image, mask: Image.Image -) -> Image.Image: - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param image: Input image. - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/lib/python3.12/site-packages/PIL/ImageCms.py b/lib/python3.12/site-packages/PIL/ImageCms.py deleted file mode 100644 index fdfbee7..0000000 --- a/lib/python3.12/site-packages/PIL/ImageCms.py +++ /dev/null @@ -1,1125 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# Originally released under LGPL. Graciously donated to PIL in -# March 2009, for distribution under the standard PIL license - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. -from __future__ import annotations - -import operator -import sys -from enum import IntEnum, IntFlag -from functools import reduce -from typing import Any, Literal, SupportsFloat, SupportsInt, Union - -from . import Image, __version__ -from ._deprecate import deprecate -from ._typing import SupportsRead - -try: - from . import _imagingcms as core - - _CmsProfileCompatible = Union[ - str, SupportsRead[bytes], core.CmsProfile, "ImageCmsProfile" - ] -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - core = DeferredError.new(ex) - -_DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> using 'renderingIntent' -> proof - colorspace -> using 'proofRenderingIntent' -> output - colorspace - - Added LCMS FLAGS support. - Added FLAGS["SOFTPROOFING"] as default flag for - buildProofTransform (otherwise the proof profile/intent - would be ignored). - - 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms - - 0.0.2 alpha Jan 6, 2002 - - Added try/except statements around type() checks of - potential CObjects... Python won't let you use type() - on them, and raises a TypeError (stupid, if you ask - me!) - - Added buildProofTransformFromOpenProfiles() function. - Additional fixes in DLL, see DLL code for details. - - 0.0.1 alpha first public release, Dec. 26, 2002 - - Known to-do list with current version (of Python interface, not pyCMSdll): - - none - -""" - -_VERSION = "1.0.0 pil" - - -def __getattr__(name: str) -> Any: - if name == "DESCRIPTION": - deprecate("PIL.ImageCms.DESCRIPTION", 12) - return _DESCRIPTION - elif name == "VERSION": - deprecate("PIL.ImageCms.VERSION", 12) - return _VERSION - elif name == "FLAGS": - deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") - return _FLAGS - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# --------------------------------------------------------------------. - - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -# -# flags - - -class Flags(IntFlag): - """Flags and documentation are taken from ``lcms2.h``.""" - - NONE = 0 - NOCACHE = 0x0040 - """Inhibit 1-pixel cache""" - NOOPTIMIZE = 0x0100 - """Inhibit optimizations""" - NULLTRANSFORM = 0x0200 - """Don't transform anyway""" - GAMUTCHECK = 0x1000 - """Out of Gamut alarm""" - SOFTPROOFING = 0x4000 - """Do softproofing""" - BLACKPOINTCOMPENSATION = 0x2000 - NOWHITEONWHITEFIXUP = 0x0004 - """Don't fix scum dot""" - HIGHRESPRECALC = 0x0400 - """Use more memory to give better accuracy""" - LOWRESPRECALC = 0x0800 - """Use less memory to minimize resources""" - # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: - USE_8BITS_DEVICELINK = 0x0008 - """Create 8 bits devicelinks""" - GUESSDEVICECLASS = 0x0020 - """Guess device class (for ``transform2devicelink``)""" - KEEP_SEQUENCE = 0x0080 - """Keep profile sequence for devicelink creation""" - FORCE_CLUT = 0x0002 - """Force CLUT optimization""" - CLUT_POST_LINEARIZATION = 0x0001 - """create postlinearization tables if possible""" - CLUT_PRE_LINEARIZATION = 0x0010 - """create prelinearization tables if possible""" - NONEGATIVES = 0x8000 - """Prevent negative numbers in floating point transforms""" - COPY_ALPHA = 0x04000000 - """Alpha channels are copied on ``cmsDoTransform()``""" - NODEFAULTRESOURCEDEF = 0x01000000 - - _GRIDPOINTS_1 = 1 << 16 - _GRIDPOINTS_2 = 2 << 16 - _GRIDPOINTS_4 = 4 << 16 - _GRIDPOINTS_8 = 8 << 16 - _GRIDPOINTS_16 = 16 << 16 - _GRIDPOINTS_32 = 32 << 16 - _GRIDPOINTS_64 = 64 << 16 - _GRIDPOINTS_128 = 128 << 16 - - @staticmethod - def GRIDPOINTS(n: int) -> Flags: - """ - Fine-tune control over number of gridpoints - - :param n: :py:class:`int` in range ``0 <= n <= 255`` - """ - return Flags.NONE | ((n & 0xFF) << 16) - - -_MAX_FLAG = reduce(operator.or_, Flags) - - -_FLAGS = { - "MATRIXINPUT": 1, - "MATRIXOUTPUT": 2, - "MATRIXONLY": (1 | 2), - "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot - # Don't create prelinearization tables on precalculated transforms - # (internal use): - "NOPRELINEARIZATION": 16, - "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) - "NOTCACHE": 64, # Inhibit 1-pixel cache - "NOTPRECALC": 256, - "NULLTRANSFORM": 512, # Don't transform anyway - "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy - "LOWRESPRECALC": 2048, # Use less memory to minimize resources - "WHITEBLACKCOMPENSATION": 8192, - "BLACKPOINTCOMPENSATION": 8192, - "GAMUTCHECK": 4096, # Out of Gamut alarm - "SOFTPROOFING": 16384, # Do softproofing - "PRESERVEBLACK": 32768, # Black preservation - "NODEFAULTRESOURCEDEF": 16777216, # CRD special - "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints -} - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, core.CmsProfile): - self._set(profile) - else: - msg = "Invalid type for Profile" # type: ignore[unreachable] - raise TypeError(msg) - - def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: - self.profile = profile - self.filename = filename - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - - def tobytes(self) -> bytes: - """ - Returns the profile in a format suitable for embedding in - saved images. - - :returns: a bytes object containing the ICC profile. - """ - - return core.profile_tobytes(self.profile) - - -class ImageCmsTransform(Image.ImagePointHandler): - """ - Transform. This can be used with the procedural API, or with the standard - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input: ImageCmsProfile, - output: ImageCmsProfile, - input_mode: str, - output_mode: str, - intent: Intent = Intent.PERCEPTUAL, - proof: ImageCmsProfile | None = None, - proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.NONE, - ): - supported_modes = ( - "RGB", - "RGBA", - "RGBX", - "CMYK", - "I;16", - "I;16L", - "I;16B", - "YCbCr", - "LAB", - "L", - "1", - ) - for mode in (input_mode, output_mode): - if mode not in supported_modes: - deprecate( - mode, - 12, - { - "L;16": "I;16 or I;16L", - "L:16B": "I;16B", - "YCCA": "YCbCr", - "YCC": "YCbCr", - }.get(mode), - ) - if proof is None: - self.transform = core.buildTransform( - input.profile, output.profile, input_mode, output_mode, intent, flags - ) - else: - self.transform = core.buildProofTransform( - input.profile, - output.profile, - proof.profile, - input_mode, - output_mode, - intent, - proof_intent, - flags, - ) - # Note: inputMode and outputMode are for pyCMS compatibility only - self.input_mode = self.inputMode = input_mode - self.output_mode = self.outputMode = output_mode - - self.output_profile = output - - def point(self, im: Image.Image) -> Image.Image: - return self.apply(im) - - def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: - if imOut is None: - imOut = Image.new(self.output_mode, im.size, None) - self.transform.apply(im.getim(), imOut.getim()) - imOut.info["icc_profile"] = self.output_profile.tobytes() - return imOut - - def apply_in_place(self, im: Image.Image) -> Image.Image: - if im.mode != self.output_mode: - msg = "mode mismatch" - raise ValueError(msg) # wrong output mode - self.transform.apply(im.getim(), im.getim()) - im.info["icc_profile"] = self.output_profile.tobytes() - return im - - -def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from . import ImageWin # type: ignore[unused-ignore, unreachable] - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(int(handle), 1) - else: - profile = core.get_display_profile_win32(int(handle or 0)) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - - -class PyCMSError(Exception): - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im: Image.Image, - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - renderingIntent: Intent = Intent.PERCEPTUAL, - outputMode: str | None = None, - inPlace: bool = False, - flags: Flags = Flags.NONE, -) -> Image.Image | None: - """ - (pyCMS) Applies an ICC transformation to a given image, mapping from - ``inputProfile`` to ``outputProfile``. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`PyCMSError` will be raised. - - This function applies an ICC transformation to im from ``inputProfile``'s - color space to ``outputProfile``'s color space using the specified rendering - intent to decide how to handle out-of-gamut colors. - - ``outputMode`` can be used to specify that a color mode conversion is to - be done using these profiles, but the specified profiles must be able - to handle that mode. I.e., if converting im from RGB to CMYK using - profiles, the input profile must handle RGB data, and the output - profile must handle CMYK data. - - :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) - or Image.open(...), etc.) - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this image, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this image, or a profile object - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param outputMode: A valid PIL mode for the output image (i.e. "RGB", - "CMYK", etc.). Note: if rendering the image "inPlace", outputMode - MUST be the same mode as the input, or omitted completely. If - omitted, the outputMode will be the same as the mode of the input - image (im.mode) - :param inPlace: Boolean. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - transform = ImageCmsTransform( - inputProfile, - outputProfile, - im.mode, - outputMode, - renderingIntent, - flags=flags, - ) - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile( - profileFilename: str | SupportsRead[bytes] | core.CmsProfile, -) -> ImageCmsProfile: - """ - (pyCMS) Opens an ICC profile file. - - The PyCMSProfile object can be passed back into pyCMS for use in creating - transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - - If ``profileFilename`` is not a valid filename for an ICC profile, - a :exc:`PyCMSError` will be raised. - - :param profileFilename: String, as a valid filename path to the ICC profile - you wish to open, or a file-like object. - :returns: A CmsProfile class object. - :exception PyCMSError: - """ - - try: - return ImageCmsProfile(profileFilename) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - flags: Flags = Flags.NONE, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``. Use applyTransform to apply the transform to a given - image. - - If the input or output profiles specified are not valid filenames, a - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile`` using the ``renderingIntent`` to determine what to do - with out-of-gamut colors. It will ONLY work for converting images that - are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, - i.e. "RGB", "RGBA", "CMYK", etc.). - - Building the transform is a fair part of the overhead in - ImageCms.profileToProfile(), so if you're planning on converting multiple - images using the same input/output settings, this can save you time. - Once you have a transform object, it can be used with - ImageCms.applyProfile() to convert images without the need to re-compute - the lookup table for the transform. - - The reason pyCMS returns a class object rather than a handle directly - to the transform is that it needs to keep track of the PIL input/output - modes that the transform is meant for. These attributes are stored in - the ``inMode`` and ``outMode`` attributes of the object (which can be - manually overridden if you really want to, but I don't know of any - time that would be of use, or would even work). - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - return ImageCmsTransform( - inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - proofProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.SOFTPROOFING, -) -> ImageCmsTransform: - """ - (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the - ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device. - - If the input, output, or proof profiles specified are not valid - filenames, a :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`PyCMSError` will be raised. - - This function builds and returns an ICC transform from the ``inputProfile`` - to the ``outputProfile``, but tries to simulate the result that would be - obtained on the ``proofProfile`` device using ``renderingIntent`` and - ``proofRenderingIntent`` to determine what to do with out-of-gamut - colors. This is known as "soft-proofing". It will ONLY work for - converting images that are in ``inMode`` to images that are in outMode - color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). - - Usage of the resulting transform object is exactly the same as with - ImageCms.buildTransform(). - - Proof profiling is generally used when using an output device to get a - good idea of what the final printed/displayed image would look like on - the ``proofProfile`` device when it's quicker and easier to use the - output device for judging color. Generally, this means that the - output device is a monitor, or a dye-sub printer (etc.), and the simulated - device is something more expensive, complicated, or time consuming - (making it difficult to make a real print for color judgement purposes). - - Soft-proofing basically functions by adjusting the colors on the - output device to match the colors of the device being simulated. However, - when the simulated device has a much wider gamut than the output - device, you may obtain marginal results. - - :param inputProfile: String, as a valid filename path to the ICC input - profile you wish to use for this transform, or a profile object - :param outputProfile: String, as a valid filename path to the ICC output - (monitor, usually) profile you wish to use for this transform, or a - profile object - :param proofProfile: String, as a valid filename path to the ICC proof - profile you wish to use for this transform, or a profile object - :param inMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param outMode: String, as a valid PIL mode that the appropriate profile - also supports (i.e. "RGB", "RGBA", "CMYK", etc.) - :param renderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for the input->proof (simulated) transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent - you wish to use for proof->output transform - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param flags: Integer (0-...) specifying additional flags - :returns: A CmsTransform class object. - :exception PyCMSError: - """ - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - try: - if not isinstance(inputProfile, ImageCmsProfile): - inputProfile = ImageCmsProfile(inputProfile) - if not isinstance(outputProfile, ImageCmsProfile): - outputProfile = ImageCmsProfile(outputProfile) - if not isinstance(proofProfile, ImageCmsProfile): - proofProfile = ImageCmsProfile(proofProfile) - return ImageCmsTransform( - inputProfile, - outputProfile, - inMode, - outMode, - renderingIntent, - proofProfile, - proofRenderingIntent, - flags, - ) - except (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform( - im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False -) -> Image.Image | None: - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`PyCMSError` is raised. - - This function applies a pre-calculated transform (from - ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) - to an image. The transform can be used for multiple images, saving - considerable calculation time if doing the same conversion multiple times. - - If you want to modify im in-place instead of receiving a new image as - the return value, set ``inPlace`` to ``True``. This can only be done if - ``transform.input_mode`` and ``transform.output_mode`` are the same, because we - can't change the mode in-place (the buffer sizes for some modes are - different). The default behavior is to return a new :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.output_mode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same - as the ``input_mode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, - depending on the value of ``inPlace``. The profile will be returned in - the image's ``info['icc_profile']``. - :exception PyCMSError: - """ - - try: - if inPlace: - transform.apply_in_place(im) - imOut = None - else: - imOut = transform.apply(im) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def createProfile( - colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 -) -> core.CmsProfile: - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`PyCMSError` is raised. - - Use this function to create common profiles on-the-fly instead of - having to supply a profile on disk and knowing the path to it. It - returns a normal CmsProfile object that can be passed to - ImageCms.buildTransformFromOpenProfiles() to create a transform to apply - to images. - - :param colorSpace: String, the color space of the profile you wish to - create. - Currently only "LAB", "XYZ", and "sRGB" are supported. - :param colorTemp: Positive number for the white point for the profile, in - degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 - illuminant if omitted (5000k). colorTemp is ONLY applied to LAB - profiles, and is ignored for XYZ and sRGB. - :returns: A CmsProfile class object - :exception PyCMSError: - """ - - if colorSpace not in ["LAB", "XYZ", "sRGB"]: - msg = ( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - raise PyCMSError(msg) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - msg = f'Color temperature must be numeric, "{colorTemp}" not valid' - raise PyCMSError(msg) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile: _CmsProfileCompatible) -> str: - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`PyCMSError` is raised. - - Use this function to obtain the INTERNAL name of the profile (stored - in an ICC tag in the profile itself), usually the one used when the - profile was originally created. Sometimes this tag also contains - additional information supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal name of the profile as stored - in an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # do it in python, not c. - # // name was "%s - %s" (model, manufacturer) || Description , - # // but if the Model and Manufacturer were the same or the model - # // was long, Just the model, in 1.x - model = profile.profile.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or (model and len(model) > 30): - return f"{model}\n" - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - info tag. This often contains details about the profile, and how it - was created, as supplied by the creator. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # add an extra newline to preserve pyCMS compatibility - # Python, not C. the white point bits weren't working well, - # so skipping. - # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint - description = profile.profile.profile_description - cpright = profile.profile.copyright - elements = [element for element in (description, cpright) if element] - return "\r\n\r\n".join(elements) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - copyright tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - manufacturer tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - model tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in - an ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`PyCMSError` is raised. - - Use this function to obtain the information stored in the profile's - description tag. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: A string containing the internal profile information stored in an - ICC tag. - :exception PyCMSError: - """ - - try: - # add an extra newline to preserve pyCMS compatibility - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return (profile.profile.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile: _CmsProfileCompatible) -> int: - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`PyCMSError` is raised. - - Use this function to determine the default (and usually best optimized) - rendering intent for this profile. Most profiles support multiple - rendering intents, but are intended mostly for one type of conversion. - If you wish to use a different intent than returned, use - ImageCms.isIntentSupported() to verify it will work first. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :returns: Integer 0-3 specifying the default rendering intent for this - profile. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - return profile.profile.rendering_intent - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported( - profile: _CmsProfileCompatible, intent: Intent, direction: Direction -) -> Literal[-1, 1]: - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` with ``profile``, and that ``profile`` can be used for the - input/output/proof profile as you desire. - - Some profiles are created specifically for one "direction", can cannot - be used for others. Some profiles can only be used for certain - rendering intents, so it's best to either verify this before trying - to create a transform with them (using this function), or catch the - potential :exc:`PyCMSError` that will occur if they don't - support the modes you select. - - :param profile: EITHER a valid CmsProfile object, OR a string of the - filename of an ICC profile. - :param intent: Integer (0-3) specifying the rendering intent you wish to - use with this profile - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifying if the profile is to be used for - input, output, or proof - - INPUT = 0 (or use ImageCms.Direction.INPUT) - OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) - PROOF = 2 (or use ImageCms.Direction.PROOF) - - :returns: 1 if the intent/direction are supported, -1 if they are not. - :exception PyCMSError: - """ - - try: - if not isinstance(profile, ImageCmsProfile): - profile = ImageCmsProfile(profile) - # FIXME: I get different results for the same data w. different - # compilers. Bug in LittleCMS or in the binding? - if profile.profile.is_intent_supported(intent, direction): - return 1 - else: - return -1 - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions() -> tuple[str, str | None, str, str]: - """ - (pyCMS) Fetches versions. - """ - - deprecate( - "PIL.ImageCms.versions()", - 12, - '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', - ) - return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/lib/python3.12/site-packages/PIL/ImageColor.py b/lib/python3.12/site-packages/PIL/ImageColor.py deleted file mode 100644 index 9a15a8e..0000000 --- a/lib/python3.12/site-packages/PIL/ImageColor.py +++ /dev/null @@ -1,320 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# map CSS3-style colour description strings to RGB -# -# History: -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-15 fl Added RGBA support -# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 -# 2004-07-19 fl Fixed gray/grey spelling issues -# 2009-03-05 fl Fixed rounding error in grayscale calculation -# -# Copyright (c) 2002-2004 by Secret Labs AB -# Copyright (c) 2002-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from functools import lru_cache - -from . import Image - - -@lru_cache -def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: - """ - Convert a color string to an RGB or RGBA tuple. If the string cannot be - parsed, this function raises a :py:exc:`ValueError` exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :return: ``(red, green, blue[, alpha])`` - """ - if len(color) > 100: - msg = "color specifier is too long" - raise ValueError(msg) - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - rgb_tuple = getrgb(rgb) - assert len(rgb_tuple) == 3 - colormap[color] = rgb_tuple - return rgb_tuple - - # check for known string formats - if re.match("#[a-f0-9]{3}$", color): - return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) - - if re.match("#[a-f0-9]{4}$", color): - return ( - int(color[1] * 2, 16), - int(color[2] * 2, 16), - int(color[3] * 2, 16), - int(color[4] * 2, 16), - ) - - if re.match("#[a-f0-9]{6}$", color): - return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) - - if re.match("#[a-f0-9]{8}$", color): - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - int(color[7:9], 16), - ) - - m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)) - - m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) - if m: - return ( - int((int(m.group(1)) * 255) / 100.0 + 0.5), - int((int(m.group(2)) * 255) / 100.0 + 0.5), - int((int(m.group(3)) * 255) / 100.0 + 0.5), - ) - - m = re.match( - r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb_floats = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb_floats = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[2] * 255 + 0.5), - ) - - m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) - if m: - return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) - msg = f"unknown color specifier: {repr(color)}" - raise ValueError(msg) - - -@lru_cache -def getcolor(color: str, mode: str) -> int | tuple[int, ...]: - """ - Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if - ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is - not color or a palette image, converts the RGB value to a grayscale value. - If the string cannot be parsed, this function raises a :py:exc:`ValueError` - exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :param mode: Convert result to this mode - :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - rgb, alpha = getrgb(color), 255 - if len(rgb) == 4: - alpha = rgb[3] - rgb = rgb[:3] - - if mode == "HSV": - from colorsys import rgb_to_hsv - - r, g, b = rgb - h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) - return int(h * 255), int(s * 255), int(v * 255) - elif Image.getmodebase(mode) == "L": - r, g, b = rgb - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return graylevel, alpha - return graylevel - elif mode[-1] == "A": - return rgb + (alpha,) - return rgb - - -colormap: dict[str, str | tuple[int, int, int]] = { - # X11 colour table from https://drafts.csswg.org/css-color-4/, with - # gray/grey spelling issues fixed. This is a superset of HTML 4.0 - # colour names used in CSS 1. - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgreen": "#90ee90", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} diff --git a/lib/python3.12/site-packages/PIL/ImageDraw.py b/lib/python3.12/site-packages/PIL/ImageDraw.py deleted file mode 100644 index d8e4c0c..0000000 --- a/lib/python3.12/site-packages/PIL/ImageDraw.py +++ /dev/null @@ -1,1218 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# drawing interface operations -# -# History: -# 1996-04-13 fl Created (experimental) -# 1996-08-07 fl Filled polygons, ellipses. -# 1996-08-13 fl Added text support -# 1998-06-28 fl Handle I and F images -# 1998-12-29 fl Added arc; use arc primitive to draw ellipses -# 1999-01-10 fl Added shape stuff (experimental) -# 1999-02-06 fl Added bitmap support -# 1999-02-11 fl Changed all primitives to take options -# 1999-02-20 fl Fixed backwards compatibility -# 2000-10-12 fl Copy on write, when necessary -# 2001-02-18 fl Use default ink for bitmap/text also in fill mode -# 2002-10-24 fl Added support for CSS-style color strings -# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing -# 2002-12-11 fl Refactored low-level drawing API (work in progress) -# 2004-08-26 fl Made Draw() a factory function, added getdraw() support -# 2004-09-04 fl Added width support to line primitive -# 2004-09-10 fl Added font mode handling -# 2006-06-19 fl Added font bearing support (getmask2) -# -# Copyright (c) 1997-2006 by Secret Labs AB -# Copyright (c) 1996-2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -import struct -from collections.abc import Sequence -from types import ModuleType -from typing import TYPE_CHECKING, Any, AnyStr, Callable, Union, cast - -from . import Image, ImageColor -from ._deprecate import deprecate -from ._typing import Coords - -# experimental access to the outline API -Outline: Callable[[], Image.core._Outline] | None -try: - Outline = Image.core.outline -except AttributeError: - Outline = None - -if TYPE_CHECKING: - from . import ImageDraw2, ImageFont - -_Ink = Union[float, tuple[int, ...], str] - -""" -A simple 2D drawing interface for PIL images. -

-Application code should use the Draw factory, instead of -directly. -""" - - -class ImageDraw: - font: ( - ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None - ) = None - - def __init__(self, im: Image.Image, mode: str | None = None) -> None: - """ - Create a drawing instance. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - im.load() - if im.readonly: - im._copy() # make it writeable - blend = 0 - if mode is None: - mode = im.mode - if mode != im.mode: - if mode == "RGBA" and im.mode == "RGB": - blend = 1 - else: - msg = "mode mismatch" - raise ValueError(msg) - if mode == "P": - self.palette = im.palette - else: - self.palette = None - self._image = im - self.im = im.im - self.draw = Image.core.draw(self.im, blend) - self.mode = mode - if mode in ("I", "F"): - self.ink = self.draw.draw_ink(1) - else: - self.ink = self.draw.draw_ink(-1) - if mode in ("1", "P", "I", "F"): - # FIXME: fix Fill2 to properly support matte for I+F images - self.fontmode = "1" - else: - self.fontmode = "L" # aliasing is okay for other modes - self.fill = False - - def getfont( - self, - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - """ - Get the current default font. - - To set the default font for this ImageDraw instance:: - - from PIL import ImageDraw, ImageFont - draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - To set the default font for all future ImageDraw instances:: - - from PIL import ImageDraw, ImageFont - ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - If the current default font is ``None``, - it is initialized with ``ImageFont.load_default()``. - - :returns: An image font.""" - if not self.font: - # FIXME: should add a font repository - from . import ImageFont - - self.font = ImageFont.load_default() - return self.font - - def _getfont( - self, font_size: float | None - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - if font_size is not None: - from . import ImageFont - - return ImageFont.load_default(font_size) - else: - return self.getfont() - - def _getink( - self, ink: _Ink | None, fill: _Ink | None = None - ) -> tuple[int | None, int | None]: - result_ink = None - result_fill = None - if ink is None and fill is None: - if self.fill: - result_fill = self.ink - else: - result_ink = self.ink - else: - if ink is not None: - if isinstance(ink, str): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and isinstance(ink, tuple): - ink = self.palette.getcolor(ink, self._image) - result_ink = self.draw.draw_ink(ink) - if fill is not None: - if isinstance(fill, str): - fill = ImageColor.getcolor(fill, self.mode) - if self.palette and isinstance(fill, tuple): - fill = self.palette.getcolor(fill, self._image) - result_fill = self.draw.draw_ink(fill) - return result_ink, result_fill - - def arc( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an arc.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink, width) - - def bitmap( - self, xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None = None - ) -> None: - """Draw a bitmap.""" - bitmap.load() - ink, fill = self._getink(fill) - if ink is None: - ink = fill - if ink is not None: - self.draw.draw_bitmap(xy, bitmap.im, ink) - - def chord( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a chord.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_chord(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_chord(xy, start, end, ink, 0, width) - - def ellipse( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an ellipse.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_ellipse(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_ellipse(xy, ink, 0, width) - - def circle( - self, - xy: Sequence[float], - radius: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a circle given center coordinates and a radius.""" - ellipse_xy = (xy[0] - radius, xy[1] - radius, xy[0] + radius, xy[1] + radius) - self.ellipse(ellipse_xy, fill, outline, width) - - def line( - self, - xy: Coords, - fill: _Ink | None = None, - width: int = 0, - joint: str | None = None, - ) -> None: - """Draw a line, or a connected sequence of line segments.""" - ink = self._getink(fill)[0] - if ink is not None: - self.draw.draw_lines(xy, ink, width) - if joint == "curve" and width > 4: - points: Sequence[Sequence[float]] - if isinstance(xy[0], (list, tuple)): - points = cast(Sequence[Sequence[float]], xy) - else: - points = [ - cast(Sequence[float], tuple(xy[i : i + 2])) - for i in range(0, len(xy), 2) - ] - for i in range(1, len(points) - 1): - point = points[i] - angles = [ - math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) - % 360 - for start, end in ( - (points[i - 1], point), - (point, points[i + 1]), - ) - ] - if angles[0] == angles[1]: - # This is a straight line, so no joint is required - continue - - def coord_at_angle( - coord: Sequence[float], angle: float - ) -> tuple[float, ...]: - x, y = coord - angle -= 90 - distance = width / 2 - 1 - return tuple( - p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) - for p, p_d in ( - (x, distance * math.cos(math.radians(angle))), - (y, distance * math.sin(math.radians(angle))), - ) - ) - - flipped = ( - angles[1] > angles[0] and angles[1] - 180 > angles[0] - ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) - coords = [ - (point[0] - width / 2 + 1, point[1] - width / 2 + 1), - (point[0] + width / 2 - 1, point[1] + width / 2 - 1), - ] - if flipped: - start, end = (angles[1] + 90, angles[0] + 90) - else: - start, end = (angles[0] - 90, angles[1] - 90) - self.pieslice(coords, start - 90, end - 90, fill) - - if width > 8: - # Cover potential gaps between the line and the joint - if flipped: - gap_coords = [ - coord_at_angle(point, angles[0] + 90), - point, - coord_at_angle(point, angles[1] + 90), - ] - else: - gap_coords = [ - coord_at_angle(point, angles[0] - 90), - point, - coord_at_angle(point, angles[1] - 90), - ] - self.line(gap_coords, fill, width=3) - - def shape( - self, - shape: Image.core._Outline, - fill: _Ink | None = None, - outline: _Ink | None = None, - ) -> None: - """(Experimental) Draw a shape.""" - shape.close() - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_outline(shape, fill_ink, 1) - if ink is not None and ink != fill_ink: - self.draw.draw_outline(shape, ink, 0) - - def pieslice( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a pieslice.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_pieslice(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_pieslice(xy, start, end, ink, 0, width) - - def point(self, xy: Coords, fill: _Ink | None = None) -> None: - """Draw one or more individual pixels.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_points(xy, ink) - - def polygon( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a polygon.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_polygon(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - if width == 1: - self.draw.draw_polygon(xy, ink, 0, width) - elif self.im is not None: - # To avoid expanding the polygon outwards, - # use the fill as a mask - mask = Image.new("1", self.im.size) - mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) - draw.draw.draw_polygon(xy, mask_ink, 1) - - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) - - def regular_polygon( - self, - bounding_circle: Sequence[Sequence[float] | float], - n_sides: int, - rotation: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a regular polygon.""" - xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) - self.polygon(xy, fill, outline, width) - - def rectangle( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a rectangle.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_rectangle(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_rectangle(xy, ink, 0, width) - - def rounded_rectangle( - self, - xy: Coords, - radius: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - *, - corners: tuple[bool, bool, bool, bool] | None = None, - ) -> None: - """Draw a rounded rectangle.""" - if isinstance(xy[0], (list, tuple)): - (x0, y0), (x1, y1) = cast(Sequence[Sequence[float]], xy) - else: - x0, y0, x1, y1 = cast(Sequence[float], xy) - if x1 < x0: - msg = "x1 must be greater than or equal to x0" - raise ValueError(msg) - if y1 < y0: - msg = "y1 must be greater than or equal to y0" - raise ValueError(msg) - if corners is None: - corners = (True, True, True, True) - - d = radius * 2 - - x0 = round(x0) - y0 = round(y0) - x1 = round(x1) - y1 = round(y1) - full_x, full_y = False, False - if all(corners): - full_x = d >= x1 - x0 - 1 - if full_x: - # The two left and two right corners are joined - d = x1 - x0 - full_y = d >= y1 - y0 - 1 - if full_y: - # The two top and two bottom corners are joined - d = y1 - y0 - if full_x and full_y: - # If all corners are joined, that is a circle - return self.ellipse(xy, fill, outline, width) - - if d == 0 or not any(corners): - # If the corners have no curve, - # or there are no corners, - # that is a rectangle - return self.rectangle(xy, fill, outline, width) - - r = int(d // 2) - ink, fill_ink = self._getink(outline, fill) - - def draw_corners(pieslice: bool) -> None: - parts: tuple[tuple[tuple[float, float, float, float], int, int], ...] - if full_x: - # Draw top and bottom halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 180, 360), - ((x0, y1 - d, x0 + d, y1), 0, 180), - ) - elif full_y: - # Draw left and right halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 90, 270), - ((x1 - d, y0, x1, y0 + d), 270, 90), - ) - else: - # Draw four separate corners - parts = tuple( - part - for i, part in enumerate( - ( - ((x0, y0, x0 + d, y0 + d), 180, 270), - ((x1 - d, y0, x1, y0 + d), 270, 360), - ((x1 - d, y1 - d, x1, y1), 0, 90), - ((x0, y1 - d, x0 + d, y1), 90, 180), - ) - ) - if corners[i] - ) - for part in parts: - if pieslice: - self.draw.draw_pieslice(*(part + (fill_ink, 1))) - else: - self.draw.draw_arc(*(part + (ink, width))) - - if fill_ink is not None: - draw_corners(True) - - if full_x: - self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill_ink, 1) - elif x1 - r - 1 > x0 + r + 1: - self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill_ink, 1) - if not full_x and not full_y: - left = [x0, y0, x0 + r, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, fill_ink, 1) - - right = [x1 - r, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - draw_corners(False) - - if not full_x: - top = [x0, y0, x1, y0 + width - 1] - if corners[0]: - top[0] += r + 1 - if corners[1]: - top[2] -= r + 1 - self.draw.draw_rectangle(top, ink, 1) - - bottom = [x0, y1 - width + 1, x1, y1] - if corners[3]: - bottom[0] += r + 1 - if corners[2]: - bottom[2] -= r + 1 - self.draw.draw_rectangle(bottom, ink, 1) - if not full_y: - left = [x0, y0, x0 + width - 1, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, ink, 1) - - right = [x1 - width + 1, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, ink, 1) - - def _multiline_check(self, text: AnyStr) -> bool: - split_character = "\n" if isinstance(text, str) else b"\n" - - return split_character in text - - def _multiline_split(self, text: AnyStr) -> list[AnyStr]: - return text.split("\n" if isinstance(text, str) else b"\n") - - def _multiline_spacing( - self, - font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont, - spacing: float, - stroke_width: float, - ) -> float: - return ( - self.textbbox((0, 0), "A", font, stroke_width=stroke_width)[3] - + stroke_width - + spacing - ) - - def text( - self, - xy: tuple[float, float], - text: AnyStr, - fill: _Ink | None = None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - stroke_fill: _Ink | None = None, - embedded_color: bool = False, - *args: Any, - **kwargs: Any, - ) -> None: - """Draw text.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(kwargs.get("font_size")) - - if self._multiline_check(text): - return self.multiline_text( - xy, - text, - fill, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - stroke_fill, - embedded_color, - ) - - def getink(fill: _Ink | None) -> int: - ink, fill_ink = self._getink(fill) - if ink is None: - assert fill_ink is not None - return fill_ink - return ink - - def draw_text(ink: int, stroke_width: float = 0) -> None: - mode = self.fontmode - if stroke_width == 0 and embedded_color: - mode = "RGBA" - coord = [] - for i in range(2): - coord.append(int(xy[i])) - start = (math.modf(xy[0])[0], math.modf(xy[1])[0]) - try: - mask, offset = font.getmask2( # type: ignore[union-attr,misc] - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - *args, - **kwargs, - ) - coord = [coord[0] + offset[0], coord[1] + offset[1]] - except AttributeError: - try: - mask = font.getmask( # type: ignore[misc] - text, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start=start, - *args, - **kwargs, - ) - except TypeError: - mask = font.getmask(text) - if mode == "RGBA": - # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A - # extract mask and set text alpha - color, mask = mask, mask.getband(3) - ink_alpha = struct.pack("i", ink)[3] - color.fillband(3, ink_alpha) - x, y = coord - if self.im is not None: - self.im.paste( - color, (x, y, x + mask.size[0], y + mask.size[1]), mask - ) - else: - self.draw.draw_bitmap(coord, mask, ink) - - ink = getink(fill) - if ink is not None: - stroke_ink = None - if stroke_width: - stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink - - if stroke_ink is not None: - # Draw stroked text - draw_text(stroke_ink, stroke_width) - - # Draw normal text - draw_text(ink, 0) - else: - # Only draw normal text - draw_text(ink) - - def multiline_text( - self, - xy: tuple[float, float], - text: AnyStr, - fill: _Ink | None = None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - stroke_fill: _Ink | None = None, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> None: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - msg = "anchor must be a 2 character string" - raise ValueError(msg) - elif anchor[1] in "tb": - msg = "anchor not supported for multiline text" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - widths = [] - max_width: float = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, font, direction=direction, features=features, language=language - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center" or "right"' - raise ValueError(msg) - - self.text( - (left, top), - line, - fill, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_fill=stroke_fill, - embedded_color=embedded_color, - ) - top += line_spacing - - def textlength( - self, - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> float: - """Get the length of a given string, in pixels with 1/64 precision.""" - if self._multiline_check(text): - msg = "can't measure length of multiline text" - raise ValueError(msg) - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - mode = "RGBA" if embedded_color else self.fontmode - return font.getlength(text, mode, direction, features, language) - - def textbbox( - self, - xy: tuple[float, float], - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> tuple[float, float, float, float]: - """Get the bounding box of a given string, in pixels.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - if self._multiline_check(text): - return self.multiline_textbbox( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - ) - - mode = "RGBA" if embedded_color else self.fontmode - bbox = font.getbbox( - text, mode, direction, features, language, stroke_width, anchor - ) - return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] - - def multiline_textbbox( - self, - xy: tuple[float, float], - text: AnyStr, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor: str | None = None, - spacing: float = 4, - align: str = "left", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - embedded_color: bool = False, - *, - font_size: float | None = None, - ) -> tuple[float, float, float, float]: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - msg = "anchor must be a 2 character string" - raise ValueError(msg) - elif anchor[1] in "tb": - msg = "anchor not supported for multiline text" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - widths = [] - max_width: float = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - bbox: tuple[float, float, float, float] | None = None - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center" or "right"' - raise ValueError(msg) - - bbox_line = self.textbbox( - (left, top), - line, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - embedded_color=embedded_color, - ) - if bbox is None: - bbox = bbox_line - else: - bbox = ( - min(bbox[0], bbox_line[0]), - min(bbox[1], bbox_line[1]), - max(bbox[2], bbox_line[2]), - max(bbox[3], bbox_line[3]), - ) - - top += line_spacing - - if bbox is None: - return xy[0], xy[1], xy[0], xy[1] - return bbox - - -def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: - """ - A simple 2D drawing interface for PIL images. - - :param im: The image to draw in. - :param mode: Optional mode to use for color values. For RGB - images, this argument can be RGB or RGBA (to blend the - drawing into the image). For all other modes, this argument - must be the same as the image mode. If omitted, the mode - defaults to the mode of the image. - """ - try: - return getattr(im, "getdraw")(mode) - except AttributeError: - return ImageDraw(im, mode) - - -def getdraw( - im: Image.Image | None = None, hints: list[str] | None = None -) -> tuple[ImageDraw2.Draw | None, ModuleType]: - """ - :param im: The image to draw in. - :param hints: An optional list of hints. Deprecated. - :returns: A (drawing context, drawing resource factory) tuple. - """ - if hints is not None: - deprecate("'hints' parameter", 12) - from . import ImageDraw2 - - draw = ImageDraw2.Draw(im) if im is not None else None - return draw, ImageDraw2 - - -def floodfill( - image: Image.Image, - xy: tuple[int, int], - value: float | tuple[int, ...], - border: float | tuple[int, ...] | None = None, - thresh: float = 0, -) -> None: - """ - .. warning:: This method is experimental. - - Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of - non-homogeneous, but similar, colors. - """ - # based on an implementation by Eric S. Raymond - # amended by yo1995 @20180806 - pixel = image.load() - assert pixel is not None - x, y = xy - try: - background = pixel[x, y] - if _color_diff(value, background) <= thresh: - return # seed point already has fill color - pixel[x, y] = value - except (ValueError, IndexError): - return # seed point outside image - edge = {(x, y)} - # use a set to keep record of current and previous edge pixels - # to reduce memory consumption - full_edge = set() - while edge: - new_edge = set() - for x, y in edge: # 4 adjacent method - for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - # If already processed, or if a coordinate is negative, skip - if (s, t) in full_edge or s < 0 or t < 0: - continue - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - full_edge.add((s, t)) - if border is None: - fill = _color_diff(p, background) <= thresh - else: - fill = p not in (value, border) - if fill: - pixel[s, t] = value - new_edge.add((s, t)) - full_edge = edge # discard pixels processed - edge = new_edge - - -def _compute_regular_polygon_vertices( - bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float -) -> list[tuple[float, float]]: - """ - Generate a list of vertices for a 2D regular polygon. - - :param bounding_circle: The bounding circle is a sequence defined - by a point and radius. The polygon is inscribed in this circle. - (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) - :param n_sides: Number of sides - (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) - :param rotation: Apply an arbitrary rotation to the polygon - (e.g. ``rotation=90``, applies a 90 degree rotation) - :return: List of regular polygon vertices - (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) - - How are the vertices computed? - 1. Compute the following variables - - theta: Angle between the apothem & the nearest polygon vertex - - side_length: Length of each polygon edge - - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) - - polygon_radius: Polygon radius (last element of bounding_circle) - - angles: Location of each polygon vertex in polar grid - (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) - - 2. For each angle in angles, get the polygon vertex at that angle - The vertex is computed using the equation below. - X= xcos(φ) + ysin(φ) - Y= −xsin(φ) + ycos(φ) - - Note: - φ = angle in degrees - x = 0 - y = polygon_radius - - The formula above assumes rotation around the origin. - In our case, we are rotating around the centroid. - To account for this, we use the formula below - X = xcos(φ) + ysin(φ) + centroid_x - Y = −xsin(φ) + ycos(φ) + centroid_y - """ - # 1. Error Handling - # 1.1 Check `n_sides` has an appropriate value - if not isinstance(n_sides, int): - msg = "n_sides should be an int" # type: ignore[unreachable] - raise TypeError(msg) - if n_sides < 3: - msg = "n_sides should be an int > 2" - raise ValueError(msg) - - # 1.2 Check `bounding_circle` has an appropriate value - if not isinstance(bounding_circle, (list, tuple)): - msg = "bounding_circle should be a sequence" - raise TypeError(msg) - - if len(bounding_circle) == 3: - if not all(isinstance(i, (int, float)) for i in bounding_circle): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - *centroid, polygon_radius = cast(list[float], list(bounding_circle)) - elif len(bounding_circle) == 2 and isinstance(bounding_circle[0], (list, tuple)): - if not all( - isinstance(i, (int, float)) for i in bounding_circle[0] - ) or not isinstance(bounding_circle[1], (int, float)): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - if len(bounding_circle[0]) != 2: - msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" - raise ValueError(msg) - - centroid = cast(list[float], list(bounding_circle[0])) - polygon_radius = cast(float, bounding_circle[1]) - else: - msg = ( - "bounding_circle should contain 2D coordinates " - "and a radius (e.g. (x, y, r) or ((x, y), r) )" - ) - raise ValueError(msg) - - if polygon_radius <= 0: - msg = "bounding_circle radius should be > 0" - raise ValueError(msg) - - # 1.3 Check `rotation` has an appropriate value - if not isinstance(rotation, (int, float)): - msg = "rotation should be an int or float" # type: ignore[unreachable] - raise ValueError(msg) - - # 2. Define Helper Functions - def _apply_rotation(point: list[float], degrees: float) -> tuple[float, float]: - return ( - round( - point[0] * math.cos(math.radians(360 - degrees)) - - point[1] * math.sin(math.radians(360 - degrees)) - + centroid[0], - 2, - ), - round( - point[1] * math.cos(math.radians(360 - degrees)) - + point[0] * math.sin(math.radians(360 - degrees)) - + centroid[1], - 2, - ), - ) - - def _compute_polygon_vertex(angle: float) -> tuple[float, float]: - start_point = [polygon_radius, 0] - return _apply_rotation(start_point, angle) - - def _get_angles(n_sides: int, rotation: float) -> list[float]: - angles = [] - degrees = 360 / n_sides - # Start with the bottom left polygon vertex - current_angle = (270 - 0.5 * degrees) + rotation - for _ in range(0, n_sides): - angles.append(current_angle) - current_angle += degrees - if current_angle > 360: - current_angle -= 360 - return angles - - # 3. Variable Declarations - angles = _get_angles(n_sides, rotation) - - # 4. Compute Vertices - return [_compute_polygon_vertex(angle) for angle in angles] - - -def _color_diff( - color1: float | tuple[int, ...], color2: float | tuple[int, ...] -) -> float: - """ - Uses 1-norm distance to calculate difference between two values. - """ - first = color1 if isinstance(color1, tuple) else (color1,) - second = color2 if isinstance(color2, tuple) else (color2,) - - return sum(abs(first[i] - second[i]) for i in range(0, len(second))) diff --git a/lib/python3.12/site-packages/PIL/ImageDraw2.py b/lib/python3.12/site-packages/PIL/ImageDraw2.py deleted file mode 100644 index 3d68658..0000000 --- a/lib/python3.12/site-packages/PIL/ImageDraw2.py +++ /dev/null @@ -1,243 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WCK-style drawing interface operations -# -# History: -# 2003-12-07 fl created -# 2005-05-15 fl updated; added to PIL as ImageDraw2 -# 2005-05-15 fl added text support -# 2005-05-20 fl added arc/chord/pieslice support -# -# Copyright (c) 2003-2005 by Secret Labs AB -# Copyright (c) 2003-2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" -from __future__ import annotations - -from typing import Any, AnyStr, BinaryIO - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath -from ._typing import Coords, StrOrBytesPath - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color: str, width: int = 1, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color: str, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__( - self, color: str, file: StrOrBytesPath | BinaryIO, size: float = 12 - ) -> None: - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__( - self, - image: Image.Image | str, - size: tuple[int, int] | list[int] | None = None, - color: float | tuple[float, ...] | str | None = None, - ) -> None: - if isinstance(image, str): - if size is None: - msg = "If image argument is mode string, size must be a list or tuple" - raise ValueError(msg) - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform: tuple[float, float, float, float, float, float] | None = None - - def flush(self) -> Image.Image: - return self.image - - def render( - self, - op: str, - xy: Coords, - pen: Pen | Brush | None, - brush: Brush | Pen | None = None, - **kwargs: Any, - ) -> None: - # handle color arguments - outline = fill = None - width = 1 - if isinstance(pen, Pen): - outline = pen.color - width = pen.width - elif isinstance(brush, Pen): - outline = brush.color - width = brush.width - if isinstance(brush, Brush): - fill = brush.color - elif isinstance(pen, Brush): - fill = pen.color - # handle transformation - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - # render the item - if op in ("arc", "line"): - kwargs.setdefault("fill", outline) - else: - kwargs.setdefault("fill", fill) - kwargs.setdefault("outline", outline) - if op == "line": - kwargs.setdefault("width", width) - getattr(self.draw, op)(xy, **kwargs) - - def settransform(self, offset: tuple[float, float]) -> None: - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, pen, *options, start=start, end=end) - - def chord( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, pen, *options, start=start, end=end) - - def ellipse(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, pen, *options) - - def line(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, pen, *options) - - def pieslice( - self, - xy: Coords, - pen: Pen | Brush | None, - start: float, - end: float, - *options: Any, - ) -> None: - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, pen, *options, start=start, end=end) - - def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, pen, *options) - - def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, pen, *options) - - def text(self, xy: tuple[float, float], text: AnyStr, font: Font) -> None: - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textbbox( - self, xy: tuple[float, float], text: AnyStr, font: Font - ) -> tuple[float, float, float, float]: - """ - Returns bounding box (in pixels) of given text. - - :return: ``(left, top, right, bottom)`` bounding box - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` - """ - if self.transform: - path = ImagePath.Path(xy) - path.transform(self.transform) - xy = path - return self.draw.textbbox(xy, text, font=font.font) - - def textlength(self, text: AnyStr, font: Font) -> float: - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` - """ - return self.draw.textlength(text, font=font.font) diff --git a/lib/python3.12/site-packages/PIL/ImageEnhance.py b/lib/python3.12/site-packages/PIL/ImageEnhance.py deleted file mode 100644 index 0e7e6dd..0000000 --- a/lib/python3.12/site-packages/PIL/ImageEnhance.py +++ /dev/null @@ -1,113 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image enhancement classes -# -# For a background, see "Image Processing By Interpolation and -# Extrapolation", Paul Haeberli and Douglas Voorhies. Available -# at http://www.graficaobscura.com/interp/index.html -# -# History: -# 1996-03-23 fl Created -# 2009-06-16 fl Fixed mean calculation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - image: Image.Image - degenerate: Image.Image - - def enhance(self, factor: float) -> Image.Image: - """ - Returns an enhanced image. - - :param factor: A floating point value controlling the enhancement. - Factor 1.0 always returns a copy of the original image, - lower factors mean less color (brightness, contrast, - etc), and higher values more. There are no restrictions - on this value. - :rtype: :py:class:`~PIL.Image.Image` - """ - return Image.blend(self.degenerate, self.image, factor) - - -class Color(_Enhance): - """Adjust image color balance. - - This class can be used to adjust the colour balance of an image, in - a manner similar to the controls on a colour TV set. An enhancement - factor of 0.0 gives a black and white image. A factor of 1.0 gives - the original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.intermediate_mode = "L" - if "A" in image.getbands(): - self.intermediate_mode = "LA" - - if self.intermediate_mode != image.mode: - image = image.convert(self.intermediate_mode).convert(image.mode) - self.degenerate = image - - -class Contrast(_Enhance): - """Adjust image contrast. - - This class can be used to control the contrast of an image, similar - to the contrast control on a TV set. An enhancement factor of 0.0 - gives a solid gray image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - if image.mode != "L": - image = image.convert("L") - mean = int(ImageStat.Stat(image).mean[0] + 0.5) - self.degenerate = Image.new("L", image.size, mean) - if self.degenerate.mode != self.image.mode: - self.degenerate = self.degenerate.convert(self.image.mode) - - if "A" in self.image.getbands(): - self.degenerate.putalpha(self.image.getchannel("A")) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brightness of an image. An - enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the - original image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.degenerate = Image.new(image.mode, image.size, 0) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) - - -class Sharpness(_Enhance): - """Adjust image sharpness. - - This class can be used to adjust the sharpness of an image. An - enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the - original image, and a factor of 2.0 gives a sharpened image. - """ - - def __init__(self, image: Image.Image) -> None: - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/lib/python3.12/site-packages/PIL/ImageFile.py b/lib/python3.12/site-packages/PIL/ImageFile.py deleted file mode 100644 index d69d845..0000000 --- a/lib/python3.12/site-packages/PIL/ImageFile.py +++ /dev/null @@ -1,832 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# base class for image file handlers -# -# history: -# 1995-09-09 fl Created -# 1996-03-11 fl Fixed load mechanism. -# 1996-04-15 fl Added pcx/xbm decoders. -# 1996-04-30 fl Added encoders. -# 1996-12-14 fl Added load helpers -# 1997-01-11 fl Use encode_to_file where possible -# 1997-08-27 fl Flush output in _save -# 1998-03-05 fl Use memory mapping for some modes -# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" -# 1999-05-31 fl Added image parser -# 2000-10-12 fl Set readonly flag on memory-mapped images -# 2002-03-20 fl Use better messages for common decoder errors -# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available -# 2003-10-30 fl Added StubImageFile class -# 2004-02-25 fl Made incremental parser more robust -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1995-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import io -import itertools -import os -import struct -import sys -from typing import IO, TYPE_CHECKING, Any, NamedTuple, cast - -from . import Image -from ._deprecate import deprecate -from ._util import is_path - -if TYPE_CHECKING: - from ._typing import StrOrBytesPath - -MAXBLOCK = 65536 - -SAFEBLOCK = 1024 * 1024 - -LOAD_TRUNCATED_IMAGES = False -"""Whether or not to load truncated image files. User code may change this.""" - -ERRORS = { - -1: "image buffer overrun error", - -2: "decoding error", - -3: "unknown error", - -8: "bad configuration", - -9: "out of memory error", -} -""" -Dict of known error codes returned from :meth:`.PyDecoder.decode`, -:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and -:meth:`.PyEncoder.encode_to_file`. -""" - - -# -# -------------------------------------------------------------------- -# Helpers - - -def _get_oserror(error: int, *, encoder: bool) -> OSError: - try: - msg = Image.core.getcodecstatus(error) - except AttributeError: - msg = ERRORS.get(error) - if not msg: - msg = f"{'encoder' if encoder else 'decoder'} error {error}" - msg += f" when {'writing' if encoder else 'reading'} image file" - return OSError(msg) - - -def raise_oserror(error: int) -> OSError: - deprecate( - "raise_oserror", - 12, - action="It is only useful for translating error codes returned by a codec's " - "decode() method, which ImageFile already does automatically.", - ) - raise _get_oserror(error, encoder=False) - - -def _tilesort(t: _Tile) -> int: - # sort on offset - return t[2] - - -class _Tile(NamedTuple): - codec_name: str - extents: tuple[int, int, int, int] | None - offset: int - args: tuple[Any, ...] | str | None - - -# -# -------------------------------------------------------------------- -# ImageFile base class - - -class ImageFile(Image.Image): - """Base class for image file format handlers.""" - - def __init__( - self, fp: StrOrBytesPath | IO[bytes], filename: str | bytes | None = None - ) -> None: - super().__init__() - - self._min_frame = 0 - - self.custom_mimetype: str | None = None - - self.tile: list[_Tile] = [] - """ A list of tile descriptors, or ``None`` """ - - self.readonly = 1 # until we know better - - self.decoderconfig: tuple[Any, ...] = () - self.decodermaxblock = MAXBLOCK - - if is_path(fp): - # filename - self.fp = open(fp, "rb") - self.filename = os.path.realpath(os.fspath(fp)) - self._exclusive_fp = True - else: - # stream - self.fp = cast(IO[bytes], fp) - self.filename = filename if filename is not None else "" - # can be overridden - self._exclusive_fp = False - - try: - try: - self._open() - except ( - IndexError, # end of data - TypeError, # end of data (ord) - KeyError, # unsupported mode - EOFError, # got header but not the first frame - struct.error, - ) as v: - raise SyntaxError(v) from v - - if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: - msg = "not identified by this driver" - raise SyntaxError(msg) - except BaseException: - # close the file only if we have opened it this constructor - if self._exclusive_fp: - self.fp.close() - raise - - def _open(self) -> None: - pass - - def get_format_mimetype(self) -> str | None: - if self.custom_mimetype: - return self.custom_mimetype - if self.format is not None: - return Image.MIME.get(self.format.upper()) - return None - - def __setstate__(self, state: list[Any]) -> None: - self.tile = [] - super().__setstate__(state) - - def verify(self) -> None: - """Check file integrity""" - - # raise exception if something's wrong. must be called - # directly after open, and closes file when finished. - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def load(self) -> Image.core.PixelAccess | None: - """Load image data based on tile list""" - - if not self.tile and self._im is None: - msg = "cannot load this image" - raise OSError(msg) - - pixel = Image.Image.load(self) - if not self.tile: - return pixel - - self.map: mmap.mmap | None = None - use_mmap = self.filename and len(self.tile) == 1 - # As of pypy 2.1.0, memory mapping was failing here. - use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") - - readonly = 0 - - # look for read/seek overrides - if hasattr(self, "load_read"): - read = self.load_read - # don't use mmap if there are custom read/seek functions - use_mmap = False - else: - read = self.fp.read - - if hasattr(self, "load_seek"): - seek = self.load_seek - use_mmap = False - else: - seek = self.fp.seek - - if use_mmap: - # try memory mapping - decoder_name, extents, offset, args = self.tile[0] - if isinstance(args, str): - args = (args, 0, 1) - if ( - decoder_name == "raw" - and isinstance(args, tuple) - and len(args) >= 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - if offset + self.size[1] * args[1] > self.map.size(): - msg = "buffer is not large enough" - raise OSError(msg) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) - readonly = 1 - # After trashing self.im, - # we might need to reload the palette data. - if self.palette: - self.palette.dirty = 1 - except (AttributeError, OSError, ImportError): - self.map = None - - self.load_prepare() - err_code = -3 # initialize to unknown error - if not self.map: - # sort tiles in file order - self.tile.sort(key=_tilesort) - - # FIXME: This is a hack to handle TIFF's JpegTables tag. - prefix = getattr(self, "tile_prefix", b"") - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for decoder_name, extents, offset, args in self.tile: - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = "image file is truncated" - raise OSError(msg) from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = ( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - raise OSError(msg) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - decoder.cleanup() - - self.tile = [] - self.readonly = readonly - - self.load_end() - - if self._exclusive_fp and self._close_exclusive_fp_after_loading: - self.fp.close() - self.fp = None - - if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: - # still raised if decoder fails to return anything - raise _get_oserror(err_code, encoder=False) - - return Image.Image.load(self) - - def load_prepare(self) -> None: - # create image memory if necessary - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - # create palette (optional) - if self.mode == "P": - Image.Image.load(self) - - def load_end(self) -> None: - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos: int) -> None: - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, read_bytes: int) -> bytes: - # pass - - def _seek_check(self, frame: int) -> bool: - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= getattr(self, "n_frames") + self._min_frame - ) - ): - msg = "attempt to seek outside sequence" - raise EOFError(msg) - - return self.tell() != frame - - -class StubHandler: - def open(self, im: StubImageFile) -> None: - pass - - @abc.abstractmethod - def load(self, im: StubImageFile) -> Image.Image: - pass - - -class StubImageFile(ImageFile): - """ - Base class for stub image loaders. - - A stub loader is an image loader that can identify files of a - certain format, but relies on external code to load the file. - """ - - def _open(self) -> None: - msg = "StubImageFile subclass must implement _open" - raise NotImplementedError(msg) - - def load(self) -> Image.core.PixelAccess | None: - loader = self._load() - if loader is None: - msg = f"cannot find loader for this {self.format} file" - raise OSError(msg) - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ # type: ignore[assignment] - self.__dict__ = image.__dict__ - return image.load() - - def _load(self) -> StubHandler | None: - """(Hook) Find actual image loader.""" - msg = "StubImageFile subclass must implement _load" - raise NotImplementedError(msg) - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image: Image.Image | None = None - data: bytes | None = None - decoder: Image.core.ImagingDecoder | PyDecoder | None = None - offset = 0 - finished = 0 - - def reset(self) -> None: - """ - (Consumer) Reset the parser. Note that you can only call this - method immediately after you've created a parser; parser - instances cannot be reused. - """ - assert self.data is None, "cannot reuse parsers" - - def feed(self, data: bytes) -> None: - """ - (Consumer) Feed data to the parser. - - :param data: A string buffer. - :exception OSError: If the parser failed to parse the image file. - """ - # collect data - - if self.finished: - return - - if self.data is None: - self.data = data - else: - self.data = self.data + data - - # parse what we have - if self.decoder: - if self.offset > 0: - # skip header - skip = min(len(self.data), self.offset) - self.data = self.data[skip:] - self.offset = self.offset - skip - if self.offset > 0 or not self.data: - return - - n, e = self.decoder.decode(self.data) - - if n < 0: - # end of stream - self.data = None - self.finished = 1 - if e < 0: - # decoding error - self.image = None - raise _get_oserror(e, encoder=False) - else: - # end of image - return - self.data = self.data[n:] - - elif self.image: - # if we end up here with no decoder, this file cannot - # be incrementally parsed. wait until we've gotten all - # available data - pass - - else: - # attempt to open this file - try: - with io.BytesIO(self.data) as fp: - im = Image.open(fp) - except OSError: - pass # not enough data - else: - flag = hasattr(im, "load_seek") or hasattr(im, "load_read") - if flag or len(im.tile) != 1: - # custom load code, or multiple tiles - self.decode = None - else: - # initialize decoder - im.load_prepare() - d, e, o, a = im.tile[0] - im.tile = [] - self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) - self.decoder.setimage(im.im, e) - - # calculate decoder offset - self.offset = o - if self.offset <= len(self.data): - self.data = self.data[self.offset :] - self.offset = 0 - - self.image = im - - def __enter__(self) -> Parser: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> Image.Image: - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: If the parser failed to parse the image file either - because it cannot be identified or cannot be - decoded. - """ - # finish decoding - if self.decoder: - # get rid of what's left in the buffers - self.feed(b"") - self.data = self.decoder = None - if not self.finished: - msg = "image was incomplete" - raise OSError(msg) - if not self.image: - msg = "cannot parse this image" - raise OSError(msg) - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - with io.BytesIO(self.data) as fp: - try: - self.image = Image.open(fp) - finally: - self.image.load() - return self.image - - -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], tile: list[_Tile], bufsize: int = 0) -> None: - """Helper to save image based on tile list - - :param im: Image object. - :param fp: File object. - :param tile: Tile list. - :param bufsize: Optional buffer size - """ - - im.load() - if not hasattr(im, "encoderconfig"): - im.encoderconfig = () - tile.sort(key=_tilesort) - # FIXME: make MAXBLOCK a configuration parameter - # It would be great if we could have the encoder specify what it needs - # But, it would need at least the image size in most cases. RawEncode is - # a tricky case. - bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - fh = fp.fileno() - fp.flush() - _encode_tile(im, fp, tile, bufsize, fh) - except (AttributeError, io.UnsupportedOperation) as exc: - _encode_tile(im, fp, tile, bufsize, None, exc) - if hasattr(fp, "flush"): - fp.flush() - - -def _encode_tile( - im: Image.Image, - fp: IO[bytes], - tile: list[_Tile], - bufsize: int, - fh: int | None, - exc: BaseException | None = None, -) -> None: - for encoder_name, extents, offset, args in tile: - if offset > 0: - fp.seek(offset) - encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) - try: - encoder.setimage(im.im, extents) - if encoder.pushes_fd: - encoder.setfd(fp) - errcode = encoder.encode_to_pyfd()[1] - else: - if exc: - # compress to Python file-compatible object - while True: - errcode, data = encoder.encode(bufsize)[1:] - fp.write(data) - if errcode: - break - else: - # slight speedup: compress to real file object - assert fh is not None - errcode = encoder.encode_to_file(fh, bufsize) - if errcode < 0: - raise _get_oserror(errcode, encoder=True) from exc - finally: - encoder.cleanup() - - -def _safe_read(fp: IO[bytes], size: int) -> bytes: - """ - Reads large blocks in a safe way. Unlike fp.read(n), this function - doesn't trust the user. If the requested size is larger than - SAFEBLOCK, the file is read block by block. - - :param fp: File handle. Must implement a read method. - :param size: Number of bytes to read. - :returns: A string containing size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return data - blocks: list[bytes] = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - blocks.append(block) - remaining_size -= len(block) - if sum(len(block) for block in blocks) < size: - msg = "Truncated File Read" - raise OSError(msg) - return b"".join(blocks) - - -class PyCodecState: - def __init__(self) -> None: - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self) -> tuple[int, int, int, int]: - return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize - - -class PyCodec: - fd: IO[bytes] | None - - def __init__(self, mode: str, *args: Any) -> None: - self.im: Image.core.ImagingCore | None = None - self.state = PyCodecState() - self.fd = None - self.mode = mode - self.init(args) - - def init(self, args: tuple[Any, ...]) -> None: - """ - Override to perform codec specific initialization - - :param args: Tuple of arg items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self) -> None: - """ - Override to perform codec specific cleanup - - :returns: None - """ - pass - - def setfd(self, fd: IO[bytes]) -> None: - """ - Called from ImageFile to set the Python file-like object - - :param fd: A Python file-like object - :returns: None - """ - self.fd = fd - - def setimage( - self, - im: Image.core.ImagingCore, - extents: tuple[int, int, int, int] | None = None, - ) -> None: - """ - Called from ImageFile to set the core output image for the codec - - :param im: A core image object - :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle - for this tile - :returns: None - """ - - # following c code - self.im = im - - if extents: - (x0, y0, x1, y1) = extents - else: - (x0, y0, x1, y1) = (0, 0, 0, 0) - - if x0 == 0 and x1 == 0: - self.state.xsize, self.state.ysize = self.im.size - else: - self.state.xoff = x0 - self.state.yoff = y0 - self.state.xsize = x1 - x0 - self.state.ysize = y1 - y0 - - if self.state.xsize <= 0 or self.state.ysize <= 0: - msg = "Size cannot be negative" - raise ValueError(msg) - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - msg = "Tile cannot extend outside image" - raise ValueError(msg) - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self) -> bool: - return self._pulls_fd - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base decoder" - raise NotImplementedError(msg) - - def set_as_raw( - self, data: bytes, rawmode: str | None = None, extra: tuple[Any, ...] = () - ) -> None: - """ - Convenience method to set the internal image from a stream of raw data - - :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. - If not specified, it will default to the mode of the image - :param extra: Extra arguments for the decoder. - :returns: None - """ - - if not rawmode: - rawmode = self.mode - d = Image._getdecoder(self.mode, "raw", rawmode, extra) - assert self.im is not None - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self) -> bool: - return self._pushes_fd - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base encoder" - raise NotImplementedError(msg) - - def encode_to_pyfd(self) -> tuple[int, int]: - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - assert self.fd is not None - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh: int, bufsize: int) -> int: - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - os.write(fh, buf[status:]) - return errcode diff --git a/lib/python3.12/site-packages/PIL/ImageFilter.py b/lib/python3.12/site-packages/PIL/ImageFilter.py deleted file mode 100644 index 8b0974b..0000000 --- a/lib/python3.12/site-packages/PIL/ImageFilter.py +++ /dev/null @@ -1,605 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard filters -# -# History: -# 1995-11-27 fl Created -# 2002-06-08 fl Added rank and mode filters -# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2002 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import functools -from collections.abc import Sequence -from types import ModuleType -from typing import TYPE_CHECKING, Any, Callable, cast - -if TYPE_CHECKING: - from . import _imaging - from ._typing import NumpyArray - - -class Filter: - @abc.abstractmethod - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - pass - - -class MultibandFilter(Filter): - pass - - -class BuiltinFilter(MultibandFilter): - filterargs: tuple[Any, ...] - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - return image.filter(*self.filterargs) - - -class Kernel(BuiltinFilter): - """ - Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating - point kernels. - - Kernels can only be applied to "L" and "RGB" images. - - :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). - :param kernel: A sequence containing kernel weights. The kernel will be flipped - vertically before being applied to the image. - :param scale: Scale factor. If given, the result for each pixel is divided by this - value. The default is the sum of the kernel weights. - :param offset: Offset. If given, this value is added to the result, after it has - been divided by the scale factor. - """ - - name = "Kernel" - - def __init__( - self, - size: tuple[int, int], - kernel: Sequence[float], - scale: float | None = None, - offset: float = 0, - ) -> None: - if scale is None: - # default scale is sum of kernel - scale = functools.reduce(lambda a, b: a + b, kernel) - if size[0] * size[1] != len(kernel): - msg = "not enough coefficients in kernel" - raise ValueError(msg) - self.filterargs = size, scale, offset, kernel - - -class RankFilter(Filter): - """ - Create a rank filter. The rank filter sorts all pixels in - a window of the given size, and returns the ``rank``'th value. - - :param size: The kernel size, in pixels. - :param rank: What pixel value to pick. Use 0 for a min filter, - ``size * size / 2`` for a median filter, ``size * size - 1`` - for a max filter, etc. - """ - - name = "Rank" - - def __init__(self, size: int, rank: int) -> None: - self.size = size - self.rank = rank - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - image = image.expand(self.size // 2, self.size // 2) - return image.rankfilter(self.size, self.rank) - - -class MedianFilter(RankFilter): - """ - Create a median filter. Picks the median pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Median" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = size * size // 2 - - -class MinFilter(RankFilter): - """ - Create a min filter. Picks the lowest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Min" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = 0 - - -class MaxFilter(RankFilter): - """ - Create a max filter. Picks the largest pixel value in a window with the - given size. - - :param size: The kernel size, in pixels. - """ - - name = "Max" - - def __init__(self, size: int = 3) -> None: - self.size = size - self.rank = size * size - 1 - - -class ModeFilter(Filter): - """ - Create a mode filter. Picks the most frequent pixel value in a box with the - given size. Pixel values that occur only once or twice are ignored; if no - pixel value occurs more than twice, the original pixel value is preserved. - - :param size: The kernel size, in pixels. - """ - - name = "Mode" - - def __init__(self, size: int = 3) -> None: - self.size = size - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.modefilter(self.size) - - -class GaussianBlur(MultibandFilter): - """Blurs the image with a sequence of extended box filters, which - approximates a Gaussian kernel. For details on accuracy see - - - :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two - numbers for x and y, or a single number for both. - """ - - name = "GaussianBlur" - - def __init__(self, radius: float | Sequence[float] = 2) -> None: - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.gaussian_blur(xy) - - -class BoxBlur(MultibandFilter): - """Blurs the image by setting each pixel to the average value of the pixels - in a square box extending radius pixels in each direction. - Supports float radius of arbitrary size. Uses an optimized implementation - which runs in linear time relative to the size of the image - for any radius value. - - :param radius: Size of the box in a direction. Either a sequence of two numbers for - x and y, or a single number for both. - - Radius 0 does not blur, returns an identical image. - Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. - """ - - name = "BoxBlur" - - def __init__(self, radius: float | Sequence[float]) -> None: - xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) - if xy[0] < 0 or xy[1] < 0: - msg = "radius must be >= 0" - raise ValueError(msg) - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.box_blur(xy) - - -class UnsharpMask(MultibandFilter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - :param radius: Blur Radius - :param percent: Unsharp strength, in percent - :param threshold: Threshold controls the minimum brightness change that - will be sharpened - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - - """ - - name = "UnsharpMask" - - def __init__( - self, radius: float = 2, percent: int = 150, threshold: int = 3 - ) -> None: - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - filterargs = (5, 5), 16, 0, ( - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - filterargs = (5, 5), 100, 0, ( - 1, 1, 1, 1, 1, - 1, 5, 5, 5, 1, - 1, 5, 44, 5, 1, - 1, 5, 5, 5, 1, - 1, 1, 1, 1, 1, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__( - self, - size: int | tuple[int, int, int], - table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, - channels: int = 3, - target_mode: str | None = None, - **kwargs: bool, - ) -> None: - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy: ModuleType | None = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: - pass - - if numpy and isinstance(table, numpy.ndarray): - numpy_table: NumpyArray = table - if copy_table: - numpy_table = numpy_table.copy() - - if numpy_table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = numpy_table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - raw_table = cast(Sequence[Sequence[int]], table) - flat_table: list[int] = [] - for pixel in raw_table: - if len(pixel) != channels: - msg = ( - "The elements of the table should " - f"have a length of {channels}." - ) - raise ValueError(msg) - flat_table.extend(pixel) - table = flat_table - - if wrong_size or len(table) != items * channels: - msg = ( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - raise ValueError(msg) - self.table = table - - @staticmethod - def _check_size(size: Any) -> tuple[int, int, int]: - try: - _, _, _ = size - except ValueError as e: - msg = "Size should be either an integer or a tuple of three integers." - raise ValueError(msg) from e - except TypeError: - size = (size, size, size) - size = tuple(int(x) for x in size) - for size_1d in size: - if not 2 <= size_1d <= 65: - msg = "Size should be in [2, 65] range." - raise ValueError(msg) - return size - - @classmethod - def generate( - cls, - size: int | tuple[int, int, int], - callback: Callable[[float, float, float], tuple[float, ...]], - channels: int = 3, - target_mode: str | None = None, - ) -> Color3DLUT: - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size_1d, size_2d, size_3d = cls._check_size(size) - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - - table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - table[idx_out : idx_out + channels] = callback( - r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) - ) - idx_out += channels - - return cls( - (size_1d, size_2d, size_3d), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform( - self, - callback: Callable[..., tuple[float, ...]], - with_normals: bool = False, - channels: int | None = None, - target_mode: str | None = None, - ) -> Color3DLUT: - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - ch_in = self.channels - ch_out = channels or ch_in - size_1d, size_2d, size_3d = self.size - - table = [0] * (size_1d * size_2d * size_3d * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size_1d - 1), - g / (size_2d - 1), - b / (size_3d - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self) -> str: - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size[0], - self.size[1], - self.size[2], - self.table, - ) diff --git a/lib/python3.12/site-packages/PIL/ImageFont.py b/lib/python3.12/site-packages/PIL/ImageFont.py deleted file mode 100644 index b694b81..0000000 --- a/lib/python3.12/site-packages/PIL/ImageFont.py +++ /dev/null @@ -1,1338 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIL raster font management -# -# History: -# 1996-08-07 fl created (experimental) -# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 -# 1999-02-06 fl rewrote most font management stuff in C -# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) -# 2001-02-17 fl added freetype support -# 2001-05-09 fl added TransposedFont wrapper class -# 2002-03-04 fl make sure we have a "L" or "1" font -# 2002-12-04 fl skip non-directory entries in the system path -# 2003-04-29 fl add embedded default font -# 2003-09-27 fl added support for truetype charmap encodings -# -# Todo: -# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1996-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -import base64 -import os -import sys -import warnings -from enum import IntEnum -from io import BytesIO -from types import ModuleType -from typing import IO, TYPE_CHECKING, Any, BinaryIO, TypedDict, cast - -from . import Image, features -from ._typing import StrOrBytesPath -from ._util import DeferredError, is_path - -if TYPE_CHECKING: - from . import ImageFile - from ._imaging import ImagingFont - from ._imagingft import Font - - -class Axis(TypedDict): - minimum: int | None - default: int | None - maximum: int | None - name: bytes | None - - -class Layout(IntEnum): - BASIC = 0 - RAQM = 1 - - -MAX_STRING_LENGTH = 1_000_000 - - -core: ModuleType | DeferredError -try: - from . import _imagingft as core -except ImportError as ex: - core = DeferredError.new(ex) - - -def _string_length_check(text: str | bytes | bytearray) -> None: - if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: - msg = "too many characters in string" - raise ValueError(msg) - - -# FIXME: add support for pilfont2 format (see FontFile.py) - -# -------------------------------------------------------------------- -# Font metrics format: -# "PILfont" LF -# fontdescriptor LF -# (optional) key=value... LF -# "DATA" LF -# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) -# -# To place a character, cut out srcbox and paste at dstbox, -# relative to the character position. Then move the character -# position according to dx, dy. -# -------------------------------------------------------------------- - - -class ImageFont: - """PIL font wrapper""" - - font: ImagingFont - - def _load_pilfont(self, filename: str) -> None: - with open(filename, "rb") as fp: - image: ImageFile.ImageFile | None = None - root = os.path.splitext(filename)[0] - - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = root + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - - msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}" - raise OSError(msg) - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: - # read PILfont header - if file.readline() != b"PILfont\n": - msg = "Not a PILfont file" - raise SyntaxError(msg) - file.readline().split(b";") - self.info = [] # FIXME: should be a dictionary - while True: - s = file.readline() - if not s or s == b"DATA\n": - break - self.info.append(s) - - # read PILfont metrics - data = file.read(256 * 20) - - # check image - if image.mode not in ("1", "L"): - msg = "invalid font image mode" - raise TypeError(msg) - - image.load() - - self.font = Image.core.font(image.im, data) - - def getmask( - self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any - ) -> Image.core.ImagingCore: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - _string_length_check(text) - Image._decompression_bomb_check(self.font.getsize(text)) - return self.font.getmask(text, mode) - - def getbbox( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> tuple[int, int, int, int]: - """ - Returns bounding box (in pixels) of given text. - - .. versionadded:: 9.2.0 - - :param text: Text to render. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return 0, 0, width, height - - def getlength( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> int: - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. versionadded:: 9.2.0 - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return width - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - """FreeType font wrapper (requires _imagingft service)""" - - font: Font - font_bytes: bytes - - def __init__( - self, - font: StrOrBytesPath | BinaryIO, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, - ) -> None: - # FIXME: use service provider instead - - if isinstance(core, DeferredError): - raise core.ex - - if size <= 0: - msg = f"font size must be greater than 0, not {size}" - raise ValueError(msg) - - self.path = font - self.size = size - self.index = index - self.encoding = encoding - - try: - from packaging.version import parse as parse_version - except ImportError: - pass - else: - if freetype_version := features.version_module("freetype2"): - if parse_version(freetype_version) < parse_version("2.9.1"): - warnings.warn( - "Support for FreeType 2.9.0 is deprecated and will be removed " - "in Pillow 12 (2025-10-15). Please upgrade to FreeType 2.9.1 " - "or newer, preferably FreeType 2.10.4 which fixes " - "CVE-2020-15999.", - DeprecationWarning, - ) - - if layout_engine not in (Layout.BASIC, Layout.RAQM): - layout_engine = Layout.BASIC - if core.HAVE_RAQM: - layout_engine = Layout.RAQM - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f: IO[bytes]) -> None: - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if is_path(font): - font = os.path.realpath(os.fspath(font)) - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(cast(IO[bytes], font)) - - def __getstate__(self) -> list[Any]: - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state: list[Any]) -> None: - path, size, index, encoding, layout_engine = state - FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine) - - def getname(self) -> tuple[str | None, str | None]: - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self) -> tuple[int, int]: - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - ) -> float: - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of :: - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use :: - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) :: - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Either width for horizontal text, or height for vertical text. - """ - _string_length_check(text) - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ) -> tuple[float, float, float, float]: - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getmask( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ink: int = 0, - start: tuple[float, float] | None = None, - ) -> Image.core.ImagingCore: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - )[0] - - def getmask2( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ink: int = 0, - start: tuple[float, float] | None = None, - *args: Any, - **kwargs: Any, - ) -> tuple[Image.core.ImagingCore, tuple[int, int]]: - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - _string_length_check(text) - if start is None: - start = (0, 0) - - def fill(width: int, height: int) -> Image.core.ImagingCore: - size = (width, height) - Image._decompression_bomb_check(size) - return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) - - return self.font.render( - text, - fill, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start[0], - start[1], - ) - - def font_variant( - self, - font: StrOrBytesPath | BinaryIO | None = None, - size: float | None = None, - index: int | None = None, - encoding: str | None = None, - layout_engine: Layout | None = None, - ) -> FreeTypeFont: - """ - Create a copy of this FreeTypeFont object, - using any specified arguments to override the settings. - - Parameters are identical to the parameters used to initialize this - object. - - :return: A FreeTypeFont object. - """ - if font is None: - try: - font = BytesIO(self.font_bytes) - except AttributeError: - font = self.path - return FreeTypeFont( - font=font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=layout_engine or self.layout_engine, - ) - - def get_variation_names(self) -> list[bytes]: - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name: str | bytes) -> None: - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) + 1 - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self) -> list[Axis]: - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - for axis in axes: - if axis["name"]: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes: list[float]) -> None: - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - - -class TransposedFont: - """Wrapper for writing rotated or mirrored text""" - - def __init__( - self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None - ): - """ - Wrapper that creates a transposed font from any existing font - object. - - :param font: A font object. - :param orientation: An optional orientation. If given, this should - be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getmask( - self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any - ) -> Image.core.ImagingCore: - im = self.font.getmask(text, mode, *args, **kwargs) - if self.orientation is not None: - return im.transpose(self.orientation) - return im - - def getbbox( - self, text: str | bytes, *args: Any, **kwargs: Any - ) -> tuple[int, int, float, float]: - # TransposedFont doesn't support getmask2, move top-left point to (0, 0) - # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont - left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) - width = right - left - height = bottom - top - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return 0, 0, height, width - return 0, 0, width, height - - def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float: - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - msg = "text length is undefined for text rotated by 90 or 270 degrees" - raise ValueError(msg) - return self.font.getlength(text, *args, **kwargs) - - -def load(filename: str) -> ImageFont: - """ - Load a font file. This function loads a font object from the given - bitmap font file, and returns the corresponding font object. For loading TrueType - or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype( - font: StrOrBytesPath | BinaryIO, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, -) -> FreeTypeFont: - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. This function loads a font object from the given - file or file-like object, and creates a font object for a font of the given - size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load` - and :py:func:`~PIL.ImageFont.load_path`. - - Pillow uses FreeType to open font files. On Windows, be aware that FreeType - will keep the file open as long as the FreeTypeFont object exists. Windows - limits the number of files that can be open in C at once to 512, so if many - fonts are opened simultaneously and that limit is approached, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - A workaround would be to copy the file(s) into memory, and open that instead. - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as: - - * The :file:`fonts/` directory on Windows, - * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` - and :file:`~/Library/Fonts/` on macOS. - * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, - and :file:`/usr/share/fonts` on Linux; or those specified by - the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables - for user-installed and system-wide fonts, respectively. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. - If it is available, Raqm layout will be used by default. - Otherwise, basic layout will be used. - - Raqm layout is recommended for all non-English text. If Raqm layout - is not required, basic layout will have better performance. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - :exception ValueError: If the font size is not greater than zero. - """ - - def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont: - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not is_path(font): - raise - ttf_filename = os.path.basename(font) - - dirs = [] - if sys.platform == "win32": - # check the windows font repository - # NOTE: must use uppercase WINDIR, to work around bugs in - # 1.5.2's os.environ.get() - windir = os.environ.get("WINDIR") - if windir: - dirs.append(os.path.join(windir, "fonts")) - elif sys.platform in ("linux", "linux2"): - data_home = os.environ.get("XDG_DATA_HOME") - if not data_home: - # The freedesktop spec defines the following default directory for - # when XDG_DATA_HOME is unset or empty. This user-level directory - # takes precedence over system-level directories. - data_home = os.path.expanduser("~/.local/share") - xdg_dirs = [data_home] - - data_dirs = os.environ.get("XDG_DATA_DIRS") - if not data_dirs: - # Similarly, defaults are defined for the system-level directories - data_dirs = "/usr/local/share:/usr/share" - xdg_dirs += data_dirs.split(":") - - dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] - elif sys.platform == "darwin": - dirs += [ - "/Library/Fonts", - "/System/Library/Fonts", - os.path.expanduser("~/Library/Fonts"), - ] - - ext = os.path.splitext(ttf_filename)[1] - first_font_with_a_different_extension = None - for directory in dirs: - for walkroot, walkdir, walkfilenames in os.walk(directory): - for walkfilename in walkfilenames: - if ext and walkfilename == ttf_filename: - return freetype(os.path.join(walkroot, walkfilename)) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: - fontpath = os.path.join(walkroot, walkfilename) - if os.path.splitext(fontpath)[1] == ".ttf": - return freetype(fontpath) - if not ext and first_font_with_a_different_extension is None: - first_font_with_a_different_extension = fontpath - if first_font_with_a_different_extension: - return freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename: str | bytes) -> ImageFont: - """ - Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a - bitmap font along the Python path. - - :param filename: Name of font file. - :return: A font object. - :exception OSError: If the file could not be read. - """ - if not isinstance(filename, str): - filename = filename.decode("utf-8") - for directory in sys.path: - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - msg = f'cannot find font file "{filename}" in sys.path' - if os.path.exists(filename): - msg += f', did you mean ImageFont.load("{filename}") instead?' - - raise OSError(msg) - - -def load_default_imagefont() -> ImageFont: - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO( - base64.b64decode( - b""" -UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA -BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL -AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA -AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB -ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A -BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB -//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA -AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH -AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA -ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv -AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ -/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 -AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA -AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG -AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA -BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA -AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA -2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF -AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// -+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA -////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA -BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv -AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA -AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA -AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA -BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// -//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA -AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF -AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB -mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn -AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA -AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 -AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA -Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB -//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA -AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ -AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC -DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ -AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ -+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 -AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ -///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG -AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA -BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA -Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC -eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG -AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// -+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA -////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA -BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT -AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A -AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA -Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA -Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// -//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA -AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ -AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA -LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 -AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA -AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 -AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA -AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG -AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA -EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK -AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA -pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG -AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// -+QAGAAIAzgAKANUAEw== -""" - ) - ), - Image.open( - BytesIO( - base64.b64decode( - b""" -iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u -Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 -M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g -LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F -IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA -Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 -NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx -in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 -SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY -AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt -y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG -ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY -lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H -/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 -AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 -c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ -/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw -pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv -oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR -evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA -AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// -Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR -w7IkEbzhVQAAAABJRU5ErkJggg== -""" - ) - ) - ), - ) - return f - - -def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: - """If FreeType support is available, load a version of Aileron Regular, - https://dotcolon.net/font/aileron, with a more limited character set. - - Otherwise, load a "better than nothing" font. - - .. versionadded:: 1.1.4 - - :param size: The font size of Aileron Regular. - - .. versionadded:: 10.1.0 - - :return: A font object. - """ - if isinstance(core, ModuleType) or size is not None: - return truetype( - BytesIO( - base64.b64decode( - b""" -AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA -AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA -MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh -tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk -OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ -2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ -AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI -BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA -AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ -AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk -QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB -kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC -ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA -EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg -JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y -AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q -AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq -QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// -//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT -FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT -U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA -AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 -ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO -AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ -gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG -oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz -qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA -DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA -P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA -LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc -jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb -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 -EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA -QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA -AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA -BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A -AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA -gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm -lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV -ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy -AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA -HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg -B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk -AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 -ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA -HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 -JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB -odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs -AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA -AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB -QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA -xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A -TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A -LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA -AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ -ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG -AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE -AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE -kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ -PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA -AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA -AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA -ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD -/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA -AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA -BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA -AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ -ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA -gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC -YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA -AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== -""" - ) - ), - 10 if size is None else size, - layout_engine=Layout.BASIC, - ) - return load_default_imagefont() diff --git a/lib/python3.12/site-packages/PIL/ImageGrab.py b/lib/python3.12/site-packages/PIL/ImageGrab.py deleted file mode 100644 index e27ca7e..0000000 --- a/lib/python3.12/site-packages/PIL/ImageGrab.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# History: -# 2001-04-26 fl created -# 2001-09-17 fl use builtin driver, if present -# 2002-11-19 fl added grabclipboard support -# -# Copyright (c) 2001-2002 by Secret Labs AB -# Copyright (c) 2001-2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import shutil -import subprocess -import sys -import tempfile - -from . import Image - - -def grab( - bbox: tuple[int, int, int, int] | None = None, - include_layered_windows: bool = False, - all_screens: bool = False, - xdisplay: str | None = None, -) -> Image.Image: - im: Image.Image - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{top},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens - ) - im = Image.frombytes( - "RGB", - size, - data, - # RGB, 32-bit line padding, origin lower left corner - "raw", - "BGR", - (size[0] * 3 + 3) & -4, - -1, - ) - if bbox: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - # Cast to Optional[str] needed for Windows and macOS. - display_name: str | None = xdisplay - try: - if not Image.core.HAVE_XCB: - msg = "Pillow was built without XCB support" - raise OSError(msg) - size, data = Image.core.grabscreen_x11(display_name) - except OSError: - if ( - display_name is None - and sys.platform not in ("darwin", "win32") - and shutil.which("gnome-screenshot") - ): - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - subprocess.call(["gnome-screenshot", "-f", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_cropped = im.crop(bbox) - im.close() - return im_cropped - return im - else: - raise - else: - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard() -> Image.Image | list[str] | None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - commands = [ - 'set theFile to (open for access POSIX file "' - + filepath - + '" with write permission)', - "try", - " write (the clipboard as «class PNGf») to theFile", - "end try", - "close access theFile", - ] - script = ["osascript"] - for command in commands: - script += ["-e", command] - subprocess.call(script) - - im = None - if os.stat(filepath).st_size != 0: - im = Image.open(filepath) - im.load() - os.unlink(filepath) - return im - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - if os.getenv("WAYLAND_DISPLAY"): - session_type = "wayland" - elif os.getenv("DISPLAY"): - session_type = "x11" - else: # Session type check failed - session_type = None - - if shutil.which("wl-paste") and session_type in ("wayland", None): - args = ["wl-paste", "-t", "image"] - elif shutil.which("xclip") and session_type in ("x11", None): - args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] - else: - msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" - raise NotImplementedError(msg) - - p = subprocess.run(args, capture_output=True) - if p.returncode != 0: - err = p.stderr - for silent_error in [ - # wl-paste, when the clipboard is empty - b"Nothing is copied", - # Ubuntu/Debian wl-paste, when the clipboard is empty - b"No selection", - # Ubuntu/Debian wl-paste, when an image isn't available - b"No suitable type of content copied", - # wl-paste or Ubuntu/Debian xclip, when an image isn't available - b" not available", - # xclip, when an image isn't available - b"cannot convert ", - # xclip, when the clipboard isn't initialized - b"xclip: Error: There is no owner for the ", - ]: - if silent_error in err: - return None - msg = f"{args[0]} error" - if err: - msg += f": {err.strip().decode()}" - raise ChildProcessError(msg) - - data = io.BytesIO(p.stdout) - im = Image.open(data) - im.load() - return im diff --git a/lib/python3.12/site-packages/PIL/ImageMath.py b/lib/python3.12/site-packages/PIL/ImageMath.py deleted file mode 100644 index 484797f..0000000 --- a/lib/python3.12/site-packages/PIL/ImageMath.py +++ /dev/null @@ -1,368 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# a simple math add-on for the Python Imaging Library -# -# History: -# 1999-02-15 fl Original PIL Plus release -# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 -# -# Copyright (c) 1999-2005 by Secret Labs AB -# Copyright (c) 2005 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import builtins -from types import CodeType -from typing import Any, Callable - -from . import Image, _imagingmath -from ._deprecate import deprecate - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im: Image.Image): - self.im = im - - def __fixup(self, im1: _Operand | float) -> Image.Image: - # convert image to suitable mode - if isinstance(im1, _Operand): - # argument was an image. - if im1.im.mode in ("1", "L"): - return im1.im.convert("I") - elif im1.im.mode in ("I", "F"): - return im1.im - else: - msg = f"unsupported mode: {im1.im.mode}" - raise ValueError(msg) - else: - # argument was a constant - if isinstance(im1, (int, float)) and self.im.mode in ("1", "L", "I"): - return Image.new("I", self.im.size, im1) - else: - return Image.new("F", self.im.size, im1) - - def apply( - self, - op: str, - im1: _Operand | float, - im2: _Operand | float | None = None, - mode: str | None = None, - ) -> _Operand: - im_1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im_1.mode, im_1.size, None) - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.unop(op, out.getim(), im_1.getim()) - else: - # binary operation - im_2 = self.__fixup(im2) - if im_1.mode != im_2.mode: - # convert both arguments to floating point - if im_1.mode != "F": - im_1 = im_1.convert("F") - if im_2.mode != "F": - im_2 = im_2.convert("F") - if im_1.size != im_2.size: - # crop both arguments to a common size - size = ( - min(im_1.size[0], im_2.size[0]), - min(im_1.size[1], im_2.size[1]), - ) - if im_1.size != size: - im_1 = im_1.crop((0, 0) + size) - if im_2.size != size: - im_2 = im_2.crop((0, 0) + size) - out = Image.new(mode or im_1.mode, im_1.size, None) - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.binop(op, out.getim(), im_1.getim(), im_2.getim()) - return _Operand(out) - - # unary operators - def __bool__(self) -> bool: - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self) -> _Operand: - return self.apply("abs", self) - - def __pos__(self) -> _Operand: - return self - - def __neg__(self) -> _Operand: - return self.apply("neg", self) - - # binary operators - def __add__(self, other: _Operand | float) -> _Operand: - return self.apply("add", self, other) - - def __radd__(self, other: _Operand | float) -> _Operand: - return self.apply("add", other, self) - - def __sub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", self, other) - - def __rsub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", other, self) - - def __mul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", self, other) - - def __rmul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", other, self) - - def __truediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", self, other) - - def __rtruediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", other, self) - - def __mod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", self, other) - - def __rmod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", other, self) - - def __pow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", self, other) - - def __rpow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", other, self) - - # bitwise - def __invert__(self) -> _Operand: - return self.apply("invert", self) - - def __and__(self, other: _Operand | float) -> _Operand: - return self.apply("and", self, other) - - def __rand__(self, other: _Operand | float) -> _Operand: - return self.apply("and", other, self) - - def __or__(self, other: _Operand | float) -> _Operand: - return self.apply("or", self, other) - - def __ror__(self, other: _Operand | float) -> _Operand: - return self.apply("or", other, self) - - def __xor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", self, other) - - def __rxor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", other, self) - - def __lshift__(self, other: _Operand | float) -> _Operand: - return self.apply("lshift", self, other) - - def __rshift__(self, other: _Operand | float) -> _Operand: - return self.apply("rshift", self, other) - - # logical - def __eq__(self, other: _Operand | float) -> _Operand: # type: ignore[override] - return self.apply("eq", self, other) - - def __ne__(self, other: _Operand | float) -> _Operand: # type: ignore[override] - return self.apply("ne", self, other) - - def __lt__(self, other: _Operand | float) -> _Operand: - return self.apply("lt", self, other) - - def __le__(self, other: _Operand | float) -> _Operand: - return self.apply("le", self, other) - - def __gt__(self, other: _Operand | float) -> _Operand: - return self.apply("gt", self, other) - - def __ge__(self, other: _Operand | float) -> _Operand: - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self: _Operand) -> _Operand: - return _Operand(self.im.convert("I")) - - -def imagemath_float(self: _Operand) -> _Operand: - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("min", self, other) - - -def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("max", self, other) - - -def imagemath_convert(self: _Operand, mode: str) -> _Operand: - return _Operand(self.im.convert(mode)) - - -ops = { - "int": imagemath_int, - "float": imagemath_float, - "equal": imagemath_equal, - "notequal": imagemath_notequal, - "min": imagemath_min, - "max": imagemath_max, - "convert": imagemath_convert, -} - - -def lambda_eval( - expression: Callable[[dict[str, Any]], Any], - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Returns the result of an image function. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A function that receives a dictionary. - :param options: Values to add to the function's dictionary. Deprecated. - You can instead use one or more keyword arguments. - :param **kw: Values to add to the function's dictionary. - :return: The expression result. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - if options: - deprecate( - "ImageMath.lambda_eval options", - 12, - "ImageMath.lambda_eval keyword arguments", - ) - - args: dict[str, Any] = ops.copy() - args.update(options) - args.update(kw) - for k, v in args.items(): - if isinstance(v, Image.Image): - args[k] = _Operand(v) - - out = expression(args) - try: - return out.im - except AttributeError: - return out - - -def unsafe_eval( - expression: str, - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. This uses Python's ``eval()`` function to process - the expression string, and carries the security risks of doing so. It is not - recommended to process expressions without considering this. - :py:meth:`~lambda_eval` is a more secure alternative. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. Deprecated. - You can instead use one or more keyword arguments. - :param **kw: Values to add to the evaluation context. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - if options: - deprecate( - "ImageMath.unsafe_eval options", - 12, - "ImageMath.unsafe_eval keyword arguments", - ) - - # build execution namespace - args: dict[str, Any] = ops.copy() - for k in list(options.keys()) + list(kw.keys()): - if "__" in k or hasattr(builtins, k): - msg = f"'{k}' not allowed" - raise ValueError(msg) - - args.update(options) - args.update(kw) - for k, v in args.items(): - if isinstance(v, Image.Image): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code: CodeType) -> None: - for const in code.co_consts: - if type(const) is type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - msg = f"'{name}' not allowed" - raise ValueError(msg) - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out - - -def eval( - expression: str, - _dict: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. - - Deprecated. Use lambda_eval() or unsafe_eval() instead. - - :param expression: A string containing a Python-style expression. - :param _dict: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - - .. deprecated:: 10.3.0 - """ - - deprecate( - "ImageMath.eval", - 12, - "ImageMath.lambda_eval or ImageMath.unsafe_eval", - ) - return unsafe_eval(expression, _dict, **kw) diff --git a/lib/python3.12/site-packages/PIL/ImageMode.py b/lib/python3.12/site-packages/PIL/ImageMode.py deleted file mode 100644 index 92a08d2..0000000 --- a/lib/python3.12/site-packages/PIL/ImageMode.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard mode descriptors -# -# History: -# 2006-03-20 fl Added -# -# Copyright (c) 2006 by Secret Labs AB. -# Copyright (c) 2006 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from functools import lru_cache -from typing import NamedTuple - -from ._deprecate import deprecate - - -class ModeDescriptor(NamedTuple): - """Wrapper for mode strings.""" - - mode: str - bands: tuple[str, ...] - basemode: str - basetype: str - typestr: str - - def __str__(self) -> str: - return self.mode - - -@lru_cache -def getmode(mode: str) -> ModeDescriptor: - """Gets a mode descriptor for the given mode.""" - endian = "<" if sys.byteorder == "little" else ">" - - modes = { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), f"{endian}i4"), - "F": ("L", "F", ("F",), f"{endian}f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - } - if mode in modes: - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - base_mode, base_type, bands, type_str = modes[mode] - return ModeDescriptor(mode, bands, base_mode, base_type, type_str) - - mapping_modes = { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": f"{endian}u2", - "I;16NS": f"{endian}i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": " -from __future__ import annotations - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """A class for building a MorphLut from a descriptive language - - The input patterns is a list of a strings sequences like these:: - - 4:(... - .1. - 111)->1 - - (whitespaces including linebreaks are ignored). The option 4 - describes a series of symmetry operations (in this case a - 4-rotation), the pattern is described by: - - - . or X - Ignore - - 1 - Pixel is on - - 0 - Pixel is off - - The result of the operation is described after "->" string. - - The default is to return the current pixel value, which is - returned if no other match is found. - - Operations: - - - 4 - 4 way rotation - - N - Negate - - 1 - Dummy op for no other operation (an op must always be given) - - M - Mirroring - - Example:: - - lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) - lut = lb.build_lut() - - """ - - def __init__( - self, patterns: list[str] | None = None, op_name: str | None = None - ) -> None: - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut: bytearray | None = None - if op_name is not None: - known_patterns = { - "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], - "dilation4": ["4:(... .0. .1.)->1"], - "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], - "erosion4": ["4:(... .1. .0.)->0"], - "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], - "edge": [ - "1:(... ... ...)->0", - "4:(.0. .1. ...)->1", - "4:(01. .1. ...)->1", - ], - } - if op_name not in known_patterns: - msg = f"Unknown pattern {op_name}!" - raise Exception(msg) - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns: list[str]) -> None: - self.patterns += patterns - - def build_default_lut(self) -> None: - symbols = [0, 1] - m = 1 << 4 # pos of current pixel - self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) - - def get_lut(self) -> bytearray | None: - return self.lut - - def _string_permute(self, pattern: str, permutation: list[int]) -> str: - """string_permute takes a pattern and a permutation and returns the - string permuted according to the permutation list. - """ - assert len(permutation) == 9 - return "".join(pattern[p] for p in permutation) - - def _pattern_permute( - self, basic_pattern: str, options: str, basic_result: int - ) -> list[tuple[str, int]]: - """pattern_permute takes a basic pattern and its result and clones - the pattern according to the modifications described in the $options - parameter. It returns a list of all cloned patterns.""" - patterns = [(basic_pattern, basic_result)] - - # rotations - if "4" in options: - res = patterns[-1][1] - for i in range(4): - patterns.append( - (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - # Swap 0 and 1 - pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") - res = 1 - int(res) - patterns.append((pattern, res)) - - return patterns - - def build_lut(self) -> bytearray: - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - assert self.lut is not None - patterns = [] - - # Parse and create symmetries of the patterns strings - for p in self.patterns: - m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) - if not m: - msg = 'Syntax error in pattern "' + p + '"' - raise Exception(msg) - options = m.group(1) - pattern = m.group(2) - result = int(m.group(3)) - - # Get rid of spaces - pattern = pattern.replace(" ", "").replace("\n", "") - - patterns += self._pattern_permute(pattern, options, result) - - # compile the patterns into regular expressions for speed - compiled_patterns = [] - for pattern in patterns: - p = pattern[0].replace(".", "X").replace("X", "[01]") - compiled_patterns.append((re.compile(p), pattern[1])) - - # Step through table and find patterns that match. - # Note that all the patterns are searched. The last one - # caught overrides - for i in range(LUT_SIZE): - # Build the bit pattern - bitpattern = bin(i)[2:] - bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] - - for pattern, r in compiled_patterns: - if pattern.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__( - self, - lut: bytearray | None = None, - op_name: str | None = None, - patterns: list[str] | None = None, - ) -> None: - """Create a binary morphological operator""" - self.lut = lut - if op_name is not None: - self.lut = LutBuilder(op_name=op_name).build_lut() - elif patterns is not None: - self.lut = LutBuilder(patterns=patterns).build_lut() - - def apply(self, image: Image.Image) -> tuple[int, Image.Image]: - """Run a single morphological operation on an image - - Returns a tuple of the number of changed pixels and the - morphed image""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - outimage = Image.new(image.mode, image.size, None) - count = _imagingmorph.apply(bytes(self.lut), image.getim(), outimage.getim()) - return count, outimage - - def match(self, image: Image.Image) -> list[tuple[int, int]]: - """Get a list of coordinates matching the morphological operation on - an image. - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.match(bytes(self.lut), image.getim()) - - def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]: - """Get a list of all turned on pixels in a binary image - - Returns a list of tuples of (x,y) coordinates - of all matching pixels. See :ref:`coordinate-system`.""" - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.get_on_pixels(image.getim()) - - def load_lut(self, filename: str) -> None: - """Load an operator from an mrl file""" - with open(filename, "rb") as f: - self.lut = bytearray(f.read()) - - if len(self.lut) != LUT_SIZE: - self.lut = None - msg = "Wrong size operator file!" - raise Exception(msg) - - def save_lut(self, filename: str) -> None: - """Save an operator to an mrl file""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut: bytearray | None) -> None: - """Set the lut from an external source""" - self.lut = lut diff --git a/lib/python3.12/site-packages/PIL/ImageOps.py b/lib/python3.12/site-packages/PIL/ImageOps.py deleted file mode 100644 index 44aad0c..0000000 --- a/lib/python3.12/site-packages/PIL/ImageOps.py +++ /dev/null @@ -1,730 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard image operations -# -# History: -# 2001-10-20 fl Created -# 2001-10-23 fl Added autocontrast operator -# 2001-12-18 fl Added Kevin's fit operator -# 2004-03-14 fl Fixed potential division by zero in equalize -# 2005-05-05 fl Fixed equalize for low number of values -# -# Copyright (c) 2001-2004 by Secret Labs AB -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import functools -import operator -import re -from collections.abc import Sequence -from typing import Protocol, cast - -from . import ExifTags, Image, ImagePalette - -# -# helpers - - -def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: - if isinstance(border, tuple): - if len(border) == 2: - left, top = right, bottom = border - elif len(border) == 4: - left, top, right, bottom = border - else: - left = top = right = bottom = border - return left, top, right, bottom - - -def _color(color: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image: Image.Image, lut: list[int]) -> Image.Image: - if image.mode == "P": - # FIXME: apply to lookup table, not image data - msg = "mode P support coming soon" - raise NotImplementedError(msg) - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - msg = f"not supported for mode {image.mode}" - raise OSError(msg) - - -# -# actions - - -def autocontrast( - image: Image.Image, - cutoff: float | tuple[float, float] = 0, - ignore: int | Sequence[int] | None = None, - mask: Image.Image | None = None, - preserve_tone: bool = False, -) -> Image.Image: - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), removes ``cutoff`` percent of the - lightest and darkest pixels from the histogram, and remaps the image - so that the darkest pixel becomes black (0), and the lightest - becomes white (255). - - :param image: The image to process. - :param cutoff: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - if isinstance(ignore, int): - h[ignore] = 0 - else: - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = int(n * cutoff[0] // 100) - for lo in range(256): - if cut > h[lo]: - cut = cut - h[lo] - h[lo] = 0 - else: - h[lo] -= cut - cut = 0 - if cut <= 0: - break - # remove cutoff% samples from the high end - cut = int(n * cutoff[1] // 100) - for hi in range(255, -1, -1): - if cut > h[hi]: - cut = cut - h[hi] - h[hi] = 0 - else: - h[hi] -= cut - cut = 0 - if cut <= 0: - break - # find lowest/highest samples after preprocessing - for lo in range(256): - if h[lo]: - break - for hi in range(255, -1, -1): - if h[hi]: - break - if hi <= lo: - # don't bother - lut.extend(list(range(256))) - else: - scale = 255.0 / (hi - lo) - offset = -lo * scale - for ix in range(256): - ix = int(ix * scale + offset) - if ix < 0: - ix = 0 - elif ix > 255: - ix = 255 - lut.append(ix) - return _lut(image, lut) - - -def colorize( - image: Image.Image, - black: str | tuple[int, ...], - white: str | tuple[int, ...], - mid: str | int | tuple[int, ...] | None = None, - blackpoint: int = 0, - whitepoint: int = 255, - midpoint: int = 127, -) -> Image.Image: - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :param image: The image to colorize. - :param black: The color to use for black input pixels. - :param white: The color to use for white input pixels. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - rgb_black = cast(Sequence[int], _color(black, "RGB")) - rgb_white = cast(Sequence[int], _color(white, "RGB")) - rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(0, blackpoint): - red.append(rgb_black[0]) - green.append(rgb_black[1]) - blue.append(rgb_black[2]) - - # Create the mapping (2-color) - if rgb_mid is None: - range_map = range(0, whitepoint - blackpoint) - - for i in range_map: - red.append( - rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) - ) - green.append( - rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) - ) - blue.append( - rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) - ) - - # Create the mapping (3-color) - else: - range_map1 = range(0, midpoint - blackpoint) - range_map2 = range(0, whitepoint - midpoint) - - for i in range_map1: - red.append( - rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) - ) - green.append( - rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) - ) - blue.append( - rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) - ) - for i in range_map2: - red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) - green.append( - rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) - ) - blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(0, 256 - whitepoint): - red.append(rgb_white[0]) - green.append(rgb_white[1]) - blue.append(rgb_white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def cover( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, so that the requested size is - covered, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio < dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - color: str | int | tuple[int, ...] | None = None, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.palette: - palette = resized.getpalette() - if palette is not None: - out.putpalette(palette) - if resized.width != size[0]: - x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image: Image.Image, border: int = 0) -> Image.Image: - """ - Remove border from image. The same amount of pixels are removed - from all four sides. This function works on all image modes. - - .. seealso:: :py:meth:`~PIL.Image.Image.crop` - - :param image: The image to crop. - :param border: The number of pixels to remove. - :return: An image. - """ - left, top, right, bottom = _border(border) - return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) - - -def scale( - image: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a rescaled image by a specific factor given in parameter. - A factor greater than 1 expands the image, between 0 and 1 contracts the - image. - - :param image: The image to rescale. - :param factor: The expansion factor, as a float. - :param resample: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - msg = "the factor must be greater than 0" - raise ValueError(msg) - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -class SupportsGetMesh(Protocol): - """ - An object that supports the ``getmesh`` method, taking an image as an - argument, and returning a list of tuples. Each tuple contains two tuples, - the source box as a tuple of 4 integers, and a tuple of 8 integers for the - final quadrilateral, in order of top left, bottom left, bottom right, top - right. - """ - - def getmesh( - self, image: Image.Image - ) -> list[ - tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] - ]: ... - - -def deform( - image: Image.Image, - deformer: SupportsGetMesh, - resample: int = Image.Resampling.BILINEAR, -) -> Image.Image: - """ - Deform the image. - - :param image: The image to deform. - :param deformer: A deformer object. Any object that implements a - ``getmesh`` method can be used. - :param resample: An optional resampling filter. Same values possible as - in the PIL.Image.transform function. - :return: An image. - """ - return image.transform( - image.size, Image.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: - """ - Equalize the image histogram. This function applies a non-linear - mapping to the input image, in order to create a uniform - distribution of grayscale values in the output image. - - :param image: The image to equalize. - :param mask: An optional mask. If given, only the pixels selected by - the mask are included in the analysis. - :return: An image. - """ - if image.mode == "P": - image = image.convert("RGB") - h = image.histogram(mask) - lut = [] - for b in range(0, len(h), 256): - histo = [_f for _f in h[b : b + 256] if _f] - if len(histo) <= 1: - lut.extend(list(range(256))) - else: - step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 - if not step: - lut.extend(list(range(256))) - else: - n = step // 2 - for i in range(256): - lut.append(n // step) - n = n + h[i + b] - return _lut(image, lut) - - -def expand( - image: Image.Image, - border: int | tuple[int, ...] = 0, - fill: str | int | tuple[int, ...] = 0, -) -> Image.Image: - """ - Add border to the image - - :param image: The image to expand. - :param border: Border width, in pixels. - :param fill: Pixel fill value (a color value). Default is 0 (black). - :return: An image. - """ - left, top, right, bottom = _border(border) - width = left + image.size[0] + right - height = top + image.size[1] + bottom - color = _color(fill, image.mode) - if image.palette: - palette = ImagePalette.ImagePalette(palette=image.getpalette()) - if isinstance(color, tuple) and (len(color) == 3 or len(color) == 4): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - bleed: float = 0.0, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and cropped version of the image, cropped to the - requested aspect ratio and size. - - This function was contributed by Kevin Cazabon. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param bleed: Remove a border around the outside of the image from all - four edges. The value is a decimal percentage (use 0.01 for - one percent). The default value is 0 (no border). - Cannot be greater than or equal to 0.5. - :param centering: Control the cropping position. Use (0.5, 0.5) for - center cropping (e.g. if cropping the width, take 50% off - of the left side, and therefore 50% off the right side). - (0.0, 0.0) will crop from the top left corner (i.e. if - cropping the width, take all of the crop off of the right - side, and if cropping the height, take all of it off the - bottom). (1.0, 0.0) will crop from the bottom left - corner, etc. (i.e. if cropping the width, take all of the - crop off the left side, and if cropping the height take - none from the top, and therefore all off the bottom). - :return: An image. - """ - - # by Kevin Cazabon, Feb 17/2000 - # kevin@cazabon.com - # https://www.cazabon.com - - centering_x, centering_y = centering - - if not 0.0 <= centering_x <= 1.0: - centering_x = 0.5 - if not 0.0 <= centering_y <= 1.0: - centering_y = 0.5 - - if not 0.0 <= bleed < 0.5: - bleed = 0.0 - - # calculate the area to use for resizing and cropping, subtracting - # the 'bleed' around the edges - - # number of pixels to trim off on Top and Bottom, Left and Right - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image: Image.Image) -> Image.Image: - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image: Image.Image) -> Image.Image: - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = list(range(255, -1, -1)) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image: Image.Image) -> Image.Image: - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image: Image.Image, bits: int) -> Image.Image: - """ - Reduce the number of bits for each color channel. - - :param image: The image to posterize. - :param bits: The number of bits to keep for each channel (1-8). - :return: An image. - """ - mask = ~(2 ** (8 - bits) - 1) - lut = [i & mask for i in range(256)] - return _lut(image, lut) - - -def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this grayscale level are inverted. - :return: An image. - """ - lut = [] - for i in range(256): - if i < threshold: - lut.append(i) - else: - lut.append(255 - i) - return _lut(image, lut) - - -def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: - """ - If an image has an EXIF Orientation tag, other than 1, transpose the image - accordingly, and remove the orientation data. - - :param image: The image to transpose. - :param in_place: Boolean. Keyword-only argument. - If ``True``, the original image is modified in-place, and ``None`` is returned. - If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned - with the transposition applied. If there is no transposition, a copy of the - image will be returned. - """ - image.load() - image_exif = image.getexif() - orientation = image_exif.get(ExifTags.Base.Orientation, 1) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - transposed_image = image.transpose(method) - if in_place: - image.im = transposed_image.im - image._size = transposed_image._size - exif_image = image if in_place else transposed_image - - exif = exif_image.getexif() - if ExifTags.Base.Orientation in exif: - del exif[ExifTags.Base.Orientation] - if "exif" in exif_image.info: - exif_image.info["exif"] = exif.tobytes() - elif "Raw profile type exif" in exif_image.info: - exif_image.info["Raw profile type exif"] = exif.tobytes().hex() - for key in ("XML:com.adobe.xmp", "xmp"): - if key in exif_image.info: - for pattern in ( - r'tiff:Orientation="([0-9])"', - r"([0-9])", - ): - value = exif_image.info[key] - exif_image.info[key] = ( - re.sub(pattern, "", value) - if isinstance(value, str) - else re.sub(pattern.encode(), b"", value) - ) - if not in_place: - return transposed_image - elif not in_place: - return image.copy() - return None diff --git a/lib/python3.12/site-packages/PIL/ImagePalette.py b/lib/python3.12/site-packages/PIL/ImagePalette.py deleted file mode 100644 index 183f855..0000000 --- a/lib/python3.12/site-packages/PIL/ImagePalette.py +++ /dev/null @@ -1,285 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# image palette object -# -# History: -# 1996-03-11 fl Rewritten. -# 1997-01-03 fl Up and running. -# 1997-08-23 fl Added load hack -# 2001-04-16 fl Fixed randint shadow bug in random() -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import array -from collections.abc import Sequence -from typing import IO, TYPE_CHECKING - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile - -if TYPE_CHECKING: - from . import Image - - -class ImagePalette: - """ - Color palette for palette mapped images - - :param mode: The mode to use for the palette. See: - :ref:`concept-modes`. Defaults to "RGB" - :param palette: An optional palette. If given, it must be a bytearray, - an array or a list of ints between 0-255. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - """ - - def __init__( - self, - mode: str = "RGB", - palette: Sequence[int] | bytes | bytearray | None = None, - ) -> None: - self.mode = mode - self.rawmode: str | None = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty: int | None = None - - @property - def palette(self) -> Sequence[int] | bytes | bytearray: - return self._palette - - @palette.setter - def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: - self._colors: dict[tuple[int, ...], int] | None = None - self._palette = palette - - @property - def colors(self) -> dict[tuple[int, ...], int]: - if self._colors is None: - mode_len = len(self.mode) - self._colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self._colors: - continue - self._colors[color] = i // mode_len - return self._colors - - @colors.setter - def colors(self, colors: dict[tuple[int, ...], int]) -> None: - self._colors = colors - - def copy(self) -> ImagePalette: - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self) -> tuple[str, Sequence[int] | bytes | bytearray]: - """ - Get palette contents in format suitable for the low-level - ``im.putpalette`` primitive. - - .. warning:: This method is experimental. - """ - if self.rawmode: - return self.rawmode, self.palette - return self.mode, self.tobytes() - - def tobytes(self) -> bytes: - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def _new_color_index( - self, image: Image.Image | None = None, e: Exception | None = None - ) -> int: - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors: tuple[int | tuple[int, ...] | None, ...] = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - msg = "cannot allocate more than 256 colors" - raise ValueError(msg) from e - return index - - def getcolor( - self, - color: tuple[int, ...], - image: Image.Image | None = None, - ) -> int: - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4: - if color[3] != 255: - msg = "cannot add non-opaque RGBA color to RGB palette" - raise ValueError(msg) - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - index = self._new_color_index(image, e) - assert isinstance(self._palette, bytearray) - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self._palette[: index * 3] - + bytes(color) - + self._palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - msg = f"unknown color specifier: {repr(color)}" # type: ignore[unreachable] - raise ValueError(msg) - - def save(self, fp: str | IO[str]) -> None: - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode: str, data: Sequence[int] | bytes | bytearray) -> ImagePalette: - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black: int, white: float) -> list[int]: - if black == 0: - return [int(white * i // 255) for i in range(256)] - - msg = "unavailable when black is non-zero" - raise NotImplementedError(msg) # FIXME - - -def make_gamma_lut(exp: float) -> list[int]: - return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] - - -def negative(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode: str = "RGB") -> ImagePalette: - from random import randint - - palette = [randint(0, 255) for _ in range(256 * len(mode))] - return ImagePalette(mode, palette) - - -def sepia(white: str = "#fff0c0") -> ImagePalette: - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename: str) -> tuple[bytes, str]: - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - paletteHandlers: list[ - type[ - GimpPaletteFile.GimpPaletteFile - | GimpGradientFile.GimpGradientFile - | PaletteFile.PaletteFile - ] - ] = [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ] - for paletteHandler in paletteHandlers: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - pass - else: - msg = "cannot load palette" - raise OSError(msg) - - return lut # data, rawmode diff --git a/lib/python3.12/site-packages/PIL/ImagePath.py b/lib/python3.12/site-packages/PIL/ImagePath.py deleted file mode 100644 index 77e8a60..0000000 --- a/lib/python3.12/site-packages/PIL/ImagePath.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# path interface -# -# History: -# 1996-11-04 fl Created -# 2002-04-14 fl Added documentation stub class -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - -Path = Image.core.path diff --git a/lib/python3.12/site-packages/PIL/ImageQt.py b/lib/python3.12/site-packages/PIL/ImageQt.py deleted file mode 100644 index a3d6471..0000000 --- a/lib/python3.12/site-packages/PIL/ImageQt.py +++ /dev/null @@ -1,216 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a simple Qt image interface. -# -# history: -# 2006-06-03 fl: created -# 2006-06-04 fl: inherit from QImage instead of wrapping it -# 2006-06-05 fl: removed toimage helper; move string support to ImageQt -# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) -# -# Copyright (c) 2006 by Secret Labs AB -# Copyright (c) 2006 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from io import BytesIO -from typing import TYPE_CHECKING, Any, Callable, Union - -from . import Image -from ._util import is_path - -if TYPE_CHECKING: - import PyQt6 - import PySide6 - - from . import ImageFile - - QBuffer: type - QByteArray = Union[PyQt6.QtCore.QByteArray, PySide6.QtCore.QByteArray] - QIODevice = Union[PyQt6.QtCore.QIODevice, PySide6.QtCore.QIODevice] - QImage = Union[PyQt6.QtGui.QImage, PySide6.QtGui.QImage] - QPixmap = Union[PyQt6.QtGui.QPixmap, PySide6.QtGui.QPixmap] - -qt_version: str | None -qt_versions = [ - ["6", "PyQt6"], - ["side6", "PySide6"], -] - -# If a version has already been imported, attempt it first -qt_versions.sort(key=lambda version: version[1] in sys.modules, reverse=True) -for version, qt_module in qt_versions: - try: - qRgba: Callable[[int, int, int, int], int] - if qt_module == "PyQt6": - from PyQt6.QtCore import QBuffer, QIODevice - from PyQt6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide6": - from PySide6.QtCore import QBuffer, QIODevice - from PySide6.QtGui import QImage, QPixmap, qRgba - except (ImportError, RuntimeError): - continue - qt_is_installed = True - qt_version = version - break -else: - qt_is_installed = False - qt_version = None - - -def rgb(r: int, g: int, b: int, a: int = 255) -> int: - """(Internal) Turns an RGB color into a Qt compatible color integer.""" - # use qRgb to pack the colors, and then turn the resulting long - # into a negative integer with the same bitpattern. - return qRgba(r, g, b, a) & 0xFFFFFFFF - - -def fromqimage(im: QImage | QPixmap) -> ImageFile.ImageFile: - """ - :param im: QImage or PIL ImageQt object - """ - buffer = QBuffer() - qt_openmode: object - if qt_version == "6": - try: - qt_openmode = getattr(QIODevice, "OpenModeFlag") - except AttributeError: - qt_openmode = getattr(QIODevice, "OpenMode") - else: - qt_openmode = QIODevice - buffer.open(getattr(qt_openmode, "ReadWrite")) - # preserve alpha channel with png - # otherwise ppm is more friendly with Image.open - if im.hasAlphaChannel(): - im.save(buffer, "png") - else: - im.save(buffer, "ppm") - - b = BytesIO() - b.write(buffer.data()) - buffer.close() - b.seek(0) - - return Image.open(b) - - -def fromqpixmap(im: QPixmap) -> ImageFile.ImageFile: - return fromqimage(im) - - -def align8to32(bytes: bytes, width: int, mode: str) -> bytes: - """ - converts each scanline of data from 8 bit to 32 bit aligned - """ - - bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] - - # calculate bytes per line and the extra padding if needed - bits_per_line = bits_per_pixel * width - full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) - bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) - - extra_padding = -bytes_per_line % 4 - - # already 32 bit aligned by luck - if not extra_padding: - return bytes - - new_data = [ - bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding - for i in range(len(bytes) // bytes_per_line) - ] - - return b"".join(new_data) - - -def _toqclass_helper(im: Image.Image | str | QByteArray) -> dict[str, Any]: - data = None - colortable = None - exclusive_fp = False - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = str(im.toUtf8(), "utf-8") - if is_path(im): - im = Image.open(im) - exclusive_fp = True - assert isinstance(im, Image.Image) - - qt_format = getattr(QImage, "Format") if qt_version == "6" else QImage - if im.mode == "1": - format = getattr(qt_format, "Format_Mono") - elif im.mode == "L": - format = getattr(qt_format, "Format_Indexed8") - colortable = [rgb(i, i, i) for i in range(256)] - elif im.mode == "P": - format = getattr(qt_format, "Format_Indexed8") - palette = im.getpalette() - assert palette is not None - colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)] - elif im.mode == "RGB": - # Populate the 4th channel with 255 - im = im.convert("RGBA") - - data = im.tobytes("raw", "BGRA") - format = getattr(qt_format, "Format_RGB32") - elif im.mode == "RGBA": - data = im.tobytes("raw", "BGRA") - format = getattr(qt_format, "Format_ARGB32") - elif im.mode == "I;16": - im = im.point(lambda i: i * 256) - - format = getattr(qt_format, "Format_Grayscale16") - else: - if exclusive_fp: - im.close() - msg = f"unsupported image mode {repr(im.mode)}" - raise ValueError(msg) - - size = im.size - __data = data or align8to32(im.tobytes(), size[0], im.mode) - if exclusive_fp: - im.close() - return {"data": __data, "size": size, "format": format, "colortable": colortable} - - -if qt_is_installed: - - class ImageQt(QImage): # type: ignore[misc] - def __init__(self, im: Image.Image | str | QByteArray) -> None: - """ - An PIL image wrapper for Qt. This is a subclass of PyQt's QImage - class. - - :param im: A PIL Image object, or a file name (given either as - Python string or a PyQt string object). - """ - im_data = _toqclass_helper(im) - # must keep a reference, or Qt will crash! - # All QImage constructors that take data operate on an existing - # buffer, so this buffer has to hang on for the life of the image. - # Fixes https://github.com/python-pillow/Pillow/issues/1370 - self.__data = im_data["data"] - super().__init__( - self.__data, - im_data["size"][0], - im_data["size"][1], - im_data["format"], - ) - if im_data["colortable"]: - self.setColorTable(im_data["colortable"]) - - -def toqimage(im: Image.Image | str | QByteArray) -> ImageQt: - return ImageQt(im) - - -def toqpixmap(im: Image.Image | str | QByteArray) -> QPixmap: - qimage = toqimage(im) - return getattr(QPixmap, "fromImage")(qimage) diff --git a/lib/python3.12/site-packages/PIL/ImageSequence.py b/lib/python3.12/site-packages/PIL/ImageSequence.py deleted file mode 100644 index a6fc340..0000000 --- a/lib/python3.12/site-packages/PIL/ImageSequence.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# sequence support classes -# -# history: -# 1997-02-20 fl Created -# -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -from __future__ import annotations - -from typing import Callable - -from . import Image - - -class Iterator: - """ - This class implements an iterator object that can be used to loop - over an image sequence. - - You can use the ``[]`` operator to access elements by index. This operator - will raise an :py:exc:`IndexError` if you try to access a nonexistent - frame. - - :param im: An image object. - """ - - def __init__(self, im: Image.Image) -> None: - if not hasattr(im, "seek"): - msg = "im must have seek method" - raise AttributeError(msg) - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix: int) -> Image.Image: - try: - self.im.seek(ix) - return self.im - except EOFError as e: - msg = "end of sequence" - raise IndexError(msg) from e - - def __iter__(self) -> Iterator: - return self - - def __next__(self) -> Image.Image: - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - msg = "end of sequence" - raise StopIteration(msg) from e - - -def all_frames( - im: Image.Image | list[Image.Image], - func: Callable[[Image.Image], Image.Image] | None = None, -) -> list[Image.Image]: - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/lib/python3.12/site-packages/PIL/ImageShow.py b/lib/python3.12/site-packages/PIL/ImageShow.py deleted file mode 100644 index d62893d..0000000 --- a/lib/python3.12/site-packages/PIL/ImageShow.py +++ /dev/null @@ -1,360 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# im.show() drivers -# -# History: -# 2008-04-06 fl Created -# -# Copyright (c) Secret Labs AB 2008. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import abc -import os -import shutil -import subprocess -import sys -from shlex import quote -from typing import Any - -from . import Image - -_viewers = [] - - -def register(viewer: type[Viewer] | Viewer, order: int = 1) -> None: - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - if isinstance(viewer, type) and issubclass(viewer, Viewer): - viewer = viewer() - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: - r""" - Display a given image. - - :param image: An image object. - :param title: Optional title. Not all viewers can display the title. - :param \**options: Additional viewer options. - :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. - """ - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image: Image.Image, **options: Any) -> int: - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format: str | None = None - """The format to convert the image into.""" - options: dict[str, Any] = {} - """Additional options used to convert the image.""" - - def get_format(self, image: Image.Image) -> str | None: - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file: str, **options: Any) -> str: - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - msg = "unavailable in base viewer" - raise NotImplementedError(msg) - - def save_image(self, image: Image.Image) -> str: - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image: Image.Image, **options: Any) -> int: - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - os.system(self.get_command(path, **options)) # nosec - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 4 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen( - self.get_command(path, **options), - shell=True, - creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), - ) # nosec - return 1 - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.call(["open", "-a", "Preview.app", path]) - executable = sys.executable or shutil.which("python3") - if executable: - subprocess.Popen( - [ - executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(Viewer): - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - @abc.abstractmethod - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - pass - - def get_command(self, file: str, **options: Any) -> str: - command = self.get_command_ex(file, **options)[0] - return f"{command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - command = executable = "xdg-open" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image: Image.Image, **options: Any) -> int: - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/lib/python3.12/site-packages/PIL/ImageStat.py b/lib/python3.12/site-packages/PIL/ImageStat.py deleted file mode 100644 index 8bc5045..0000000 --- a/lib/python3.12/site-packages/PIL/ImageStat.py +++ /dev/null @@ -1,160 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# global image statistics -# -# History: -# 1996-04-05 fl Created -# 1997-05-21 fl Added mask; added rms, var, stddev attributes -# 1997-08-05 fl Added median -# 1998-07-05 hk Fixed integer overflow error -# -# Notes: -# This class shows how to implement delayed evaluation of attributes. -# To get a certain value, simply access the corresponding attribute. -# The __getattr__ dispatcher takes care of the rest. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -from functools import cached_property - -from . import Image - - -class Stat: - def __init__( - self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None - ) -> None: - """ - Calculate statistics for the given image. If a mask is included, - only the regions covered by that mask are included in the - statistics. You can also pass in a previously calculated histogram. - - :param image: A PIL image, or a precalculated histogram. - - .. note:: - - For a PIL image, calculations rely on the - :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are - grouped into 256 bins, even if the image has more than 8 bits per - channel. So ``I`` and ``F`` mode images have a maximum ``mean``, - ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum - of more than 255. - - :param mask: An optional mask. - """ - if isinstance(image_or_list, Image.Image): - self.h = image_or_list.histogram(mask) - elif isinstance(image_or_list, list): - self.h = image_or_list - else: - msg = "first argument must be image or list" # type: ignore[unreachable] - raise TypeError(msg) - self.bands = list(range(len(self.h) // 256)) - - @cached_property - def extrema(self) -> list[tuple[int, int]]: - """ - Min/max values for each band in the image. - - .. note:: - This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and - simply returns the low and high bins used. This is correct for - images with 8 bits per channel, but fails for other modes such as - ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to - return per-band extrema for the image. This is more correct and - efficient because, for non-8-bit modes, the histogram method uses - :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. - """ - - def minmax(histogram: list[int]) -> tuple[int, int]: - res_min, res_max = 255, 0 - for i in range(256): - if histogram[i]: - res_min = i - break - for i in range(255, -1, -1): - if histogram[i]: - res_max = i - break - return res_min, res_max - - return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] - - @cached_property - def count(self) -> list[int]: - """Total number of pixels for each band in the image.""" - return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] - - @cached_property - def sum(self) -> list[float]: - """Sum of all pixels for each band in the image.""" - - v = [] - for i in range(0, len(self.h), 256): - layer_sum = 0.0 - for j in range(256): - layer_sum += j * self.h[i + j] - v.append(layer_sum) - return v - - @cached_property - def sum2(self) -> list[float]: - """Squared sum of all pixels for each band in the image.""" - - v = [] - for i in range(0, len(self.h), 256): - sum2 = 0.0 - for j in range(256): - sum2 += (j**2) * float(self.h[i + j]) - v.append(sum2) - return v - - @cached_property - def mean(self) -> list[float]: - """Average (arithmetic mean) pixel level for each band in the image.""" - return [self.sum[i] / self.count[i] for i in self.bands] - - @cached_property - def median(self) -> list[int]: - """Median pixel level for each band in the image.""" - - v = [] - for i in self.bands: - s = 0 - half = self.count[i] // 2 - b = i * 256 - for j in range(256): - s = s + self.h[b + j] - if s > half: - break - v.append(j) - return v - - @cached_property - def rms(self) -> list[float]: - """RMS (root-mean-square) for each band in the image.""" - return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] - - @cached_property - def var(self) -> list[float]: - """Variance for each band in the image.""" - return [ - (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] - for i in self.bands - ] - - @cached_property - def stddev(self) -> list[float]: - """Standard deviation for each band in the image.""" - return [math.sqrt(self.var[i]) for i in self.bands] - - -Global = Stat # compatibility diff --git a/lib/python3.12/site-packages/PIL/ImageTk.py b/lib/python3.12/site-packages/PIL/ImageTk.py deleted file mode 100644 index bf29fdb..0000000 --- a/lib/python3.12/site-packages/PIL/ImageTk.py +++ /dev/null @@ -1,290 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import tkinter -from io import BytesIO -from typing import TYPE_CHECKING, Any, cast - -from . import Image, ImageFile - -if TYPE_CHECKING: - from ._typing import CapsuleType - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - - -def _get_image_from_kw(kw: dict[str, Any]) -> ImageFile.ImageFile | None: - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if not source: - return None - return Image.open(source) - - -def _pyimagingtkcall( - command: str, photo: PhotoImage | tkinter.PhotoImage, ptr: CapsuleType -) -> None: - tk = photo.tk - try: - tk.call(command, photo, repr(ptr)) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - _imagingtk.tkinit(tk.interpaddr()) - tk.call(command, photo, repr(ptr)) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__( - self, - image: Image.Image | str | None = None, - size: tuple[int, int] | None = None, - **kw: Any, - ) -> None: - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if image is None: - msg = "Image is required" - raise ValueError(msg) - elif isinstance(image, str): - mode = image - image = None - - if size is None: - msg = "If first argument is mode, size is required" - raise ValueError(msg) - else: - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.apply_transparency() - image.load() - mode = image.palette.mode if image.palette else "RGB" - size = image.size - kw["width"], kw["height"] = size - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self) -> None: - try: - name = self.__photo.name - except AttributeError: - return - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self) -> str: - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im: Image.Image) -> None: - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :param im: A PIL image. The size must match the target region. If the - mode does not match, the image is converted to the mode of - the bitmap image. - """ - # convert to blittable - ptr = im.getim() - image = im.im - if not image.isblock() or im.mode != self.__mode: - block = Image.core.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - ptr = block.ptr - - _pyimagingtkcall("PyImagingPhoto", self.__photo, ptr) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image: Image.Image | None = None, **kw: Any) -> None: - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if image is None: - msg = "Image is required" - raise ValueError(msg) - self.__mode = image.mode - self.__size = image.size - - self.__photo = tkinter.BitmapImage(data=image.tobitmap(), **kw) - - def __del__(self) -> None: - try: - name = self.__photo.name - except AttributeError: - return - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self) -> str: - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo: PhotoImage) -> Image.Image: - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - - _pyimagingtkcall("PyImagingPhotoGet", photo, im.getim()) - - return im - - -def _show(image: Image.Image, title: str | None) -> None: - """Helper for the Image.show method.""" - - class UI(tkinter.Label): - def __init__(self, master: tkinter.Toplevel, im: Image.Image) -> None: - self.image: BitmapImage | PhotoImage - if im.mode == "1": - self.image = BitmapImage(im, foreground="white", master=master) - else: - self.image = PhotoImage(im, master=master) - if TYPE_CHECKING: - image = cast(tkinter._Image, self.image) - else: - image = self.image - super().__init__(master, image=image, bg="black", bd=0) - - if not getattr(tkinter, "_default_root"): - msg = "tkinter not initialized" - raise OSError(msg) - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/lib/python3.12/site-packages/PIL/ImageTransform.py b/lib/python3.12/site-packages/PIL/ImageTransform.py deleted file mode 100644 index a3d8f44..0000000 --- a/lib/python3.12/site-packages/PIL/ImageTransform.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# transform wrappers -# -# History: -# 2002-04-08 fl Created -# -# Copyright (c) 2002 by Secret Labs AB -# Copyright (c) 2002 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from collections.abc import Sequence -from typing import Any - -from . import Image - - -class Transform(Image.ImageTransformHandler): - """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" - - method: Image.Transform - - def __init__(self, data: Sequence[Any]) -> None: - self.data = data - - def getdata(self) -> tuple[Image.Transform, Sequence[int]]: - return self.method, self.data - - def transform( - self, - size: tuple[int, int], - image: Image.Image, - **options: Any, - ) -> Image.Image: - """Perform the transform. Called from :py:meth:`.Image.transform`.""" - # can be overridden - method, data = self.getdata() - return image.transform(size, method, data, **options) - - -class AffineTransform(Transform): - """ - Define an affine image transform. - - This function takes a 6-tuple (a, b, c, d, e, f) which contain the first - two rows from an affine transform matrix. For each pixel (x, y) in the - output image, the new value is taken from a position (a x + b y + c, - d x + e y + f) in the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows - from an affine transform matrix. - """ - - method = Image.Transform.AFFINE - - -class PerspectiveTransform(Transform): - """ - Define a perspective image transform. - - This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel - (x, y) in the output image, the new value is taken from a position - ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in - the input image, rounded to nearest pixel. - - This function can be used to scale, translate, rotate, and shear the - original image. - - See :py:meth:`.Image.transform` - - :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). - """ - - method = Image.Transform.PERSPECTIVE - - -class ExtentTransform(Transform): - """ - Define a transform to extract a subregion from an image. - - Maps a rectangle (defined by two corners) from the image to a rectangle of - the given size. The resulting image will contain data sampled from between - the corners, such that (x0, y0) in the input image will end up at (0,0) in - the output image, and (x1, y1) at size. - - This method can be used to crop, stretch, shrink, or mirror an arbitrary - rectangle in the current image. It is slightly slower than crop, but about - as fast as a corresponding resize operation. - - See :py:meth:`.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.EXTENT - - -class QuadTransform(Transform): - """ - Define a quad image transform. - - Maps a quadrilateral (a region defined by four corners) from the image to a - rectangle of the given size. - - See :py:meth:`.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/lib/python3.12/site-packages/PIL/ImageWin.py b/lib/python3.12/site-packages/PIL/ImageWin.py deleted file mode 100644 index 98c28f2..0000000 --- a/lib/python3.12/site-packages/PIL/ImageWin.py +++ /dev/null @@ -1,247 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Windows DIB display interface -# -# History: -# 1996-05-20 fl Created -# 1996-09-20 fl Fixed subregion exposure -# 1997-09-21 fl Added draw primitive (for tzPrint) -# 2003-05-21 fl Added experimental Window/ImageWindow classes -# 2003-09-05 fl Added fromstring/tostring methods -# -# Copyright (c) Secret Labs AB 1997-2003. -# Copyright (c) Fredrik Lundh 1996-2003. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image - - -class HDC: - """ - Wraps an HDC integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods. - """ - - def __init__(self, dc: int) -> None: - self.dc = dc - - def __int__(self) -> int: - return self.dc - - -class HWND: - """ - Wraps an HWND integer. The resulting object can be passed to the - :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` - methods, instead of a DC. - """ - - def __init__(self, wnd: int) -> None: - self.wnd = wnd - - def __int__(self) -> int: - return self.wnd - - -class Dib: - """ - A Windows bitmap with the given mode and size. The mode can be one of "1", - "L", "P", or "RGB". - - If the display requires a palette, this constructor creates a suitable - palette and associates it with the image. For an "L" image, 128 graylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 graylevels. - - To make sure that palettes work properly under Windows, you must call the - ``palette`` method upon certain events from Windows. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. The mode can be one of "1", - "L", "P", or "RGB". - :param size: If the first argument is a mode string, this - defines the size of the image. - """ - - def __init__( - self, image: Image.Image | str, size: tuple[int, int] | None = None - ) -> None: - if isinstance(image, str): - mode = image - image = "" - if size is None: - msg = "If first argument is mode, size is required" - raise ValueError(msg) - else: - mode = image.mode - size = image.size - if mode not in ["1", "L", "P", "RGB"]: - mode = Image.getmodebase(mode) - self.image = Image.core.display(mode, size) - self.mode = mode - self.size = size - if image: - assert not isinstance(image, str) - self.paste(image) - - def expose(self, handle: int | HDC | HWND) -> None: - """ - Copy the bitmap contents to a device context. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. In PythonWin, you can use - ``CDC.GetHandleAttrib()`` to get a suitable handle. - """ - handle_int = int(handle) - if isinstance(handle, HWND): - dc = self.image.getdc(handle_int) - try: - self.image.expose(dc) - finally: - self.image.releasedc(handle_int, dc) - else: - self.image.expose(handle_int) - - def draw( - self, - handle: int | HDC | HWND, - dst: tuple[int, int, int, int], - src: tuple[int, int, int, int] | None = None, - ) -> None: - """ - Same as expose, but allows you to specify where to draw the image, and - what part of it to draw. - - The destination and source areas are given as 4-tuple rectangles. If - the source is omitted, the entire image is copied. If the source and - the destination have different sizes, the image is resized as - necessary. - """ - if src is None: - src = (0, 0) + self.size - handle_int = int(handle) - if isinstance(handle, HWND): - dc = self.image.getdc(handle_int) - try: - self.image.draw(dc, dst, src) - finally: - self.image.releasedc(handle_int, dc) - else: - self.image.draw(handle_int, dst, src) - - def query_palette(self, handle: int | HDC | HWND) -> int: - """ - Installs the palette associated with the image in the given device - context. - - This method should be called upon **QUERYNEWPALETTE** and - **PALETTECHANGED** events from Windows. If this method returns a - non-zero value, one or more display palette entries were changed, and - the image should be redrawn. - - :param handle: Device context (HDC), cast to a Python integer, or an - HDC or HWND instance. - :return: The number of entries that were changed (if one or more entries, - this indicates that the image should be redrawn). - """ - handle_int = int(handle) - if isinstance(handle, HWND): - handle = self.image.getdc(handle_int) - try: - result = self.image.query_palette(handle) - finally: - self.image.releasedc(handle, handle) - else: - result = self.image.query_palette(handle_int) - return result - - def paste( - self, im: Image.Image, box: tuple[int, int, int, int] | None = None - ) -> None: - """ - Paste a PIL image into the bitmap image. - - :param im: A PIL image. The size must match the target region. - If the mode does not match, the image is converted to the - mode of the bitmap image. - :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. See :ref:`coordinate-system`. If - None is given instead of a tuple, all of the image is - assumed. - """ - im.load() - if self.mode != im.mode: - im = im.convert(self.mode) - if box: - self.image.paste(im.im, box) - else: - self.image.paste(im.im) - - def frombytes(self, buffer: bytes) -> None: - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - self.image.frombytes(buffer) - - def tobytes(self) -> bytes: - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__( - self, title: str = "PIL", width: int | None = None, height: int | None = None - ) -> None: - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action: str, *args: int) -> None: - getattr(self, f"ui_handle_{action}")(*args) - - def ui_handle_clear(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_damage(self, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_destroy(self) -> None: - pass - - def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - pass - - def ui_handle_resize(self, width: int, height: int) -> None: - pass - - def mainloop(self) -> None: - Image.core.eventloop() - - -class ImageWindow(Window): - """Create an image window which displays the given image.""" - - def __init__(self, image: Image.Image | Dib, title: str = "PIL") -> None: - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - super().__init__(title, width=width, height=height) - - def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: - self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/lib/python3.12/site-packages/PIL/ImtImagePlugin.py b/lib/python3.12/site-packages/PIL/ImtImagePlugin.py deleted file mode 100644 index 594c565..0000000 --- a/lib/python3.12/site-packages/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IM Tools support for PIL -# -# history: -# 1996-05-27 fl Created (read 8-bit images only) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - format = "IMT" - format_description = "IM Tools" - - def _open(self) -> None: - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - assert self.fp is not None - - buffer = self.fp.read(100) - if b"\n" not in buffer: - msg = "not an IM file" - raise SyntaxError(msg) - - xsize = ysize = 0 - - while True: - if buffer: - s = buffer[:1] - buffer = buffer[1:] - else: - s = self.fp.read(1) - if not s: - break - - if s == b"\x0C": - # image data begins - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - self.fp.tell() - len(buffer), - (self.mode, 0, 1), - ) - ] - - break - - else: - # read key/value pair - if b"\n" not in buffer: - buffer += self.fp.read(100) - lines = buffer.split(b"\n") - s += lines.pop(0) - buffer = b"\n".join(lines) - if len(s) == 1 or len(s) > 100: - break - if s[0] == ord(b"*"): - continue # comment - - m = field.match(s) - if not m: - break - k, v = m.group(1, 2) - if k == b"width": - xsize = int(v) - self._size = xsize, ysize - elif k == b"height": - ysize = int(v) - self._size = xsize, ysize - elif k == b"pixel" and v == b"n8": - self._mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/lib/python3.12/site-packages/PIL/IptcImagePlugin.py b/lib/python3.12/site-packages/PIL/IptcImagePlugin.py deleted file mode 100644 index 60ab7c8..0000000 --- a/lib/python3.12/site-packages/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,249 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# IPTC/NAA file handling -# -# history: -# 1995-10-01 fl Created -# 1998-03-09 fl Cleaned up and added to PIL -# 2002-06-18 fl Added getiptcinfo helper -# -# Copyright (c) Secret Labs AB 1997-2002. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from collections.abc import Sequence -from io import BytesIO -from typing import cast - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._deprecate import deprecate - -COMPRESSION = {1: "raw", 5: "jpeg"} - - -def __getattr__(name: str) -> bytes: - if name == "PAD": - deprecate("IptcImagePlugin.PAD", 12) - return b"\0\0\0\0" - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# -# Helpers - - -def _i(c: bytes) -> int: - return i32((b"\0\0\0\0" + c)[-4:]) - - -def _i8(c: int | bytes) -> int: - return c if isinstance(c, int) else c[0] - - -def i(c: bytes) -> int: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.i", 12) - return _i(c) - - -def dump(c: Sequence[int | bytes]) -> None: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.dump", 12) - for i in c: - print(f"{_i8(i):02x}", end=" ") - print() - - -## -# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields -# from TIFF and JPEG files, use the getiptcinfo function. - - -class IptcImageFile(ImageFile.ImageFile): - format = "IPTC" - format_description = "IPTC/NAA" - - def getint(self, key: tuple[int, int]) -> int: - return _i(self.info[key]) - - def field(self) -> tuple[tuple[int, int] | None, int]: - # - # get a IPTC field header - s = self.fp.read(5) - if not s.strip(b"\x00"): - return None, 0 - - tag = s[1], s[2] - - # syntax - if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: - msg = "invalid IPTC/NAA file" - raise SyntaxError(msg) - - # field size - size = s[3] - if size > 132: - msg = "illegal field length in IPTC/NAA file" - raise OSError(msg) - elif size == 128: - size = 0 - elif size > 128: - size = _i(self.fp.read(size - 128)) - else: - size = i16(s, 3) - - return tag, size - - def _open(self) -> None: - # load descriptive fields - while True: - offset = self.fp.tell() - tag, size = self.field() - if not tag or tag == (8, 10): - break - if size: - tagdata = self.fp.read(size) - else: - tagdata = None - if tag in self.info: - if isinstance(self.info[tag], list): - self.info[tag].append(tagdata) - else: - self.info[tag] = [self.info[tag], tagdata] - else: - self.info[tag] = tagdata - - # mode - layers = self.info[(3, 60)][0] - component = self.info[(3, 60)][1] - if (3, 65) in self.info: - id = self.info[(3, 65)][0] - 1 - else: - id = 0 - if layers == 1 and not component: - self._mode = "L" - elif layers == 3 and component: - self._mode = "RGB"[id] - elif layers == 4 and component: - self._mode = "CMYK"[id] - - # size - self._size = self.getint((3, 20)), self.getint((3, 30)) - - # compression - try: - compression = COMPRESSION[self.getint((3, 120))] - except KeyError as e: - msg = "Unknown IPTC image compression" - raise OSError(msg) from e - - # tile - if tag == (8, 10): - self.tile = [ - ImageFile._Tile("iptc", (0, 0) + self.size, offset, compression) - ] - - def load(self) -> Image.core.PixelAccess | None: - if len(self.tile) != 1 or self.tile[0][0] != "iptc": - return ImageFile.ImageFile.load(self) - - offset, compression = self.tile[0][2:] - - self.fp.seek(offset) - - # Copy image data to temporary file - o = BytesIO() - if compression == "raw": - # To simplify access to the extracted file, - # prepend a PPM header - o.write(b"P5\n%d %d\n255\n" % self.size) - while True: - type, size = self.field() - if type != (8, 10): - break - while size > 0: - s = self.fp.read(min(size, 8192)) - if not s: - break - o.write(s) - size -= len(s) - - with Image.open(o) as _im: - _im.load() - self.im = _im.im - return None - - -Image.register_open(IptcImageFile.format, IptcImageFile) - -Image.register_extension(IptcImageFile.format, ".iim") - - -def getiptcinfo( - im: ImageFile.ImageFile, -) -> dict[tuple[int, int], bytes | list[bytes]] | None: - """ - Get IPTC information from TIFF, JPEG, or IPTC file. - - :param im: An image containing IPTC data. - :returns: A dictionary containing IPTC information, or None if - no IPTC information block was found. - """ - from . import JpegImagePlugin, TiffImagePlugin - - data = None - - info: dict[tuple[int, int], bytes | list[bytes]] = {} - if isinstance(im, IptcImageFile): - # return info dictionary right away - for k, v in im.info.items(): - if isinstance(k, tuple): - info[k] = v - return info - - elif isinstance(im, JpegImagePlugin.JpegImageFile): - # extract the IPTC/NAA resource - photoshop = im.info.get("photoshop") - if photoshop: - data = photoshop.get(0x0404) - - elif isinstance(im, TiffImagePlugin.TiffImageFile): - # get raw data from the IPTC/NAA tag (PhotoShop tags the data - # as 4-byte integers, so we cannot use the get method...) - try: - data = im.tag_v2[TiffImagePlugin.IPTC_NAA_CHUNK] - except KeyError: - pass - - if data is None: - return None # no properties - - # create an IptcImagePlugin object without initializing it - class FakeImage: - pass - - fake_im = FakeImage() - fake_im.__class__ = IptcImageFile # type: ignore[assignment] - iptc_im = cast(IptcImageFile, fake_im) - - # parse the IPTC information chunk - iptc_im.info = {} - iptc_im.fp = BytesIO(data) - - try: - iptc_im._open() - except (IndexError, KeyError): - pass # expected failure - - for k, v in iptc_im.info.items(): - if isinstance(k, tuple): - info[k] = v - return info diff --git a/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py b/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index b6ebd56..0000000 --- a/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,443 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -from collections.abc import Callable -from typing import IO, cast - -from . import Image, ImageFile, ImagePalette, _binary - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp: IO[bytes], length: int = -1) -> None: - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes: int) -> bool: - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes: int) -> bytes: - if not self._can_read(num_bytes): - msg = "Not enough data in header" - raise SyntaxError(msg) - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." - raise OSError(msg) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self) -> BoxReader: - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self) -> bool: - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self) -> bytes: - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = cast(tuple[int, bytes], self.read_fields(">I4s")) - if lbox == 1: - lbox = cast(int, self.read_fields(">Q")[0]) - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - msg = "Invalid header length" - raise SyntaxError(msg) - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp: IO[bytes]) -> tuple[tuple[int, int], str]: - """Parse the JPEG 2000 codestream to extract the size and component - count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" - - hdr = fp.read(2) - lsiz = _binary.i16be(hdr) - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - ssiz = struct.unpack_from(">B", siz, 38) - if (ssiz[0] & 0x7F) + 1 > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - msg = "unable to determine J2K image mode" - raise SyntaxError(msg) - - return size, mode - - -def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom == 0: - return None - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header( - fp: IO[bytes], -) -> tuple[ - tuple[int, int], - str, - str | None, - tuple[float, float] | None, - ImagePalette.ImagePalette | None, -]: - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - assert header is not None - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - palette = None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - assert isinstance(height, int) - assert isinstance(width, int) - assert isinstance(bpc, int) - size = (width, height) - if nc == 1 and (bpc & 0x7F) > 8: - mode = "I;16" - elif nc == 1: - mode = "L" - elif nc == 2: - mode = "LA" - elif nc == 3: - mode = "RGB" - elif nc == 4: - mode = "RGBA" - elif tbox == b"colr" and nc == 4: - meth, _, _, enumcs = header.read_fields(">BBBI") - if meth == 1 and enumcs == 12: - mode = "CMYK" - elif tbox == b"pclr" and mode in ("L", "LA"): - ne, npc = header.read_fields(">HB") - assert isinstance(ne, int) - assert isinstance(npc, int) - max_bitdepth = 0 - for bitdepth in header.read_fields(">" + ("B" * npc)): - assert isinstance(bitdepth, int) - if bitdepth > max_bitdepth: - max_bitdepth = bitdepth - if max_bitdepth <= 8: - palette = ImagePalette.ImagePalette("RGBA" if npc == 4 else "RGB") - for i in range(ne): - color: list[int] = [] - for value in header.read_fields(">" + ("B" * npc)): - assert isinstance(value, int) - color.append(value) - palette.getcolor(tuple(color)) - mode = "P" if mode == "L" else "PA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - assert isinstance(vrcn, int) - assert isinstance(vrcd, int) - assert isinstance(hrcn, int) - assert isinstance(hrcd, int) - assert isinstance(vrce, int) - assert isinstance(hrce, int) - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - msg = "Malformed JP2 header" - raise SyntaxError(msg) - - return size, mode, mimetype, dpi, palette - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self) -> None: - sig = self.fp.read(4) - if sig == b"\xff\x4f\xff\x51": - self.codec = "j2k" - self._size, self._mode = _parse_codestream(self.fp) - else: - sig = sig + self.fp.read(8) - - if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": - self.codec = "jp2" - header = _parse_jp2_header(self.fp) - self._size, self._mode, self.custom_mimetype, dpi, self.palette = header - if dpi is not None: - self.info["dpi"] = dpi - if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): - self._parse_comment() - else: - msg = "not a JPEG 2000 file" - raise SyntaxError(msg) - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ImageFile._Tile( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - def _parse_comment(self) -> None: - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - self.fp.seek(length - 2, os.SEEK_CUR) - - while True: - marker = self.fp.read(2) - if not marker: - break - typ = marker[1] - if typ in (0x90, 0xD9): - # Start of tile or end of codestream - break - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - if typ == 0x64: - # Comment - self.info["comment"] = self.fp.read(length - 2)[2:] - break - else: - self.fp.seek(length - 2, os.SEEK_CUR) - - @property # type: ignore[override] - def reduce( - self, - ) -> ( - Callable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] - | int - ): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value: int) -> None: - self._reduce = value - - def load(self) -> Image.core.PixelAccess | None: - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # Update the reduce and layers settings - t = self.tile[0] - assert isinstance(t[3], tuple) - t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) - self.tile = [ImageFile._Tile(t[0], (0, 0) + self.size, t[2], t3)] - - return ImageFile.ImageFile.load(self) - - -def _accept(prefix: bytes) -> bool: - return ( - prefix[:4] == b"\xff\x4f\xff\x51" - or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" - ) - - -# ------------------------------------------------------------ -# Save support - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # Get the keyword arguments - info = im.encoderinfo - - if isinstance(filename, str): - filename = filename.encode() - if filename.endswith(b".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - offset = info.get("offset", None) - tile_offset = info.get("tile_offset", None) - tile_size = info.get("tile_size", None) - quality_mode = info.get("quality_mode", "rates") - quality_layers = info.get("quality_layers", None) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - isinstance(quality_layer, (int, float)) for quality_layer in quality_layers - ) - ): - msg = "quality_layers must be a sequence of numbers" - raise ValueError(msg) - - num_resolutions = info.get("num_resolutions", 0) - cblk_size = info.get("codeblock_size", None) - precinct_size = info.get("precinct_size", None) - irreversible = info.get("irreversible", False) - progression = info.get("progression", "LRCP") - cinema_mode = info.get("cinema_mode", "no") - mct = info.get("mct", 0) - signed = info.get("signed", False) - comment = info.get("comment") - if isinstance(comment, str): - comment = comment.encode() - plt = info.get("plt", False) - - fd = -1 - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - signed, - fd, - comment, - plt, - ) - - ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", (0, 0) + im.size, 0, kind)]) - - -# ------------------------------------------------------------ -# Registry stuff - - -Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) -Image.register_save(Jpeg2KImageFile.format, _save) - -Image.register_extensions( - Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] -) - -Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/lib/python3.12/site-packages/PIL/JpegImagePlugin.py b/lib/python3.12/site-packages/PIL/JpegImagePlugin.py deleted file mode 100644 index 6510e07..0000000 --- a/lib/python3.12/site-packages/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,895 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# JPEG (JFIF) file handling -# -# See "Digital Compression and Coding of Continuous-Tone Still Images, -# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) -# -# History: -# 1995-09-09 fl Created -# 1995-09-13 fl Added full parser -# 1996-03-25 fl Added hack to use the IJG command line utilities -# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug -# 1996-05-28 fl Added draft support, JFIF version (0.1) -# 1996-12-30 fl Added encoder options, added progression property (0.2) -# 1997-08-27 fl Save mode 1 images as BW (0.3) -# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) -# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) -# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) -# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) -# 2003-04-25 fl Added experimental EXIF decoder (0.5) -# 2003-06-06 fl Added experimental EXIF GPSinfo decoder -# 2003-09-13 fl Extract COM markers -# 2009-09-06 fl Added icc_profile support (from Florian Hoech) -# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) -# 2009-03-08 fl Added subsampling support (from Justin Huff). -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import array -import io -import math -import os -import struct -import subprocess -import sys -import tempfile -import warnings -from typing import IO, TYPE_CHECKING, Any - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._deprecate import deprecate -from .JpegPresets import presets - -if TYPE_CHECKING: - from .MpoImagePlugin import MpoImageFile - -# -# Parser - - -def Skip(self: JpegImageFile, marker: int) -> None: - n = i16(self.fp.read(2)) - 2 - ImageFile._safe_read(self.fp, n) - - -def APP(self: JpegImageFile, marker: int) -> None: - # - # Application marker. Store these in the APP dictionary. - # Also look for well-known application markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - app = "APP%d" % (marker & 15) - - self.app[app] = s # compatibility - self.applist.append((app, s)) - - if marker == 0xFFE0 and s[:4] == b"JFIF": - # extract JFIF information - self.info["jfif"] = version = i16(s, 5) # version - self.info["jfif_version"] = divmod(version, 256) - # extract JFIF properties - try: - jfif_unit = s[7] - jfif_density = i16(s, 8), i16(s, 10) - except Exception: - pass - else: - if jfif_unit == 1: - self.info["dpi"] = jfif_density - self.info["jfif_unit"] = jfif_unit - self.info["jfif_density"] = jfif_density - elif marker == 0xFFE1 and s[:6] == b"Exif\0\0": - # extract EXIF information - if "exif" in self.info: - self.info["exif"] += s[6:] - else: - self.info["exif"] = s - self._exif_offset = self.fp.tell() - n + 6 - elif marker == 0xFFE1 and s[:29] == b"http://ns.adobe.com/xap/1.0/\x00": - self.info["xmp"] = s.split(b"\x00", 1)[1] - elif marker == 0xFFE2 and s[:5] == b"FPXR\0": - # extract FlashPix information (incomplete) - self.info["flashpix"] = s # FIXME: value will change - elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": - # Since an ICC profile can be larger than the maximum size of - # a JPEG marker (64K), we need provisions to split it into - # multiple markers. The format defined by the ICC specifies - # one or more APP2 markers containing the following data: - # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) - # Marker sequence number 1, 2, etc (1 byte) - # Number of markers Total of APP2's used (1 byte) - # Profile data (remainder of APP2 data) - # Decoders should use the marker sequence numbers to - # reassemble the profile, rather than assuming that the APP2 - # markers appear in the correct sequence. - self.icclist.append(s) - elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": - # parse the image resource block - offset = 14 - photoshop = self.info.setdefault("photoshop", {}) - while s[offset : offset + 4] == b"8BIM": - try: - offset += 4 - # resource code - code = i16(s, offset) - offset += 2 - # resource name (usually empty) - name_len = s[offset] - # name = s[offset+1:offset+1+name_len] - offset += 1 + name_len - offset += offset & 1 # align - # resource data block - size = i32(s, offset) - offset += 4 - data = s[offset : offset + size] - if code == 0x03ED: # ResolutionInfo - photoshop[code] = { - "XResolution": i32(data, 0) / 65536, - "DisplayedUnitsX": i16(data, 4), - "YResolution": i32(data, 8) / 65536, - "DisplayedUnitsY": i16(data, 12), - } - else: - photoshop[code] = data - offset += size - offset += offset & 1 # align - except struct.error: - break # insufficient data - - elif marker == 0xFFEE and s[:5] == b"Adobe": - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = s[11] - except IndexError: - pass - else: - self.info["adobe_transform"] = adobe_transform - elif marker == 0xFFE2 and s[:4] == b"MPF\0": - # extract MPO information - self.info["mp"] = s[4:] - # offset is current location minus buffer size - # plus constant header size - self.info["mpoffset"] = self.fp.tell() - n + 4 - - -def COM(self: JpegImageFile, marker: int) -> None: - # - # Comment marker. Store these in the APP dictionary. - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - self.info["comment"] = s - self.app["COM"] = s # compatibility - self.applist.append(("COM", s)) - - -def SOF(self: JpegImageFile, marker: int) -> None: - # - # Start of frame marker. Defines the size and mode of the - # image. JPEG is colour blind, so we use some simple - # heuristics to map the number of layers to an appropriate - # mode. Note that this could be made a bit brighter, by - # looking for JFIF and Adobe APP markers. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - self._size = i16(s, 3), i16(s, 1) - - self.bits = s[0] - if self.bits != 8: - msg = f"cannot handle {self.bits}-bit layers" - raise SyntaxError(msg) - - self.layers = s[5] - if self.layers == 1: - self._mode = "L" - elif self.layers == 3: - self._mode = "RGB" - elif self.layers == 4: - self._mode = "CMYK" - else: - msg = f"cannot handle {self.layers}-layer images" - raise SyntaxError(msg) - - if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: - self.info["progressive"] = self.info["progression"] = 1 - - if self.icclist: - # fixup icc profile - self.icclist.sort() # sort by sequence number - if self.icclist[0][13] == len(self.icclist): - profile = [p[14:] for p in self.icclist] - icc_profile = b"".join(profile) - else: - icc_profile = None # wrong number of fragments - self.info["icc_profile"] = icc_profile - self.icclist = [] - - for i in range(6, len(s), 3): - t = s[i : i + 3] - # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) - - -def DQT(self: JpegImageFile, marker: int) -> None: - # - # Define quantization table. Note that there might be more - # than one table in each marker. - - # FIXME: The quantization tables can be used to estimate the - # compression quality. - - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - while len(s): - v = s[0] - precision = 1 if (v // 16 == 0) else 2 # in bytes - qt_length = 1 + precision * 64 - if len(s) < qt_length: - msg = "bad quantization table marker" - raise SyntaxError(msg) - data = array.array("B" if precision == 1 else "H", s[1:qt_length]) - if sys.byteorder == "little" and precision > 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# JPEG marker table - -MARKER = { - 0xFFC0: ("SOF0", "Baseline DCT", SOF), - 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), - 0xFFC2: ("SOF2", "Progressive DCT", SOF), - 0xFFC3: ("SOF3", "Spatial lossless", SOF), - 0xFFC4: ("DHT", "Define Huffman table", Skip), - 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), - 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), - 0xFFC7: ("SOF7", "Differential spatial", SOF), - 0xFFC8: ("JPG", "Extension", None), - 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), - 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), - 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), - 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), - 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), - 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), - 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), - 0xFFD0: ("RST0", "Restart 0", None), - 0xFFD1: ("RST1", "Restart 1", None), - 0xFFD2: ("RST2", "Restart 2", None), - 0xFFD3: ("RST3", "Restart 3", None), - 0xFFD4: ("RST4", "Restart 4", None), - 0xFFD5: ("RST5", "Restart 5", None), - 0xFFD6: ("RST6", "Restart 6", None), - 0xFFD7: ("RST7", "Restart 7", None), - 0xFFD8: ("SOI", "Start of image", None), - 0xFFD9: ("EOI", "End of image", None), - 0xFFDA: ("SOS", "Start of scan", Skip), - 0xFFDB: ("DQT", "Define quantization table", DQT), - 0xFFDC: ("DNL", "Define number of lines", Skip), - 0xFFDD: ("DRI", "Define restart interval", Skip), - 0xFFDE: ("DHP", "Define hierarchical progression", SOF), - 0xFFDF: ("EXP", "Expand reference component", Skip), - 0xFFE0: ("APP0", "Application segment 0", APP), - 0xFFE1: ("APP1", "Application segment 1", APP), - 0xFFE2: ("APP2", "Application segment 2", APP), - 0xFFE3: ("APP3", "Application segment 3", APP), - 0xFFE4: ("APP4", "Application segment 4", APP), - 0xFFE5: ("APP5", "Application segment 5", APP), - 0xFFE6: ("APP6", "Application segment 6", APP), - 0xFFE7: ("APP7", "Application segment 7", APP), - 0xFFE8: ("APP8", "Application segment 8", APP), - 0xFFE9: ("APP9", "Application segment 9", APP), - 0xFFEA: ("APP10", "Application segment 10", APP), - 0xFFEB: ("APP11", "Application segment 11", APP), - 0xFFEC: ("APP12", "Application segment 12", APP), - 0xFFED: ("APP13", "Application segment 13", APP), - 0xFFEE: ("APP14", "Application segment 14", APP), - 0xFFEF: ("APP15", "Application segment 15", APP), - 0xFFF0: ("JPG0", "Extension 0", None), - 0xFFF1: ("JPG1", "Extension 1", None), - 0xFFF2: ("JPG2", "Extension 2", None), - 0xFFF3: ("JPG3", "Extension 3", None), - 0xFFF4: ("JPG4", "Extension 4", None), - 0xFFF5: ("JPG5", "Extension 5", None), - 0xFFF6: ("JPG6", "Extension 6", None), - 0xFFF7: ("JPG7", "Extension 7", None), - 0xFFF8: ("JPG8", "Extension 8", None), - 0xFFF9: ("JPG9", "Extension 9", None), - 0xFFFA: ("JPG10", "Extension 10", None), - 0xFFFB: ("JPG11", "Extension 11", None), - 0xFFFC: ("JPG12", "Extension 12", None), - 0xFFFD: ("JPG13", "Extension 13", None), - 0xFFFE: ("COM", "Comment", COM), -} - - -def _accept(prefix: bytes) -> bool: - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix[:3] == b"\xFF\xD8\xFF" - - -## -# Image plugin for JPEG and JFIF images. - - -class JpegImageFile(ImageFile.ImageFile): - format = "JPEG" - format_description = "JPEG (ISO 10918)" - - def _open(self) -> None: - s = self.fp.read(3) - - if not _accept(s): - msg = "not a JPEG file" - raise SyntaxError(msg) - s = b"\xFF" - - # Create attributes - self.bits = self.layers = 0 - self._exif_offset = 0 - - # JPEG specifics (internal) - self.layer: list[tuple[int, int, int, int]] = [] - self._huffman_dc: dict[Any, Any] = {} - self._huffman_ac: dict[Any, Any] = {} - self.quantization: dict[int, list[int]] = {} - self.app: dict[str, bytes] = {} # compatibility - self.applist: list[tuple[str, bytes]] = [] - self.icclist: list[bytes] = [] - - while True: - i = s[0] - if i == 0xFF: - s = s + self.fp.read(1) - i = i16(s) - else: - # Skip non-0xFF junk - s = self.fp.read(1) - continue - - if i in MARKER: - name, description, handler = MARKER[i] - if handler is not None: - handler(self, i) - if i == 0xFFDA: # start of scan - rawmode = self.mode - if self.mode == "CMYK": - rawmode = "CMYK;I" # assume adobe conventions - self.tile = [ - ImageFile._Tile("jpeg", (0, 0) + self.size, 0, (rawmode, "")) - ] - # self.__offset = self.fp.tell() - break - s = self.fp.read(1) - elif i in {0, 0xFFFF}: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - msg = "no marker found" - raise SyntaxError(msg) - - self._read_dpi_from_exif() - - def __getattr__(self, name: str) -> Any: - if name in ("huffman_ac", "huffman_dc"): - deprecate(name, 12) - return getattr(self, "_" + name) - raise AttributeError(name) - - def load_read(self, read_bytes: int) -> bytes: - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xFF\xD9" - - return s - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - if len(self.tile) != 1: - return None - - # Protect from second call - if self.decoderconfig: - return None - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - assert isinstance(a, tuple) - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self._mode = mode - a = mode, "" - - if size: - scale = min(self.size[0] // size[0], self.size[1] // size[1]) - for s in [8, 4, 2, 1]: - if scale >= s: - break - assert e is not None - e = ( - e[0], - e[1], - (e[2] - e[0] + s - 1) // s + e[0], - (e[3] - e[1] + s - 1) // s + e[1], - ) - self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) - scale = s - - self.tile = [ImageFile._Tile(d, e, o, a)] - self.decoderconfig = (scale, 0) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return self.mode, box - - def load_djpeg(self) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - try: - os.unlink(path) - except OSError: - pass - - msg = "Invalid Filename" - raise ValueError(msg) - - try: - with Image.open(path) as _im: - _im.load() - self.im = _im.im - finally: - try: - os.unlink(path) - except OSError: - pass - - self._mode = self.im.mode - self._size = self.im.size - - self.tile = [] - - def _getexif(self) -> dict[int, Any] | None: - return _getexif(self) - - def _read_dpi_from_exif(self) -> None: - # If DPI isn't in JPEG header, fetch from EXIF - if "dpi" in self.info or "exif" not in self.info: - return - try: - exif = self.getexif() - resolution_unit = exif[0x0128] - x_resolution = exif[0x011A] - try: - dpi = float(x_resolution[0]) / x_resolution[1] - except TypeError: - dpi = x_resolution - if math.isnan(dpi): - msg = "DPI is not a number" - raise ValueError(msg) - if resolution_unit == 3: # cm - # 1 dpcm = 2.54 dpi - dpi *= 2.54 - self.info["dpi"] = dpi, dpi - except ( - struct.error, # truncated EXIF - KeyError, # dpi not included - SyntaxError, # invalid/unreadable EXIF - TypeError, # dpi is an invalid float - ValueError, # dpi is an invalid float - ZeroDivisionError, # invalid dpi rational value - ): - self.info["dpi"] = 72, 72 - - def _getmp(self) -> dict[int, Any] | None: - return _getmp(self) - - -def _getexif(self: JpegImageFile) -> dict[int, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -def _getmp(self: JpegImageFile) -> dict[int, Any] | None: - # Extract MP information. This method was inspired by the "highly - # experimental" _getexif version that's been in use for years now, - # itself based on the ImageFileDirectory class in the TIFF plugin. - - # The MP record essentially consists of a TIFF file embedded in a JPEG - # application marker. - try: - data = self.info["mp"] - except KeyError: - return None - file_contents = io.BytesIO(data) - head = file_contents.read(8) - endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" - # process dictionary - from . import TiffImagePlugin - - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - msg = "malformed MP Index (unreadable directory)" - raise SyntaxError(msg) from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - msg = "malformed MP Index (no number of images)" - raise SyntaxError(msg) from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(0, quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", rawmpentries, entrynum * 16 - ) - labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") - mpentry = dict(zip(labels, unpackedentry)) - mpentryattr = { - "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), - "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), - "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), - "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, - "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, - "MPType": mpentry["Attribute"] & 0x00FFFFFF, - } - if mpentryattr["ImageDataFormat"] == 0: - mpentryattr["ImageDataFormat"] = "JPEG" - else: - msg = "unsupported picture format in MPO" - raise SyntaxError(msg) - mptypemap = { - 0x000000: "Undefined", - 0x010001: "Large Thumbnail (VGA Equivalent)", - 0x010002: "Large Thumbnail (Full HD Equivalent)", - 0x020001: "Multi-Frame Image (Panorama)", - 0x020002: "Multi-Frame Image: (Disparity)", - 0x020003: "Multi-Frame Image: (Multi-Angle)", - 0x030000: "Baseline MP Primary Image", - } - mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") - mpentry["Attribute"] = mpentryattr - mpentries.append(mpentry) - mp[0xB002] = mpentries - except KeyError as e: - msg = "malformed MP Index (bad MP Entry)" - raise SyntaxError(msg) from e - # Next we should try and parse the individual image unique ID list; - # we don't because I've never seen this actually used in a real MPO - # file and so can't test it. - return mp - - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -# fmt: off -zigzag_index = ( - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63, -) - -samplings = { - (1, 1, 1, 1, 1, 1): 0, - (2, 1, 1, 1, 1, 1): 1, - (2, 2, 1, 1, 1, 1): 2, -} -# fmt: on - - -def get_sampling(im: Image.Image) -> int: - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the default value. - # - # NOTE: currently Pillow can't encode JPEG to YCCK format. - # If YCCK support is added in the future, subsampling code will have - # to be updated (here and in JpegEncode.c) to deal with 4 layers. - if not isinstance(im, JpegImageFile) or im.layers in (1, 4): - return -1 - sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] - return samplings.get(sampling, -1) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.width == 0 or im.height == 0: - msg = "cannot write empty image as JPEG" - raise ValueError(msg) - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as JPEG" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - msg = "Invalid quality setting" - raise ValueError(msg) - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) and qtables in presets: - qtables = presets[qtables].get("quantization") - - if subsampling == "4:4:4": - subsampling = 0 - elif subsampling == "4:2:2": - subsampling = 1 - elif subsampling == "4:2:0": - subsampling = 2 - elif subsampling == "4:1:1": - # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. - # Set 4:2:0 if someone is still using that value. - subsampling = 2 - elif subsampling == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - subsampling = get_sampling(im) - - def validate_qtables( - qtables: ( - str | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | None - ) - ) -> list[list[int]] | None: - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] - if isinstance(qtables, (tuple, list, dict)): - if isinstance(qtables, dict): - qtables = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - msg = "None or too many quantization tables" - raise ValueError(msg) - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - msg = "Invalid quantization table" - raise TypeError(msg) - table_array = array.array("H", table) - except TypeError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables[idx] = list(table_array) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = info.get("extra", b"") - - MAX_BYTES_IN_MARKER = 65533 - xmp = info.get("xmp", im.info.get("xmp")) - if xmp: - overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00" - max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len - if len(xmp) > max_data_bytes_in_marker: - msg = "XMP data is too long" - raise ValueError(msg) - size = o16(2 + overhead_len + len(xmp)) - extra += b"\xFF\xE1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp - - icc_profile = info.get("icc_profile") - if icc_profile: - overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) - max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len - markers = [] - while icc_profile: - markers.append(icc_profile[:max_data_bytes_in_marker]) - icc_profile = icc_profile[max_data_bytes_in_marker:] - i = 1 - for marker in markers: - size = o16(2 + overhead_len + len(marker)) - extra += ( - b"\xFF\xE2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - comment = info.get("comment", im.info.get("comment")) - - # "progressive" is the official name, but older documentation - # says "progression" - # FIXME: issue a warning if the wrong form is used (post-1.1.7) - progressive = info.get("progressive", False) or info.get("progression", False) - - optimize = info.get("optimize", False) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if len(exif) > MAX_BYTES_IN_MARKER: - msg = "EXIF data is too long" - raise ValueError(msg) - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("keep_rgb", False), - info.get("streamtype", 0), - dpi[0], - dpi[1], - subsampling, - info.get("restart_marker_blocks", 0), - info.get("restart_marker_rows", 0), - qtables, - comment, - extra, - exif, - ) - - # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 - if optimize or progressive: - # CMYK can be bigger - if im.mode == "CMYK": - bufsize = 4 * im.size[0] * im.size[1] - # keep sets quality to -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - if exif: - bufsize += len(exif) + 5 - if extra: - bufsize += len(extra) + 1 - else: - # The EXIF info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save( - im, fp, [ImageFile._Tile("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize - ) - - -def _save_cjpeg(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(tempfile) - except OSError: - pass - - -## -# Factory for making JPEG and MPO instances -def jpeg_factory( - fp: IO[bytes], filename: str | bytes | None = None -) -> JpegImageFile | MpoImageFile: - im = JpegImageFile(fp, filename) - try: - mpheader = im._getmp() - if mpheader is not None and mpheader[45057] > 1: - for segment, content in im.applist: - if segment == "APP1" and b' hdrgm:Version="' in content: - # Ultra HDR images are not yet supported - return im - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - except (TypeError, IndexError): - # It is really a JPEG - pass - except SyntaxError: - warnings.warn( - "Image appears to be a malformed MPO file, it will be " - "interpreted as a base JPEG file" - ) - return im - - -# --------------------------------------------------------------------- -# Registry stuff - -Image.register_open(JpegImageFile.format, jpeg_factory, _accept) -Image.register_save(JpegImageFile.format, _save) - -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) - -Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/lib/python3.12/site-packages/PIL/JpegPresets.py b/lib/python3.12/site-packages/PIL/JpegPresets.py deleted file mode 100644 index d0e64a3..0000000 --- a/lib/python3.12/site-packages/PIL/JpegPresets.py +++ /dev/null @@ -1,242 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. -Can be used when saving JPEG files. - -The following presets are available by default: -``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, -``low``, ``medium``, ``high``, ``maximum``. -More presets can be added to the :py:data:`presets` dict if needed. - -To apply the preset, specify:: - - quality="preset_name" - -To apply only the quantization table:: - - qtables="preset_name" - -To apply only the subsampling setting:: - - subsampling="preset_name" - -Example:: - - im.save("image_name.jpg", quality="web_high") - -Subsampling ------------ - -Subsampling is the practice of encoding images by implementing less resolution -for chroma information than for luma information. -(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) - -Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and -4:2:0. - -You can get the subsampling of a JPEG with the -:func:`.JpegImagePlugin.get_sampling` function. - -In JPEG compressed data a JPEG marker is used instead of an EXIF tag. -(ref.: https://exiv2.org/tags.html) - - -Quantization tables -------------------- - -They are values use by the DCT (Discrete cosine transform) to remove -*unnecessary* information from the image (the lossy part of the compression). -(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, -https://en.wikipedia.org/wiki/JPEG#Quantization) - -You can get the quantization tables of a JPEG with:: - - im.quantization - -This will return a dict with a number of lists. You can pass this dict -directly as the qtables argument when saving a JPEG. - -The quantization table format in presets is a list with sublists. These formats -are interchangeable. - -Libjpeg ref.: -https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -from __future__ import annotations - -# fmt: off -presets = { - 'web_low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [20, 16, 25, 39, 50, 46, 62, 68, - 16, 18, 23, 38, 38, 53, 65, 68, - 25, 23, 31, 38, 53, 65, 68, 68, - 39, 38, 38, 53, 65, 68, 68, 68, - 50, 38, 53, 65, 68, 68, 68, 68, - 46, 53, 65, 68, 68, 68, 68, 68, - 62, 65, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68], - [21, 25, 32, 38, 54, 68, 68, 68, - 25, 28, 24, 38, 54, 68, 68, 68, - 32, 24, 32, 43, 66, 68, 68, 68, - 38, 38, 43, 53, 68, 68, 68, 68, - 54, 54, 66, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68] - ]}, - 'web_medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [16, 11, 11, 16, 23, 27, 31, 30, - 11, 12, 12, 15, 20, 23, 23, 30, - 11, 12, 13, 16, 23, 26, 35, 47, - 16, 15, 16, 23, 26, 37, 47, 64, - 23, 20, 23, 26, 39, 51, 64, 64, - 27, 23, 26, 37, 51, 64, 64, 64, - 31, 23, 35, 47, 64, 64, 64, 64, - 30, 30, 47, 64, 64, 64, 64, 64], - [17, 15, 17, 21, 20, 26, 38, 48, - 15, 19, 18, 17, 20, 26, 35, 43, - 17, 18, 20, 22, 26, 30, 46, 53, - 21, 17, 22, 28, 30, 39, 53, 64, - 20, 20, 26, 30, 39, 48, 64, 64, - 26, 26, 30, 39, 48, 63, 64, 64, - 38, 35, 46, 53, 64, 64, 64, 64, - 48, 43, 53, 64, 64, 64, 64, 64] - ]}, - 'web_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 14, 19, - 6, 6, 6, 11, 12, 15, 19, 28, - 9, 8, 10, 12, 16, 20, 27, 31, - 11, 10, 12, 15, 20, 27, 31, 31, - 12, 12, 14, 19, 27, 31, 31, 31, - 16, 12, 19, 28, 31, 31, 31, 31], - [7, 7, 13, 24, 26, 31, 31, 31, - 7, 12, 16, 21, 31, 31, 31, 31, - 13, 16, 17, 31, 31, 31, 31, 31, - 24, 21, 31, 31, 31, 31, 31, 31, - 26, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31] - ]}, - 'web_very_high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 11, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 11, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'web_maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 3, - 1, 1, 1, 1, 2, 2, 3, 3, - 1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 2, 2, 3, 3, 3, 3], - [1, 1, 1, 2, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 3, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3] - ]}, - 'low': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [18, 14, 14, 21, 30, 35, 34, 17, - 14, 16, 16, 19, 26, 23, 12, 12, - 14, 16, 17, 21, 23, 12, 12, 12, - 21, 19, 21, 23, 12, 12, 12, 12, - 30, 26, 23, 12, 12, 12, 12, 12, - 35, 23, 12, 12, 12, 12, 12, 12, - 34, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [20, 19, 22, 27, 20, 20, 17, 17, - 19, 25, 23, 14, 14, 12, 12, 12, - 22, 23, 14, 14, 12, 12, 12, 12, - 27, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'medium': {'subsampling': 2, # "4:2:0" - 'quantization': [ - [12, 8, 8, 12, 17, 21, 24, 17, - 8, 9, 9, 11, 15, 19, 12, 12, - 8, 9, 10, 12, 19, 12, 12, 12, - 12, 11, 12, 21, 12, 12, 12, 12, - 17, 15, 19, 12, 12, 12, 12, 12, - 21, 19, 12, 12, 12, 12, 12, 12, - 24, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12], - [13, 11, 13, 16, 20, 20, 17, 17, - 11, 14, 14, 14, 14, 12, 12, 12, - 13, 14, 14, 14, 12, 12, 12, 12, - 16, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'high': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [6, 4, 4, 6, 9, 11, 12, 16, - 4, 5, 5, 6, 8, 10, 12, 12, - 4, 5, 5, 6, 10, 12, 12, 12, - 6, 6, 6, 11, 12, 12, 12, 12, - 9, 8, 10, 12, 12, 12, 12, 12, - 11, 10, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 16, 12, 12, 12, 12, 12, 12, 12], - [7, 7, 13, 24, 20, 20, 17, 17, - 7, 12, 16, 14, 14, 12, 12, 12, - 13, 16, 14, 14, 12, 12, 12, 12, - 24, 14, 14, 12, 12, 12, 12, 12, - 20, 14, 12, 12, 12, 12, 12, 12, - 20, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12, - 17, 12, 12, 12, 12, 12, 12, 12] - ]}, - 'maximum': {'subsampling': 0, # "4:4:4" - 'quantization': [ - [2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 3, 4, 5, 6, - 2, 2, 2, 2, 4, 5, 7, 9, - 2, 2, 2, 4, 5, 7, 9, 12, - 3, 3, 4, 5, 8, 10, 12, 12, - 4, 4, 5, 7, 10, 12, 12, 12, - 5, 5, 7, 9, 12, 12, 12, 12, - 6, 6, 9, 12, 12, 12, 12, 12], - [3, 3, 5, 9, 13, 15, 15, 15, - 3, 4, 6, 10, 14, 12, 12, 12, - 5, 6, 9, 14, 12, 12, 12, 12, - 9, 10, 14, 12, 12, 12, 12, 12, - 13, 14, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12, - 15, 12, 12, 12, 12, 12, 12, 12] - ]}, -} -# fmt: on diff --git a/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py b/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py deleted file mode 100644 index 5dd031b..0000000 --- a/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Basic McIdas support for PIL -# -# History: -# 1997-05-05 fl Created (8-bit images only) -# 2009-03-08 fl Added 16/32-bit support. -# -# Thanks to Richard Jones and Craig Swank for specs and samples. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import struct - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" - - -## -# Image plugin for McIdas area images. - - -class McIdasImageFile(ImageFile.ImageFile): - format = "MCIDAS" - format_description = "McIdas area file" - - def _open(self) -> None: - # parse area file directory - assert self.fp is not None - - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - msg = "not an McIdas area file" - raise SyntaxError(msg) - - self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) - - # get mode - if w[11] == 1: - mode = rawmode = "L" - elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" - elif w[11] == 4: - # FIXME: add memory map support - mode = "I" - rawmode = "I;32B" - else: - msg = "unsupported McIdas format" - raise SyntaxError(msg) - - self._mode = mode - self._size = w[10], w[9] - - offset = w[34] + w[15] - stride = w[15] + w[10] * w[11] * w[14] - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1)) - ] - - -# -------------------------------------------------------------------- -# registry - -Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) - -# no default extension diff --git a/lib/python3.12/site-packages/PIL/MicImagePlugin.py b/lib/python3.12/site-packages/PIL/MicImagePlugin.py deleted file mode 100644 index 5f23a34..0000000 --- a/lib/python3.12/site-packages/PIL/MicImagePlugin.py +++ /dev/null @@ -1,107 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Microsoft Image Composer support for PIL -# -# Notes: -# uses TiffImagePlugin.py to read the actual image streams -# -# History: -# 97-01-20 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == olefile.MAGIC - - -## -# Image plugin for Microsoft's Image Composer file format. - - -class MicImageFile(TiffImagePlugin.TiffImageFile): - format = "MIC" - format_description = "Microsoft Image Composer" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = olefile.OleFileIO(self.fp) - except OSError as e: - msg = "not an MIC file; invalid OLE file" - raise SyntaxError(msg) from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [ - path - for path in self.ole.listdir() - if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image" - ] - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - msg = "not an MIC file; no image entries" - raise SyntaxError(msg) - - self.frame = -1 - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - self.__fp = self.fp - self.seek(0) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - try: - filename = self.images[frame] - except IndexError as e: - msg = "no such frame" - raise EOFError(msg) from e - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self) -> int: - return self.frame - - def close(self) -> None: - self.__fp.close() - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.__fp.close() - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/lib/python3.12/site-packages/PIL/MpegImagePlugin.py b/lib/python3.12/site-packages/PIL/MpegImagePlugin.py deleted file mode 100644 index ad4d3e9..0000000 --- a/lib/python3.12/site-packages/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,88 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPEG file handling -# -# History: -# 95-09-09 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i8 -from ._typing import SupportsRead - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp: SupportsRead[bytes]) -> None: - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self) -> int: - return i8(self.fp.read(1)) - - def peek(self, bits: int) -> int: - while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c - self.bits += 8 - return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 - - def skip(self, bits: int) -> None: - while self.bits < bits: - self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) - self.bits += 8 - self.bits = self.bits - bits - - def read(self, bits: int) -> int: - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"\x00\x00\x01\xb3" - - -## -# Image plugin for MPEG streams. This plugin can identify a stream, -# but it cannot read it. - - -class MpegImageFile(ImageFile.ImageFile): - format = "MPEG" - format_description = "MPEG" - - def _open(self) -> None: - assert self.fp is not None - - s = BitStream(self.fp) - if s.read(32) != 0x1B3: - msg = "not an MPEG file" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile, _accept) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/lib/python3.12/site-packages/PIL/MpoImagePlugin.py b/lib/python3.12/site-packages/PIL/MpoImagePlugin.py deleted file mode 100644 index 71f89a0..0000000 --- a/lib/python3.12/site-packages/PIL/MpoImagePlugin.py +++ /dev/null @@ -1,190 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# MPO file handling -# -# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the -# Camera & Imaging Products Association) -# -# The multi-picture object combines multiple JPEG images (with a modified EXIF -# data format) into a single file. While it can theoretically be used much like -# a GIF animation, it is commonly used to represent 3D photographs and is (as -# of this writing) the most commonly used format by 3D cameras. -# -# History: -# 2014-03-13 Feneric Created -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import os -import struct -from typing import IO, Any, cast - -from . import ( - Image, - ImageFile, - ImageSequence, - JpegImagePlugin, - TiffImagePlugin, -) -from ._binary import o32le - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - JpegImagePlugin._save(im, fp, filename) - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - append_images = im.encoderinfo.get("append_images", []) - if not append_images and not getattr(im, "is_animated", False): - _save(im, fp, filename) - return - - mpf_offset = 28 - offsets: list[int] = [] - for imSequence in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(imSequence): - if not offsets: - # APP2 marker - im_frame.encoderinfo["extra"] = ( - b"\xFF\xE2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 - ) - exif = im_frame.encoderinfo.get("exif") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - im_frame.encoderinfo["exif"] = exif - if exif: - mpf_offset += 4 + len(exif) - - JpegImagePlugin._save(im_frame, fp, filename) - offsets.append(fp.tell()) - else: - im_frame.save(fp, "JPEG") - offsets.append(fp.tell() - offsets[-1]) - - ifd = TiffImagePlugin.ImageFileDirectory_v2() - ifd[0xB000] = b"0100" - ifd[0xB001] = len(offsets) - - mpentries = b"" - data_offset = 0 - for i, size in enumerate(offsets): - if i == 0: - mptype = 0x030000 # Baseline MP Primary Image - else: - mptype = 0x000000 # Undefined - mpentries += struct.pack(" None: - self.fp.seek(0) # prep the fp in order to pass the JPEG test - JpegImagePlugin.JpegImageFile._open(self) - self._after_jpeg_open() - - def _after_jpeg_open(self, mpheader: dict[int, Any] | None = None) -> None: - self.mpinfo = mpheader if mpheader is not None else self._getmp() - if self.mpinfo is None: - msg = "Image appears to be a malformed MPO file" - raise ValueError(msg) - self.n_frames = self.mpinfo[0xB001] - self.__mpoffsets = [ - mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] - ] - self.__mpoffsets[0] = 0 - # Note that the following assertion will only be invalid if something - # gets broken within JpegImagePlugin. - assert self.n_frames == len(self.__mpoffsets) - del self.info["mpoffset"] # no longer needed - self.is_animated = self.n_frames > 1 - self._fp = self.fp # FIXME: hack - self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame - self.__frame = 0 - self.offset = 0 - # for now we can only handle reading and individual frame extraction - self.readonly = 1 - - def load_seek(self, pos: int) -> None: - self._fp.seek(pos) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - self.fp = self._fp - self.offset = self.__mpoffsets[frame] - - original_exif = self.info.get("exif") - if "exif" in self.info: - del self.info["exif"] - - self.fp.seek(self.offset + 2) # skip SOI marker - if not self.fp.read(2): - msg = "No data found for frame" - raise ValueError(msg) - self.fp.seek(self.offset) - JpegImagePlugin.JpegImageFile._open(self) - if self.info.get("exif") != original_exif: - self._reload_exif() - - self.tile = [ - ImageFile._Tile("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1]) - ] - self.__frame = frame - - def tell(self) -> int: - return self.__frame - - @staticmethod - def adopt( - jpeg_instance: JpegImagePlugin.JpegImageFile, - mpheader: dict[int, Any] | None = None, - ) -> MpoImageFile: - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - mpo_instance = cast(MpoImageFile, jpeg_instance) - mpo_instance._after_jpeg_open(mpheader) - return mpo_instance - - -# --------------------------------------------------------------------- -# Registry stuff - -# Note that since MPO shares a factory with JPEG, we do not need to do a -# separate registration for it here. -# Image.register_open(MpoImageFile.format, -# JpegImagePlugin.jpeg_factory, _accept) -Image.register_save(MpoImageFile.format, _save) -Image.register_save_all(MpoImageFile.format, _save_all) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/lib/python3.12/site-packages/PIL/MspImagePlugin.py b/lib/python3.12/site-packages/PIL/MspImagePlugin.py deleted file mode 100644 index f3460a7..0000000 --- a/lib/python3.12/site-packages/PIL/MspImagePlugin.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# The Python Imaging Library. -# -# MSP file handling -# -# This is the format used by the Paint program in Windows 1 and 2. -# -# History: -# 95-09-05 fl Created -# 97-01-03 fl Read/write MSP images -# 17-02-21 es Fixed RLE interpretation -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# Copyright (c) Eric Soroos 2017. -# -# See the README file for information on usage and redistribution. -# -# More info on this format: https://archive.org/details/gg243631 -# Page 313: -# Figure 205. Windows Paint Version 1: "DanM" Format -# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 -# -# See also: https://www.fileformat.info/format/mspaint/egff.htm -from __future__ import annotations - -import io -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] in [b"DanM", b"LinS"] - - -## -# Image plugin for Windows MSP images. This plugin supports both -# uncompressed (Windows 1.0). - - -class MspImageFile(ImageFile.ImageFile): - format = "MSP" - format_description = "Windows Paint" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(32) - if not _accept(s): - msg = "not an MSP file" - raise SyntaxError(msg) - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - msg = "bad MSP checksum" - raise SyntaxError(msg) - - self._mode = "1" - self._size = i16(s, 4), i16(s, 6) - - if s[:4] == b"DanM": - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 32, ("1", 0, 1))] - else: - self.tile = [ImageFile._Tile("MSP", (0, 0) + self.size, 32, None)] - - -class MspDecoder(ImageFile.PyDecoder): - # The algo for the MSP decoder is from - # https://www.fileformat.info/format/mspaint/egff.htm - # cc-by-attribution -- That page references is taken from the - # Encyclopedia of Graphics File Formats and is licensed by - # O'Reilly under the Creative Common/Attribution license - # - # For RLE encoded files, the 32byte header is followed by a scan - # line map, encoded as one 16bit word of encoded byte length per - # line. - # - # NOTE: the encoded length of the line can be 0. This was not - # handled in the previous version of this encoder, and there's no - # mention of how to handle it in the documentation. From the few - # examples I've seen, I've assumed that it is a fill of the - # background color, in this case, white. - # - # - # Pseudocode of the decoder: - # Read a BYTE value as the RunType - # If the RunType value is zero - # Read next byte as the RunCount - # Read the next byte as the RunValue - # Write the RunValue byte RunCount times - # If the RunType value is non-zero - # Use this value as the RunCount - # Read and write the next RunCount bytes literally - # - # e.g.: - # 0x00 03 ff 05 00 01 02 03 04 - # would yield the bytes: - # 0xff ff ff 00 01 02 03 04 - # - # which are then interpreted as a bit packed mode '1' image - - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - msg = "Truncated MSP file in row map" - raise OSError(msg) from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" - raise OSError(msg) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - msg = f"Corrupted MSP file in row {x}" - raise OSError(msg) from e - - self.set_as_raw(img.getvalue(), "1") - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as MSP" - raise OSError(msg) - - # create MSP header - header = [0] * 16 - - header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 - header[2], header[3] = im.size - header[4], header[5] = 1, 1 - header[6], header[7] = 1, 1 - header[8], header[9] = im.size - - checksum = 0 - for h in header: - checksum = checksum ^ h - header[12] = checksum # FIXME: is this the right field? - - # header - for h in header: - fp.write(o16(h)) - - # image body - ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) - - -# -# registry - -Image.register_open(MspImageFile.format, MspImageFile, _accept) -Image.register_save(MspImageFile.format, _save) - -Image.register_extension(MspImageFile.format, ".msp") diff --git a/lib/python3.12/site-packages/PIL/PSDraw.py b/lib/python3.12/site-packages/PIL/PSDraw.py deleted file mode 100644 index 02939d2..0000000 --- a/lib/python3.12/site-packages/PIL/PSDraw.py +++ /dev/null @@ -1,234 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Simple PostScript graphics interface -# -# History: -# 1996-04-20 fl Created -# 1999-01-10 fl Added gsave/grestore to image method -# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) -# -# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import sys -from typing import IO, TYPE_CHECKING - -from . import EpsImagePlugin - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` is assumed. - """ - - def __init__(self, fp: IO[bytes] | None = None) -> None: - if not fp: - fp = sys.stdout.buffer - self.fp = fp - - def begin_document(self, id: str | None = None) -> None: - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont: dict[bytes, int] = {} - - def end_document(self) -> None: - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font: str, size: int) -> None: - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font_bytes = bytes(font, "UTF-8") - if font_bytes not in self.isofont: - # reencode font - self.fp.write( - b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font_bytes, font_bytes) - ) - self.isofont[font_bytes] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font_bytes)) - - def line(self, xy0: tuple[int, int], xy1: tuple[int, int]) -> None: - """ - Draws a line between the two points. Coordinates are given in - PostScript point coordinates (72 points per inch, (0, 0) is the lower - left corner of the page). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box: tuple[int, int, int, int]) -> None: - """ - Draws a rectangle. - - :param box: A tuple of four integers, specifying left, bottom, width and - height. - """ - self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) - - def text(self, xy: tuple[int, int], text: str) -> None: - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text_bytes = bytes(text, "UTF-8") - text_bytes = b"\\(".join(text_bytes.split(b"(")) - text_bytes = b"\\)".join(text_bytes.split(b")")) - self.fp.write(b"%d %d M (%s) S\n" % (xy + (text_bytes,))) - - if TYPE_CHECKING: - from . import Image - - def image( - self, box: tuple[int, int, int, int], im: Image.Image, dpi: int | None = None - ) -> None: - """Draw a PIL image, centered in the given box.""" - # default resolution depends on mode - if not dpi: - if im.mode == "1": - dpi = 200 # fax - else: - dpi = 100 # grayscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = im.size[1] * 72 / dpi - # max allowed size - xmax = float(box[2] - box[0]) - ymax = float(box[3] - box[1]) - if x > xmax: - y = y * xmax / x - x = xmax - if y > ymax: - x = x * ymax / y - y = ymax - dx = (xmax - x) / 2 + box[0] - dy = (ymax - y) / 2 + box[1] - self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) - if (x, y) != im.size: - # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) - sx = x / im.size[0] - sy = y / im.size[1] - self.fp.write(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, "", 0) - self.fp.write(b"\ngrestore\n") - - -# -------------------------------------------------------------------- -# PostScript driver - -# -# EDROFF.PS -- PostScript driver for Edroff 2 -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - - -EDROFF_PS = b"""\ -/S { show } bind def -/P { moveto show } bind def -/M { moveto } bind def -/X { 0 rmoveto } bind def -/Y { 0 exch rmoveto } bind def -/E { findfont - dup maxlength dict begin - { - 1 index /FID ne { def } { pop pop } ifelse - } forall - /Encoding exch def - dup /FontName exch def - currentdict end definefont pop -} bind def -/F { findfont exch scalefont dup setfont - [ exch /setfont cvx ] cvx bind def -} bind def -""" - -# -# VDI.PS -- PostScript driver for VDI meta commands -# -# History: -# 94-01-25 fl: created (edroff 2.04) -# -# Copyright (c) Fredrik Lundh 1994. -# - -VDI_PS = b"""\ -/Vm { moveto } bind def -/Va { newpath arcn stroke } bind def -/Vl { moveto lineto stroke } bind def -/Vc { newpath 0 360 arc closepath } bind def -/Vr { exch dup 0 rlineto - exch dup 0 exch rlineto - exch neg 0 rlineto - 0 exch neg rlineto - setgray fill } bind def -/Tm matrix def -/Ve { Tm currentmatrix pop - translate scale newpath 0 0 .5 0 360 arc closepath - Tm setmatrix -} bind def -/Vf { currentgray exch setgray fill setgray } bind def -""" - -# -# ERROR.PS -- Error handler -# -# History: -# 89-11-21 fl: created (pslist 1.10) -# - -ERROR_PS = b"""\ -/landscape false def -/errorBUF 200 string def -/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def -errordict begin /handleerror { - initmatrix /Courier findfont 10 scalefont setfont - newpath 72 720 moveto $error begin /newerror false def - (PostScript Error) show errorNL errorNL - (Error: ) show - /errorname load errorBUF cvs show errorNL errorNL - (Command: ) show - /command load dup type /stringtype ne { errorBUF cvs } if show - errorNL errorNL - (VMstatus: ) show - vmstatus errorBUF cvs show ( bytes available, ) show - errorBUF cvs show ( bytes used at level ) show - errorBUF cvs show errorNL errorNL - (Operand stargck: ) show errorNL /ostargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall errorNL - (Execution stargck: ) show errorNL /estargck load { - dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL - } forall - end showpage -} def end -""" diff --git a/lib/python3.12/site-packages/PIL/PaletteFile.py b/lib/python3.12/site-packages/PIL/PaletteFile.py deleted file mode 100644 index 81652e5..0000000 --- a/lib/python3.12/site-packages/PIL/PaletteFile.py +++ /dev/null @@ -1,54 +0,0 @@ -# -# Python Imaging Library -# $Id$ -# -# stuff to read simple, teragon-style palette files -# -# History: -# 97-08-23 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from typing import IO - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp: IO[bytes]) -> None: - palette = [o8(i) * 3 for i in range(256)] - - while True: - s = fp.readline() - - if not s: - break - if s[:1] == b"#": - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = [int(x) for x in s.split()] - try: - [i, r, g, b] = v - except ValueError: - [i, r] = v - g = b = r - - if 0 <= i <= 255: - palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(palette) - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/lib/python3.12/site-packages/PIL/PalmImagePlugin.py b/lib/python3.12/site-packages/PIL/PalmImagePlugin.py deleted file mode 100644 index b332453..0000000 --- a/lib/python3.12/site-packages/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,232 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import o8 -from ._binary import o16be as o16b - -# fmt: off -_Palm8BitColormapValues = ( - (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), - (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), - (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), - (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), - (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), - (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), - (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), - (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), - (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), - (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), - (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), - (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), - (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), - (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), - (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), - (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), - (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), - (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), - (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), - (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), - (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), - (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), - (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), - (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), - (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), - (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), - (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), - (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), - (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), - (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), - (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), - (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), - (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), - (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), - (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), - (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), - (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), - (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), - (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), - (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), - (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), - (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), - (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), - (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), - (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), - (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), - (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), - (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), - (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), - (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), - (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), - (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), - (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), - (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), - (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), - (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), - (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), - (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), - (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) -# fmt: on - - -# so build a prototype image to be used for palette resampling -def build_prototype_image() -> Image.Image: - image = Image.new("L", (1, len(_Palm8BitColormapValues))) - image.putdata(list(range(len(_Palm8BitColormapValues)))) - palettedata: tuple[int, ...] = () - for colormapValue in _Palm8BitColormapValues: - palettedata += colormapValue - palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) - image.putpalette(palettedata) - return image - - -Palm8BitColormapImage = build_prototype_image() - -# OK, we now have in Palm8BitColormapImage, -# a "P"-mode image with the right palette -# -# -------------------------------------------------------------------- - -_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} - -_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} - - -# -# -------------------------------------------------------------------- - -## -# (Internal) Image save plugin for the Palm format. - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode == "P": - # we assume this is a color Palm image with the standard colormap, - # unless the "info" dict has a "custom-colormap" field - - rawmode = "P" - bpp = 8 - version = 1 - - elif im.mode == "L": - if im.encoderinfo.get("bpp") in (1, 2, 4): - # this is 8-bit grayscale, so we shift it to get the high-order bits, - # and invert it because - # Palm does grayscale from white (0) to black (1) - bpp = im.encoderinfo["bpp"] - maxval = (1 << bpp) - 1 - shift = 8 - bpp - im = im.point(lambda x: maxval - (x >> shift)) - elif im.info.get("bpp") in (1, 2, 4): - # here we assume that even though the inherent mode is 8-bit grayscale, - # only the lower bpp bits are significant. - # We invert them to match the Palm. - bpp = im.info["bpp"] - maxval = (1 << bpp) - 1 - im = im.point(lambda x: maxval - (x & maxval)) - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # we ignore the palette here - im._mode = "P" - rawmode = f"P;{bpp}" - version = 1 - - elif im.mode == "1": - # monochrome -- write it inverted, as is the Palm standard - rawmode = "1;I" - bpp = 1 - version = 0 - - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # - # make sure image data is available - im.load() - - # write header - - cols = im.size[0] - rows = im.size[1] - - rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 - transparent_index = 0 - compression_type = _COMPRESSION_TYPES["none"] - - flags = 0 - if im.mode == "P" and "custom-colormap" in im.info: - assert im.palette is not None - flags = flags & _FLAGS["custom-colormap"] - colormapsize = 4 * 256 + 2 - colormapmode = im.palette.mode - colormap = im.getdata().getpalette() - else: - colormapsize = 0 - - if "offset" in im.info: - offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 - else: - offset = 0 - - fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) - fp.write(o8(bpp)) - fp.write(o8(version)) - fp.write(o16b(offset)) - fp.write(o8(transparent_index)) - fp.write(o8(compression_type)) - fp.write(o16b(0)) # reserved by Palm - - # now write colormap if necessary - - if colormapsize > 0: - fp.write(o16b(256)) - for i in range(256): - fp.write(o8(i)) - if colormapmode == "RGB": - fp.write( - o8(colormap[3 * i]) - + o8(colormap[3 * i + 1]) - + o8(colormap[3 * i + 2]) - ) - elif colormapmode == "RGBA": - fp.write( - o8(colormap[4 * i]) - + o8(colormap[4 * i + 1]) - + o8(colormap[4 * i + 2]) - ) - - # now convert data to raw form - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))] - ) - - if hasattr(fp, "flush"): - fp.flush() - - -# -# -------------------------------------------------------------------- - -Image.register_save("Palm", _save) - -Image.register_extension("Palm", ".palm") - -Image.register_mime("Palm", "image/palm") diff --git a/lib/python3.12/site-packages/PIL/PcdImagePlugin.py b/lib/python3.12/site-packages/PIL/PcdImagePlugin.py deleted file mode 100644 index e8ea800..0000000 --- a/lib/python3.12/site-packages/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,64 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCD file handling -# -# History: -# 96-05-10 fl Created -# 96-05-27 fl Added draft mode (128x192, 256x384) -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile - -## -# Image plugin for PhotoCD images. This plugin only reads the 768x512 -# image from the file; higher resolutions are encoded in a proprietary -# encoding. - - -class PcdImageFile(ImageFile.ImageFile): - format = "PCD" - format_description = "Kodak PhotoCD" - - def _open(self) -> None: - # rough - assert self.fp is not None - - self.fp.seek(2048) - s = self.fp.read(2048) - - if s[:4] != b"PCD_": - msg = "not a PCD file" - raise SyntaxError(msg) - - orientation = s[1538] & 3 - self.tile_post_rotate = None - if orientation == 1: - self.tile_post_rotate = 90 - elif orientation == 3: - self.tile_post_rotate = -90 - - self._mode = "RGB" - self._size = 768, 512 # FIXME: not correct for rotated images! - self.tile = [ImageFile._Tile("pcd", (0, 0) + self.size, 96 * 2048, None)] - - def load_end(self) -> None: - if self.tile_post_rotate: - # Handle rotated PCDs - self.im = self.im.rotate(self.tile_post_rotate) - self._size = self.im.size - - -# -# registry - -Image.register_open(PcdImageFile.format, PcdImageFile) - -Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/lib/python3.12/site-packages/PIL/PcfFontFile.py b/lib/python3.12/site-packages/PIL/PcfFontFile.py deleted file mode 100644 index 0d1968b..0000000 --- a/lib/python3.12/site-packages/PIL/PcfFontFile.py +++ /dev/null @@ -1,254 +0,0 @@ -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# portable compiled font file parser -# -# history: -# 1997-08-19 fl created -# 2003-09-13 fl fixed loading of unicode fonts -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1997-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from typing import BinaryIO, Callable - -from . import FontFile, Image -from ._binary import i8 -from ._binary import i16be as b16 -from ._binary import i16le as l16 -from ._binary import i32be as b32 -from ._binary import i32le as l32 - -# -------------------------------------------------------------------- -# declarations - -PCF_MAGIC = 0x70636601 # "\x01fcp" - -PCF_PROPERTIES = 1 << 0 -PCF_ACCELERATORS = 1 << 1 -PCF_METRICS = 1 << 2 -PCF_BITMAPS = 1 << 3 -PCF_INK_METRICS = 1 << 4 -PCF_BDF_ENCODINGS = 1 << 5 -PCF_SWIDTHS = 1 << 6 -PCF_GLYPH_NAMES = 1 << 7 -PCF_BDF_ACCELERATORS = 1 << 8 - -BYTES_PER_ROW: list[Callable[[int], int]] = [ - lambda bits: ((bits + 7) >> 3), - lambda bits: ((bits + 15) >> 3) & ~1, - lambda bits: ((bits + 31) >> 3) & ~3, - lambda bits: ((bits + 63) >> 3) & ~7, -] - - -def sz(s: bytes, o: int) -> bytes: - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - msg = "not a PCF file" - raise SyntaxError(msg) - - super().__init__() - - count = l32(fp.read(4)) - self.toc = {} - for i in range(count): - type = l32(fp.read(4)) - self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) - - self.fp = fp - - self.info = self._load_properties() - - metrics = self._load_metrics() - bitmaps = self._load_bitmaps(metrics) - encoding = self._load_encoding() - - # - # create glyph structure - - for ch, ix in enumerate(encoding): - if ix is not None: - ( - xsize, - ysize, - left, - right, - width, - ascent, - descent, - attributes, - ) = metrics[ix] - self.glyph[ch] = ( - (width, 0), - (left, descent - ysize, xsize + left, descent), - (0, 0, xsize, ysize), - bitmaps[ix], - ) - - def _getformat( - self, tag: int - ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: - format, size, offset = self.toc[tag] - - fp = self.fp - fp.seek(offset) - - format = l32(fp.read(4)) - - if format & 4: - i16, i32 = b16, b32 - else: - i16, i32 = l16, l32 - - return fp, format, i16, i32 - - def _load_properties(self) -> dict[bytes, bytes | int]: - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] - - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - property_value: bytes | int = sz(data, v) if s else v - properties[sz(data, k)] = property_value - - return properties - - def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: - # - # font metrics - - metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] - - fp, format, i16, i32 = self._getformat(PCF_METRICS) - - append = metrics.append - - if (format & 0xFF00) == 0x100: - # "compressed" metrics - for i in range(i16(fp.read(2))): - left = i8(fp.read(1)) - 128 - right = i8(fp.read(1)) - 128 - width = i8(fp.read(1)) - 128 - ascent = i8(fp.read(1)) - 128 - descent = i8(fp.read(1)) - 128 - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, 0)) - - else: - # "jumbo" metrics - for i in range(i32(fp.read(4))): - left = i16(fp.read(2)) - right = i16(fp.read(2)) - width = i16(fp.read(2)) - ascent = i16(fp.read(2)) - descent = i16(fp.read(2)) - attributes = i16(fp.read(2)) - xsize = right - left - ysize = ascent + descent - append((xsize, ysize, left, right, width, ascent, descent, attributes)) - - return metrics - - def _load_bitmaps( - self, metrics: list[tuple[int, int, int, int, int, int, int, int]] - ) -> list[Image.Image]: - # - # bitmap data - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - msg = "Wrong number of bitmaps" - raise OSError(msg) - - offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] - - bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmap_sizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - bitmaps = [] - for i in range(nbitmaps): - xsize, ysize = metrics[i][:2] - b, e = offsets[i : i + 2] - bitmaps.append( - Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) - ) - - return bitmaps - - def _load_encoding(self) -> list[int | None]: - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) - first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) - - # map character code to bitmap index - encoding: list[int | None] = [None] * min(256, nencoding) - - encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(first_col, len(encoding)): - try: - encoding_offset = encoding_offsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encoding_offset != 0xFFFF: - encoding[i] = encoding_offset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/lib/python3.12/site-packages/PIL/PcxImagePlugin.py b/lib/python3.12/site-packages/PIL/PcxImagePlugin.py deleted file mode 100644 index 8445d5c..0000000 --- a/lib/python3.12/site-packages/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,229 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PCX file handling -# -# This format was originally used by ZSoft's popular PaintBrush -# program for the IBM PC. It is also supported by many MS-DOS and -# Windows applications, including the Windows PaintBrush program in -# Windows 3. -# -# history: -# 1995-09-01 fl Created -# 1996-05-20 fl Fixed RGB support -# 1997-01-03 fl Fixed 2-bit and 4-bit support -# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) -# 1999-02-07 fl Added write support -# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust -# 2002-07-30 fl Seek from to current position, not beginning of file -# 2003-06-03 fl Extract DPI settings (info["dpi"]) -# -# Copyright (c) 1997-2003 by Secret Labs AB. -# Copyright (c) 1995-2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import logging -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix: bytes) -> bool: - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - format = "PCX" - format_description = "Paintbrush" - - def _open(self) -> None: - # header - assert self.fp is not None - - s = self.fp.read(128) - if not _accept(s): - msg = "not a PCX file" - raise SyntaxError(msg) - - # image - bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 - if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: - msg = "bad PCX image size" - raise SyntaxError(msg) - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_stride, - ) - - self.info["dpi"] = i16(s, 12), i16(s, 14) - - if bits == 1 and planes == 1: - mode = rawmode = "1" - - elif bits == 1 and planes in (2, 4): - mode = "P" - rawmode = "P;%dL" % planes - self.palette = ImagePalette.raw("RGB", s[16:64]) - - elif version == 5 and bits == 8 and planes == 1: - mode = rawmode = "L" - # FIXME: hey, this doesn't work with the incremental loader !!! - self.fp.seek(-769, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear grayscale - for i in range(256): - if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: - mode = rawmode = "P" - break - if mode == "P": - self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) - - elif version == 5 and bits == 8 and planes == 3: - mode = "RGB" - rawmode = "RGB;L" - - else: - msg = "unknown PCX mode" - raise OSError(msg) - - self._mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - bbox = (0, 0) + self.size - logger.debug("size: %sx%s", *self.size) - - self.tile = [ - ImageFile._Tile("pcx", bbox, self.fp.tell(), (rawmode, planes * stride)) - ] - - -# -------------------------------------------------------------------- -# save PCX files - - -SAVE = { - # mode: (version, bits, planes, raw mode) - "1": (2, 1, 1, "1"), - "L": (5, 8, 1, "L"), - "P": (5, 8, 1, "P"), - "RGB": (5, 8, 3, "RGB;L"), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as PCX" - raise ValueError(msg) from e - - # bytes per plane - stride = (im.size[0] * bits + 7) // 8 - # stride should be even - stride += stride % 2 - # Stride needs to be kept in sync with the PcxEncode.c version. - # Ideally it should be passed in in the state, but the bytes value - # gets overwritten. - - logger.debug( - "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", - im.size[0], - bits, - stride, - ) - - # under windows, we could determine the current screen size with - # "Image.core.display_mode()[1]", but I think that's overkill... - - screen = im.size - - dpi = 100, 100 - - # PCX header - fp.write( - o8(10) - + o8(version) - + o8(1) - + o8(bits) - + o16(0) - + o16(0) - + o16(im.size[0] - 1) - + o16(im.size[1] - 1) - + o16(dpi[0]) - + o16(dpi[1]) - + b"\0" * 24 - + b"\xFF" * 24 - + b"\0" - + o8(planes) - + o16(stride) - + o16(1) - + o16(screen[0]) - + o16(screen[1]) - + b"\0" * 54 - ) - - assert fp.tell() == 128 - - ImageFile._save( - im, fp, [ImageFile._Tile("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))] - ) - - if im.mode == "P": - # colour palette - fp.write(o8(12)) - palette = im.im.getpalette("RGB", "RGB") - palette += b"\x00" * (768 - len(palette)) - fp.write(palette) # 768 bytes - elif im.mode == "L": - # grayscale palette - fp.write(o8(12)) - for i in range(256): - fp.write(o8(i) * 3) - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PcxImageFile.format, PcxImageFile, _accept) -Image.register_save(PcxImageFile.format, _save) - -Image.register_extension(PcxImageFile.format, ".pcx") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/lib/python3.12/site-packages/PIL/PdfImagePlugin.py b/lib/python3.12/site-packages/PIL/PdfImagePlugin.py deleted file mode 100644 index e9c20dd..0000000 --- a/lib/python3.12/site-packages/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PDF (Acrobat) file handling -# -# History: -# 1996-07-16 fl Created -# 1997-01-18 fl Fixed header -# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. -# 2004-02-24 fl Fixes for 1 and P images. -# -# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. -# Copyright (c) 1996-1997 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -## -# Image plugin for PDF images (output only). -## -from __future__ import annotations - -import io -import math -import os -import time -from typing import IO, Any - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _write_image( - im: Image.Image, - filename: str | bytes, - existing_pdf: PdfParser.PdfParser, - image_refs: list[PdfParser.IndirectReference], -) -> tuple[PdfParser.IndirectReference, str]: - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - params = None - decode = None - - # - # Get image characteristics - - width, height = im.size - - dict_obj: dict[str, Any] = {"BitsPerComponent": 8} - if im.mode == "1": - if features.check("libtiff"): - decode_filter = "CCITTFaxDecode" - dict_obj["BitsPerComponent"] = 1 - params = PdfParser.PdfArray( - [ - PdfParser.PdfDict( - { - "K": -1, - "BlackIs1": True, - "Columns": width, - "Rows": height, - } - ) - ] - ) - else: - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - decode_filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "LA": - decode_filter = "JPXDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - procset = "ImageB" # grayscale - dict_obj["SMaskInData"] = 1 - elif im.mode == "P": - decode_filter = "ASCIIHexDecode" - palette = im.getpalette() - assert palette is not None - dict_obj["ColorSpace"] = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - len(palette) // 3 - 1, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - - if "transparency" in im.info: - smask = im.convert("LA").getchannel("A") - smask.encoderinfo = {} - - image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] - dict_obj["SMask"] = image_ref - elif im.mode == "RGB": - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "RGBA": - decode_filter = "JPXDecode" - procset = "ImageC" # color images - dict_obj["SMaskInData"] = 1 - elif im.mode == "CMYK": - decode_filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - msg = f"cannot save mode {im.mode}" - raise ValueError(msg) - - # - # image - - op = io.BytesIO() - - if decode_filter == "ASCIIHexDecode": - ImageFile._save(im, op, [ImageFile._Tile("hex", (0, 0) + im.size, 0, im.mode)]) - elif decode_filter == "CCITTFaxDecode": - im.save( - op, - "TIFF", - compression="group4", - # use a single strip - strip_size=math.ceil(width / 8) * height, - ) - elif decode_filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif decode_filter == "JPXDecode": - del dict_obj["BitsPerComponent"] - Image.SAVE["JPEG2000"](im, op, filename) - else: - msg = f"unsupported PDF filter ({decode_filter})" - raise ValueError(msg) - - stream = op.getvalue() - filter: PdfParser.PdfArray | PdfParser.PdfName - if decode_filter == "CCITTFaxDecode": - stream = stream[8:] - filter = PdfParser.PdfArray([PdfParser.PdfName(decode_filter)]) - else: - filter = PdfParser.PdfName(decode_filter) - - image_ref = image_refs.pop(0) - existing_pdf.write_obj( - image_ref, - stream=stream, - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / x_resolution, - Height=height, # * 72.0 / y_resolution, - Filter=filter, - Decode=decode, - DecodeParms=params, - **dict_obj, - ) - - return image_ref, procset - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - is_appending = im.encoderinfo.get("append", False) - filename_str = filename.decode() if isinstance(filename, bytes) else filename - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="w+b") - - dpi = im.encoderinfo.get("dpi") - if dpi: - x_resolution = dpi[0] - y_resolution = dpi[1] - else: - x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": ( - None if is_appending else os.path.splitext(os.path.basename(filename))[0] - ), - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - number_of_pages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_number_of_pages = 1 - if save_all: - im_number_of_pages = getattr(im, "n_frames", 1) - number_of_pages += im_number_of_pages - for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - if im.mode == "P" and "transparency" in im.info: - image_refs.append(existing_pdf.next_object_id(0)) - - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - page_number = 0 - for im_sequence in ims: - im_pages: ImageSequence.Iterator | list[Image.Image] = ( - ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] - ) - for im in im_pages: - image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) - - # - # page - - existing_pdf.write_page( - page_refs[page_number], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_ref), - ), - MediaBox=[ - 0, - 0, - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ], - Contents=contents_refs[page_number], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ) - - existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) - - page_number += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -Image.register_save("PDF", _save) -Image.register_save_all("PDF", _save_all) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/lib/python3.12/site-packages/PIL/PdfParser.py b/lib/python3.12/site-packages/PIL/PdfParser.py deleted file mode 100644 index 7cb2d24..0000000 --- a/lib/python3.12/site-packages/PIL/PdfParser.py +++ /dev/null @@ -1,1073 +0,0 @@ -from __future__ import annotations - -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib -from typing import IO, TYPE_CHECKING, Any, NamedTuple, Union - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s: str) -> bytes: - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02D8", - 0x19: "\u02C7", - 0x1A: "\u02C6", - 0x1B: "\u02D9", - 0x1C: "\u02DD", - 0x1D: "\u02DB", - 0x1E: "\u02DA", - 0x1F: "\u02DC", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203A", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201E", - 0x8D: "\u201C", - 0x8E: "\u201D", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201A", - 0x92: "\u2122", - 0x93: "\uFB01", - 0x94: "\uFB02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017D", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017E", - 0xA0: "\u20AC", -} - - -def decode_text(b: bytes) -> str: - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition: bool, error_message: str) -> None: - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReferenceTuple(NamedTuple): - object_id: int - generation: int - - -class IndirectReference(IndirectReferenceTuple): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} R" - - def __bytes__(self) -> bytes: - return self.__str__().encode("us-ascii") - - def __eq__(self, other: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, IndirectReference) - return other.object_id == self.object_id and other.generation == self.generation - - def __ne__(self, other: object) -> bool: - return not (self == other) - - def __hash__(self) -> int: - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} obj" - - -class XrefTable: - def __init__(self) -> None: - self.existing_entries: dict[int, tuple[int, int]] = ( - {} - ) # object ID => (offset, generation) - self.new_entries: dict[int, tuple[int, int]] = ( - {} - ) # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key: int, value: tuple[int, int]) -> None: - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key: int) -> tuple[int, int]: - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key: int) -> None: - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - msg = f"object ID {key} cannot be deleted because it doesn't exist" - raise IndexError(msg) - - def __contains__(self, key: int) -> bool: - return key in self.existing_entries or key in self.new_entries - - def __len__(self) -> int: - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self) -> set[int]: - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f: IO[bytes]) -> int: - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev: int | None = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = [] - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - name: bytes - - def __init__(self, name: PdfName | bytes | str) -> None: - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self) -> str: - return self.name.decode("us-ascii") - - def __eq__(self, other: object) -> bool: - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self) -> int: - return hash(self.name) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data: bytes) -> PdfName: - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self) -> bytes: - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(list[Any]): - def __bytes__(self) -> bytes: - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -if TYPE_CHECKING: - _DictBase = collections.UserDict[Union[str, bytes], Any] -else: - _DictBase = collections.UserDict - - -class PdfDict(_DictBase): - def __setattr__(self, key: str, value: Any) -> None: - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key: str) -> str | time.struct_time: - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self) -> bytes: - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data: list[int] | bytes) -> None: - self.data = data - - def __bytes__(self) -> bytes: - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary: PdfDict, buf: bytes) -> None: - self.dictionary = dictionary - self.buf = buf - - def decode(self) -> bytes: - try: - filter = self.dictionary[b"Filter"] - except KeyError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary[b"DL"] - except KeyError: - expected_length = self.dictionary[b"Length"] - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - msg = f"stream filter {repr(filter)} unknown/unsupported" - raise NotImplementedError(msg) - - -def pdf_repr(x: Any) -> bytes: - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, (int, float)): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__( - self, - filename: str | None = None, - f: IO[bytes] | None = None, - buf: bytes | bytearray | None = None, - start_offset: int = 0, - mode: str = "rb", - ) -> None: - if buf and f: - msg = "specify buf or f or filename, but not both buf and f" - raise RuntimeError(msg) - self.filename = filename - self.buf: bytes | bytearray | mmap.mmap | None = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects: dict[IndirectReference, Any] = {} - self.root_ref: IndirectReference | None - self.info_ref: IndirectReference | None - self.pages_ref: IndirectReference | None - self.last_xref_section_offset: int | None - if self.buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = PdfDict() - self.pages: list[IndirectReference] = [] - self.orig_pages: list[IndirectReference] = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict: dict[bytes, Any] = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self) -> PdfParser: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def start_writing(self) -> None: - self.close_buf() - self.seek_end() - - def close_buf(self) -> None: - if isinstance(self.buf, mmap.mmap): - self.buf.close() - self.buf = None - - def close(self) -> None: - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self) -> None: - assert self.f is not None - self.f.seek(0, os.SEEK_END) - - def write_header(self) -> None: - assert self.f is not None - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s: str) -> None: - assert self.f is not None - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self) -> IndirectReference: - assert self.f is not None - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self) -> None: - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer( - self, new_root_ref: IndirectReference | None = None - ) -> None: - assert self.f is not None - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict: dict[str | bytes, Any] = { - b"Root": self.root_ref, - b"Size": num_entries, - } - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page( - self, ref: int | IndirectReference | None, *objs: Any, **dict_obj: Any - ) -> IndirectReference: - obj_ref = self.pages[ref] if isinstance(ref, int) else ref - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(obj_ref, *objs, **dict_obj) - - def write_obj( - self, ref: IndirectReference | None, *objs: Any, **dict_obj: Any - ) -> IndirectReference: - assert self.f is not None - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self) -> None: - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f: IO[bytes]) -> bytes | mmap.mmap: - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self) -> None: - assert self.buf is not None - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - check_format_condition( - self.trailer_dict.get(b"Root") is not None, "Root is missing" - ) - self.root_ref = self.trailer_dict[b"Root"] - assert self.root_ref is not None - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition( - self.root.get(b"Pages") is not None, "/Pages missing in Root" - ) - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - assert self.pages_ref is not None - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset: int | None = None) -> IndirectReference: - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"<<(.*>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"<<(.*?>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self) -> None: - assert self.buf is not None - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m is not None, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - assert m is not None - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset: int) -> None: - assert self.buf is not None - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m is not None, "previous trailer not found") - assert m is not None - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"<<") - re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data: bytes) -> dict[bytes, Any]: - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m is not None and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - assert isinstance(key, bytes) - value, value_offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - if value_offset is None: - break - offset = value_offset - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw: bytes, as_text: bool = False) -> str | bytes: - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value( - cls, - data: bytes | bytearray | mmap.mmap, - offset: int, - expect_indirect: IndirectReference | None = None, - max_nesting: int = -1, - ) -> tuple[Any, int | None]: - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, object_offset = cls.get_value( - data, m.end(), max_nesting=max_nesting - 1 - ) - if object_offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, object_offset) - check_format_condition( - m is not None, "indirect object definition end not found" - ) - assert m is not None - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result: dict[Any, Any] = {} - m = cls.re_dict_end.match(data, offset) - current_offset: int | None = offset - while not m: - assert current_offset is not None - key, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - if current_offset is None: - return result, None - value, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - result[key] = value - if current_offset is None: - return result, None - m = cls.re_dict_end.match(data, current_offset) - current_offset = m.end() - m = cls.re_stream_start.match(data, current_offset) - if m: - stream_len = result.get(b"Length") - if stream_len is None or not isinstance(stream_len, int): - msg = f"bad or missing Length in stream dict ({stream_len})" - raise PdfFormatError(msg) - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m is not None, "stream end not found") - assert m is not None - current_offset = m.end() - return PdfStream(PdfDict(result), stream_data), current_offset - return PdfDict(result), current_offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - results = [] - m = cls.re_array_end.match(data, offset) - current_offset = offset - while not m: - assert current_offset is not None - value, current_offset = cls.get_value( - data, current_offset, max_nesting=max_nesting - 1 - ) - results.append(value) - if current_offset is None: - return results, None - m = cls.re_array_end.match(data, current_offset) - return results, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - msg = f"unrecognized object: {repr(data[offset : offset + 32])}" - raise PdfFormatError(msg) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string( - cls, data: bytes | bytearray | mmap.mmap, offset: int - ) -> tuple[bytes, int]: - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - msg = "unfinished literal string" - raise PdfFormatError(msg) - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset: int) -> int: - assert self.buf is not None - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m is not None, "xref section start not found") - assert m is not None - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m is not None, "xref entry not found") - assert m is not None - offset = m.end() - is_free = m.group(3) == b"f" - if not is_free: - generation = int(m.group(2)) - new_entry = (int(m.group(1)), generation) - if i not in self.xref_table: - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref: IndirectReference, max_nesting: int = -1) -> Any: - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - assert self.buf is not None - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree( - self, node: PdfDict | None = None - ) -> list[IndirectReference]: - page_node = node if node is not None else self.page_tree_root - check_format_condition( - page_node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in page_node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/lib/python3.12/site-packages/PIL/PixarImagePlugin.py b/lib/python3.12/site-packages/PIL/PixarImagePlugin.py deleted file mode 100644 index 36f565f..0000000 --- a/lib/python3.12/site-packages/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PIXAR raster support for PIL -# -# history: -# 97-01-29 fl Created -# -# notes: -# This is incomplete; it is based on a few samples created with -# Photoshop 2.5 and 3.0, and a summary description provided by -# Greg Coats . Hopefully, "L" and -# "RGBA" support will be added in future versions. -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"\200\350\000\000" - - -## -# Image plugin for PIXAR raster images. - - -class PixarImageFile(ImageFile.ImageFile): - format = "PIXAR" - format_description = "PIXAR raster image" - - def _open(self) -> None: - # assuming a 4-byte magic label - assert self.fp is not None - - s = self.fp.read(4) - if not _accept(s): - msg = "not a PIXAR file" - raise SyntaxError(msg) - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - if mode == (14, 2): - self._mode = "RGB" - # FIXME: to be continued... - - # create tile descriptor (assuming "dumped") - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1)) - ] - - -# -# -------------------------------------------------------------------- - -Image.register_open(PixarImageFile.format, PixarImageFile, _accept) - -Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/lib/python3.12/site-packages/PIL/PngImagePlugin.py b/lib/python3.12/site-packages/PIL/PngImagePlugin.py deleted file mode 100644 index 4e12272..0000000 --- a/lib/python3.12/site-packages/PIL/PngImagePlugin.py +++ /dev/null @@ -1,1544 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PNG support code -# -# See "PNG (Portable Network Graphics) Specification, version 1.0; -# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). -# -# history: -# 1996-05-06 fl Created (couldn't resist it) -# 1996-12-14 fl Upgraded, added read and verify support (0.2) -# 1996-12-15 fl Separate PNG stream parser -# 1996-12-29 fl Added write support, added getchunks -# 1996-12-30 fl Eliminated circular references in decoder (0.3) -# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) -# 2001-02-08 fl Added transparency support (from Zircon) (0.5) -# 2001-04-16 fl Don't close data source in "open" method (0.6) -# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) -# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) -# 2004-09-20 fl Added PngInfo chunk container -# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) -# 2008-08-13 fl Added tRNS support for RGB images -# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) -# 2009-03-08 fl Added zTXT support (from Lowell Alleman) -# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) -# -# Copyright (c) 1997-2009 by Secret Labs AB -# Copyright (c) 1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import itertools -import logging -import re -import struct -import warnings -import zlib -from collections.abc import Callable -from enum import IntEnum -from typing import IO, TYPE_CHECKING, Any, NamedTuple, NoReturn, cast - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 - -if TYPE_CHECKING: - from . import _imaging - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Grayscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I;16", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Grayscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def _safe_zlib_decompress(s: bytes) -> bytes: - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - msg = "Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK" - raise ValueError(msg) - return plaintext - - -def _crc32(data: bytes, seed: int = 0) -> int: - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp: IO[bytes]) -> None: - self.fp: IO[bytes] | None = fp - self.queue: list[tuple[bytes, int, int]] | None = [] - - def read(self) -> tuple[bytes, int, int]: - """Fetch a new chunk. Returns header information.""" - cid = None - - assert self.fp is not None - if self.queue: - cid, pos, length = self.queue.pop() - self.fp.seek(pos) - else: - s = self.fp.read(8) - cid = s[4:] - pos = self.fp.tell() - length = i32(s) - - if not is_cid(cid): - if not ImageFile.LOAD_TRUNCATED_IMAGES: - msg = f"broken PNG file (chunk {repr(cid)})" - raise SyntaxError(msg) - - return cid, pos, length - - def __enter__(self) -> ChunkStream: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> None: - self.queue = self.fp = None - - def push(self, cid: bytes, pos: int, length: int) -> None: - assert self.queue is not None - self.queue.append((cid, pos, length)) - - def call(self, cid: bytes, pos: int, length: int) -> bytes: - """Call the appropriate chunk handler""" - - logger.debug("STREAM %r %s %s", cid, pos, length) - return getattr(self, f"chunk_{cid.decode('ascii')}")(pos, length) - - def crc(self, cid: bytes, data: bytes) -> None: - """Read and verify checksum""" - - # Skip CRC checks for ancillary chunks if allowed to load truncated - # images - # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - assert self.fp is not None - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - msg = f"broken PNG file (bad header checksum in {repr(cid)})" - raise SyntaxError(msg) - except struct.error as e: - msg = f"broken PNG file (incomplete checksum in {repr(cid)})" - raise SyntaxError(msg) from e - - def crc_skip(self, cid: bytes, data: bytes) -> None: - """Read checksum""" - - assert self.fp is not None - self.fp.read(4) - - def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: - # Simple approach; just calculate checksum for all remaining - # blocks. Must be called directly after open. - - cids = [] - - assert self.fp is not None - while True: - try: - cid, pos, length = self.read() - except struct.error as e: - msg = "truncated PNG file" - raise OSError(msg) from e - - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -class iTXt(str): - """ - Subclass of string to allow iTXt chunks to look like strings while - keeping their extra information - - """ - - lang: str | bytes | None - tkey: str | bytes | None - - @staticmethod - def __new__( - cls, text: str, lang: str | None = None, tkey: str | None = None - ) -> iTXt: - """ - :param cls: the class to use when creating the instance - :param text: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - """ - - self = str.__new__(cls, text) - self.lang = lang - self.tkey = tkey - return self - - -class PngInfo: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self) -> None: - self.chunks: list[tuple[bytes, bytes, bool]] = [] - - def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - self.chunks.append((cid, data, after_idat)) - - def add_itxt( - self, - key: str | bytes, - value: str | bytes, - lang: str | bytes = "", - tkey: str | bytes = "", - zip: bool = False, - ) -> None: - """Appends an iTXt chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key - :param lang: language code - :param tkey: UTF-8 version of the key name - :param zip: compression flag - - """ - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - if not isinstance(value, bytes): - value = value.encode("utf-8", "strict") - if not isinstance(lang, bytes): - lang = lang.encode("utf-8", "strict") - if not isinstance(tkey, bytes): - tkey = tkey.encode("utf-8", "strict") - - if zip: - self.add( - b"iTXt", - key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), - ) - else: - self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) - - def add_text( - self, key: str | bytes, value: str | bytes | iTXt, zip: bool = False - ) -> None: - """Appends a text chunk. - - :param key: latin-1 encodable text key name - :param value: value for this key, text or an - :py:class:`PIL.PngImagePlugin.iTXt` instance - :param zip: compression flag - - """ - if isinstance(value, iTXt): - return self.add_itxt( - key, - value, - value.lang if value.lang is not None else b"", - value.tkey if value.tkey is not None else b"", - zip=zip, - ) - - # The tEXt chunk stores latin-1 text - if not isinstance(value, bytes): - try: - value = value.encode("latin-1", "strict") - except UnicodeError: - return self.add_itxt(key, value, zip=zip) - - if not isinstance(key, bytes): - key = key.encode("latin-1", "strict") - - if zip: - self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) - else: - self.add(b"tEXt", key + b"\0" + value) - - -# -------------------------------------------------------------------- -# PNG image stream (IHDR/IEND) - - -class _RewindState(NamedTuple): - info: dict[str | tuple[int, int], Any] - tile: list[ImageFile._Tile] - seq_num: int | None - - -class PngStream(ChunkStream): - def __init__(self, fp: IO[bytes]) -> None: - super().__init__(fp) - - # local copies of Image attributes - self.im_info: dict[str | tuple[int, int], Any] = {} - self.im_text: dict[str, str | iTXt] = {} - self.im_size = (0, 0) - self.im_mode = "" - self.im_tile: list[ImageFile._Tile] = [] - self.im_palette: tuple[str, bytes] | None = None - self.im_custom_mimetype: str | None = None - self.im_n_frames: int | None = None - self._seq_num: int | None = None - self.rewind_state = _RewindState({}, [], None) - - self.text_memory = 0 - - def check_text_memory(self, chunklen: int) -> None: - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - msg = ( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - raise ValueError(msg) - - def save_rewind(self) -> None: - self.rewind_state = _RewindState( - self.im_info.copy(), - self.im_tile, - self._seq_num, - ) - - def rewind(self) -> None: - self.im_info = self.rewind_state.info.copy() - self.im_tile = self.rewind_state.tile - self._seq_num = self.rewind_state.seq_num - - def chunk_iCCP(self, pos: int, length: int) -> bytes: - # ICC profile - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - i = s.find(b"\0") - logger.debug("iCCP profile name %r", s[:i]) - comp_method = s[i + 1] - logger.debug("Compression method %s", comp_method) - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in iCCP chunk" - raise SyntaxError(msg) - try: - icc_profile = _safe_zlib_decompress(s[i + 2 :]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - icc_profile = None - else: - raise - except zlib.error: - icc_profile = None # FIXME - self.im_info["icc_profile"] = icc_profile - return s - - def chunk_IHDR(self, pos: int, length: int) -> bytes: - # image header - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 13: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated IHDR chunk" - raise ValueError(msg) - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - msg = "unknown filter category" - raise SyntaxError(msg) - return s - - def chunk_IDAT(self, pos: int, length: int) -> NoReturn: - # image data - if "bbox" in self.im_info: - tile = [ImageFile._Tile("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [ImageFile._Tile("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - msg = "image data found" - raise EOFError(msg) - - def chunk_IEND(self, pos: int, length: int) -> NoReturn: - msg = "end of PNG image" - raise EOFError(msg) - - def chunk_PLTE(self, pos: int, length: int) -> bytes: - # palette - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - self.im_palette = "RGB", s - return s - - def chunk_tRNS(self, pos: int, length: int) -> bytes: - # transparency - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if self.im_mode == "P": - if _simple_palette.match(s): - # tRNS contains only one full-transparent entry, - # other entries are full opaque - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - # otherwise, we have a byte string with one alpha value - # for each palette entry - self.im_info["transparency"] = s - elif self.im_mode in ("1", "L", "I;16"): - self.im_info["transparency"] = i16(s) - elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) - return s - - def chunk_gAMA(self, pos: int, length: int) -> bytes: - # gamma setting - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos: int, length: int) -> bytes: - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos: int, length: int) -> bytes: - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 1: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated sRGB chunk" - raise ValueError(msg) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos: int, length: int) -> bytes: - # pixels per unit - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 9: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated pHYs chunk" - raise ValueError(msg) - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos: int, length: int) -> bytes: - # text - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - # fallback for broken tEXt tags - k = s - v = b"" - if k: - k_str = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k_str] = v if k == b"exif" else v_str - self.im_text[k_str] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos: int, length: int) -> bytes: - # compressed text - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - try: - k, v = s.split(b"\0", 1) - except ValueError: - k = s - v = b"" - if v: - comp_method = v[0] - else: - comp_method = 0 - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in zTXt chunk" - raise SyntaxError(msg) - try: - v = _safe_zlib_decompress(v[1:]) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - v = b"" - else: - raise - except zlib.error: - v = b"" - - if k: - k_str = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k_str] = self.im_text[k_str] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_iTXt(self, pos: int, length: int) -> bytes: - # international text - assert self.fp is not None - r = s = ImageFile._safe_read(self.fp, length) - try: - k, r = r.split(b"\0", 1) - except ValueError: - return s - if len(r) < 2: - return s - cf, cm, r = r[0], r[1], r[2:] - try: - lang, tk, v = r.split(b"\0", 2) - except ValueError: - return s - if cf != 0: - if cm == 0: - try: - v = _safe_zlib_decompress(v) - except ValueError: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - else: - raise - except zlib.error: - return s - else: - return s - if k == b"XML:com.adobe.xmp": - self.im_info["xmp"] = v - try: - k_str = k.decode("latin-1", "strict") - lang_str = lang.decode("utf-8", "strict") - tk_str = tk.decode("utf-8", "strict") - v_str = v.decode("utf-8", "strict") - except UnicodeError: - return s - - self.im_info[k_str] = self.im_text[k_str] = iTXt(v_str, lang_str, tk_str) - self.check_text_memory(len(v_str)) - - return s - - def chunk_eXIf(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 8: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated acTL chunk" - raise ValueError(msg) - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos: int, length: int) -> bytes: - assert self.fp is not None - s = ImageFile._safe_read(self.fp, length) - if length < 26: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated fcTL chunk" - raise ValueError(msg) - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - msg = "APNG contains invalid frames" - raise SyntaxError(msg) - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos: int, length: int) -> bytes: - assert self.fp is not None - if length < 4: - if ImageFile.LOAD_TRUNCATED_IMAGES: - s = ImageFile._safe_read(self.fp, length) - return s - msg = "APNG contains truncated fDAT chunk" - raise ValueError(msg) - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == _MAGIC - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - format = "PNG" - format_description = "Portable network graphics" - - def _open(self) -> None: - if not _accept(self.fp.read(8)): - msg = "not a PNG file" - raise SyntaxError(msg) - self._fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] - self.png: PngStream | None = PngStream(self.fp) - - while True: - # - # get next chunk - - cid, pos, length = self.png.read() - - try: - s = self.png.call(cid, pos, length) - except EOFError: - break - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - self.png.crc(cid, s) - - # - # Copy relevant attributes from the PngStream. An alternative - # would be to let the PngStream class modify these attributes - # directly, but that introduces circular references which are - # difficult to break if things go wrong in the decoder... - # (believe me, I've tried ;-) - - self._mode = self.png.im_mode - self._size = self.png.im_size - self.info = self.png.im_info - self._text: dict[str, str | iTXt] | None = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self._fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self) -> dict[str, str | iTXt]: - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - assert self._text is not None - return self._text - - def verify(self) -> None: - """Verify PNG file""" - - if self.fp is None: - msg = "verify must be called directly after open" - raise RuntimeError(msg) - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - assert self.png is not None - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in APNG file" - raise EOFError(msg) from e - - def _seek(self, frame: int, rewind: bool = False) -> None: - assert self.png is not None - - self.dispose: _imaging.ImagingCore | None - dispose_extent = None - if frame == 0: - if rewind: - self._fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self._im = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self._fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self._fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - msg = "No more images in APNG file" - raise EOFError(msg) - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - msg = "APNG missing frame data" - raise SyntaxError(msg) - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - dispose_extent = self.info.get("bbox") - - if not self.tile: - msg = "image not found in APNG frame" - raise EOFError(msg) - if dispose_extent: - self.dispose_extent: tuple[float, float, float, float] = dispose_extent - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - self.dispose = None - if self.dispose_op == Disposal.OP_PREVIOUS: - if self._prev_im: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - def load_prepare(self) -> None: - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes: int) -> bytes: - """internal: read more image data""" - - assert self.png is not None - while self.__idat == 0: - # end of chunk, skip forward to next one - - self.fp.read(4) # CRC - - cid, pos, length = self.png.read() - - if cid not in [b"IDAT", b"DDAT", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - self.__idat = length # empty chunks are allowed - - # read more data from this chunk - if read_bytes <= 0: - read_bytes = self.__idat - else: - read_bytes = min(read_bytes, self.__idat) - - self.__idat = self.__idat - read_bytes - - return self.fp.read(read_bytes) - - def load_end(self) -> None: - """internal: finished reading image data""" - assert self.png is not None - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - try: - ImageFile._safe_read(self.fp, length) - except OSError as e: - if ImageFile.LOAD_TRUNCATED_IMAGES: - break - else: - raise e - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - if self.im.mode == "RGB" and "transparency" in self.info: - mask = updated.convert_transparent( - "RGBA", self.info["transparency"] - ) - else: - if self.im.mode == "P" and "transparency" in self.info: - t = self.info["transparency"] - if isinstance(t, bytes): - updated.putpalettealphas(t) - elif isinstance(t, int): - updated.putpalettealpha(t) - mask = updated.convert("RGBA") - self._prev_im.paste(updated, self.dispose_extent, mask) - self.im = self._prev_im - - def _getexif(self) -> dict[int, Any] | None: - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self) -> Image.Exif: - if "exif" not in self.info: - self.load() - - return super().getexif() - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmode, bit depth and color type - "1": ("1", b"\x01", b"\x00"), - "L;1": ("L;1", b"\x01", b"\x00"), - "L;2": ("L;2", b"\x02", b"\x00"), - "L;4": ("L;4", b"\x04", b"\x00"), - "L": ("L", b"\x08", b"\x00"), - "LA": ("LA", b"\x08", b"\x04"), - "I": ("I;16B", b"\x10", b"\x00"), - "I;16": ("I;16B", b"\x10", b"\x00"), - "I;16B": ("I;16B", b"\x10", b"\x00"), - "P;1": ("P;1", b"\x01", b"\x03"), - "P;2": ("P;2", b"\x02", b"\x03"), - "P;4": ("P;4", b"\x04", b"\x03"), - "P": ("P", b"\x08", b"\x03"), - "RGB": ("RGB", b"\x08", b"\x02"), - "RGBA": ("RGBA", b"\x08", b"\x06"), -} - - -def putchunk(fp: IO[bytes], cid: bytes, *data: bytes) -> None: - """Write a PNG chunk (including CRC field)""" - - byte_data = b"".join(data) - - fp.write(o32(len(byte_data)) + cid) - fp.write(byte_data) - crc = _crc32(byte_data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp: IO[bytes], chunk: Callable[..., None]) -> None: - self.fp = fp - self.chunk = chunk - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp: IO[bytes], chunk: Callable[..., None], seq_num: int) -> None: - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -class _Frame(NamedTuple): - im: Image.Image - bbox: tuple[int, int, int, int] | None - encoderinfo: dict[str, Any] - - -def _write_multiple_frames( - im: Image.Image, - fp: IO[bytes], - chunk: Callable[..., None], - mode: str, - rawmode: str, - default_image: Image.Image | None, - append_images: list[Image.Image], -) -> Image.Image | None: - duration = im.encoderinfo.get("duration") - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(append_images) - else: - chain = itertools.chain([im], append_images) - - im_frames: list[_Frame] = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - if im_frame.mode == mode: - im_frame = im_frame.copy() - else: - im_frame = im_frame.convert(mode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous.encoderinfo.get("disposal") - prev_blend = previous.encoderinfo.get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous.im.copy() - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous.bbox - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2].im - else: - base_im = previous.im - delta = ImageChops.subtract_modulo( - im_frame.convert("RGBA"), base_im.convert("RGBA") - ) - bbox = delta.getbbox(alpha_only=False) - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - and "duration" in encoderinfo - ): - previous.encoderinfo["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append(_Frame(im_frame, bbox, encoderinfo)) - - if len(im_frames) == 1 and not default_image: - return im_frames[0].im - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - if im.mode != mode: - im = im.convert(mode) - ImageFile._save( - im, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + im.size, 0, rawmode)], - ) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data.im - if not frame_data.bbox: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data.bbox - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data.encoderinfo - frame_duration = int(round(encoderinfo.get("duration", 0))) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - cast(IO[bytes], fdat_chunks), - [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - return None - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, - fp: IO[bytes], - filename: str | bytes, - chunk: Callable[..., None] = putchunk, - save_all: bool = False, -) -> None: - # save an image to disk (called by the save method) - - if save_all: - default_image = im.encoderinfo.get( - "default_image", im.info.get("default_image") - ) - modes = set() - sizes = set() - append_images = im.encoderinfo.get("append_images", []) - for im_seq in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(im_seq): - modes.add(im_frame.mode) - sizes.add(im_frame.size) - for mode in ("RGBA", "RGB", "P"): - if mode in modes: - break - else: - mode = modes.pop() - size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) - else: - size = im.size - mode = im.mode - - outmode = mode - if mode == "P": - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - outmode += f";{bits}" - - # encoder options - im.encoderconfig = ( - im.encoderinfo.get("optimize", False), - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - im.encoderinfo.get("dictionary", b""), - ) - - # get the corresponding PNG mode - try: - rawmode, bit_depth, color_type = _OUTMODES[outmode] - except KeyError as e: - msg = f"cannot write mode {mode} as PNG" - raise OSError(msg) from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(size[0]), # 0: size - o32(size[1]), - bit_depth, - color_type, - b"\0", # 10: compression - b"\0", # 11: filter category - b"\0", # 12: interlace flag - ) - - chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] - - icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - # ICC profile - # according to PNG spec, the iCCP chunk contains: - # Profile name 1-79 bytes (character string) - # Null separator 1 byte (null character) - # Compression method 1 byte (0) - # Compressed profile n bytes (zlib with deflate compression) - name = b"ICC Profile" - data = name + b"\0\0" + zlib.compress(icc) - chunk(fp, b"iCCP", data) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 3 - palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] - while len(palette_bytes) < palette_byte_number: - palette_bytes += b"\0" - chunk(fp, b"PLTE", palette_bytes) - - transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) - - if transparency or transparency == 0: - if im.mode == "P": - # limit to actual palette size - alpha_bytes = colors - if isinstance(transparency, bytes): - chunk(fp, b"tRNS", transparency[:alpha_bytes]) - else: - transparency = max(0, min(255, transparency)) - alpha = b"\xFF" * transparency + b"\0" - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - elif im.mode in ("1", "L", "I", "I;16"): - transparency = max(0, min(65535, transparency)) - chunk(fp, b"tRNS", o16(transparency)) - elif im.mode == "RGB": - red, green, blue = transparency - chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) - else: - if "transparency" in im.encoderinfo: - # don't bother with transparency if it's an RGBA - # and it's in the info dict. It's probably just stale. - msg = "cannot use transparency for this mode" - raise OSError(msg) - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - chunk(fp, b"tRNS", alpha[:alpha_bytes]) - - dpi = im.encoderinfo.get("dpi") - if dpi: - chunk( - fp, - b"pHYs", - o32(int(dpi[0] / 0.0254 + 0.5)), - o32(int(dpi[1] / 0.0254 + 0.5)), - b"\x01", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif") - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - single_im: Image.Image | None = im - if save_all: - single_im = _write_multiple_frames( - im, fp, chunk, mode, rawmode, default_image, append_images - ) - if single_im: - ImageFile._save( - single_im, - cast(IO[bytes], _idat(fp, chunk)), - [ImageFile._Tile("zip", (0, 0) + single_im.size, 0, rawmode)], - ) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if after_idat: - chunk(fp, cid, data) - - chunk(fp, b"IEND", b"") - - if hasattr(fp, "flush"): - fp.flush() - - -# -------------------------------------------------------------------- -# PNG chunk converter - - -def getchunks(im: Image.Image, **params: Any) -> list[tuple[bytes, bytes, bytes]]: - """Return a list of PNG chunks representing this image.""" - from io import BytesIO - - chunks = [] - - def append(fp: IO[bytes], cid: bytes, *data: bytes) -> None: - byte_data = b"".join(data) - crc = o32(_crc32(byte_data, _crc32(cid))) - chunks.append((cid, byte_data, crc)) - - fp = BytesIO() - - try: - im.encoderinfo = params - _save(im, fp, "", append) - finally: - del im.encoderinfo - - return chunks - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(PngImageFile.format, PngImageFile, _accept) -Image.register_save(PngImageFile.format, _save) -Image.register_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/lib/python3.12/site-packages/PIL/PpmImagePlugin.py b/lib/python3.12/site-packages/PIL/PpmImagePlugin.py deleted file mode 100644 index 4e779df..0000000 --- a/lib/python3.12/site-packages/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,375 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# PPM support for PIL -# -# History: -# 96-03-24 fl Created -# 98-03-06 fl Write RGBA images (as RGB, that is) -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import math -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P1": "1", - b"P2": "L", - b"P3": "RGB", - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - b"Pf": "F", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix: bytes) -> bool: - return prefix[0:1] == b"P" and prefix[1] in b"0123456fy" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self) -> bytes: - assert self.fp is not None - - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self) -> bytes: - assert self.fp is not None - - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - msg = "Reached EOF while reading header" - raise ValueError(msg) - elif len(token) > 10: - msg = f"Token too long in file header: {token.decode()}" - raise ValueError(msg) - return token - - def _open(self) -> None: - assert self.fp is not None - - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - msg = "not a PPM file" - raise SyntaxError(msg) - self._mode = mode - - if magic_number in (b"P1", b"P4"): - self.custom_mimetype = "image/x-portable-bitmap" - elif magic_number in (b"P2", b"P5"): - self.custom_mimetype = "image/x-portable-graymap" - elif magic_number in (b"P3", b"P6"): - self.custom_mimetype = "image/x-portable-pixmap" - - self._size = int(self._read_token()), int(self._read_token()) - - decoder_name = "raw" - if magic_number in (b"P1", b"P2", b"P3"): - decoder_name = "ppm_plain" - - args: str | tuple[str | int, ...] - if mode == "1": - args = "1;I" - elif mode == "F": - scale = float(self._read_token()) - if scale == 0.0 or not math.isfinite(scale): - msg = "scale must be finite and non-zero" - raise ValueError(msg) - self.info["scale"] = abs(scale) - - rawmode = "F;32F" if scale < 0 else "F;32BF" - args = (rawmode, 0, -1) - else: - maxval = int(self._read_token()) - if not 0 < maxval < 65536: - msg = "maxval must be greater than 0 and less than 65536" - raise ValueError(msg) - if maxval > 255 and mode == "L": - self._mode = "I" - - rawmode = mode - if decoder_name != "ppm_plain": - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - - args = rawmode if decoder_name == "raw" else (rawmode, maxval) - self.tile = [ - ImageFile._Tile(decoder_name, (0, 0) + self.size, self.fp.tell(), args) - ] - - -# -# -------------------------------------------------------------------- - - -class PpmPlainDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _comment_spans: bool - - def _read_block(self) -> bytes: - assert self.fd is not None - - return self.fd.read(ImageFile.SAFEBLOCK) - - def _find_comment_end(self, block: bytes, start: int = 0) -> int: - a = block.find(b"\n", start) - b = block.find(b"\r", start) - return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) - - def _ignore_comments(self, block: bytes) -> bytes: - if self._comment_spans: - # Finish current comment - while block: - comment_end = self._find_comment_end(block) - if comment_end != -1: - # Comment ends in this block - # Delete tail of comment - block = block[comment_end + 1 :] - break - else: - # Comment spans whole block - # So read the next block, looking for the end - block = self._read_block() - - # Search for any further comments - self._comment_spans = False - while True: - comment_start = block.find(b"#") - if comment_start == -1: - # No comment found - break - comment_end = self._find_comment_end(block, comment_start) - if comment_end != -1: - # Comment ends in this block - # Delete comment - block = block[:comment_start] + block[comment_end + 1 :] - else: - # Comment continues to next block(s) - block = block[:comment_start] - self._comment_spans = True - break - return block - - def _decode_bitonal(self) -> bytearray: - """ - This is a separate method because in the plain PBM format, all data tokens are - exactly one byte, so the inter-token whitespace is optional. - """ - data = bytearray() - total_bytes = self.state.xsize * self.state.ysize - - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - # eof - break - - block = self._ignore_comments(block) - - tokens = b"".join(block.split()) - for token in tokens: - if token not in (48, 49): - msg = b"Invalid token for this mode: %s" % bytes([token]) - raise ValueError(msg) - data = (data + tokens)[:total_bytes] - invert = bytes.maketrans(b"01", b"\xFF\x00") - return data.translate(invert) - - def _decode_blocks(self, maxval: int) -> bytearray: - data = bytearray() - max_len = 10 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count - - half_token = b"" - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - if half_token: - block = bytearray(b" ") # flush half_token - else: - # eof - break - - block = self._ignore_comments(block) - - if half_token: - block = half_token + block # stitch half_token to new block - half_token = b"" - - tokens = block.split() - - if block and not block[-1:].isspace(): # block might split token - half_token = tokens.pop() # save half token for later - if len(half_token) > max_len: # prevent buildup of half_token - msg = ( - b"Token too long found in data: %s" % half_token[: max_len + 1] - ) - raise ValueError(msg) - - for token in tokens: - if len(token) > max_len: - msg = b"Token too long found in data: %s" % token[: max_len + 1] - raise ValueError(msg) - value = int(token) - if value < 0: - msg_str = f"Channel value is negative: {value}" - raise ValueError(msg_str) - if value > maxval: - msg_str = f"Channel value too large for this mode: {value}" - raise ValueError(msg_str) - value = round(value / maxval * out_max) - data += o32(value) if self.mode == "I" else o8(value) - if len(data) == total_bytes: # finished! - break - return data - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - self._comment_spans = False - if self.mode == "1": - data = self._decode_bitonal() - rawmode = "1;8" - else: - maxval = self.args[-1] - data = self._decode_blocks(maxval) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - data = bytearray() - maxval = self.args[-1] - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count - while len(data) < dest_length: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode in ("I", "I;16"): - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - elif im.mode == "F": - rawmode, head = "F;32F", b"Pf" - else: - msg = f"cannot write mode {im.mode} as PPM" - raise OSError(msg) - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - elif head == b"Pf": - fp.write(b"-1.0\n") - row_order = -1 if im.mode == "F" else 1 - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))] - ) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) -Image.register_decoder("ppm_plain", PpmPlainDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/lib/python3.12/site-packages/PIL/PsdImagePlugin.py b/lib/python3.12/site-packages/PIL/PsdImagePlugin.py deleted file mode 100644 index 8ff5e39..0000000 --- a/lib/python3.12/site-packages/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,332 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# Adobe PSD 2.5/3.0 file handling -# -# History: -# 1995-09-01 fl Created -# 1997-01-03 fl Read most PSD images -# 1997-01-18 fl Fixed P and CMYK support -# 2001-10-21 fl Added seek/tell support (for layers) -# -# Copyright (c) 1997-2001 by Secret Labs AB. -# Copyright (c) 1995-2001 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -from functools import cached_property -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 -from ._binary import si32be as si32 - -MODES = { - # (photoshop mode, bits) -> (pil mode, required channels) - (0, 1): ("1", 1), - (0, 8): ("L", 1), - (1, 8): ("L", 1), - (2, 8): ("P", 1), - (3, 8): ("RGB", 3), - (4, 8): ("CMYK", 4), - (7, 8): ("L", 1), # FIXME: multilayer - (8, 8): ("L", 1), # duotone - (9, 8): ("LAB", 3), -} - - -# --------------------------------------------------------------------. -# read PSD images - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"8BPS" - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - msg = "not a PSD file" - raise SyntaxError(msg) - - psd_bits = i16(s, 22) - psd_channels = i16(s, 12) - psd_mode = i16(s, 24) - - mode, channels = MODES[(psd_mode, psd_bits)] - - if channels > psd_channels: - msg = "not enough channels" - raise OSError(msg) - if mode == "RGB" and psd_channels == 4: - mode = "RGBA" - channels = 4 - - self._mode = mode - self._size = i32(s, 18), i32(s, 14) - - # - # color mode data - - size = i32(read(4)) - if size: - data = read(size) - if mode == "P" and size == 768: - self.palette = ImagePalette.raw("RGB;L", data) - - # - # image resources - - self.resources = [] - - size = i32(read(4)) - if size: - # load resources - end = self.fp.tell() + size - while self.fp.tell() < end: - read(4) # signature - id = i16(read(2)) - name = read(i8(read(1))) - if not (len(name) & 1): - read(1) # padding - data = read(i32(read(4))) - if len(data) & 1: - read(1) # padding - self.resources.append((id, name, data)) - if id == 1039: # ICC profile - self.info["icc_profile"] = data - - # - # layer and mask information - - self._layers_position = None - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - self._layers_position = self.fp.tell() - self._layers_size = size - self.fp.seek(end) - self._n_frames: int | None = None - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self._fp = self.fp - self.frame = 1 - self._min_frame = 1 - - @cached_property - def layers( - self, - ) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: - layers = [] - if self._layers_position is not None: - self._fp.seek(self._layers_position) - _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) - layers = _layerinfo(_layer_data, self._layers_size) - self._n_frames = len(layers) - return layers - - @property - def n_frames(self) -> int: - if self._n_frames is None: - self._n_frames = len(self.layers) - return self._n_frames - - @property - def is_animated(self) -> bool: - return len(self.layers) > 1 - - def seek(self, layer: int) -> None: - if not self._seek_check(layer): - return - - # seek to given layer (1..max) - try: - _, mode, _, tile = self.layers[layer - 1] - self._mode = mode - self.tile = tile - self.frame = layer - self.fp = self._fp - except IndexError as e: - msg = "no such layer" - raise EOFError(msg) from e - - def tell(self) -> int: - # return layer number (0=image, 1..max=layers) - return self.frame - - -def _layerinfo( - fp: IO[bytes], ct_bytes: int -) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: - # read layerinfo block - layers = [] - - def read(size: int) -> bytes: - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - msg = "Layer block too short for number of layers requested" - raise SyntaxError(msg) - - for _ in range(abs(ct)): - # bounding box - y0 = si32(read(4)) - x0 = si32(read(4)) - y1 = si32(read(4)) - x1 = si32(read(4)) - - # image info - bands = [] - ct_types = i16(read(2)) - if ct_types > 4: - fp.seek(ct_types * 6 + 12, io.SEEK_CUR) - size = i32(read(4)) - fp.seek(size, io.SEEK_CUR) - continue - - for _ in range(ct_types): - type = i16(read(2)) - - if type == 65535: - b = "A" - else: - b = "RGBA"[type] - - bands.append(b) - read(4) # size - - # figure out the image mode - bands.sort() - if bands == ["R"]: - mode = "L" - elif bands == ["B", "G", "R"]: - mode = "RGB" - elif bands == ["A", "B", "G", "R"]: - mode = "RGBA" - else: - mode = "" # unknown - - # skip over blend flags and extra information - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - length = i8(read(1)) - if length: - # Don't know the proper encoding, - # Latin-1 should be a good guess - name = read(length).decode("latin-1", "replace") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - layerinfo = [] - for i, (name, mode, bbox) in enumerate(layers): - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layerinfo.append((name, mode, bbox, tile)) - - return layerinfo - - -def _maketile( - file: IO[bytes], mode: str, bbox: tuple[int, int, int, int], channels: int -) -> list[ImageFile._Tile]: - tiles = [] - read = file.read - - compression = i16(read(2)) - - xsize = bbox[2] - bbox[0] - ysize = bbox[3] - bbox[1] - - offset = file.tell() - - if compression == 0: - # - # raw compression - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tiles.append(ImageFile._Tile("raw", bbox, offset, layer)) - offset = offset + xsize * ysize - - elif compression == 1: - # - # packbits compression - i = 0 - bytecount = read(channels * ysize * 2) - offset = file.tell() - for channel in range(channels): - layer = mode[channel] - if mode == "CMYK": - layer += ";I" - tiles.append(ImageFile._Tile("packbits", bbox, offset, layer)) - for y in range(ysize): - offset = offset + i16(bytecount, i) - i += 2 - - file.seek(offset) - - if offset & 1: - read(1) # padding - - return tiles - - -# -------------------------------------------------------------------- -# registry - - -Image.register_open(PsdImageFile.format, PsdImageFile, _accept) - -Image.register_extension(PsdImageFile.format, ".psd") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/lib/python3.12/site-packages/PIL/QoiImagePlugin.py b/lib/python3.12/site-packages/PIL/QoiImagePlugin.py deleted file mode 100644 index 010d3f9..0000000 --- a/lib/python3.12/site-packages/PIL/QoiImagePlugin.py +++ /dev/null @@ -1,115 +0,0 @@ -# -# The Python Imaging Library. -# -# QOI support for PIL -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"qoif" - - -class QoiImageFile(ImageFile.ImageFile): - format = "QOI" - format_description = "Quite OK Image" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a QOI file" - raise SyntaxError(msg) - - self._size = i32(self.fp.read(4)), i32(self.fp.read(4)) - - channels = self.fp.read(1)[0] - self._mode = "RGB" if channels == 3 else "RGBA" - - self.fp.seek(1, os.SEEK_CUR) # colorspace - self.tile = [ImageFile._Tile("qoi", (0, 0) + self._size, self.fp.tell(), None)] - - -class QoiDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _previous_pixel: bytes | bytearray | None = None - _previously_seen_pixels: dict[int, bytes | bytearray] = {} - - def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: - self._previous_pixel = value - - r, g, b, a = value - hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 - self._previously_seen_pixels[hash_value] = value - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - - self._previously_seen_pixels = {} - self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) - - data = bytearray() - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands - while len(data) < dest_length: - byte = self.fd.read(1)[0] - value: bytes | bytearray - if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB - value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] - elif byte == 0b11111111: # QOI_OP_RGBA - value = self.fd.read(4) - else: - op = byte >> 6 - if op == 0: # QOI_OP_INDEX - op_index = byte & 0b00111111 - value = self._previously_seen_pixels.get( - op_index, bytearray((0, 0, 0, 0)) - ) - elif op == 1 and self._previous_pixel: # QOI_OP_DIFF - value = bytearray( - ( - (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) - % 256, - (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) - % 256, - (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, - self._previous_pixel[3], - ) - ) - elif op == 2 and self._previous_pixel: # QOI_OP_LUMA - second_byte = self.fd.read(1)[0] - diff_green = (byte & 0b00111111) - 32 - diff_red = ((second_byte & 0b11110000) >> 4) - 8 - diff_blue = (second_byte & 0b00001111) - 8 - - value = bytearray( - tuple( - (self._previous_pixel[i] + diff_green + diff) % 256 - for i, diff in enumerate((diff_red, 0, diff_blue)) - ) - ) - value += self._previous_pixel[3:] - elif op == 3 and self._previous_pixel: # QOI_OP_RUN - run_length = (byte & 0b00111111) + 1 - value = self._previous_pixel - if bands == 3: - value = value[:3] - data += value * run_length - continue - self._add_to_previous_pixels(value) - - if bands == 3: - value = value[:3] - data += value - self.set_as_raw(data) - return -1, 0 - - -Image.register_open(QoiImageFile.format, QoiImageFile, _accept) -Image.register_decoder("qoi", QoiDecoder) -Image.register_extension(QoiImageFile.format, ".qoi") diff --git a/lib/python3.12/site-packages/PIL/SgiImagePlugin.py b/lib/python3.12/site-packages/PIL/SgiImagePlugin.py deleted file mode 100644 index 44254b7..0000000 --- a/lib/python3.12/site-packages/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,247 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# -# History: -# 2017-22-07 mb Add RLE decompression -# 2016-16-10 mb Add save method without compression -# 1995-09-10 fl Created -# -# Copyright (c) 2016 by Mickael Bonfill. -# Copyright (c) 2008 by Karsten Hiddemann. -# Copyright (c) 1997 by Secret Labs AB. -# Copyright (c) 1995 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 2 and i16(prefix) == 474 - - -MODES = { - (1, 1, 1): "L", - (1, 2, 1): "L", - (2, 1, 1): "L;16B", - (2, 2, 1): "L;16B", - (1, 3, 3): "RGB", - (2, 3, 3): "RGB;16B", - (1, 3, 4): "RGBA", - (2, 3, 4): "RGBA;16B", -} - - -## -# Image plugin for SGI images. -class SgiImageFile(ImageFile.ImageFile): - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self) -> None: - # HEAD - assert self.fp is not None - - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - msg = "Not an SGI image file" - raise ValueError(msg) - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = s[3] - - # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s, 4) - - # xsize : width - xsize = i16(s, 6) - - # ysize : height - ysize = i16(s, 8) - - # zsize : channels count - zsize = i16(s, 10) - - # layout - layout = bpc, dimension, zsize - - # determine mode from bits/zsize - rawmode = "" - try: - rawmode = MODES[layout] - except KeyError: - pass - - if rawmode == "": - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - self._size = xsize, ysize - self._mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # orientation -1 : scanlines begins at the bottom-left corner - orientation = -1 - - # decoder info - if compression == 0: - pagesize = xsize * ysize * bpc - if bpc == 2: - self.tile = [ - ImageFile._Tile( - "SGI16", - (0, 0) + self.size, - headlen, - (self.mode, 0, orientation), - ) - ] - else: - self.tile = [] - offset = headlen - for layer in self.mode: - self.tile.append( - ImageFile._Tile( - "raw", (0, 0) + self.size, offset, (layer, 0, orientation) - ) - ) - offset += pagesize - elif compression == 1: - self.tile = [ - ImageFile._Tile( - "sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc) - ) - ] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in {"RGB", "RGBA", "L"}: - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - # Get the keyword arguments - info = im.encoderinfo - - # Byte-per-pixel precision, 1 = 8bits per pixel - bpc = info.get("bpc", 1) - - if bpc not in (1, 2): - msg = "Unsupported number of bytes per pixel" - raise ValueError(msg) - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magic_number = 474 - # Run-Length Encoding Compression - Unsupported at this time - rle = 0 - - # Number of dimensions (x,y,z) - dim = 3 - # X Dimension = width / Y Dimension = height - x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 - # Z Dimension: Number of channels - z = len(im.mode) - - if dim in {1, 2}: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - raise ValueError(msg) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - img_name = os.path.splitext(os.path.basename(filename))[0] - if isinstance(img_name, str): - img_name = img_name.encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magic_number)) - fp.write(o8(rle)) - fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) - fp.write(struct.pack(">H", x)) - fp.write(struct.pack(">H", y)) - fp.write(struct.pack(">H", z)) - fp.write(struct.pack(">l", pinmin)) - fp.write(struct.pack(">l", pinmax)) - fp.write(struct.pack("4s", b"")) # dummy - fp.write(struct.pack("79s", img_name)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after img_name - fp.write(struct.pack(">l", colormap)) - fp.write(struct.pack("404s", b"")) # dummy - - rawmode = "L" - if bpc == 2: - rawmode = "L;16B" - - for channel in im.split(): - fp.write(channel.tobytes("raw", rawmode, 0, orientation)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: - assert self.fd is not None - assert self.im is not None - - rawmode, stride, orientation = self.args - pagesize = self.state.xsize * self.state.ysize - zsize = len(self.mode) - self.fd.seek(512) - - for band in range(zsize): - channel = Image.new("L", (self.state.xsize, self.state.ysize)) - channel.frombytes( - self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation - ) - self.im.putband(channel.im, band) - - return -1, 0 - - -# -# registry - - -Image.register_decoder("SGI16", SGI16Decoder) -Image.register_open(SgiImageFile.format, SgiImageFile, _accept) -Image.register_save(SgiImageFile.format, _save) -Image.register_mime(SgiImageFile.format, "image/sgi") - -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py b/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py deleted file mode 100644 index 075073f..0000000 --- a/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,329 +0,0 @@ -# -# The Python Imaging Library. -# -# SPIDER image file handling -# -# History: -# 2004-08-02 Created BB -# 2006-03-02 added save method -# 2006-03-13 added support for stack images -# -# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. -# Copyright (c) 2004 by William Baxter. -# Copyright (c) 2004 by Secret Labs AB. -# Copyright (c) 2004 by Fredrik Lundh. -# - -## -# Image plugin for the Spider image format. This format is used -# by the SPIDER software, in processing image data from electron -# microscopy and tomography. -## - -# -# SpiderImagePlugin.py -# -# The Spider image format is used by SPIDER software, in processing -# image data from electron microscopy and tomography. -# -# Spider home page: -# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html -# -from __future__ import annotations - -import os -import struct -import sys -from typing import IO, TYPE_CHECKING, Any, cast - -from . import Image, ImageFile - - -def isInt(f: Any) -> int: - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, OverflowError): - return 0 - - -iforms = [1, 3, -11, -12, -21, -22] - - -# There is no magic number to identify Spider files, so just check a -# series of header locations to see if they have reasonable values. -# Returns no. of bytes in the header, if it is a valid Spider header, -# otherwise returns 0 - - -def isSpiderHeader(t: tuple[float, ...]) -> int: - h = (99,) + t # add 1 value so can use spider header index start=1 - # header values 1,2,5,12,13,22,23 should be integers - for i in [1, 2, 5, 12, 13, 22, 23]: - if not isInt(h[i]): - return 0 - # check iform - iform = int(h[5]) - if iform not in iforms: - return 0 - # check other header values - labrec = int(h[13]) # no. records in file header - labbyt = int(h[22]) # total no. of bytes in header - lenbyt = int(h[23]) # record length in bytes - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename: str) -> int: - with open(filename, "rb") as fp: - f = fp.read(92) # read 23 * 4 bytes - t = struct.unpack(">23f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - t = struct.unpack("<23f", f) # little-endian - hdrlen = isSpiderHeader(t) - return hdrlen - - -class SpiderImageFile(ImageFile.ImageFile): - format = "SPIDER" - format_description = "Spider 2D image" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - # check header - n = 27 * 4 # read 27 float values - f = self.fp.read(n) - - try: - self.bigendian = 1 - t = struct.unpack(">27f", f) # try big-endian first - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - self.bigendian = 0 - t = struct.unpack("<27f", f) # little-endian - hdrlen = isSpiderHeader(t) - if hdrlen == 0: - msg = "not a valid Spider file" - raise SyntaxError(msg) - except struct.error as e: - msg = "not a valid Spider file" - raise SyntaxError(msg) from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - msg = "not a Spider 2D image" - raise SyntaxError(msg) - - self._size = int(h[12]), int(h[2]) # size in pixels (width, height) - self.istack = int(h[24]) - self.imgnumber = int(h[27]) - - if self.istack == 0 and self.imgnumber == 0: - # stk=0, img=0: a regular 2D image - offset = hdrlen - self._nimages = 1 - elif self.istack > 0 and self.imgnumber == 0: - # stk>0, img=0: Opening the stack for the first time - self.imgbytes = int(h[12]) * int(h[2]) * 4 - self.hdrlen = hdrlen - self._nimages = int(h[26]) - # Point to the first image in the stack - offset = hdrlen * 2 - self.imgnumber = 1 - elif self.istack == 0 and self.imgnumber > 0: - # stk=0, img>0: an image within the stack - offset = hdrlen + self.stkoffset - self.istack = 2 # So Image knows it's still a stack - else: - msg = "inconsistent stack header values" - raise SyntaxError(msg) - - if self.bigendian: - self.rawmode = "F;32BF" - else: - self.rawmode = "F;32F" - self._mode = "F" - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1)) - ] - self._fp = self.fp # FIXME: hack - - @property - def n_frames(self) -> int: - return self._nimages - - @property - def is_animated(self) -> bool: - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self) -> int: - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame: int) -> None: - if self.istack == 0: - msg = "attempt to seek in a non-stack file" - raise EOFError(msg) - if not self._seek_check(frame): - return - self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) - self.fp = self._fp - self.fp.seek(self.stkoffset) - self._open() - - # returns a byte image after rescaling to 0..255 - def convert2byte(self, depth: int = 255) -> Image.Image: - extrema = self.getextrema() - assert isinstance(extrema[0], float) - minimum, maximum = cast(tuple[float, float], extrema) - m: float = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i: i * m + b).convert("L") - - if TYPE_CHECKING: - from . import ImageTk - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self) -> ImageTk.PhotoImage: - from . import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - -# -------------------------------------------------------------------- -# Image series - - -# given a list of filenames, return a list of images -def loadImageSeries(filelist: list[str] | None = None) -> list[SpiderImageFile] | None: - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return None - - imglist = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(f"{img} is not a Spider image file") - continue - im.info["filename"] = img - imglist.append(im) - return imglist - - -# -------------------------------------------------------------------- -# For saving images in Spider format - - -def makeSpiderHeader(im: Image.Image) -> list[bytes]: - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [0.0] * nvalues - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - hdr[5] = 1.0 # iform for 2D image - hdr[12] = float(nsam) # number of pixels per line - hdr[13] = float(labrec) # number of records in file header - hdr[22] = float(labbyt) # total number of bytes in header - hdr[23] = float(lenbyt) # record length in bytes - - # adjust for Fortran indexing - hdr = hdr[1:] - hdr.append(0.0) - # pack binary data into a string - return [struct.pack("f", v) for v in hdr] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode[0] != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - msg = "Error creating Spider header" - raise OSError(msg) - - # write the SPIDER header - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] - ) - - -def _save_spider(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # get the filename extension and register it with Image - filename_ext = os.path.splitext(filename)[1] - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - Image.register_extension(SpiderImageFile.format, ext) - _save(im, fp, filename) - - -# -------------------------------------------------------------------- - - -Image.register_open(SpiderImageFile.format, SpiderImageFile) -Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print(f"image: {im}") - print(f"format: {im.format}") - print(f"size: {im.size}") - print(f"mode: {im.mode}") - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/lib/python3.12/site-packages/PIL/SunImagePlugin.py b/lib/python3.12/site-packages/PIL/SunImagePlugin.py deleted file mode 100644 index 8912379..0000000 --- a/lib/python3.12/site-packages/PIL/SunImagePlugin.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Sun image file handling -# -# History: -# 1995-09-10 fl Created -# 1996-05-28 fl Fixed 32-bit alignment -# 1998-12-29 fl Import ImagePalette module -# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) -# -# Copyright (c) 1997-2001 by Secret Labs AB -# Copyright (c) 1995-1996 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 - - -## -# Image plugin for Sun raster files. - - -class SunImageFile(ImageFile.ImageFile): - format = "SUN" - format_description = "Sun Raster File" - - def _open(self) -> None: - # The Sun Raster file header is 32 bytes in length - # and has the following format: - - # typedef struct _SunRaster - # { - # DWORD MagicNumber; /* Magic (identification) number */ - # DWORD Width; /* Width of image in pixels */ - # DWORD Height; /* Height of image in pixels */ - # DWORD Depth; /* Number of bits per pixel */ - # DWORD Length; /* Size of image data in bytes */ - # DWORD Type; /* Type of raster file */ - # DWORD ColorMapType; /* Type of color map */ - # DWORD ColorMapLength; /* Size of the color map in bytes */ - # } SUNRASTER; - - assert self.fp is not None - - # HEAD - s = self.fp.read(32) - if not _accept(s): - msg = "not an SUN raster file" - raise SyntaxError(msg) - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - if depth == 1: - self._mode, rawmode = "1", "1;I" - elif depth == 4: - self._mode, rawmode = "L", "L;4" - elif depth == 8: - self._mode = rawmode = "L" - elif depth == 24: - if file_type == 3: - self._mode, rawmode = "RGB", "RGB" - else: - self._mode, rawmode = "RGB", "BGR" - elif depth == 32: - if file_type == 3: - self._mode, rawmode = "RGB", "RGBX" - else: - self._mode, rawmode = "RGB", "BGRX" - else: - msg = "Unsupported Mode/Bit Depth" - raise SyntaxError(msg) - - if palette_length: - if palette_length > 1024: - msg = "Unsupported Color Palette Length" - raise SyntaxError(msg) - - if palette_type != 1: - msg = "Unsupported Palette Type" - raise SyntaxError(msg) - - offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) - if self.mode == "L": - self._mode = "P" - rawmode = rawmode.replace("L", "P") - - # 16 bit boundaries on stride - stride = ((self.size[0] * depth + 15) // 16) * 2 - - # file type: Type is the version (or flavor) of the bitmap - # file. The following values are typically found in the Type - # field: - # 0000h Old - # 0001h Standard - # 0002h Byte-encoded - # 0003h RGB format - # 0004h TIFF format - # 0005h IFF format - # FFFFh Experimental - - # Old and standard are the same, except for the length tag. - # byte-encoded is run-length-encoded - # RGB looks similar to standard, but RGB byte order - # TIFF and IFF mean that they were converted from T/IFF - # Experimental means that it's something else. - # (https://www.fileformat.info/format/sunraster/egff.htm) - - if file_type in (0, 1, 3, 4, 5): - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride)) - ] - elif file_type == 2: - self.tile = [ - ImageFile._Tile("sun_rle", (0, 0) + self.size, offset, rawmode) - ] - else: - msg = "Unsupported Sun Raster file type" - raise SyntaxError(msg) - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/lib/python3.12/site-packages/PIL/TarIO.py b/lib/python3.12/site-packages/PIL/TarIO.py deleted file mode 100644 index 779288b..0000000 --- a/lib/python3.12/site-packages/PIL/TarIO.py +++ /dev/null @@ -1,57 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# read files from within a tar file -# -# History: -# 95-06-18 fl Created -# 96-05-28 fl Open files in binary mode -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-96. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO[bytes]): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile: str, file: str) -> None: - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - s = self.fh.read(512) - if len(s) != 512: - msg = "unexpected end of tar file" - raise OSError(msg) - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - msg = "cannot find subfile" - raise OSError(msg) - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) diff --git a/lib/python3.12/site-packages/PIL/TgaImagePlugin.py b/lib/python3.12/site-packages/PIL/TgaImagePlugin.py deleted file mode 100644 index 90d5b5c..0000000 --- a/lib/python3.12/site-packages/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,264 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TGA file handling -# -# History: -# 95-09-01 fl created (reads 24-bit files only) -# 97-01-04 fl support more TGA versions, including compressed images -# 98-07-04 fl fixed orientation and alpha layer bugs -# 98-09-11 fl fixed orientation for runlength decoder -# -# Copyright (c) Secret Labs AB 1997-98. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import warnings -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGRA;15Z", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - format = "TGA" - format_description = "Targa" - - def _open(self) -> None: - # process header - assert self.fp is not None - - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = s[17] - - self._size = i16(s, 12), i16(s, 14) - - # validate header fields - if ( - colormaptype not in (0, 1) - or self.size[0] <= 0 - or self.size[1] <= 0 - or depth not in (1, 8, 16, 24, 32) - ): - msg = "not a TGA file" - raise SyntaxError(msg) - - # image mode - if imagetype in (3, 11): - self._mode = "L" - if depth == 1: - self._mode = "1" # ??? - elif depth == 16: - self._mode = "LA" - elif imagetype in (1, 9): - self._mode = "P" if colormaptype else "L" - elif imagetype in (2, 10): - self._mode = "RGB" if depth == 24 else "RGBA" - else: - msg = "unknown TGA mode" - raise SyntaxError(msg) - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - msg = "unknown TGA orientation" - raise SyntaxError(msg) - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) - ) - self.palette.mode = "RGBA" - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", bytes(3 * start) + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", bytes(4 * start) + self.fp.read(4 * size) - ) - else: - msg = "unknown TGA map depth" - raise SyntaxError(msg) - - # setup tile descriptor - try: - rawmode = MODES[(imagetype & 7, depth)] - if imagetype & 8: - # compressed - self.tile = [ - ImageFile._Tile( - "tga_rle", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, orientation, depth), - ) - ] - else: - self.tile = [ - ImageFile._Tile( - "raw", - (0, 0) + self.size, - self.fp.tell(), - (rawmode, 0, orientation), - ) - ] - except KeyError: - pass # cannot decode - - def load_end(self) -> None: - if self._flip_horizontally: - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TGA" - raise OSError(msg) from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - palette = im.im.getpalette("RGB", "BGR") - colormaplength, colormapentry = len(palette) // 3, 24 - else: - colormaplength, colormapentry = 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(0) # colormapfirst - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(palette) - - if rle: - ImageFile._save( - im, - fp, - [ImageFile._Tile("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))], - ) - else: - ImageFile._save( - im, - fp, - [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))], - ) - - # write targa version 2 footer - fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") - - -# -# -------------------------------------------------------------------- -# Registry - - -Image.register_open(TgaImageFile.format, TgaImageFile) -Image.register_save(TgaImageFile.format, _save) - -Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/lib/python3.12/site-packages/PIL/TiffImagePlugin.py b/lib/python3.12/site-packages/PIL/TiffImagePlugin.py deleted file mode 100644 index ff5a6f9..0000000 --- a/lib/python3.12/site-packages/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,2271 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF file handling -# -# TIFF is a flexible, if somewhat aged, image file format originally -# defined by Aldus. Although TIFF supports a wide variety of pixel -# layouts and compression methods, the name doesn't really stand for -# "thousands of incompatible file formats," it just feels that way. -# -# To read TIFF data from a stream, the stream must be seekable. For -# progressive decoding, make sure to use TIFF files where the tag -# directory is placed first in the file. -# -# History: -# 1995-09-01 fl Created -# 1996-05-04 fl Handle JPEGTABLES tag -# 1996-05-18 fl Fixed COLORMAP support -# 1997-01-05 fl Fixed PREDICTOR support -# 1997-08-27 fl Added support for rational tags (from Perry Stoll) -# 1998-01-10 fl Fixed seek/tell (from Jan Blom) -# 1998-07-15 fl Use private names for internal variables -# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) -# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) -# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) -# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) -# 2001-12-18 fl Added workaround for broken Matrox library -# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) -# 2003-05-19 fl Check FILLORDER tag -# 2003-09-26 fl Added RGBa support -# 2004-02-24 fl Added DPI support; fixed rational write support -# 2005-02-07 fl Added workaround for broken Corel Draw 10 files -# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) -# -# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. -# Copyright (c) 1995-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import itertools -import logging -import math -import os -import struct -import warnings -from collections.abc import Iterator, MutableMapping -from fractions import Fraction -from numbers import Number, Rational -from typing import IO, TYPE_CHECKING, Any, Callable, NoReturn, cast - -from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._deprecate import deprecate -from ._typing import StrOrBytesPath -from ._util import is_path -from .TiffTags import TYPES - -if TYPE_CHECKING: - from ._typing import Buffer, IntegralLike - -logger = logging.getLogger(__name__) - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF = False -STRIP_SIZE = 65536 - -II = b"II" # little-endian (Intel style) -MM = b"MM" # big-endian (Motorola style) - -# -# -------------------------------------------------------------------- -# Read TIFF files - -# a few tag names, just to make the code below a bit more readable -OSUBFILETYPE = 255 -IMAGEWIDTH = 256 -IMAGELENGTH = 257 -BITSPERSAMPLE = 258 -COMPRESSION = 259 -PHOTOMETRIC_INTERPRETATION = 262 -FILLORDER = 266 -IMAGEDESCRIPTION = 270 -STRIPOFFSETS = 273 -SAMPLESPERPIXEL = 277 -ROWSPERSTRIP = 278 -STRIPBYTECOUNTS = 279 -X_RESOLUTION = 282 -Y_RESOLUTION = 283 -PLANAR_CONFIGURATION = 284 -RESOLUTION_UNIT = 296 -TRANSFERFUNCTION = 301 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEWIDTH = 322 -TILELENGTH = 323 -TILEOFFSETS = 324 -TILEBYTECOUNTS = 325 -SUBIFD = 330 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -YCBCRSUBSAMPLING = 530 -REFERENCEBLACKWHITE = 532 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 -JPEGQUALITY = 65537 # pseudo-tag by libtiff - -# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java -IMAGEJ_META_DATA_BYTE_COUNTS = 50838 -IMAGEJ_META_DATA = 50839 - -COMPRESSION_INFO = { - # Compression => pil compression name - 1: "raw", - 2: "tiff_ccitt", - 3: "group3", - 4: "group4", - 5: "tiff_lzw", - 6: "tiff_jpeg", # obsolete - 7: "jpeg", - 8: "tiff_adobe_deflate", - 32771: "tiff_raw_16", # 16-bit padding - 32773: "packbits", - 32809: "tiff_thunderscan", - 32946: "tiff_deflate", - 34676: "tiff_sgilog", - 34677: "tiff_sgilog24", - 34925: "lzma", - 50000: "zstd", - 50001: "webp", -} - -COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} - -OPEN_INFO = { - # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, - # ExtraSamples) => mode, rawmode - (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), - (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), - (II, 1, (1,), 1, (1,), ()): ("1", "1"), - (MM, 1, (1,), 1, (1,), ()): ("1", "1"), - (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), - (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), - (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), - (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), - (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), - (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), - (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), - (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), - (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), - (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), - (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), - (II, 1, (1,), 1, (8,), ()): ("L", "L"), - (MM, 1, (1,), 1, (8,), ()): ("L", "L"), - (II, 1, (2,), 1, (8,), ()): ("L", "L"), - (MM, 1, (2,), 1, (8,), ()): ("L", "L"), - (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), - (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), - (II, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), - (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), - (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), - (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), - (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), - (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), - (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), - (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), - (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), - (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), - (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), - (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), - (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), - (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 - (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), - (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), - (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), - (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), - (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), - (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), - (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), - (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), - (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), - (II, 3, (1,), 1, (8,), ()): ("P", "P"), - (MM, 3, (1,), 1, (8,), ()): ("P", "P"), - (II, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), - (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), - (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), - (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), - (MM, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16B"), - (II, 6, (1,), 1, (8,), ()): ("L", "L"), - (MM, 6, (1,), 1, (8,), ()): ("L", "L"), - # JPEG compressed images handled by LibTiff and auto-converted to RGBX - # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel - (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), - (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), -} - -MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) - -PREFIXES = [ - b"MM\x00\x2A", # Valid TIFF header with big-endian byte order - b"II\x2A\x00", # Valid TIFF header with little-endian byte order - b"MM\x2A\x00", # Invalid TIFF header, assume big-endian - b"II\x00\x2A", # Invalid TIFF header, assume little-endian - b"MM\x00\x2B", # BigTIFF with big-endian byte order - b"II\x2B\x00", # BigTIFF with little-endian byte order -] - -if not getattr(Image.core, "libtiff_support_custom_tags", True): - deprecate("Support for LibTIFF earlier than version 4", 12) - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] in PREFIXES - - -def _limit_rational( - val: float | Fraction | IFDRational, max_val: int -) -> tuple[IntegralLike, IntegralLike]: - inv = abs(float(val)) > 1 - n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) - return n_d[::-1] if inv else n_d - - -def _limit_signed_rational( - val: IFDRational, max_val: int, min_val: int -) -> tuple[IntegralLike, IntegralLike]: - frac = Fraction(val) - n_d: tuple[IntegralLike, IntegralLike] = frac.numerator, frac.denominator - - if min(float(i) for i in n_d) < min_val: - n_d = _limit_rational(val, abs(min_val)) - - n_d_float = tuple(float(i) for i in n_d) - if max(n_d_float) > max_val: - n_d = _limit_rational(n_d_float[0] / n_d_float[1], max_val) - - return n_d - - -## -# Wrapper for TIFF IFDs. - -_load_dispatch = {} -_write_dispatch = {} - - -def _delegate(op: str) -> Any: - def delegate( - self: IFDRational, *args: tuple[float, ...] - ) -> bool | float | Fraction: - return getattr(self._val, op)(*args) - - return delegate - - -class IFDRational(Rational): - """Implements a rational class where 0/0 is a legal value to match - the in the wild use of exif rationals. - - e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used - """ - - """ If the denominator is 0, store this as a float('nan'), otherwise store - as a fractions.Fraction(). Delegate as appropriate - - """ - - __slots__ = ("_numerator", "_denominator", "_val") - - def __init__( - self, value: float | Fraction | IFDRational, denominator: int = 1 - ) -> None: - """ - :param value: either an integer numerator, a - float/rational/other number, or an IFDRational - :param denominator: Optional integer denominator - """ - self._val: Fraction | float - if isinstance(value, IFDRational): - self._numerator = value.numerator - self._denominator = value.denominator - self._val = value._val - return - - if isinstance(value, Fraction): - self._numerator = value.numerator - self._denominator = value.denominator - else: - if TYPE_CHECKING: - self._numerator = cast(IntegralLike, value) - else: - self._numerator = value - self._denominator = denominator - - if denominator == 0: - self._val = float("nan") - elif denominator == 1: - self._val = Fraction(value) - elif int(value) == value: - self._val = Fraction(int(value), denominator) - else: - self._val = Fraction(value / denominator) - - @property - def numerator(self) -> IntegralLike: - return self._numerator - - @property - def denominator(self) -> int: - return self._denominator - - def limit_rational(self, max_denominator: int) -> tuple[IntegralLike, int]: - """ - - :param max_denominator: Integer, the maximum denominator value - :returns: Tuple of (numerator, denominator) - """ - - if self.denominator == 0: - return self.numerator, self.denominator - - assert isinstance(self._val, Fraction) - f = self._val.limit_denominator(max_denominator) - return f.numerator, f.denominator - - def __repr__(self) -> str: - return str(float(self._val)) - - def __hash__(self) -> int: - return self._val.__hash__() - - def __eq__(self, other: object) -> bool: - val = self._val - if isinstance(other, IFDRational): - other = other._val - if isinstance(other, float): - val = float(val) - return val == other - - def __getstate__(self) -> list[float | Fraction | IntegralLike]: - return [self._val, self._numerator, self._denominator] - - def __setstate__(self, state: list[float | Fraction | IntegralLike]) -> None: - IFDRational.__init__(self, 0) - _val, _numerator, _denominator = state - assert isinstance(_val, (float, Fraction)) - self._val = _val - if TYPE_CHECKING: - self._numerator = cast(IntegralLike, _numerator) - else: - self._numerator = _numerator - assert isinstance(_denominator, int) - self._denominator = _denominator - - """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', - 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', - 'mod','rmod', 'pow','rpow', 'pos', 'neg', - 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', - 'ceil', 'floor', 'round'] - print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) - """ - - __add__ = _delegate("__add__") - __radd__ = _delegate("__radd__") - __sub__ = _delegate("__sub__") - __rsub__ = _delegate("__rsub__") - __mul__ = _delegate("__mul__") - __rmul__ = _delegate("__rmul__") - __truediv__ = _delegate("__truediv__") - __rtruediv__ = _delegate("__rtruediv__") - __floordiv__ = _delegate("__floordiv__") - __rfloordiv__ = _delegate("__rfloordiv__") - __mod__ = _delegate("__mod__") - __rmod__ = _delegate("__rmod__") - __pow__ = _delegate("__pow__") - __rpow__ = _delegate("__rpow__") - __pos__ = _delegate("__pos__") - __neg__ = _delegate("__neg__") - __abs__ = _delegate("__abs__") - __trunc__ = _delegate("__trunc__") - __lt__ = _delegate("__lt__") - __gt__ = _delegate("__gt__") - __le__ = _delegate("__le__") - __ge__ = _delegate("__ge__") - __bool__ = _delegate("__bool__") - __ceil__ = _delegate("__ceil__") - __floor__ = _delegate("__floor__") - __round__ = _delegate("__round__") - # Python >= 3.11 - if hasattr(Fraction, "__int__"): - __int__ = _delegate("__int__") - - -_LoaderFunc = Callable[["ImageFileDirectory_v2", bytes, bool], Any] - - -def _register_loader(idx: int, size: int) -> Callable[[_LoaderFunc], _LoaderFunc]: - def decorator(func: _LoaderFunc) -> _LoaderFunc: - from .TiffTags import TYPES - - if func.__name__.startswith("load_"): - TYPES[idx] = func.__name__[5:].replace("_", " ") - _load_dispatch[idx] = size, func # noqa: F821 - return func - - return decorator - - -def _register_writer(idx: int) -> Callable[[Callable[..., Any]], Callable[..., Any]]: - def decorator(func: Callable[..., Any]) -> Callable[..., Any]: - _write_dispatch[idx] = func # noqa: F821 - return func - - return decorator - - -def _register_basic(idx_fmt_name: tuple[int, str, str]) -> None: - from .TiffTags import TYPES - - idx, fmt, name = idx_fmt_name - TYPES[idx] = name - size = struct.calcsize(f"={fmt}") - - def basic_handler( - self: ImageFileDirectory_v2, data: bytes, legacy_api: bool = True - ) -> tuple[Any, ...]: - return self._unpack(f"{len(data) // size}{fmt}", data) - - _load_dispatch[idx] = size, basic_handler # noqa: F821 - _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 - b"".join(self._pack(fmt, value) for value in values) - ) - - -if TYPE_CHECKING: - _IFDv2Base = MutableMapping[int, Any] -else: - _IFDv2Base = MutableMapping - - -class ImageFileDirectory_v2(_IFDv2Base): - """This class represents a TIFF tag directory. To speed things up, we - don't decode tags unless they're asked for. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v2() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - 'Some Data' - - Individual values are returned as the strings or numbers, sequences are - returned as tuples of the values. - - The tiff metadata type of each item is stored in a dictionary of - tag types in - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types - are read from a tiff file, guessed from the type added, or added - manually. - - Data Structures: - - * ``self.tagtype = {}`` - - * Key: numerical TIFF tag number - * Value: integer corresponding to the data type from - :py:data:`.TiffTags.TYPES` - - .. versionadded:: 3.0.0 - - 'Internal' data structures: - - * ``self._tags_v2 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data, as tuple for multiple values - - * ``self._tagdata = {}`` - - * Key: numerical TIFF tag number - * Value: undecoded byte string from file - - * ``self._tags_v1 = {}`` - - * Key: numerical TIFF tag number - * Value: decoded data in the v1 format - - Tags will be found in the private attributes ``self._tagdata``, and in - ``self._tags_v2`` once decoded. - - ``self.legacy_api`` is a value for internal use, and shouldn't be changed - from outside code. In cooperation with - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` - is true, then decoded tags will be populated into both ``_tags_v1`` and - ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF - save routine. Tags should be read from ``_tags_v1`` if - ``legacy_api == true``. - - """ - - _load_dispatch: dict[int, tuple[int, _LoaderFunc]] = {} - _write_dispatch: dict[int, Callable[..., Any]] = {} - - def __init__( - self, - ifh: bytes = b"II\052\0\0\0\0\0", - prefix: bytes | None = None, - group: int | None = None, - ) -> None: - """Initialize an ImageFileDirectory. - - To construct an ImageFileDirectory from a real file, pass the 8-byte - magic header to the constructor. To only set the endianness, pass it - as the 'prefix' keyword argument. - - :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets - endianness. - :param prefix: Override the endianness of the file. - """ - if not _accept(ifh): - msg = f"not a TIFF file (header {repr(ifh)} not valid)" - raise SyntaxError(msg) - self._prefix = prefix if prefix is not None else ifh[:2] - if self._prefix == MM: - self._endian = ">" - elif self._prefix == II: - self._endian = "<" - else: - msg = "not a TIFF IFD" - raise SyntaxError(msg) - self._bigtiff = ifh[2] == 43 - self.group = group - self.tagtype: dict[int, int] = {} - """ Dictionary of tag types """ - self.reset() - self.next = ( - self._unpack("Q", ifh[8:])[0] - if self._bigtiff - else self._unpack("L", ifh[4:])[0] - ) - self._legacy_api = False - - prefix = property(lambda self: self._prefix) - offset = property(lambda self: self._offset) - - @property - def legacy_api(self) -> bool: - return self._legacy_api - - @legacy_api.setter - def legacy_api(self, value: bool) -> NoReturn: - msg = "Not allowing setting of legacy api" - raise Exception(msg) - - def reset(self) -> None: - self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false - self._tags_v2: dict[int, Any] = {} # main tag storage - self._tagdata: dict[int, bytes] = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self._next = None - self._offset: int | None = None - - def __str__(self) -> str: - return str(dict(self)) - - def named(self) -> dict[str, Any]: - """ - :returns: dict of name|key: value - - Returns the complete tag dictionary, with named tags where possible. - """ - return { - TiffTags.lookup(code, self.group).name: value - for code, value in self.items() - } - - def __len__(self) -> int: - return len(set(self._tagdata) | set(self._tags_v2)) - - def __getitem__(self, tag: int) -> Any: - if tag not in self._tags_v2: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - self[tag] = handler(self, data, self.legacy_api) # check type - val = self._tags_v2[tag] - if self.legacy_api and not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - def __contains__(self, tag: object) -> bool: - return tag in self._tags_v2 or tag in self._tagdata - - def __setitem__(self, tag: int, value: Any) -> None: - self._setitem(tag, value, self.legacy_api) - - def _setitem(self, tag: int, value: Any, legacy_api: bool) -> None: - basetypes = (Number, bytes, str) - - info = TiffTags.lookup(tag, self.group) - values = [value] if isinstance(value, basetypes) else value - - if tag not in self.tagtype: - if info.type: - self.tagtype[tag] = info.type - else: - self.tagtype[tag] = TiffTags.UNDEFINED - if all(isinstance(v, IFDRational) for v in values): - self.tagtype[tag] = ( - TiffTags.RATIONAL - if all(v >= 0 for v in values) - else TiffTags.SIGNED_RATIONAL - ) - elif all(isinstance(v, int) for v in values): - if all(0 <= v < 2**16 for v in values): - self.tagtype[tag] = TiffTags.SHORT - elif all(-(2**15) < v < 2**15 for v in values): - self.tagtype[tag] = TiffTags.SIGNED_SHORT - else: - self.tagtype[tag] = ( - TiffTags.LONG - if all(v >= 0 for v in values) - else TiffTags.SIGNED_LONG - ) - elif all(isinstance(v, float) for v in values): - self.tagtype[tag] = TiffTags.DOUBLE - elif all(isinstance(v, str) for v in values): - self.tagtype[tag] = TiffTags.ASCII - elif all(isinstance(v, bytes) for v in values): - self.tagtype[tag] = TiffTags.BYTE - - if self.tagtype[tag] == TiffTags.UNDEFINED: - values = [ - v.encode("ascii", "replace") if isinstance(v, str) else v - for v in values - ] - elif self.tagtype[tag] == TiffTags.RATIONAL: - values = [float(v) if isinstance(v, int) else v for v in values] - - is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) - if not is_ifd: - values = tuple(info.cvt_enum(value) for value in values) - - dest = self._tags_v1 if legacy_api else self._tags_v2 - - # Three branches: - # Spec'd length == 1, Actual length 1, store as element - # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. - # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. - # Don't mess with the legacy api, since it's frozen. - if not is_ifd and ( - (info.length == 1) - or self.tagtype[tag] == TiffTags.BYTE - or (info.length is None and len(values) == 1 and not legacy_api) - ): - # Don't mess with the legacy api, since it's frozen. - if legacy_api and self.tagtype[tag] in [ - TiffTags.RATIONAL, - TiffTags.SIGNED_RATIONAL, - ]: # rationals - values = (values,) - try: - (dest[tag],) = values - except ValueError: - # We've got a builtin tag with 1 expected entry - warnings.warn( - f"Metadata Warning, tag {tag} had too many entries: " - f"{len(values)}, expected 1" - ) - dest[tag] = values[0] - - else: - # Spec'd length > 1 or undefined - # Unspec'd, and length > 1 - dest[tag] = values - - def __delitem__(self, tag: int) -> None: - self._tags_v2.pop(tag, None) - self._tags_v1.pop(tag, None) - self._tagdata.pop(tag, None) - - def __iter__(self) -> Iterator[int]: - return iter(set(self._tagdata) | set(self._tags_v2)) - - def _unpack(self, fmt: str, data: bytes) -> tuple[Any, ...]: - return struct.unpack(self._endian + fmt, data) - - def _pack(self, fmt: str, *values: Any) -> bytes: - return struct.pack(self._endian + fmt, *values) - - list( - map( - _register_basic, - [ - (TiffTags.SHORT, "H", "short"), - (TiffTags.LONG, "L", "long"), - (TiffTags.SIGNED_BYTE, "b", "signed byte"), - (TiffTags.SIGNED_SHORT, "h", "signed short"), - (TiffTags.SIGNED_LONG, "l", "signed long"), - (TiffTags.FLOAT, "f", "float"), - (TiffTags.DOUBLE, "d", "double"), - (TiffTags.IFD, "L", "long"), - (TiffTags.LONG8, "Q", "long8"), - ], - ) - ) - - @_register_loader(1, 1) # Basic type, except for the legacy API. - def load_byte(self, data: bytes, legacy_api: bool = True) -> bytes: - return data - - @_register_writer(1) # Basic type, except for the legacy API. - def write_byte(self, data: bytes | int | IFDRational) -> bytes: - if isinstance(data, IFDRational): - data = int(data) - if isinstance(data, int): - data = bytes((data,)) - return data - - @_register_loader(2, 1) - def load_string(self, data: bytes, legacy_api: bool = True) -> str: - if data.endswith(b"\0"): - data = data[:-1] - return data.decode("latin-1", "replace") - - @_register_writer(2) - def write_string(self, value: str | bytes | int) -> bytes: - # remerge of https://github.com/python-pillow/Pillow/pull/1416 - if isinstance(value, int): - value = str(value) - if not isinstance(value, bytes): - value = value.encode("ascii", "replace") - return value + b"\0" - - @_register_loader(5, 8) - def load_rational( - self, data: bytes, legacy_api: bool = True - ) -> tuple[tuple[int, int] | IFDRational, ...]: - vals = self._unpack(f"{len(data) // 4}L", data) - - def combine(a: int, b: int) -> tuple[int, int] | IFDRational: - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(5) - def write_rational(self, *values: IFDRational) -> bytes: - return b"".join( - self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values - ) - - @_register_loader(7, 1) - def load_undefined(self, data: bytes, legacy_api: bool = True) -> bytes: - return data - - @_register_writer(7) - def write_undefined(self, value: bytes | int | IFDRational) -> bytes: - if isinstance(value, IFDRational): - value = int(value) - if isinstance(value, int): - value = str(value).encode("ascii", "replace") - return value - - @_register_loader(10, 8) - def load_signed_rational( - self, data: bytes, legacy_api: bool = True - ) -> tuple[tuple[int, int] | IFDRational, ...]: - vals = self._unpack(f"{len(data) // 4}l", data) - - def combine(a: int, b: int) -> tuple[int, int] | IFDRational: - return (a, b) if legacy_api else IFDRational(a, b) - - return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) - - @_register_writer(10) - def write_signed_rational(self, *values: IFDRational) -> bytes: - return b"".join( - self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) - for frac in values - ) - - def _ensure_read(self, fp: IO[bytes], size: int) -> bytes: - ret = fp.read(size) - if len(ret) != size: - msg = ( - "Corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(ret)}. " - ) - raise OSError(msg) - return ret - - def load(self, fp: IO[bytes]) -> None: - self.reset() - self._offset = fp.tell() - - try: - tag_count = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("H", self._ensure_read(fp, 2)) - )[0] - for i in range(tag_count): - tag, typ, count, data = ( - self._unpack("HHQ8s", self._ensure_read(fp, 20)) - if self._bigtiff - else self._unpack("HHL4s", self._ensure_read(fp, 12)) - ) - - tagname = TiffTags.lookup(tag, self.group).name - typname = TYPES.get(typ, "unknown") - msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" - - try: - unit_size, handler = self._load_dispatch[typ] - except KeyError: - logger.debug("%s - unsupported type %s", msg, typ) - continue # ignore unsupported type - size = count * unit_size - if size > (8 if self._bigtiff else 4): - here = fp.tell() - (offset,) = self._unpack("Q" if self._bigtiff else "L", data) - msg += f" Tag Location: {here} - Data Location: {offset}" - fp.seek(offset) - data = ImageFile._safe_read(fp, size) - fp.seek(here) - else: - data = data[:size] - - if len(data) != size: - warnings.warn( - "Possibly corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(data)}." - f" Skipping tag {tag}" - ) - logger.debug(msg) - continue - - if not data: - logger.debug(msg) - continue - - self._tagdata[tag] = data - self.tagtype[tag] = typ - - msg += " - value: " + ( - "" % size if size > 32 else repr(data) - ) - logger.debug(msg) - - (self.next,) = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("L", self._ensure_read(fp, 4)) - ) - except OSError as msg: - warnings.warn(str(msg)) - return - - def tobytes(self, offset: int = 0) -> bytes: - # FIXME What about tagdata? - result = self._pack("H", len(self._tags_v2)) - - entries: list[tuple[int, int, int, bytes, bytes]] = [] - offset = offset + len(result) + len(self._tags_v2) * 12 + 4 - stripoffsets = None - - # pass 1: convert tags to binary format - # always write tags in ascending order - for tag, value in sorted(self._tags_v2.items()): - if tag == STRIPOFFSETS: - stripoffsets = len(entries) - typ = self.tagtype[tag] - logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) - is_ifd = typ == TiffTags.LONG and isinstance(value, dict) - if is_ifd: - if self._endian == "<": - ifh = b"II\x2A\x00\x08\x00\x00\x00" - else: - ifh = b"MM\x00\x2A\x00\x00\x00\x08" - ifd = ImageFileDirectory_v2(ifh, group=tag) - values = self._tags_v2[tag] - for ifd_tag, ifd_value in values.items(): - ifd[ifd_tag] = ifd_value - data = ifd.tobytes(offset) - else: - values = value if isinstance(value, tuple) else (value,) - data = self._write_dispatch[typ](self, *values) - - tagname = TiffTags.lookup(tag, self.group).name - typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") - msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" - msg += " - value: " + ( - "" % len(data) if len(data) >= 16 else str(values) - ) - logger.debug(msg) - - # count is sum of lengths for string and arbitrary data - if is_ifd: - count = 1 - elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: - count = len(data) - else: - count = len(values) - # figure out if data fits into the entry - if len(data) <= 4: - entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) - else: - entries.append((tag, typ, count, self._pack("L", offset), data)) - offset += (len(data) + 1) // 2 * 2 # pad to word - - # update strip offset data to point beyond auxiliary data - if stripoffsets is not None: - tag, typ, count, value, data = entries[stripoffsets] - if data: - size, handler = self._load_dispatch[typ] - values = [val + offset for val in handler(self, data, self.legacy_api)] - data = self._write_dispatch[typ](self, *values) - else: - value = self._pack("L", self._unpack("L", value)[0] + offset) - entries[stripoffsets] = tag, typ, count, value, data - - # pass 2: write entries to file - for tag, typ, count, value, data in entries: - logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) - result += self._pack("HHL4s", tag, typ, count, value) - - # -- overwrite here for multi-page -- - result += b"\0\0\0\0" # end of entries - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in entries: - result += data - if len(data) & 1: - result += b"\0" - - return result - - def save(self, fp: IO[bytes]) -> int: - if fp.tell() == 0: # skip TIFF header on subsequent pages - # tiff header -- PIL always starts the first IFD at offset 8 - fp.write(self._prefix + self._pack("HL", 42, 8)) - - offset = fp.tell() - result = self.tobytes(offset) - fp.write(result) - return offset + len(result) - - -ImageFileDirectory_v2._load_dispatch = _load_dispatch -ImageFileDirectory_v2._write_dispatch = _write_dispatch -for idx, name in TYPES.items(): - name = name.replace(" ", "_") - setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) - setattr(ImageFileDirectory_v2, f"write_{name}", _write_dispatch[idx]) -del _load_dispatch, _write_dispatch, idx, name - - -# Legacy ImageFileDirectory support. -class ImageFileDirectory_v1(ImageFileDirectory_v2): - """This class represents the **legacy** interface to a TIFF tag directory. - - Exposes a dictionary interface of the tags in the directory:: - - ifd = ImageFileDirectory_v1() - ifd[key] = 'Some Data' - ifd.tagtype[key] = TiffTags.ASCII - print(ifd[key]) - ('Some Data',) - - Also contains a dictionary of tag types as read from the tiff image file, - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. - - Values are returned as a tuple. - - .. deprecated:: 3.0.0 - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - self._legacy_api = True - - tags = property(lambda self: self._tags_v1) - tagdata = property(lambda self: self._tagdata) - - # defined in ImageFileDirectory_v2 - tagtype: dict[int, int] - """Dictionary of tag types""" - - @classmethod - def from_v2(cls, original: ImageFileDirectory_v2) -> ImageFileDirectory_v1: - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - - """ - - ifd = cls(prefix=original.prefix) - ifd._tagdata = original._tagdata - ifd.tagtype = original.tagtype - ifd.next = original.next # an indicator for multipage tiffs - return ifd - - def to_v2(self) -> ImageFileDirectory_v2: - """Returns an - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - instance with the same data as is contained in the original - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` - instance. - - :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` - - """ - - ifd = ImageFileDirectory_v2(prefix=self.prefix) - ifd._tagdata = dict(self._tagdata) - ifd.tagtype = dict(self.tagtype) - ifd._tags_v2 = dict(self._tags_v2) - return ifd - - def __contains__(self, tag: object) -> bool: - return tag in self._tags_v1 or tag in self._tagdata - - def __len__(self) -> int: - return len(set(self._tagdata) | set(self._tags_v1)) - - def __iter__(self) -> Iterator[int]: - return iter(set(self._tagdata) | set(self._tags_v1)) - - def __setitem__(self, tag: int, value: Any) -> None: - for legacy_api in (False, True): - self._setitem(tag, value, legacy_api) - - def __getitem__(self, tag: int) -> Any: - if tag not in self._tags_v1: # unpack on the fly - data = self._tagdata[tag] - typ = self.tagtype[tag] - size, handler = self._load_dispatch[typ] - for legacy in (False, True): - self._setitem(tag, handler(self, data, legacy), legacy) - val = self._tags_v1[tag] - if not isinstance(val, (tuple, bytes)): - val = (val,) - return val - - -# undone -- switch this pointer -ImageFileDirectory = ImageFileDirectory_v1 - - -## -# Image plugin for TIFF files. - - -class TiffImageFile(ImageFile.ImageFile): - format = "TIFF" - format_description = "Adobe TIFF" - _close_exclusive_fp_after_loading = False - - def __init__( - self, - fp: StrOrBytesPath | IO[bytes], - filename: str | bytes | None = None, - ) -> None: - self.tag_v2: ImageFileDirectory_v2 - """ Image file directory (tag dictionary) """ - - self.tag: ImageFileDirectory_v1 - """ Legacy tag entries """ - - super().__init__(fp, filename) - - def _open(self) -> None: - """Open the first image in a TIFF file""" - - # Header - ifh = self.fp.read(8) - if ifh[2] == 43: - ifh += self.fp.read(8) - - self.tag_v2 = ImageFileDirectory_v2(ifh) - - # setup frame pointers - self.__first = self.__next = self.tag_v2.next - self.__frame = -1 - self._fp = self.fp - self._frame_pos: list[int] = [] - self._n_frames: int | None = None - - logger.debug("*** TiffImageFile._open ***") - logger.debug("- __first: %s", self.__first) - logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) - - # and load the first frame - self._seek(0) - - @property - def n_frames(self) -> int: - current_n_frames = self._n_frames - if current_n_frames is None: - current = self.tell() - self._seek(len(self._frame_pos)) - while self._n_frames is None: - self._seek(self.tell() + 1) - self.seek(current) - assert self._n_frames is not None - return self._n_frames - - def seek(self, frame: int) -> None: - """Select a given frame as current image""" - if not self._seek_check(frame): - return - self._seek(frame) - if self._im is not None and ( - self.im.size != self._tile_size or self.im.mode != self.mode - ): - # The core image will no longer be used - self._im = None - - def _seek(self, frame: int) -> None: - self.fp = self._fp - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - while len(self._frame_pos) <= frame: - if not self.__next: - msg = "no more images in TIFF file" - raise EOFError(msg) - logger.debug( - "Seeking to frame %s, on frame %s, __next %s, location: %s", - frame, - self.__frame, - self.__next, - self.fp.tell(), - ) - if self.__next >= 2**63: - msg = "Unable to seek to frame" - raise ValueError(msg) - self.fp.seek(self.__next) - self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s", self.fp.tell()) - self.tag_v2.load(self.fp) - if self.tag_v2.next in self._frame_pos: - # This IFD has already been processed - # Declare this to be the end of the image - self.__next = 0 - else: - self.__next = self.tag_v2.next - if self.__next == 0: - self._n_frames = frame + 1 - if len(self._frame_pos) == 1: - self.is_animated = self.__next != 0 - self.__frame += 1 - self.fp.seek(self._frame_pos[frame]) - self.tag_v2.load(self.fp) - if XMP in self.tag_v2: - self.info["xmp"] = self.tag_v2[XMP] - elif "xmp" in self.info: - del self.info["xmp"] - self._reload_exif() - # fill the legacy tag/ifd entries - self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) - self.__frame = frame - self._setup() - - def tell(self) -> int: - """Return the current frame number""" - return self.__frame - - def get_photoshop_blocks(self) -> dict[int, dict[str, bytes]]: - """ - Returns a dictionary of Photoshop "Image Resource Blocks". - The keys are the image resource ID. For more information, see - https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 - - :returns: Photoshop "Image Resource Blocks" in a dictionary. - """ - blocks = {} - val = self.tag_v2.get(ExifTags.Base.ImageResources) - if val: - while val[:4] == b"8BIM": - id = i16(val[4:6]) - n = math.ceil((val[6] + 1) / 2) * 2 - size = i32(val[6 + n : 10 + n]) - data = val[10 + n : 10 + n + size] - blocks[id] = {"data": data} - - val = val[math.ceil((10 + n + size) / 2) * 2 :] - return blocks - - def load(self) -> Image.core.PixelAccess | None: - if self.tile and self.use_load_libtiff: - return self._load_libtiff() - return super().load() - - def load_prepare(self) -> None: - if self._im is None: - Image._decompression_bomb_check(self._tile_size) - self.im = Image.core.new(self.mode, self._tile_size) - ImageFile.ImageFile.load_prepare(self) - - def load_end(self) -> None: - # allow closing if we're on the first frame, there's no next - # This is the ImageFile.load path only, libtiff specific below. - if not self.is_animated: - self._close_exclusive_fp_after_loading = True - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - # load IFD data from fp before it is closed - exif = self.getexif() - for key in TiffTags.TAGS_V2_GROUPS: - if key not in exif: - continue - exif.get_ifd(key) - - ImageOps.exif_transpose(self, in_place=True) - if ExifTags.Base.Orientation in self.tag_v2: - del self.tag_v2[ExifTags.Base.Orientation] - - def _load_libtiff(self) -> Image.core.PixelAccess | None: - """Overload method triggered when we detect a compressed tiff - Calls out to libtiff""" - - Image.Image.load(self) - - self.load_prepare() - - if not len(self.tile) == 1: - msg = "Not exactly one tile" - raise OSError(msg) - - # (self._compression, (extents tuple), - # 0, (rawmode, self._compression, fp)) - extents = self.tile[0][1] - args = self.tile[0][3] - - # To be nice on memory footprint, if there's a - # file descriptor, use that instead of reading - # into a string in python. - try: - fp = hasattr(self.fp, "fileno") and self.fp.fileno() - # flush the file descriptor, prevents error on pypy 2.4+ - # should also eliminate the need for fp.tell - # in _seek - if hasattr(self.fp, "flush"): - self.fp.flush() - except OSError: - # io.BytesIO have a fileno, but returns an OSError if - # it doesn't use a file descriptor. - fp = False - - if fp: - assert isinstance(args, tuple) - args_list = list(args) - args_list[2] = fp - args = tuple(args_list) - - decoder = Image._getdecoder(self.mode, "libtiff", args, self.decoderconfig) - try: - decoder.setimage(self.im, extents) - except ValueError as e: - msg = "Couldn't set the image" - raise OSError(msg) from e - - close_self_fp = self._exclusive_fp and not self.is_animated - if hasattr(self.fp, "getvalue"): - # We've got a stringio like thing passed in. Yay for all in memory. - # The decoder needs the entire file in one shot, so there's not - # a lot we can do here other than give it the entire file. - # unless we could do something like get the address of the - # underlying string for stringio. - # - # Rearranging for supporting byteio items, since they have a fileno - # that returns an OSError if there's no underlying fp. Easier to - # deal with here by reordering. - logger.debug("have getvalue. just sending in a string from getvalue") - n, err = decoder.decode(self.fp.getvalue()) - elif fp: - # we've got a actual file on disk, pass in the fp. - logger.debug("have fileno, calling fileno version of the decoder.") - if not close_self_fp: - self.fp.seek(0) - # 4 bytes, otherwise the trace might error out - n, err = decoder.decode(b"fpfp") - else: - # we have something else. - logger.debug("don't have fileno or getvalue. just reading") - self.fp.seek(0) - # UNDONE -- so much for that buffer size thing. - n, err = decoder.decode(self.fp.read()) - - self.tile = [] - self.readonly = 0 - - self.load_end() - - if close_self_fp: - self.fp.close() - self.fp = None # might be shared - - if err < 0: - raise OSError(err) - - return Image.Image.load(self) - - def _setup(self) -> None: - """Setup this image object based on current tags""" - - if 0xBC01 in self.tag_v2: - msg = "Windows Media Photo files not yet supported" - raise OSError(msg) - - # extract relevant tags - self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] - self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) - - # photometric is a required tag, but not everyone is reading - # the specification - photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) - - # old style jpeg compression images most certainly are YCbCr - if self._compression == "tiff_jpeg": - photo = 6 - - fillorder = self.tag_v2.get(FILLORDER, 1) - - logger.debug("*** Summary ***") - logger.debug("- compression: %s", self._compression) - logger.debug("- photometric_interpretation: %s", photo) - logger.debug("- planar_configuration: %s", self._planar_configuration) - logger.debug("- fill_order: %s", fillorder) - logger.debug("- YCbCr subsampling: %s", self.tag_v2.get(YCBCRSUBSAMPLING)) - - # size - xsize = self.tag_v2.get(IMAGEWIDTH) - ysize = self.tag_v2.get(IMAGELENGTH) - if not isinstance(xsize, int) or not isinstance(ysize, int): - msg = "Invalid dimensions" - raise ValueError(msg) - self._tile_size = xsize, ysize - orientation = self.tag_v2.get(ExifTags.Base.Orientation) - if orientation in (5, 6, 7, 8): - self._size = ysize, xsize - else: - self._size = xsize, ysize - - logger.debug("- size: %s", self.size) - - sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) - if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: - # SAMPLEFORMAT is properly per band, so an RGB image will - # be (1,1,1). But, we don't support per band pixel types, - # and anything more than one band is a uint8. So, just - # take the first element. Revisit this if adding support - # for more exotic images. - sample_format = (1,) - - bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) - extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) - if photo in (2, 6, 8): # RGB, YCbCr, LAB - bps_count = 3 - elif photo == 5: # CMYK - bps_count = 4 - else: - bps_count = 1 - bps_count += len(extra_tuple) - bps_actual_count = len(bps_tuple) - samples_per_pixel = self.tag_v2.get( - SAMPLESPERPIXEL, - 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, - ) - - if samples_per_pixel > MAX_SAMPLESPERPIXEL: - # DOS check, samples_per_pixel can be a Long, and we extend the tuple below - logger.error( - "More samples per pixel than can be decoded: %s", samples_per_pixel - ) - msg = "Invalid value for samples per pixel" - raise SyntaxError(msg) - - if samples_per_pixel < bps_actual_count: - # If a file has more values in bps_tuple than expected, - # remove the excess. - bps_tuple = bps_tuple[:samples_per_pixel] - elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: - # If a file has only one value in bps_tuple, when it should have more, - # presume it is the same number of bits for all of the samples. - bps_tuple = bps_tuple * samples_per_pixel - - if len(bps_tuple) != samples_per_pixel: - msg = "unknown data organization" - raise SyntaxError(msg) - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, - photo, - sample_format, - fillorder, - bps_tuple, - extra_tuple, - ) - logger.debug("format key: %s", key) - try: - self._mode, rawmode = OPEN_INFO[key] - except KeyError as e: - logger.debug("- unsupported format") - msg = "unknown pixel mode" - raise SyntaxError(msg) from e - - logger.debug("- raw mode: %s", rawmode) - logger.debug("- pil mode: %s", self.mode) - - self.info["compression"] = self._compression - - xres = self.tag_v2.get(X_RESOLUTION, 1) - yres = self.tag_v2.get(Y_RESOLUTION, 1) - - if xres and yres: - resunit = self.tag_v2.get(RESOLUTION_UNIT) - if resunit == 2: # dots per inch - self.info["dpi"] = (xres, yres) - elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = (xres * 2.54, yres * 2.54) - elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = (xres, yres) - # For backward compatibility, - # we also preserve the old behavior - self.info["resolution"] = xres, yres - else: # No absolute unit of measurement - self.info["resolution"] = xres, yres - - # build tile descriptors - x = y = layer = 0 - self.tile = [] - self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" - if self.use_load_libtiff: - # Decoder expects entire file as one tile. - # There's a buffer size limit in load (64k) - # so large g4 images will fail if we use that - # function. - # - # Setup the one tile for the whole image, then - # use the _load_libtiff function. - - # libtiff handles the fillmode for us, so 1;IR should - # actually be 1;I. Including the R double reverses the - # bits, so stripes of the image are reversed. See - # https://github.com/python-pillow/Pillow/issues/279 - if fillorder == 2: - # Replace fillorder with fillorder=1 - key = key[:3] + (1,) + key[4:] - logger.debug("format key: %s", key) - # this should always work, since all the - # fillorder==2 modes have a corresponding - # fillorder=1 mode - self._mode, rawmode = OPEN_INFO[key] - # libtiff always returns the bytes in native order. - # we're expecting image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if rawmode == "I;16": - rawmode = "I;16N" - if ";16B" in rawmode: - rawmode = rawmode.replace(";16B", ";16N") - if ";16L" in rawmode: - rawmode = rawmode.replace(";16L", ";16N") - - # YCbCr images with new jpeg compression with pixels in one plane - # unpacked straight into RGB values - if ( - photo == 6 - and self._compression == "jpeg" - and self._planar_configuration == 1 - ): - rawmode = "RGB" - - # Offset in the tile tuple is 0, we go from 0,0 to - # w,h, and we only do this once -- eds - a = (rawmode, self._compression, False, self.tag_v2.offset) - self.tile.append(ImageFile._Tile("libtiff", (0, 0, xsize, ysize), 0, a)) - - elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: - # striped image - if STRIPOFFSETS in self.tag_v2: - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = xsize - else: - # tiled image - offsets = self.tag_v2[TILEOFFSETS] - tilewidth = self.tag_v2.get(TILEWIDTH) - h = self.tag_v2.get(TILELENGTH) - if not isinstance(tilewidth, int) or not isinstance(h, int): - msg = "Invalid tile dimensions" - raise ValueError(msg) - w = tilewidth - - for offset in offsets: - if x + w > xsize: - stride = w * sum(bps_tuple) / 8 # bytes per line - else: - stride = 0 - - tile_rawmode = rawmode - if self._planar_configuration == 2: - # each band on it's own layer - tile_rawmode = rawmode[layer] - # adjust stride width accordingly - stride /= bps_count - - args = (tile_rawmode, int(stride), 1) - self.tile.append( - ImageFile._Tile( - self._compression, - (x, y, min(x + w, xsize), min(y + h, ysize)), - offset, - args, - ) - ) - x = x + w - if x >= xsize: - x, y = 0, y + h - if y >= ysize: - x = y = 0 - layer += 1 - else: - logger.debug("- unsupported data organization") - msg = "unknown data organization" - raise SyntaxError(msg) - - # Fix up info. - if ICCPROFILE in self.tag_v2: - self.info["icc_profile"] = self.tag_v2[ICCPROFILE] - - # fixup palette descriptor - - if self.mode in ["P", "PA"]: - palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] - self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) - - -# -# -------------------------------------------------------------------- -# Write TIFF files - -# little endian is default except for image modes with -# explicit big endian byte-order - -SAVE_INFO = { - # mode => rawmode, byteorder, photometrics, - # sampleformat, bitspersample, extra - "1": ("1", II, 1, 1, (1,), None), - "L": ("L", II, 1, 1, (8,), None), - "LA": ("LA", II, 1, 1, (8, 8), 2), - "P": ("P", II, 3, 1, (8,), None), - "PA": ("PA", II, 3, 1, (8, 8), 2), - "I": ("I;32S", II, 1, 2, (32,), None), - "I;16": ("I;16", II, 1, 1, (16,), None), - "I;16S": ("I;16S", II, 1, 2, (16,), None), - "F": ("F;32F", II, 1, 3, (32,), None), - "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), - "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), - "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), - "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), - "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), - "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), - "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), - "I;16B": ("I;16B", MM, 1, 1, (16,), None), - "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), - "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TIFF" - raise OSError(msg) from e - - ifd = ImageFileDirectory_v2(prefix=prefix) - - encoderinfo = im.encoderinfo - encoderconfig = im.encoderconfig - try: - compression = encoderinfo["compression"] - except KeyError: - compression = im.info.get("compression") - if isinstance(compression, int): - # compression value may be from BMP. Ignore it - compression = None - if compression is None: - compression = "raw" - elif compression == "tiff_jpeg": - # OJPEG is obsolete, so use new-style JPEG compression instead - compression = "jpeg" - elif compression == "tiff_deflate": - compression = "tiff_adobe_deflate" - - libtiff = WRITE_LIBTIFF or compression != "raw" - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = 1 - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - if "tiffinfo" in encoderinfo: - info = encoderinfo["tiffinfo"] - elif "exif" in encoderinfo: - info = encoderinfo["exif"] - if isinstance(info, bytes): - exif = Image.Exif() - exif.load(info) - info = exif - else: - info = {} - logger.debug("Tiffinfo Keys: %s", list(info)) - if isinstance(info, ImageFileDirectory_v1): - info = info.to_v2() - for key in info: - if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: - ifd[key] = info.get_ifd(key) - else: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except Exception: - pass # might not be an IFD. Might not have populated type - - legacy_ifd = {} - if hasattr(im, "tag"): - legacy_ifd = im.tag.to_v2() - - supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} - for tag in ( - # IFD offset that may not be correct in the saved image - EXIFIFD, - # Determined by the image format and should not be copied from legacy_ifd. - SAMPLEFORMAT, - ): - if tag in supplied_tags: - del supplied_tags[tag] - - # additions written by Greg Couch, gregc@cgl.ucsf.edu - # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com - if hasattr(im, "tag_v2"): - # preserve tags from original TIFF image file - for key in ( - RESOLUTION_UNIT, - X_RESOLUTION, - Y_RESOLUTION, - IPTC_NAA_CHUNK, - PHOTOSHOP_CHUNK, - XMP, - ): - if key in im.tag_v2: - if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( - TiffTags.BYTE, - TiffTags.UNDEFINED, - ): - del supplied_tags[key] - else: - ifd[key] = im.tag_v2[key] - ifd.tagtype[key] = im.tag_v2.tagtype[key] - - # preserve ICC profile (should also work when saving other formats - # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - ifd[ICCPROFILE] = icc - - for key, name in [ - (IMAGEDESCRIPTION, "description"), - (X_RESOLUTION, "resolution"), - (Y_RESOLUTION, "resolution"), - (X_RESOLUTION, "x_resolution"), - (Y_RESOLUTION, "y_resolution"), - (RESOLUTION_UNIT, "resolution_unit"), - (SOFTWARE, "software"), - (DATE_TIME, "date_time"), - (ARTIST, "artist"), - (COPYRIGHT, "copyright"), - ]: - if name in encoderinfo: - ifd[key] = encoderinfo[name] - - dpi = encoderinfo.get("dpi") - if dpi: - ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = dpi[0] - ifd[Y_RESOLUTION] = dpi[1] - - if bits != (1,): - ifd[BITSPERSAMPLE] = bits - if len(bits) != 1: - ifd[SAMPLESPERPIXEL] = len(bits) - if extra is not None: - ifd[EXTRASAMPLES] = extra - if format != 1: - ifd[SAMPLEFORMAT] = format - - if PHOTOMETRIC_INTERPRETATION not in ifd: - ifd[PHOTOMETRIC_INTERPRETATION] = photo - elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: - if im.mode == "1": - inverted_im = im.copy() - px = inverted_im.load() - if px is not None: - for y in range(inverted_im.height): - for x in range(inverted_im.width): - px[x, y] = 0 if px[x, y] == 255 else 255 - im = inverted_im - else: - im = ImageOps.invert(im) - - if im.mode in ["P", "PA"]: - lut = im.im.getpalette("RGB", "RGB;L") - colormap = [] - colors = len(lut) // 3 - for i in range(3): - colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] - colormap += [0] * (256 - colors) - ifd[COLORMAP] = colormap - # data orientation - w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] - stride = len(bits) * ((w * bits[0] + 7) // 8) - if ROWSPERSTRIP not in ifd: - # aim for given strip size (64 KB by default) when using libtiff writer - if libtiff: - im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) - rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) - # JPEG encoder expects multiple of 8 rows - if compression == "jpeg": - rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) - else: - rows_per_strip = h - if rows_per_strip == 0: - rows_per_strip = 1 - ifd[ROWSPERSTRIP] = rows_per_strip - strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] - strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] - if strip_byte_counts >= 2**16: - ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG - ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( - stride * h - strip_byte_counts * (strips_per_image - 1), - ) - ifd[STRIPOFFSETS] = tuple( - range(0, strip_byte_counts * strips_per_image, strip_byte_counts) - ) # this is adjusted by IFD writer - # no compression by default: - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) - - if im.mode == "YCbCr": - for tag, default_value in { - YCBCRSUBSAMPLING: (1, 1), - REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), - }.items(): - ifd.setdefault(tag, default_value) - - blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] - if libtiff: - if "quality" in encoderinfo: - quality = encoderinfo["quality"] - if not isinstance(quality, int) or quality < 0 or quality > 100: - msg = "Invalid quality setting" - raise ValueError(msg) - if compression != "jpeg": - msg = "quality setting only supported for 'jpeg' compression" - raise ValueError(msg) - ifd[JPEGQUALITY] = quality - - logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s", sorted(ifd.items())) - _fp = 0 - if hasattr(fp, "fileno"): - try: - fp.seek(0) - _fp = fp.fileno() - except io.UnsupportedOperation: - pass - - # optional types for non core tags - types = {} - # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library - # based on the data in the strip. - # OSUBFILETYPE is deprecated. - # The other tags expect arrays with a certain length (fixed or depending on - # BITSPERSAMPLE, etc), passing arrays with a different length will result in - # segfaults. Block these tags until we add extra validation. - # SUBIFD may also cause a segfault. - blocklist += [ - OSUBFILETYPE, - REFERENCEBLACKWHITE, - STRIPBYTECOUNTS, - STRIPOFFSETS, - TRANSFERFUNCTION, - SUBIFD, - ] - - # bits per sample is a single short in the tiff directory, not a list. - atts: dict[int, Any] = {BITSPERSAMPLE: bits[0]} - # Merge the ones that we have with (optional) more bits from - # the original file, e.g x,y resolution so that we can - # save(load('')) == original file. - for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): - # Libtiff can only process certain core items without adding - # them to the custom dictionary. - # Custom items are supported for int, float, unicode, string and byte - # values. Other types and tuples require a tagtype. - if tag not in TiffTags.LIBTIFF_CORE: - if not getattr(Image.core, "libtiff_support_custom_tags", False): - continue - - if tag in ifd.tagtype: - types[tag] = ifd.tagtype[tag] - elif not (isinstance(value, (int, float, str, bytes))): - continue - else: - type = TiffTags.lookup(tag).type - if type: - types[tag] = type - if tag not in atts and tag not in blocklist: - if isinstance(value, str): - atts[tag] = value.encode("ascii", "replace") + b"\0" - elif isinstance(value, IFDRational): - atts[tag] = float(value) - else: - atts[tag] = value - - if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: - atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - - logger.debug("Converted items: %s", sorted(atts.items())) - - # libtiff always expects the bytes in native order. - # we're storing image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if im.mode in ("I;16B", "I;16"): - rawmode = "I;16N" - - # Pass tags as sorted list so that the tags are set in a fixed order. - # This is required by libtiff for some tags. For example, the JPEGQUALITY - # pseudo tag requires that the COMPRESS tag was already set. - tags = list(atts.items()) - tags.sort() - a = (rawmode, compression, _fp, filename, tags, types) - encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) - encoder.setimage(im.im, (0, 0) + im.size) - while True: - errcode, data = encoder.encode(ImageFile.MAXBLOCK)[1:] - if not _fp: - fp.write(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} when writing image file" - raise OSError(msg) - - else: - for tag in blocklist: - del ifd[tag] - offset = ifd.save(fp) - - ImageFile._save( - im, - fp, - [ImageFile._Tile("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))], - ) - - # -- helper for multi-page save -- - if "_debug_multipage" in encoderinfo: - # just to access o32 and o16 (using correct byte order) - setattr(im, "_debug_multipage", ifd) - - -class AppendingTiffWriter(io.BytesIO): - fieldSizes = [ - 0, # None - 1, # byte - 1, # ascii - 2, # short - 4, # long - 8, # rational - 1, # sbyte - 1, # undefined - 2, # sshort - 4, # slong - 8, # srational - 4, # float - 8, # double - 4, # ifd - 2, # unicode - 4, # complex - 8, # long8 - ] - - Tags = { - 273, # StripOffsets - 288, # FreeOffsets - 324, # TileOffsets - 519, # JPEGQTables - 520, # JPEGDCTables - 521, # JPEGACTables - } - - def __init__(self, fn: StrOrBytesPath | IO[bytes], new: bool = False) -> None: - self.f: IO[bytes] - if is_path(fn): - self.name = fn - self.close_fp = True - try: - self.f = open(fn, "w+b" if new else "r+b") - except OSError: - self.f = open(fn, "w+b") - else: - self.f = cast(IO[bytes], fn) - self.close_fp = False - self.beginning = self.f.tell() - self.setup() - - def setup(self) -> None: - # Reset everything. - self.f.seek(self.beginning, os.SEEK_SET) - - self.whereToWriteNewIFDOffset: int | None = None - self.offsetOfNewPage = 0 - - self.IIMM = iimm = self.f.read(4) - if not iimm: - # empty file - first page - self.isFirst = True - return - - self.isFirst = False - if iimm == b"II\x2a\x00": - self.setEndian("<") - elif iimm == b"MM\x00\x2a": - self.setEndian(">") - else: - msg = "Invalid TIFF file header" - raise RuntimeError(msg) - - self.skipIFDs() - self.goToEnd() - - def finalize(self) -> None: - if self.isFirst: - return - - # fix offsets - self.f.seek(self.offsetOfNewPage) - - iimm = self.f.read(4) - if not iimm: - # Make it easy to finish a frame without committing to a new one. - return - - if iimm != self.IIMM: - msg = "IIMM of new page doesn't match IIMM of first page" - raise RuntimeError(msg) - - ifd_offset = self.readLong() - ifd_offset += self.offsetOfNewPage - assert self.whereToWriteNewIFDOffset is not None - self.f.seek(self.whereToWriteNewIFDOffset) - self.writeLong(ifd_offset) - self.f.seek(ifd_offset) - self.fixIFD() - - def newFrame(self) -> None: - # Call this to finish a frame. - self.finalize() - self.setup() - - def __enter__(self) -> AppendingTiffWriter: - return self - - def __exit__(self, *args: object) -> None: - if self.close_fp: - self.close() - - def tell(self) -> int: - return self.f.tell() - self.offsetOfNewPage - - def seek(self, offset: int, whence: int = io.SEEK_SET) -> int: - """ - :param offset: Distance to seek. - :param whence: Whether the distance is relative to the start, - end or current position. - :returns: The resulting position, relative to the start. - """ - if whence == os.SEEK_SET: - offset += self.offsetOfNewPage - - self.f.seek(offset, whence) - return self.tell() - - def goToEnd(self) -> None: - self.f.seek(0, os.SEEK_END) - pos = self.f.tell() - - # pad to 16 byte boundary - pad_bytes = 16 - pos % 16 - if 0 < pad_bytes < 16: - self.f.write(bytes(pad_bytes)) - self.offsetOfNewPage = self.f.tell() - - def setEndian(self, endian: str) -> None: - self.endian = endian - self.longFmt = f"{self.endian}L" - self.shortFmt = f"{self.endian}H" - self.tagFormat = f"{self.endian}HHL" - - def skipIFDs(self) -> None: - while True: - ifd_offset = self.readLong() - if ifd_offset == 0: - self.whereToWriteNewIFDOffset = self.f.tell() - 4 - break - - self.f.seek(ifd_offset) - num_tags = self.readShort() - self.f.seek(num_tags * 12, os.SEEK_CUR) - - def write(self, data: Buffer, /) -> int: - return self.f.write(data) - - def _fmt(self, field_size: int) -> str: - try: - return {2: "H", 4: "L", 8: "Q"}[field_size] - except KeyError: - msg = "offset is not supported" - raise RuntimeError(msg) - - def _read(self, field_size: int) -> int: - (value,) = struct.unpack( - self.endian + self._fmt(field_size), self.f.read(field_size) - ) - return value - - def readShort(self) -> int: - return self._read(2) - - def readLong(self) -> int: - return self._read(4) - - @staticmethod - def _verify_bytes_written(bytes_written: int | None, expected: int) -> None: - if bytes_written is not None and bytes_written != expected: - msg = f"wrote only {bytes_written} bytes but wanted {expected}" - raise RuntimeError(msg) - - def rewriteLastShortToLong(self, value: int) -> None: - self.f.seek(-2, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - self._verify_bytes_written(bytes_written, 4) - - def _rewriteLast(self, value: int, field_size: int) -> None: - self.f.seek(-field_size, os.SEEK_CUR) - bytes_written = self.f.write( - struct.pack(self.endian + self._fmt(field_size), value) - ) - self._verify_bytes_written(bytes_written, field_size) - - def rewriteLastShort(self, value: int) -> None: - return self._rewriteLast(value, 2) - - def rewriteLastLong(self, value: int) -> None: - return self._rewriteLast(value, 4) - - def writeShort(self, value: int) -> None: - bytes_written = self.f.write(struct.pack(self.shortFmt, value)) - self._verify_bytes_written(bytes_written, 2) - - def writeLong(self, value: int) -> None: - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - self._verify_bytes_written(bytes_written, 4) - - def close(self) -> None: - self.finalize() - if self.close_fp: - self.f.close() - - def fixIFD(self) -> None: - num_tags = self.readShort() - - for i in range(num_tags): - tag, field_type, count = struct.unpack(self.tagFormat, self.f.read(8)) - - field_size = self.fieldSizes[field_type] - total_size = field_size * count - is_local = total_size <= 4 - if not is_local: - offset = self.readLong() + self.offsetOfNewPage - self.rewriteLastLong(offset) - - if tag in self.Tags: - cur_pos = self.f.tell() - - if is_local: - self._fixOffsets(count, field_size) - self.f.seek(cur_pos + 4) - else: - self.f.seek(offset) - self._fixOffsets(count, field_size) - self.f.seek(cur_pos) - - elif is_local: - # skip the locally stored value that is not an offset - self.f.seek(4, os.SEEK_CUR) - - def _fixOffsets(self, count: int, field_size: int) -> None: - for i in range(count): - offset = self._read(field_size) - offset += self.offsetOfNewPage - if field_size == 2 and offset >= 65536: - # offset is now too large - we must convert shorts to longs - if count != 1: - msg = "not implemented" - raise RuntimeError(msg) # XXX TODO - - # simple case - the offset is just one and therefore it is - # local (not referenced with another offset) - self.rewriteLastShortToLong(offset) - self.f.seek(-10, os.SEEK_CUR) - self.writeShort(TiffTags.LONG) # rewrite the type to LONG - self.f.seek(8, os.SEEK_CUR) - else: - self._rewriteLast(offset, field_size) - - def fixOffsets( - self, count: int, isShort: bool = False, isLong: bool = False - ) -> None: - if isShort: - field_size = 2 - elif isLong: - field_size = 4 - else: - field_size = 0 - return self._fixOffsets(count, field_size) - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - encoderinfo = im.encoderinfo.copy() - encoderconfig = im.encoderconfig - append_images = list(encoderinfo.get("append_images", [])) - if not hasattr(im, "n_frames") and not append_images: - return _save(im, fp, filename) - - cur_idx = im.tell() - try: - with AppendingTiffWriter(fp) as tf: - for ims in [im] + append_images: - ims.encoderinfo = encoderinfo - ims.encoderconfig = encoderconfig - if not hasattr(ims, "n_frames"): - nfr = 1 - else: - nfr = ims.n_frames - - for idx in range(nfr): - ims.seek(idx) - ims.load() - _save(ims, tf, filename) - tf.newFrame() - finally: - im.seek(cur_idx) - - -# -# -------------------------------------------------------------------- -# Register - -Image.register_open(TiffImageFile.format, TiffImageFile, _accept) -Image.register_save(TiffImageFile.format, _save) -Image.register_save_all(TiffImageFile.format, _save_all) - -Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) - -Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/lib/python3.12/site-packages/PIL/TiffTags.py b/lib/python3.12/site-packages/PIL/TiffTags.py deleted file mode 100644 index 86adaa4..0000000 --- a/lib/python3.12/site-packages/PIL/TiffTags.py +++ /dev/null @@ -1,562 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# TIFF tags -# -# This module provides clear-text names for various well-known -# TIFF tags. the TIFF codec works just fine without it. -# -# Copyright (c) Secret Labs AB 1999. -# -# See the README file for information on usage and redistribution. -# - -## -# This module provides constants and clear-text names for various -# well-known TIFF tags. -## -from __future__ import annotations - -from typing import NamedTuple - - -class _TagInfo(NamedTuple): - value: int | None - name: str - type: int | None - length: int | None - enum: dict[str, int] - - -class TagInfo(_TagInfo): - __slots__: list[str] = [] - - def __new__( - cls, - value: int | None = None, - name: str = "unknown", - type: int | None = None, - length: int | None = None, - enum: dict[str, int] | None = None, - ) -> TagInfo: - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value: str) -> int | str: - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag: int, group: int | None = None) -> TagInfo: - """ - :param tag: Integer tag number - :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in - - .. versionadded:: 8.3.0 - - :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, - otherwise just populating the value and name from ``TAGS``. - If the tag is not recognized, "unknown" is returned for the name - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or TagInfo(tag, TAGS.get(tag, "unknown")) - - -## -# Map tag numbers to tag info. -# -# id: (Name, Type, Length[, enum_values]) -# -# The length here differs from the length in the tiff spec. For -# numbers, the tiff spec is for the number of fields returned. We -# agree here. For string-like types, the tiff spec uses the length of -# field in bytes. In Pillow, we are using the number of expected -# fields, in general 1 for string-like types. - - -BYTE = 1 -ASCII = 2 -SHORT = 3 -LONG = 4 -RATIONAL = 5 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -_tags_v2: dict[int, tuple[str, int, int] | tuple[str, int, int, dict[str, int]]] = { - 254: ("NewSubfileType", LONG, 1), - 255: ("SubfileType", SHORT, 1), - 256: ("ImageWidth", LONG, 1), - 257: ("ImageLength", LONG, 1), - 258: ("BitsPerSample", SHORT, 0), - 259: ( - "Compression", - SHORT, - 1, - { - "Uncompressed": 1, - "CCITT 1d": 2, - "Group 3 Fax": 3, - "Group 4 Fax": 4, - "LZW": 5, - "JPEG": 6, - "PackBits": 32773, - }, - ), - 262: ( - "PhotometricInterpretation", - SHORT, - 1, - { - "WhiteIsZero": 0, - "BlackIsZero": 1, - "RGB": 2, - "RGB Palette": 3, - "Transparency Mask": 4, - "CMYK": 5, - "YCbCr": 6, - "CieLAB": 8, - "CFA": 32803, # TIFF/EP, Adobe DNG - "LinearRaw": 32892, # Adobe DNG - }, - ), - 263: ("Threshholding", SHORT, 1), - 264: ("CellWidth", SHORT, 1), - 265: ("CellLength", SHORT, 1), - 266: ("FillOrder", SHORT, 1), - 269: ("DocumentName", ASCII, 1), - 270: ("ImageDescription", ASCII, 1), - 271: ("Make", ASCII, 1), - 272: ("Model", ASCII, 1), - 273: ("StripOffsets", LONG, 0), - 274: ("Orientation", SHORT, 1), - 277: ("SamplesPerPixel", SHORT, 1), - 278: ("RowsPerStrip", LONG, 1), - 279: ("StripByteCounts", LONG, 0), - 280: ("MinSampleValue", SHORT, 0), - 281: ("MaxSampleValue", SHORT, 0), - 282: ("XResolution", RATIONAL, 1), - 283: ("YResolution", RATIONAL, 1), - 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), - 285: ("PageName", ASCII, 1), - 286: ("XPosition", RATIONAL, 1), - 287: ("YPosition", RATIONAL, 1), - 288: ("FreeOffsets", LONG, 1), - 289: ("FreeByteCounts", LONG, 1), - 290: ("GrayResponseUnit", SHORT, 1), - 291: ("GrayResponseCurve", SHORT, 0), - 292: ("T4Options", LONG, 1), - 293: ("T6Options", LONG, 1), - 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), - 297: ("PageNumber", SHORT, 2), - 301: ("TransferFunction", SHORT, 0), - 305: ("Software", ASCII, 1), - 306: ("DateTime", ASCII, 1), - 315: ("Artist", ASCII, 1), - 316: ("HostComputer", ASCII, 1), - 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), - 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", RATIONAL, 6), - 320: ("ColorMap", SHORT, 0), - 321: ("HalftoneHints", SHORT, 2), - 322: ("TileWidth", LONG, 1), - 323: ("TileLength", LONG, 1), - 324: ("TileOffsets", LONG, 0), - 325: ("TileByteCounts", LONG, 0), - 330: ("SubIFDs", LONG, 0), - 332: ("InkSet", SHORT, 1), - 333: ("InkNames", ASCII, 1), - 334: ("NumberOfInks", SHORT, 1), - 336: ("DotRange", SHORT, 0), - 337: ("TargetPrinter", ASCII, 1), - 338: ("ExtraSamples", SHORT, 0), - 339: ("SampleFormat", SHORT, 0), - 340: ("SMinSampleValue", DOUBLE, 0), - 341: ("SMaxSampleValue", DOUBLE, 0), - 342: ("TransferRange", SHORT, 6), - 347: ("JPEGTables", UNDEFINED, 1), - # obsolete JPEG tags - 512: ("JPEGProc", SHORT, 1), - 513: ("JPEGInterchangeFormat", LONG, 1), - 514: ("JPEGInterchangeFormatLength", LONG, 1), - 515: ("JPEGRestartInterval", SHORT, 1), - 517: ("JPEGLosslessPredictors", SHORT, 0), - 518: ("JPEGPointTransforms", SHORT, 0), - 519: ("JPEGQTables", LONG, 0), - 520: ("JPEGDCTables", LONG, 0), - 521: ("JPEGACTables", LONG, 0), - 529: ("YCbCrCoefficients", RATIONAL, 3), - 530: ("YCbCrSubSampling", SHORT, 2), - 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 37724: ("ImageSourceData", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - # MPInfo - 45056: ("MPFVersion", UNDEFINED, 1), - 45057: ("NumberOfImages", LONG, 1), - 45058: ("MPEntry", UNDEFINED, 1), - 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check - 45060: ("TotalFrames", LONG, 1), - 45313: ("MPIndividualNum", LONG, 1), - 45569: ("PanOrientation", LONG, 1), - 45570: ("PanOverlap_H", RATIONAL, 1), - 45571: ("PanOverlap_V", RATIONAL, 1), - 45572: ("BaseViewpointNum", LONG, 1), - 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), - 45574: ("BaselineLength", RATIONAL, 1), - 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), - 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), - 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), - 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), - 45579: ("YawAngle", SIGNED_RATIONAL, 1), - 45580: ("PitchAngle", SIGNED_RATIONAL, 1), - 45581: ("RollAngle", SIGNED_RATIONAL, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), - 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 -} -_tags_v2_groups = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: { - 0: ("GPSVersionID", BYTE, 4), - 1: ("GPSLatitudeRef", ASCII, 2), - 2: ("GPSLatitude", RATIONAL, 3), - 3: ("GPSLongitudeRef", ASCII, 2), - 4: ("GPSLongitude", RATIONAL, 3), - 5: ("GPSAltitudeRef", BYTE, 1), - 6: ("GPSAltitude", RATIONAL, 1), - 7: ("GPSTimeStamp", RATIONAL, 3), - 8: ("GPSSatellites", ASCII, 0), - 9: ("GPSStatus", ASCII, 2), - 10: ("GPSMeasureMode", ASCII, 2), - 11: ("GPSDOP", RATIONAL, 1), - 12: ("GPSSpeedRef", ASCII, 2), - 13: ("GPSSpeed", RATIONAL, 1), - 14: ("GPSTrackRef", ASCII, 2), - 15: ("GPSTrack", RATIONAL, 1), - 16: ("GPSImgDirectionRef", ASCII, 2), - 17: ("GPSImgDirection", RATIONAL, 1), - 18: ("GPSMapDatum", ASCII, 0), - 19: ("GPSDestLatitudeRef", ASCII, 2), - 20: ("GPSDestLatitude", RATIONAL, 3), - 21: ("GPSDestLongitudeRef", ASCII, 2), - 22: ("GPSDestLongitude", RATIONAL, 3), - 23: ("GPSDestBearingRef", ASCII, 2), - 24: ("GPSDestBearing", RATIONAL, 1), - 25: ("GPSDestDistanceRef", ASCII, 2), - 26: ("GPSDestDistance", RATIONAL, 1), - 27: ("GPSProcessingMethod", UNDEFINED, 0), - 28: ("GPSAreaInformation", UNDEFINED, 0), - 29: ("GPSDateStamp", ASCII, 11), - 30: ("GPSDifferential", SHORT, 1), - }, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# Legacy Tags structure -# these tags aren't included above, but were in the previous versions -TAGS: dict[int | tuple[int, int], str] = { - 347: "JPEGTables", - 700: "XMP", - # Additional Exif Info - 32932: "Wang Annotation", - 33434: "ExposureTime", - 33437: "FNumber", - 33445: "MD FileTag", - 33446: "MD ScalePixel", - 33447: "MD ColorTable", - 33448: "MD LabName", - 33449: "MD SampleInfo", - 33450: "MD PrepDate", - 33451: "MD PrepTime", - 33452: "MD FileUnits", - 33550: "ModelPixelScaleTag", - 33723: "IptcNaaInfo", - 33918: "INGR Packet Data Tag", - 33919: "INGR Flag Registers", - 33920: "IrasB Transformation Matrix", - 33922: "ModelTiepointTag", - 34264: "ModelTransformationTag", - 34377: "PhotoshopInfo", - 34735: "GeoKeyDirectoryTag", - 34736: "GeoDoubleParamsTag", - 34737: "GeoAsciiParamsTag", - 34850: "ExposureProgram", - 34852: "SpectralSensitivity", - 34855: "ISOSpeedRatings", - 34856: "OECF", - 34864: "SensitivityType", - 34865: "StandardOutputSensitivity", - 34866: "RecommendedExposureIndex", - 34867: "ISOSpeed", - 34868: "ISOSpeedLatitudeyyy", - 34869: "ISOSpeedLatitudezzz", - 34908: "HylaFAX FaxRecvParams", - 34909: "HylaFAX FaxSubAddress", - 34910: "HylaFAX FaxRecvTime", - 36864: "ExifVersion", - 36867: "DateTimeOriginal", - 36868: "DateTimeDigitized", - 37121: "ComponentsConfiguration", - 37122: "CompressedBitsPerPixel", - 37724: "ImageSourceData", - 37377: "ShutterSpeedValue", - 37378: "ApertureValue", - 37379: "BrightnessValue", - 37380: "ExposureBiasValue", - 37381: "MaxApertureValue", - 37382: "SubjectDistance", - 37383: "MeteringMode", - 37384: "LightSource", - 37385: "Flash", - 37386: "FocalLength", - 37396: "SubjectArea", - 37500: "MakerNote", - 37510: "UserComment", - 37520: "SubSec", - 37521: "SubSecTimeOriginal", - 37522: "SubsecTimeDigitized", - 40960: "FlashPixVersion", - 40961: "ColorSpace", - 40962: "PixelXDimension", - 40963: "PixelYDimension", - 40964: "RelatedSoundFile", - 40965: "InteroperabilityIFD", - 41483: "FlashEnergy", - 41484: "SpatialFrequencyResponse", - 41486: "FocalPlaneXResolution", - 41487: "FocalPlaneYResolution", - 41488: "FocalPlaneResolutionUnit", - 41492: "SubjectLocation", - 41493: "ExposureIndex", - 41495: "SensingMethod", - 41728: "FileSource", - 41729: "SceneType", - 41730: "CFAPattern", - 41985: "CustomRendered", - 41986: "ExposureMode", - 41987: "WhiteBalance", - 41988: "DigitalZoomRatio", - 41989: "FocalLengthIn35mmFilm", - 41990: "SceneCaptureType", - 41991: "GainControl", - 41992: "Contrast", - 41993: "Saturation", - 41994: "Sharpness", - 41995: "DeviceSettingDescription", - 41996: "SubjectDistanceRange", - 42016: "ImageUniqueID", - 42032: "CameraOwnerName", - 42033: "BodySerialNumber", - 42034: "LensSpecification", - 42035: "LensMake", - 42036: "LensModel", - 42037: "LensSerialNumber", - 42112: "GDAL_METADATA", - 42113: "GDAL_NODATA", - 42240: "Gamma", - 50215: "Oce Scanjob Description", - 50216: "Oce Application Selector", - 50217: "Oce Identification Number", - 50218: "Oce ImageLogic Characteristics", - # Adobe DNG - 50706: "DNGVersion", - 50707: "DNGBackwardVersion", - 50708: "UniqueCameraModel", - 50709: "LocalizedCameraModel", - 50710: "CFAPlaneColor", - 50711: "CFALayout", - 50712: "LinearizationTable", - 50713: "BlackLevelRepeatDim", - 50714: "BlackLevel", - 50715: "BlackLevelDeltaH", - 50716: "BlackLevelDeltaV", - 50717: "WhiteLevel", - 50718: "DefaultScale", - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50721: "ColorMatrix1", - 50722: "ColorMatrix2", - 50723: "CameraCalibration1", - 50724: "CameraCalibration2", - 50725: "ReductionMatrix1", - 50726: "ReductionMatrix2", - 50727: "AnalogBalance", - 50728: "AsShotNeutral", - 50729: "AsShotWhiteXY", - 50730: "BaselineExposure", - 50731: "BaselineNoise", - 50732: "BaselineSharpness", - 50733: "BayerGreenSplit", - 50734: "LinearResponseLimit", - 50735: "CameraSerialNumber", - 50736: "LensInfo", - 50737: "ChromaBlurRadius", - 50738: "AntiAliasStrength", - 50740: "DNGPrivateData", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 50784: "Alias Layer Metadata", -} - -TAGS_V2: dict[int, TagInfo] = {} -TAGS_V2_GROUPS: dict[int, dict[int, TagInfo]] = {} - - -def _populate() -> None: - for k, v in _tags_v2.items(): - # Populate legacy structure. - TAGS[k] = v[0] - if len(v) == 4: - for sk, sv in v[3].items(): - TAGS[(k, sv)] = sk - - TAGS_V2[k] = TagInfo(k, *v) - - for group, tags in _tags_v2_groups.items(): - TAGS_V2_GROUPS[group] = {k: TagInfo(k, *v) for k, v in tags.items()} - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES: dict[int, str] = {} - -# -# These tags are handled by default in libtiff, without -# adding to the custom dictionary. From tif_dir.c, searching for -# case TIFFTAG in the _TIFFVSetField function: -# Line: item. -# 148: case TIFFTAG_SUBFILETYPE: -# 151: case TIFFTAG_IMAGEWIDTH: -# 154: case TIFFTAG_IMAGELENGTH: -# 157: case TIFFTAG_BITSPERSAMPLE: -# 181: case TIFFTAG_COMPRESSION: -# 202: case TIFFTAG_PHOTOMETRIC: -# 205: case TIFFTAG_THRESHHOLDING: -# 208: case TIFFTAG_FILLORDER: -# 214: case TIFFTAG_ORIENTATION: -# 221: case TIFFTAG_SAMPLESPERPIXEL: -# 228: case TIFFTAG_ROWSPERSTRIP: -# 238: case TIFFTAG_MINSAMPLEVALUE: -# 241: case TIFFTAG_MAXSAMPLEVALUE: -# 244: case TIFFTAG_SMINSAMPLEVALUE: -# 247: case TIFFTAG_SMAXSAMPLEVALUE: -# 250: case TIFFTAG_XRESOLUTION: -# 256: case TIFFTAG_YRESOLUTION: -# 262: case TIFFTAG_PLANARCONFIG: -# 268: case TIFFTAG_XPOSITION: -# 271: case TIFFTAG_YPOSITION: -# 274: case TIFFTAG_RESOLUTIONUNIT: -# 280: case TIFFTAG_PAGENUMBER: -# 284: case TIFFTAG_HALFTONEHINTS: -# 288: case TIFFTAG_COLORMAP: -# 294: case TIFFTAG_EXTRASAMPLES: -# 298: case TIFFTAG_MATTEING: -# 305: case TIFFTAG_TILEWIDTH: -# 316: case TIFFTAG_TILELENGTH: -# 327: case TIFFTAG_TILEDEPTH: -# 333: case TIFFTAG_DATATYPE: -# 344: case TIFFTAG_SAMPLEFORMAT: -# 361: case TIFFTAG_IMAGEDEPTH: -# 364: case TIFFTAG_SUBIFD: -# 376: case TIFFTAG_YCBCRPOSITIONING: -# 379: case TIFFTAG_YCBCRSUBSAMPLING: -# 383: case TIFFTAG_TRANSFERFUNCTION: -# 389: case TIFFTAG_REFERENCEBLACKWHITE: -# 393: case TIFFTAG_INKNAMES: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -LIBTIFF_CORE = { - 255, - 256, - 257, - 258, - 259, - 262, - 263, - 266, - 274, - 277, - 278, - 280, - 281, - 340, - 341, - 282, - 283, - 284, - 286, - 287, - 296, - 297, - 321, - 320, - 338, - 32995, - 322, - 323, - 32998, - 32996, - 339, - 32997, - 330, - 531, - 530, - 301, - 532, - 333, - # as above - 269, # this has been in our tests forever, and works - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff -LIBTIFF_CORE.remove(323) # Tiled images -LIBTIFF_CORE.remove(333) # Ink Names either - -# Note to advanced users: There may be combinations of these -# parameters and values that when added properly, will work and -# produce valid tiff images that may work in your application. -# It is safe to add and remove tags from this set from Pillow's point -# of view so long as you test against libtiff. diff --git a/lib/python3.12/site-packages/PIL/WalImageFile.py b/lib/python3.12/site-packages/PIL/WalImageFile.py deleted file mode 100644 index 87e3287..0000000 --- a/lib/python3.12/site-packages/PIL/WalImageFile.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# WAL file handling -# -# History: -# 2003-04-23 fl created -# -# Copyright (c) 2003 by Fredrik Lundh. -# -# See the README file for information on usage and redistribution. -# - -""" -This reader is based on the specification available from: -https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -and has been tested with a few sample files found using google. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import i32le as i32 -from ._typing import StrOrBytesPath - - -class WalImageFile(ImageFile.ImageFile): - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self) -> None: - self._mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self) -> Image.core.PixelAccess | None: - if self._im is None: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -def open(filename: StrOrBytesPath | IO[bytes]) -> WalImageFile: - """ - Load texture from a Quake2 WAL texture file. - - By default, a Quake2 standard palette is attached to the texture. - To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -quake2palette = ( - # default palette taken from piffo 0.93 by Hans Häggström - b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" - b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" - b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" - b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" - b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" - b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" - b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" - b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" - b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" - b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" - b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" - b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" - b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" - b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" - b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" - b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" - b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" - b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" - b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" - b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" - b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" - b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" - b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" - b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" - b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" - b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" - b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" - b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" - b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" - b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" - b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" - b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" - b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" - b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" - b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" - b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" - b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" - b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" - b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" - b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" - b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" - b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" - b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" - b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" - b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" - b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" - b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" - b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" -) diff --git a/lib/python3.12/site-packages/PIL/WebPImagePlugin.py b/lib/python3.12/site-packages/PIL/WebPImagePlugin.py deleted file mode 100644 index 64188f2..0000000 --- a/lib/python3.12/site-packages/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,323 +0,0 @@ -from __future__ import annotations - -from io import BytesIO -from typing import IO, Any - -from . import Image, ImageFile - -try: - from . import _webp - - SUPPORTED = True -except ImportError: - SUPPORTED = False - - -_VP8_MODES_BY_IDENTIFIER = { - b"VP8 ": "RGB", - b"VP8X": "RGBA", - b"VP8L": "RGBA", # lossless -} - - -def _accept(prefix: bytes) -> bool | str: - is_riff_file_format = prefix[:4] == b"RIFF" - is_webp_file = prefix[8:12] == b"WEBP" - is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER - - if is_riff_file_format and is_webp_file and is_valid_vp8_mode: - if not SUPPORTED: - return ( - "image file could not be identified because WEBP support not installed" - ) - return True - return False - - -class WebPImageFile(ImageFile.ImageFile): - format = "WEBP" - format_description = "WebP image" - __loaded = 0 - __logical_frame = 0 - - def _open(self) -> None: - # Use the newer AnimDecoder API to parse the (possibly) animated file, - # and access muxed chunks like ICC/EXIF/XMP. - self._decoder = _webp.WebPAnimDecoder(self.fp.read()) - - # Get info from decoder - width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() - self._size = width, height - self.info["loop"] = loop_count - bg_a, bg_r, bg_g, bg_b = ( - (bgcolor >> 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self._mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - self.tile = [] - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self) -> dict[int, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset: bool = True) -> None: - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self) -> tuple[bytes, int, int]: - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - msg = "failed to decode next frame in WebP file" - raise EOFError(msg) - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame: int) -> None: - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self) -> Image.core.PixelAccess | None: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def load_seek(self, pos: int) -> None: - pass - - def tell(self) -> int: - return self.__logical_frame - - -def _convert_frame(im: Image.Image) -> Image.Image: - # Make sure image mode is supported - if im.mode not in ("RGBX", "RGBA", "RGB"): - im = im.convert("RGBA" if im.has_transparency_data else "RGB") - return im - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background: int | tuple[int, ...] = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(0 <= v < 256 for v in background) - ): - msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" - raise OSError(msg) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size[0], - im.size[1], - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get # of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - - frame = _convert_frame(ims) - - # Append the frame to the animation encoder - enc.add( - frame.getim(), - round(timestamp), - lossless, - quality, - alpha_quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, round(timestamp), lossless, quality, alpha_quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - exact = 1 if im.encoderinfo.get("exact") else 0 - - im = _convert_frame(im) - - data = _webp.WebPEncode( - im.getim(), - lossless, - float(quality), - float(alpha_quality), - icc_profile, - method, - exact, - exif, - xmp, - ) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/lib/python3.12/site-packages/PIL/WmfImagePlugin.py b/lib/python3.12/site-packages/PIL/WmfImagePlugin.py deleted file mode 100644 index 68f8a74..0000000 --- a/lib/python3.12/site-packages/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,181 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# WMF stub codec -# -# history: -# 1996-12-14 fl Created -# 2004-02-22 fl Turned into a stub driver -# 2004-02-23 fl Added EMF support -# -# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# -# WMF/EMF reference documentation: -# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf -# http://wvware.sourceforge.net/caolan/index.html -# http://wvware.sourceforge.net/caolan/ora-wmf.html -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as word -from ._binary import si16le as short -from ._binary import si32le as _long - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific WMF image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -if hasattr(Image.core, "drawwmf"): - # install default handler (windows only) - - class WmfHandler(ImageFile.StubHandler): - def open(self, im: ImageFile.StubImageFile) -> None: - im._mode = "RGB" - self.bbox = im.info["wmf_bbox"] - - def load(self, im: ImageFile.StubImageFile) -> Image.Image: - im.fp.seek(0) # rewind - return Image.frombytes( - "RGB", - im.size, - Image.core.drawwmf(im.fp.read(), im.size, self.bbox), - "raw", - "BGR", - (im.size[0] * 3 + 3) & -4, - -1, - ) - - register_handler(WmfHandler()) - -# -# -------------------------------------------------------------------- -# Read WMF file - - -def _accept(prefix: bytes) -> bool: - return ( - prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" - ) - - -## -# Image plugin for Windows metafiles. - - -class WmfStubImageFile(ImageFile.StubImageFile): - format = "WMF" - format_description = "Windows Metafile" - - def _open(self) -> None: - self._inch = None - - # check placable header - s = self.fp.read(80) - - if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": - # placeable windows metafile - - # get units per inch - self._inch = word(s, 14) - - # get bounding box - x0 = short(s, 6) - y0 = short(s, 8) - x1 = short(s, 10) - y1 = short(s, 12) - - # normalize size to 72 dots per inch - self.info["dpi"] = 72 - size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - # sanity check (standard metafile header) - if s[22:26] != b"\x01\x00\t\x00": - msg = "Unsupported WMF file format" - raise SyntaxError(msg) - - elif s[:4] == b"\x01\x00\x00\x00" and s[40:44] == b" EMF": - # enhanced metafile - - # get bounding box - x0 = _long(s, 8) - y0 = _long(s, 12) - x1 = _long(s, 16) - y1 = _long(s, 20) - - # get frame (in 0.01 millimeter units) - frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) - - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) - ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - if xdpi == ydpi: - self.info["dpi"] = xdpi - else: - self.info["dpi"] = xdpi, ydpi - - else: - msg = "Unsupported file format" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = size - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - def load(self, dpi: int | None = None) -> Image.core.PixelAccess | None: - if dpi is not None and self._inch is not None: - self.info["dpi"] = dpi - x0, y0, x1, y1 = self.info["wmf_bbox"] - self._size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - return super().load() - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "WMF save handler not installed" - raise OSError(msg) - _handler.save(im, fp, filename) - - -# -# -------------------------------------------------------------------- -# Registry stuff - - -Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) -Image.register_save(WmfStubImageFile.format, _save) - -Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py b/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py deleted file mode 100644 index 5d1f201..0000000 --- a/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,85 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XV Thumbnail file handler by Charles E. "Gene" Cash -# (gcash@magicnet.net) -# -# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, -# available from ftp://ftp.cis.upenn.edu/pub/xv/ -# -# history: -# 98-08-15 cec created (b/w only) -# 98-12-09 cec added color palette -# 98-12-28 fl added to PIL (with only a few very minor modifications) -# -# To do: -# FIXME: make save work (this requires quantization support) -# -from __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_MAGIC = b"P7 332" - -# standard color palette for thumbnails (RGB332) -PALETTE = b"" -for r in range(8): - for g in range(8): - for b in range(4): - PALETTE = PALETTE + ( - o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) - ) - - -def _accept(prefix: bytes) -> bool: - return prefix[:6] == _MAGIC - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self) -> None: - # check magic - assert self.fp is not None - - if not _accept(self.fp.read(6)): - msg = "not an XV thumbnail file" - raise SyntaxError(msg) - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - msg = "Unexpected EOF reading XV thumbnail file" - raise SyntaxError(msg) - if s[0] != 35: # ie. when not a comment: '#' - break - - # parse header line (already read) - s = s.strip().split() - - self._mode = "P" - self._size = int(s[0]), int(s[1]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [ - ImageFile._Tile( - "raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1) - ) - ] - - -# -------------------------------------------------------------------- - -Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/lib/python3.12/site-packages/PIL/XbmImagePlugin.py b/lib/python3.12/site-packages/PIL/XbmImagePlugin.py deleted file mode 100644 index f3d490a..0000000 --- a/lib/python3.12/site-packages/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,98 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XBM File handling -# -# History: -# 1995-09-08 fl Created -# 1996-11-01 fl Added save support -# 1997-07-07 fl Made header parser more tolerant -# 1997-07-22 fl Fixed yet another parser bug -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) -# 2004-02-24 fl Allow some whitespace before first #define -# -# Copyright (c) 1997-2004 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re -from typing import IO - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" - b"(?P" - b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" - b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" - b")?" - rb"[\000-\377]*_bits\[]" -) - - -def _accept(prefix: bytes) -> bool: - return prefix.lstrip()[:7] == b"#define" - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self) -> None: - assert self.fp is not None - - m = xbm_head.match(self.fp.read(512)) - - if not m: - msg = "not a XBM file" - raise SyntaxError(msg) - - xsize = int(m.group("width")) - ysize = int(m.group("height")) - - if m.group("hotspot"): - self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) - - self._mode = "1" - self._size = xsize, ysize - - self.tile = [ImageFile._Tile("xbm", (0, 0) + self.size, m.end(), None)] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as XBM" - raise OSError(msg) - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) - - fp.write(b"static char im_bits[] = {\n") - - ImageFile._save(im, fp, [ImageFile._Tile("xbm", (0, 0) + im.size, 0, None)]) - - fp.write(b"};\n") - - -Image.register_open(XbmImageFile.format, XbmImageFile, _accept) -Image.register_save(XbmImageFile.format, _save) - -Image.register_extension(XbmImageFile.format, ".xbm") - -Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/lib/python3.12/site-packages/PIL/XpmImagePlugin.py b/lib/python3.12/site-packages/PIL/XpmImagePlugin.py deleted file mode 100644 index 1fc6c0c..0000000 --- a/lib/python3.12/site-packages/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# XPM File handling -# -# History: -# 1996-12-29 fl Created -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) -# -# Copyright (c) Secret Labs AB 1997-2001. -# Copyright (c) Fredrik Lundh 1996-2001. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -# XPM header -xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') - - -def _accept(prefix: bytes) -> bool: - return prefix[:9] == b"/* XPM */" - - -## -# Image plugin for X11 pixel maps. - - -class XpmImageFile(ImageFile.ImageFile): - format = "XPM" - format_description = "X11 Pixel Map" - - def _open(self) -> None: - if not _accept(self.fp.read(9)): - msg = "not an XPM file" - raise SyntaxError(msg) - - # skip forward to next string - while True: - s = self.fp.readline() - if not s: - msg = "broken XPM file" - raise SyntaxError(msg) - m = xpm_head.match(s) - if m: - break - - self._size = int(m.group(1)), int(m.group(2)) - - pal = int(m.group(3)) - bpp = int(m.group(4)) - - if pal > 256 or bpp != 1: - msg = "cannot read this XPM file" - raise ValueError(msg) - - # - # load palette description - - palette = [b"\0\0\0"] * 256 - - for _ in range(pal): - s = self.fp.readline() - if s[-2:] == b"\r\n": - s = s[:-2] - elif s[-1:] in b"\r\n": - s = s[:-1] - - c = s[1] - s = s[2:-2].split() - - for i in range(0, len(s), 2): - if s[i] == b"c": - # process colour key - rgb = s[i + 1] - if rgb == b"None": - self.info["transparency"] = c - elif rgb[:1] == b"#": - # FIXME: handle colour names (see ImagePalette.py) - rgb = int(rgb[1:], 16) - palette[c] = ( - o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) - ) - else: - # unknown colour - msg = "cannot read this XPM file" - raise ValueError(msg) - break - - else: - # missing colour key - msg = "cannot read this XPM file" - raise ValueError(msg) - - self._mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette)) - - self.tile = [ - ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1)) - ] - - def load_read(self, read_bytes: int) -> bytes: - # - # load all image data in one chunk - - xsize, ysize = self.size - - s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] - - return b"".join(s) - - -# -# Registry - - -Image.register_open(XpmImageFile.format, XpmImageFile, _accept) - -Image.register_extension(XpmImageFile.format, ".xpm") - -Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/lib/python3.12/site-packages/PIL/__init__.py b/lib/python3.12/site-packages/PIL/__init__.py deleted file mode 100644 index 09546fe..0000000 --- a/lib/python3.12/site-packages/PIL/__init__.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Pillow (Fork of the Python Imaging Library) - -Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors. - https://github.com/python-pillow/Pillow/ - -Pillow is forked from PIL 1.1.7. - -PIL is the Python Imaging Library by Fredrik Lundh and contributors. -Copyright (c) 1999 by Secret Labs AB. - -Use PIL.__version__ for this Pillow version. - -;-) -""" - -from __future__ import annotations - -from . import _version - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -__version__ = _version.__version__ -del _version - - -_plugins = [ - "BlpImagePlugin", - "BmpImagePlugin", - "BufrStubImagePlugin", - "CurImagePlugin", - "DcxImagePlugin", - "DdsImagePlugin", - "EpsImagePlugin", - "FitsImagePlugin", - "FliImagePlugin", - "FpxImagePlugin", - "FtexImagePlugin", - "GbrImagePlugin", - "GifImagePlugin", - "GribStubImagePlugin", - "Hdf5StubImagePlugin", - "IcnsImagePlugin", - "IcoImagePlugin", - "ImImagePlugin", - "ImtImagePlugin", - "IptcImagePlugin", - "JpegImagePlugin", - "Jpeg2KImagePlugin", - "McIdasImagePlugin", - "MicImagePlugin", - "MpegImagePlugin", - "MpoImagePlugin", - "MspImagePlugin", - "PalmImagePlugin", - "PcdImagePlugin", - "PcxImagePlugin", - "PdfImagePlugin", - "PixarImagePlugin", - "PngImagePlugin", - "PpmImagePlugin", - "PsdImagePlugin", - "QoiImagePlugin", - "SgiImagePlugin", - "SpiderImagePlugin", - "SunImagePlugin", - "TgaImagePlugin", - "TiffImagePlugin", - "WebPImagePlugin", - "WmfImagePlugin", - "XbmImagePlugin", - "XpmImagePlugin", - "XVThumbImagePlugin", -] - - -class UnidentifiedImageError(OSError): - """ - Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. - - If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` - to true may allow the image to be opened after all. The setting will ignore missing - data and checksum failures. - """ - - pass diff --git a/lib/python3.12/site-packages/PIL/__main__.py b/lib/python3.12/site-packages/PIL/__main__.py deleted file mode 100644 index 043156e..0000000 --- a/lib/python3.12/site-packages/PIL/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -import sys - -from .features import pilinfo - -pilinfo(supported_formats="--report" not in sys.argv) diff --git a/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc deleted file mode 100644 index cde8304126b5dcc8af8e34e3927ab3196688646f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4375 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 SKIk9a=pViJ-hFahT-pDhP)->D diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc deleted file mode 100644 index a2404b964815c5e3a5ea96dfd81276bcc6465380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7023 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 JbJ%7g{s$iG)~x^l diff --git a/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc deleted file mode 100644 index c191d858d6c74f7d33eeb27a89a35755f402f53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 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 AQvd(} diff --git a/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc deleted file mode 100644 index 5301c42611b8a5f835585c116cce176678d9e4b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22697 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

q!!ySJ&Msin!)B0ST)iH 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 K$TZTS;(r6sp-V*o diff --git a/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc deleted file mode 100644 index 5af5088115a35bb60fec9e77d1a5f0558c9308c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15658 zcmcJ03vg3cmf(BR(_gawviz4nG6-ygA$&t1HrT|57&?Y9m=KMuC)+ZzWZsi8R;09( z%`P%w3b{#-MJGKmo6N>kG8KBNwwmnpR;N=lJE{Jagq=dX_H4PUQ?*OgZk5xp(^-0_ zcF(y_Pcn|3q-$y)_Qg~152;5qeHy@JSVc%XqU+O* z==<~}uM8PRO8Sg6C8Gk&uuCGL7_+MPX))JlUKd7PfU&SLpOw`FY^-)4ph3>g+F0Fd zOrJwTX(-l?;aC5$4p#q~qOX)KWeou9lu?H%w&XR6H3sy<<BZ>V0{hrZU#ama!(l zg~9p;FiA+D}!Gi6NkF$TN{%#vz9^G zD(wBMP$9bxwzY^kA@h{qM??=T=zQUDBBVoP=^0KaD_i@oYGC|Qb;u{PI8WME| zLjkB(1h;Ps1!9#iy4@Skytw!5CePk8t{0+bH*IX$)Be{i#!g2jR6q9szvutiE0;}2BDWn&dz?V~s|VxRR? z)Fxp!P#ig^KI-&WXd9<4%1=|{v`5_|$j5_W4rkRP7u171VpvU@0xrjf&^Mckt6!4$(`hB60pgPp?e9y_FM+Mcf-VTn7 za2^?l;}ewPrs0unm+O&#%TQz_u!SA#4@_) zE)Q@phAp9Bf4*RQOY62Rd@vel9`*Up!H(y*9Pc{1rDK#Q8~=D{Y%myZ8J!S}Lq6U+ zI27Tdyq^n>M!8Dpycz!ZpFl84eXcTPRL(_R$<=*R`|j%Mvbwt29Sb_oqS2KxZv2g@ z>UY)qQk}Wds+st7e71AGbaS?JSFUMW#_74|tXfu4HBT*TDNjqr=3aDql3fo=D7`)1 zkW2jp+mESeFvnKa!bnZ;1anIjxy4!vt+kWCR)5%<=E2Vj;T!C?AkA(Z> zLj`54_&r4%>T;E})0#z{O{!W}K;a`EcizvcJnatZ6Nj#Sv;31yG=%; zWG5UkIFk9Boub|+)i4VNmQE<5`P-GE;tJ{5y-G(5Ek%`iaH@E8q%F?Nx~W&;5VEo| z02(G-PJ$NWgtFLDTp86%wX0fCz5x3op-QNW2QV&|sJTekGggj1*J;miQpf90; zyc~PZ=d~;o*I-Rt%_>N_T7-`QWicIK=m0{ShfwArNDBoBebg+`xYqHO=8n*7NR&kF z1!#wqD#mexGzOqwl`uxJOY+5KtXi4_xa0~~z;L+)QH+PHifJhomkn1->0&JP#u?VG zPng2L{u9P$28zFad}gUfnu;3}rf981OWeq6r19;b5*DDRUaBj`tSs6f<%S!jR56xX zfYxQho?^L_l2#*OU9bHW^jQ8dwJ~H!wzy@uRjMn-@d6Z#M52Mda*$QwKdB$6V>mghOE|(ZR-bSbPabPv zOX3>V_$I@e;#!P<$gt+PjuvTTmoleHNN~#UO}ooC|wkBBOz@!0>^< zIYAbT2G|8^L$23p#g(ac6YyWsr4EDSB!bO52l% zpgP6A)v=(f%P@5rU0u#v`pVJC&g3DGi4CTd;`Q#!$I`Wv9XUWUPaRGLrj9|zU{2Le zol1>Oc_%xUpk~L^(e$BN^Yz2C>|E=O!E9x7R^K8b?VNfxePXuu`YDjT+ir|!t6H-9 zEt4IeJF4$G8nceZdB?_AjzNcq7a8THXI^?hkIaB#t{@L0$2ePJyls0EF z�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 C4qzn! diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc deleted file mode 100644 index a05fe71727540567a76051d5c0706e97810d5c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11558 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc deleted file mode 100644 index fc05c4553b705d12ccfa2230eb5fb2b516aa3d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6770 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc deleted file mode 100644 index 1aa4cf496e95178969fb1f5418c73bd46ecfee81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 zcmb_fO>7&-6`t82a``8bG^u~vloZEdV~duRxJm8Ak$>daHPk3}9E6R_P~4TYH2*Za zvP5QC7)1(Dh6q(I@DQl&_nQ{ODPl&mN~ z4t)e?-n{vH@6DTU-u}(waU!6D|7oB8uLq$oX~QC}!QhSefLTT&5^)NpaTH_9Gbtv@ zK+UGuG#BMS#)*82Purrlv^{Evwk;|+(B@BciuMnr=|rnSc0Y0j}~jFt{_ zD9?tu!lAc`tV*Gbq|Rr_l~9(55(zywDNi4iGNK&MghRte4o=EyNRejeq)b90RCgKl zMdM-C;OFUdVh5SQXNQkWN+4vWa)#|{JT)gN2EM9L@eNIPuT1Ak=%ifd>?Ky85%uDjf&+3PRX-JWuA@my)NE;w%p zi^9#$<=vIt`s|vo|8rsBD?5zcfN3Z}3yYfG#T%zUvWz4Y#UhF_Z$XGfS&@lyA}jGC zcMN((hsZ1@mykST+lNDt?|Zlrp7YTPz<;R ziD(*&xWGeXpjc~G9)flJ2^=d8T29VPWet8hmCwyUP;-iuno{V{5NU(b5MnVoBdf7k z!DrbqWQoEsKUIUK_6KB<$YmyL%Wt|U<{3K)1QBZO}6pDD5;TjanFs@67w8-5XP zGq3RqUb1QYyBxG^MSD>wI#f8925DFmM2=bvHB0LPz@G&}MXWI(=bQbE)n9;d6gyOk zD<)lmuq9p%qSV9?Zl_sAX3M@TAVyQ`BD-{nLmFFjYMf@qOwpw|Mdk_w7O`orCI^;- zwkQU6G)Q$>T+(fEo3&`uoSJK@waZh{i6J`e&FG|lH_7y?yXaAUEs5PiGw|j|U~`*> zv^MI6re9r8`*laF+cmf5Df)_DsM}4?xi$AT&v`^f^MLJiWls_Mn={&h7ev$VnwR!M z%RD8`*K9S;#_DUFq}eyc75zI$cygCz-)5~jlEKZE#c6_Nzvj123nR^@*){(Z3#-$M zx{b6picw2CU_TBEh3=C?iUatkC6&ktB?LGVYJkbOiSmSo;uDH~PiQz8c$iQ{!Y)F! zH1D6mrsE3+|MuBa7hgB{ydoDQLIclWGt#_aZ?0_cB%Xmskk3(UGq?oF=EA!gHy6(s zc-|0TnR!`MXAC|iXC$SuI2H|7R8)giNCK{S+Ta(=9R^Kp77Uy>uxv033-CW=F!@6U zRurlmJU82^0bKS(Hk|`dEqGg)(3HFe)0EHP(gPmYklTCX==Gy@w;%Yv-S>sQ5~jsy zS*Uw`CB7c)UXI?3mQEY(f%?GyN_!cXM|4(y^HHEv$NGpqyK0~=PLq0XGdr~fPCGszc;Akilf9oc6rOA*MFk#s}BF}N1*QGU|2&Aa+R%0t8Z0*vDWbd$X)C37+Oed2P9r{gT&`AIZC)R`pDN&RzB*1w=vMA`zmL? zYh67^J1*&oYX8bqC01tY-97qf`2;XvA5$6IG^w{wkHaXbJX;>E@7`0zI#WJT@9KdT zbx~zZf3xz_hM}tiw|Z9-cl&Qo-6glL+#9(!`^k|{PkeIpet@p$4J^AVu7}?Knzz3? z@aO%v_OA~9>A+q5z;=)m$1XmFi+r(oANpR#OI9-geTkb<-PY z12_&tL~iret2E~^>Hn}gZ?0~$R(}x{S&dD$aM#)iG-x3(cx>kp0{Df#vD@hPkSG0- z-3ir1r)8^EfA89^%@Hb11xym%mK0uvqk!1-1*RFoHquNqHeU*lN|P0nG*n^@0_<||`jJTJDJ?=H;VGVc|RW`AD#+mz8jc%H%N9f&cE^41N6V+rzLnkzaBwxcE$ zn4?aEk1GjTRw#g<8ofB`Yyh{j0qYdZe=tXvAbX)054Vw*X@df+;k-oi`_qJE38aUh zy}@J^gUiJM!UZLlg4An4HMnd}$`A*gWn#7sz96#jh4Czv?4t#Z+_0_j6bLlk&BW6Z zyei5xp(zBQzG&dILf@1IqMJBQjzhcPX<;~3U=~D*(*kgZ=Z1UHz0?Ny4Y}R>*Wa)E z_mxgQ^7rW%ejB;(?yn2(8?HsyL!qlCbp65qapy|s!|rgcJG}bbTKCA^(OUPBdmXjz zYD!b=Upi!H2;YYQY!ozP%QF<$?QEYs@U{4 zT0UPnU-j1l&y?{Oon4OtJ^Eoi|9K$%50jg%`c~9x93B^O<^9!()!Ew@YkP-34;=o= zg*yAcaiF%>@I%k>n&!Fx7=N0#LvC*)k~&8+21mah!W^N|Z?JMk zC118B+v@j!;M#*i+eW`$^ zLxf_HSv&)b5`p5^=nHP-asR$+WB1*A*0_BeoRjZf?{e^a))||leS-yVqa(r}_<9lt z`H{w2bQuU*8lZ%xyoBbsg&%*Pi#DCL6L)!w6I|5vsW~_wFrCoMi@XMfVN>%tIWui; zW>h%QMOry3Z8mY#RH(sRhh5{V!8uW!XS$u{1w8CR+@zGVpg7G|}v zZ2qn2zRQ**88XcVYnJdO$mq6kEEZS8Y9t<02A3FQvbu0$B0MJPR{A&^iAo?SME33h zg4LNmojDa`Wh=d!ljq`Ud@?Spqw#1Y-ZMF^ zo`VID4}Q*pXA9KZ`OCtP34LA^fHI5Kq6ykyFQmyRBbqPUVJA2#Z2`I} zO%lwI4Q%Gp?S|&)Q#yC_&3ARn(P&sX_huxqZfSVXgD#C1jCg}siCS5>%@#!?GcP*R-6$xe+MuinrAuOfT?Met*X$fa1-X0&UpG2%xI zjN>-=t511a4C2IM$&-+$`ti2)hS8??$!c<9#CQ3)6D#A%%!ozywl0J{0~ z*(0(Xmv!6O>6jW$lwNr3K^I1%N<`Fcq4=Z}3q@k0lnC-VuSn5RodGwPP{!n~(6NGp z1fa+s97dq>NzYoJ>88AwP&ftEC9+(_TX#P4H81!&3cil{+F$$b_#XIr(*swJFIN#) z?X|>A;#z7ZmFEB8tjVZ1lC#PD_LKL0CySoF>HbHartHWAPix-Zx@fU4So{TxKkI&I zX?*&mhPZrxCaiU5(X($=aGuHAga5TG0RJ1h#Xj2B*GYcgX+3P=e!s8!FvtBPCjdRN zHgcfDQD^=waDQgSNHY$sjb*&zq^m6=qcI|Tlm8pYMPn8B0w)m+8I2YBdU#PQZf(SQ zg?*iT#H^DP{wGPJCwNl1Q5H5%Wm~Or^G&yl;n*ooG^Kcr6V2xbV2ikbvLs>Nu$_3( zlym^K+R9vYQ7$A27|UFl6WMgrS(9L)lmPlwX+jdDaW+@1t23OjsxG4s!wRxn#h6IT zj8(K5`~;ISi8iXEL$s&NYMmjanT@%C^)QUmlD0x@b6mElI4CWe$&ec$cgsA3ld`Cl z{HR=rFJ|iFKzzoW1dM>Y=zTD3idjt!GY}+Uzc5MI9Z8Thv=`YVq=H{C zHvrpRZRE)`_bUzpC@xs~=nBe~9_KJo$VcsH_HIvOsayba$? zBk^clR^(oIQ4kG6fG?HTs8MBbY?Aap&z!I0XECq=7;f28j_3={?FHxdqO&EpeV)rT z<{e%6p8mXjV1;8{RcZc-owypZ+p^PhJ-^)hrL!k*>B&2L9y#lu;T7xZv%%R=PMkk* zJD#uGm*%flJ$8CBFWfjVd*I`rr1_%Vk!Fh3p3Ipmkz$Q6+dF$8Jpjy%d**1mZ&@Ia zRnB}ISvC=`FYBIt8#`Ebk!sJip_!rVo`Rz(%`VzqnfmOR+2(>hkY*l(8ZEcp{?gg@ z_ciz4`hxkp`h3U1dEtxj{q`ReJ-aa1)MwkScjoQQPfWz)d*D6wyQzP8`*#`;58S8H zrpIj^^WNL96f6N8EHm)wDHy%Z2QSt~Zf{2UMMJu;=xzYl+A}v+aPLSTE;`+rA6`io zx3=XD&m}Va4eP8m+wyb!vYB|cK$^5V7A%bgOJlY#tA3uGOFp#hlxxB6Bk24_L5PI= zc}0fZ1?QzTnF%uo%~8S_2XX!{&TblK#5c$Z{CFj&8AAfls>E1^JV&Auty6-!nn487 zV(k8PT&uwyWmBegEmcO#I&LLjfV_EKi^-6OSig2$dxdY+FsfD{-s-H%;L(w)T9Z|) z3|jzr%Y8+R#R`VpKH7NC~17GN3JG*G!n1QjS!$W~P)g z3$RGE`n0kWcVHJ56F(U)d5&ZGk*!@NHOy}8$9Q-@~LoNJ?T%Cn}mTC;1eb*(jP z_1D~x?O?9PEK;>vt?0xvm^`?7#u~3=Y-%K0t!C8CPSv6dG_-3Tt!9*8KejO{;1=iy z#={uAp^P$j%NWV92SZ|i0xjKC%QN4bmY)BQmYM*kw5kR&%5I|VXP|8j)%K?#SBq#R zRR>fZrM#QZJLS{reFDWATfz9^*hd5}$x; z5k&!wgS90vQ-$Y2MU|!Sgw8`Pmf#765)`Ar5m7p?^D3M*A>>BdLuhm|SWf|r+>Z>4F@5>3@N*QRP=z8I z-GUua9A%1+jw+I>n?Qvz^;`+tFbSQR)`dg~X-$_N3H(MErtwjRM2TLVo$l3bYmA`R z174HlSU4J@014_CT>hYabQ{91kQyF_vFWUI3vv*WDd?>RfO_Ux0#t`VB-ywLpfaZV zV-Qdt!2;v?nE;Ba%PBcq-riZPuFrPl_GX*&_Ku>xb=k~&s?w%qJK~vlXWm_K1PYEo z&ila8k!AsOSZ&wLGv*9?)dnvP=e1)q$1;aMK8YB|lj+TbKc2qT1~9~ZGnjX_rTND- z-pqw;>-B@Tlw5Ca_+~O+6HHqkyK6IVW!dWuY15-sa?$22fw23wEk)1vwWw&#z?pYu zZC_fp6z$bG_NV<>CcEeQ>p5?sw*7&3*ytyN{W5FFv_n{JRXZv!(+=&MWo;JQeZfL?e<=(noce5*fa?uG$>%Mbq(N&AE zYQYsKxB`!An{J$*JzexS73&)SRmr(M+3H7r1XvetS^s+x4b>6Qz zv)i-mA)cljbKl*vxM^R_|4U!F3-g}&!?{G>zk9Pzi=AEb!*`D4UBP1W)*L%0Wo*TU z=FdClIy2^fsp(wwHRpER_jLfq?s}!*4`wa5+ZWr~=PbYov}cb0pLGi4I`aNqRFfw- zy|4VFc5AVH*WXUxp1#*uXn!R$@UV6pET->;4EM+j7ctkPc~>heS?0*B6_(8D${e|x zEc*P}maH@v1czdZHMLpc(}RDgtzSOL63@=%L6-QMU>$9M&2PLo`y!B*q6b#?6LSf{ zma!5zJRyiLDT4hi5YM}XQFjG@S-tN}#xipc7< z-}olzaNJfAtPolSxxqauH%Q}f(z8C~NT%hEifUTT>3T}~|HPDPY-zS02IQ!tCge$6stxmG<>{iVhK$l{nW&p1ADZaz(b z)6B~EG)=ge`veXMYo{qIpcC9^(1l0k-%%L*-F(V$W%|(4Kqn3VhL~hYoswfZKNyd}zec5dW1gm3c|Y_a83cn zpIS4N9Sso+Pe`GVUKPSijw!$gA>AGdU6=|-%PpqSxC{VD_mrL?$hISLWD-G^yd9Nl z!RjzpxM!%3P{ZktvJ;I+(J0uODH#}de)*2Wi}F~#06zt*rFcW74-^wt@3*BGaS;7Aw7FKBdiaW5Af(Hm6G>9)Q+jJMvjD(N)>OZOr@$%J?GBM?m|sz z8+9J;oH_U0bI<+G&po?;NG4?gp7y`jkN+_#2;bpH@I*X9+>}K@SP(Q}M9@SnWQc{( zNJvCFY=lR`@Rkgz5E+SZUc`tNVk0r2qgu>}7ivao3i1f3(BdPtA>p{7)qEsqGL0;S zJ^dpI&aDM*g31$3!StJrbA7~Ce|2n^198{5QR~a zr;LtH5k?KF*i<9B2?CT9OQVLa63r?oz-jI6?MTZ5CBq;N{m}8WPy$>6Qq;6*w@gUh zaf)_#HmfqKIQnI(T7`mT+8K+DXFYwMy6iL87>3q&%&lYvS0?FqQmJy zwpT{)4Gf>l$cOOL_aW{C5Ea2(G`4JdYsuElabi2LN@3-RvMgv#dz#KwX)-OauB@C)m>0GHN+_#EtvkRv@mtV|fRa^NP)9#w-j_&q7vG5$?({&U32o4&pg$~ z^G@Zvpce~DF{fH3vx@6m!nyLS4A^5PH1oZhiCHRO=s+qoqc@uo(Pq9+Gsmad+XOzq zO_&jyUI<*ulL)w8u<@1ECN!f~T;lHm;@&h5L7b>wS#9PPD}7Pl7m)dyJ~jqOnhx<{ z@{^j%+-JUg+Dl|V(=+lGjsXu;?@bPoE8H0#vyIb}=rjW0A#~mZxvUr^$Pt@#Acyq5 zH{4kjdBNFij$$Vl>3XewRCmZb$KRGqW+h0=q7bbWPzZ(#U&cqwI!FZu`3n?+SF~*1 zf$#u#p>=?nSF*4&!a@5LHBW5n6)C@RaFtbJjMV5ywhjx=5 zxHLTcZE&Q;pwz*+4c&1J+TL$!x&rshAY4yInxH;nF{mUN`7z#(Y0<4!OsH*ep+GSm zg6|l}_CsbN`8L8hc=|E)5<)uUMh4L;w}!v)wy-6b!1Pv8S@57VJmMy{1q%WdMnvdC zLYfGDM`%QX+gNg=;0OpkhIcfJ!Z4JMxba-hgu0l^xpFR7u(XnabRw6#R8kCoMncft z#JQo~)2Gh7(|`7Cf8SkU6BG#l(6V{Bt+QHblul)f%;L9FwwSjZt7tI?3af5qi&IV> zPD&YMch=BHea7KTXIB>Dp0?w?1gEsKX9iDZ2OvQBY0ns?aox-mrx^BLeCPqfPQdVy zuwI+E+PB`=^vjcMdocYJBta{(c>t#W6%uH>!q6f`w3sHrJ319f$K7OkbA;NJ5a;Q= z!+y$DU)HUI=exT5Pxq!(A9~nC5D-;p*ThW|ytE)V<+&MQ!ncRZ`NM?YI#%;Eamim5 zyzQhGniU=BrMzdREb%MRsR_6fyg?1VytfwqpY{!q6JDTQ`Y*Icg3|;o;*5|(wD|M? z+~)$EW;Qe%)}pXu1;elw`=AwqDRe@3A&NifoP2+2Hu4;-Fm|7LX3AKJFY>?-^6v$R zvspmpKaI?pXyC)y*o@>f1ZHpbQv|VPhqZV$=FYD2iroQKd22PA47Tj4Z~|%?2(4C2 zEMet?XIuoWbsjAU=6g@svc-=bZcEz>c2B-w_qylop3>@_R{~pRqyVAMh2LP#zFMBC z%Gu{2elU=&yqA0u;-Dqq&cuQ}0EKdWnG(|5h8`n8)7!9Zh6@O57jJ{7Lr3-L@X;>) zaUAB|F!U_E{JRoRJ#KhZHPa#QR=~{XR9f^z!c3V=hgmA%bMEwkK@&PAeak-HZ>hRT zy2*{@6jh}~#|@1YT?u|dX>RS=DbrCt>}SkkZq#|};(_cKOZ&`0RFxR`$uy;{iYiM3cG;hS~t|zZ0=e5PY zTgPu6zjgBF$vfLWKm8!ywz1=-g^M>X-hTbgfqN}?Tkf^pZM%PIDZ93#drtaT-Z=Q9 z-(CFe#rv->ANZ=}iiDEEC_*!J?`rEluVN}R0J zlRxj?cPn`_d7IuDzIXoa`Fj`cURZu*DYv%!*tO(bbUv~kPh5{(i(OA#OU$2p5PxYS zwg1-Mn|p6N&&a2aU8|dW=}~>-^~r0K*JrNHEdFe*zI9G|RJ;ANcNgBj@%}fpWIeTi zuJ7X$8>!}7`)}^Qv*Uhrx#_Fa7pc{bx4-WB+F47TT-kkUuJ4n<^`LO5N51(0>BsdO4XMQg zpSI6QpTu~>pgwya^LraJXhDE%5{K9}pdm5Z(8pou&~021IK2k{&B$SdPVai!@#TpL z5VtY>t_lDo-*gB%x+tUY1JiV+A!!nw0L6X+LpsK4k;YDk!QV{+>wv*+ z@IzIjw#xJ(wvX&Joc%ElXs*`^VN^0~1o<)7+h01vO1!IHcn%)lR8nz%=B;LCfkuAT*ih8Pxh=v^bHdX5kF0uhBj0LJtW zZ7fe-lCZr%^1%ecZiE3)sog%`Jl{Fj{p%g8wfk12ecY013I849V+r7S6GYtz@5(tq zt~6>{M!ErtOHQ*?uW=nK;cxa_j-k;E>#-|QXs8+b(+%ksF9WW?umRwOgdIbQHPFV${!%lVC}|_dY$u|?5CgxPi_AkhVR3oDE>8cSd{)YAqwKF z-wDZYh27r@JO3i=dlav~8hH{8i96=bKM~;dL_R1c=La7)wX8O^JQ3hy^9(HC4>>C~ zU5z{x8drtJ`BM*@T34G|@3b%PdLZ3Hi;LJtS? EpSWo&iU0rr diff --git a/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc deleted file mode 100644 index 62a508f532330a6891e25d09137badd6a2b39292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3706 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc deleted file mode 100644 index 0dab4ff9a3283041a602f364b7f79eb9f5a683dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44809 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 O@iBSjYeY)AdjA1>mEGU~ diff --git a/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc deleted file mode 100644 index 8a83022beb3c295bcb7fae6176eb5815d80158e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2112 zcmaJ?&2JM&6rcUH6UX=?j>1w2nb6^LK3B-43(fLBGW3JpkZWGCc`FJ(6JJy zav46sQ;0^RNa8Oe$+JQ`t0X*mI_j;FNtCjEqNeGlXezp9jKiEBJ5!?^6RjUhIw1~k z#8Vr4V7`Q8l%OO8nW+RL(Fs=KCFU}l;3SX4!pP^jsMijRDw*tAQI$T_j z$eJG4*J9l@zo7oTn#mtX75|^1$XT30Q%GAj$sg7!U5A1@b4H1`ICl#%b$!tEyLQkw z{$KK(2ZTVK-v6vK;6|CDmr~f3EH2&Q%A4bsUeLYBt-;M%2lY4 zrDL0W!%M9_;Nr$^*)?ABZM77@>lJHTv(;iO`XqQ=|B*$KKTXU{WHD|Y3kffKm5G}3@_p$iU8M66?X6S;tFg9p!v*@JIc{WS^1LU2ly zUhyb|wrXU}#Cc3$jtL5DMB0E4im*8>YAG3$6>Tq;MM+gO+4h~wYo<8&F2*{xX)N0u z9GB#b&8V_wb7n59$~Kb`vo@n>rp*~yRWa?>PenB+J27lpS2WwxIB!vp%^I>gZPU|P zn^N#jl8wn2DVs8E>Y_o=9&zYzDK?{LHm7w}(PP=X zIRkfzj4#SKrYchn#gW0G;h3SA^5LwQJTInXBX)M|!&uYxFqqBTUO`Ya#T0}>ceB;C zkRlB~Y|$mOK5%gP^!@Z|c<5fb61q9OATGXH9$GwJNtZm;@X%wQfBwXk6W87@x0m~> zzMYj_Kl|QT3m+_Zul1crTC-v?T>;TFL)FT z&(B?%E4NnSzXS%>g5B$Z@WRlwi)H4jwbr?Rfm!d|UFl!#9H<5do(4N^Cco}4U${Ga zd-hI#IlR2PTwLuuyc!%V#of5j)z8;Dqa-d;XQ%PYMFw2g~5SgzX3REvo0Q{}1*OEn(g88QXzfMvvH`$J^R3 zjc%~LT=c~;iaX#05I1=0AmMZl%7lcN+#Hxh*}R$0Dq0G&Wa1H~6itK!PtLTHBSs|h w-%cOBC!M0-!AC$x8f*}-KVvA0`aOcE{wJvASJd$v>iUE4qYgYr!0O@u0P@=DF#rGn diff --git a/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc deleted file mode 100644 index 686edcbe9e483860677272a9ca0c7a94dae2b59e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2693 zcmZ`*&2JM&6rb^a*omE(I3G^Z0NX%YOu;T6DhR3~S`~;W1{DdZu3Bs39VZ*sUUzl_ zab(nhP#e@rB;t@9dH|^h5EuT0-g`+(5a}w1NNrVdi)1QQoci9Z*G~8tYiHifdvEsb zZ+`EMf9vRIC(!o)7ax1967nZbf~NQatq)T|7KlL%YLODnQHpZN3YDas1hQnvmRwSD zN=ePBFjw@j5i``AaxP+Y7-1OOLgX|tA~%WA#?*ldm7P}XH`kXpP@sFdQrVx zwq4yd?Xm;Y(8&2`fFMbQJY}S$k1?-J45v(sWecbY8p?nKtw%suAT^?sDour^^X(e6 zk+S3JmZj;Hie(nW_WPX*E0{&Ipq>6=t^+lAM$iq7>?uy{;6<7+j0 zbb=M!w6MuOpk5^3@PmlM4bj1Xv=`%!_ zWHs6~H#~P>_Sj-_Ija30J#_cd{gd~;eDwCcZG~d}0CJ?Nb+QY{D z8g(0aPu}E>D81AS`mn*{V01c+(6x|@rzTo06liYHH$)W;Y+GZkxi8k48p%VA@|z*U ztQiUH*cE76WAmG&n#2<|X`;KO3#1we;-aJqKO_Za-*h}{yPEFjRT06ar&1w74$-CB zy-=~@$u6@j!3Iy}OgFsf#cJ8rr#|D{=AP^@cG*+%CEH*yIOa4CmJN2YU18;vj3!pm zQ|)5WVXh~YoH0*D1I7g{G4FlqDS7mmPQJo|v{3AYm>m~7AY)hWLUKO2Ff>1OXUDAi zSG;e|UAQ`bb)hz2yL z3j_o68>Ai0a->Cya%BIe^x~LNul+(qr7DfYML+#L%GYB^%BeHz4knw&!mNNET8{&Qnwl!wP^E_?s^G-%p1%p zaI=DSokIm7B3_nIqOcdDOP8RD^#B zis`6eOgl$T^Ir+;ulW&S;kaC@X{`Cmwz)Rd~e%a{`n4 zL7DE}=pnRcMtMrQmr3_h&pS_h_AU49TS}k!HMv4YR!R3Oy8CQ}99}2=sOVoN{YwLT SpAH;Y9ysvm$P;p09NGUR2TYg% diff --git a/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc deleted file mode 100644 index 36c81e750a1952a9a39bd6f1ad6d4c706bb8a5ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668 zcmZ`*O>7%Q6rR~#uO0uy`FCQa=_)OyhQ_9)L8u@KqJ&1JX{8DdM#$QD$H}H^ubJJn zvE_=iszd@vP1Hkr;J|?cRW3bphMM{xSPrNtlwfj5P&U-WOy_q*} zzW2tzCK6EsZQ{S=-0vzOf8ro$A)ldphbSQ%#2^N>NSWp-MP9O`vYeNJmkq^I%AtIy ztmai1hxD+KFx2ZxK4NqmVW3?S`Is1y>%{0{>cT*nNh1mtafz_dLb{_7 za4fbk8t@&;Vyr7zgA!po){zF>OKjttlCROS)B^nueX*qxGvaen$GR5E^gKkP4E17q zrDD6fYuXhDhSK!8hY&@Qk-X4!S)XHGmmpK7#b$~q2^#Vc4Z0TrW`i_{PHHqG)eBJ# z+H}Qnb<5K9YSl7}V)+TD%8F*mENZ7uO-*VhuCC4N6~kgY8x>Y3syf%p!Q=_;v@g}{ z*#%Z~vqER)HuWNfmK}H;Zm|wJq&=R`&D&*`GZtrAEm!3>8alb^yzSamo4Y03GVNTo z=FY=;8NbAM&N63P6K`gZ9?LnV%O)vmy}Zt;IRBlC9Rf z9?s@W$7MWlh9|%S1dY=L-7?wjCOxUEr}tn$o(dg;NQABr7z`akHVsg{c$kn2BqPr} z#GpFZtwOL8(RB1SUY1(rtYj|vN9A!4d*Om!EV8Q0`(ZSWR_MVp*@^Y8jjtVDInf-M z*osXwl?mPrf+BqF7QkumAWUr#M)K4kdC8!889v1b84^G|WT=J=RIMqQu-A*1*Nz6l z!c%bSsRLq0iUS^pOThy!wD;^V3mArH+GcBfg}SY*CNHxNKVu3*gKoAE8c-);NLM5m z??beP6iBYomv|KmbUU=sUKguKgA||w`OQ#Z)b<2c>jKncEqRT`*sZ{k8msyrTfTwV#8(!=}t>WrS zA8~GTPjMK#=!FVp+h9N(vyQ~FK~J%(tddbs#VUEKT`D=u_2jZM=c%Z`xTC;cn9)Am zLIt#_r=CMWRtR1LWyggM0N6XYky=k}jINK~99vQUN)D~L8<*EFZ#32$KYVcWtL@~g zJADUMKD^(z?^f}*zVT*!{6QpsBfJ{E5nqk3eYPDL-BroZ$cpk^bZ1bI2e4#%J$-X@ zMg1ezyA$ubac1?*E#+=}->yvJeLlcj2ml|TIKd}yh|u34=$PLi$>VJ#ilb*E>+IlMPBig8N0&Zjv$rE?Hb^r*=m6H^8gAVAXC4@>iZFI8nVITpuwx9 znf@!ojEutZ{{cP*j_$hL3!l3nz|W7uGyq&O%X|biBA7)OS&l{TIdtO|{4J22MClvQ z!99nQ&2Z}b%ResN8QR|e_D*+hMZVuXxK{kuYDUucmH5|ZubzcsJA3Q!UFCoXXkE_E zPu7*}yio$zu%vKI4FL+C0S;!d_2se8 z?JxMG&~RL?HMGtG{=&TorP3l`5un5|nx5*`s%B-5D>xt=s~5)$5HS<4mR~y(Pt|oF zLl_G$(SGVM`+4^1IgFXt-&SEuE~_~Bf8rTXdXaa1h`-0*hZQj6oNu7pl_{nF4iS3b zZ!-7~8G8^*E=Ts%Fiq`^Qks1f8KT3ty6z360Q=q(THx6 zNl&B>y@*b>5!0EqJe_lbPkOiAJG*DHk00qdy*t^nd-h0%wB>60toO|9!{_V|($1Xp z;(*zq)lF-&_C5Znsd7I(}C+y0n|3{stekWK}Bk(|(4c z7Ac(1hLnZ@1C;upal$lU0$7GO1lbAmfO*0)V41KE zSSM@)Hqvek+9wy+a2(4Cnq)@kMZtD6DiW+!McyqA=`>2r?U(939-<)zt;f&eM~^=halz%uRJz=3TtkM^#Qj`(?V2A0a zco-I`NWL$i-gpGk5>LmdfI)jIlo7;2lC}%l>R+V1y8bA0bg$G0pJ$XJ;?!_NHco{m zeZ%82BMLrVww&rY-raNIV&6ay%$^wu4+SKg2KObub1Xa|?Bu70gz24=VmKfSN2HyT zW8p}6GAu?$!a;v{=j3!`3|3MQZwlhhpnphh*weXd_fE+l5jyZyu&UC|m;27{?1NP( zTA9wtY1tAIZb!yoCW0td!h2icPpXG(mRhqq=bukJpQ=i`Kd8A|^V7pCP5W1@2Qtio zr_fIgtF#X5g_ZoL@UTe5=+|HcXY?}+tXY0l2_(s4dTp&}3LuIxsX#ofLChFp23|LQ z0O*9B*UuOu`8|jkHJCT(h)Kg9qhflVj>2P%ffD%Lh%Tnns446T)BgmI1UVNtD7yV} zXgn0Y72+iSXowuJc22lG3G3|-jdESL;bf5no5)ClFfKY_lx)2?9g6sF_lROxlufvq zgL`&+O`;1sZBoQ1Mh1gIXf!egqx?}pHjp;is5a{1ZL)qs8kKPBoRUOjDl)5Li-=p{ z5vUO*U4v|vT4$;1=GV{7UXH(*W7xO)Uhj(wtBgBmam;%Y-sJJO+h4B*! z=Qt48uQ_T`%`1+^4BNP7tw`=oZA&*TdDE{f`|b{8YP#;XC_5@v0saj;igE(E8z&(D z19w!%(@05UK#8!7!j3^*zqxHhNA^~MH7NZEJ7bJ7G2s1JCv>W-^cjgU+Wya&3a28F zzmM>0HSutUVkX|m8+e-6f2f|785Y`EKYfuZ8jVC^Q^L_8nW(39hK;C_5^$OP47#Z# zeI4-5m`AA@OUyW9jahkmycqO0UXr&XZo4)2;Mi6V&z&N-1s~l zD7oV{*fVEnvR?Gv z>VGnejWdu%s|gK*Irw-ac*A4BqlF-MEo$U~!bs%0OrIt6!D|!o3KQ}t;w_UcBVu@B zXli6c5M_NxxFs7zUkG@((Kk6Mgm~m}lcES)PsvOm3>;kNpO8(HQ;{KGi1$_yS}7v8 z5gRZ=jX>Oj(3VO6Z6P>F=%x{K>4t3dhj<^5)m;c+LJWic+cJY~vUzAaB1kw}nZc^e zVm{~(MW8Df9v&x{XusHmgBctwRX|mty2Ux6z+xTrkqnL}CH)evA`o9kY2sT^mAtXA zJ=L9dF7;+Bn$wq-o9VnMc)iId@I2ZcCb8I*?>@uDTTe!xwT~+wz{fj$|Kn+&Q##D1H9N zN0QxZ4O`QPe$~*CqH~`5JJuy@y8Ba)_cJ}!*tu?`n!L-q?%H68+p~CP;Y^zOz|NpZuDbW-%4kCiQDoP3h*9s@6<->zd2+(AAuEHK$K5*WSPQm#_Z()sOhU`1Z$_KRKB> ze<5?}@`~#f_)?o=z9-Q$|5DtxBDtBcC?NE&p&X$DkxaxF1u*?vt})SXsydy>ryAvwab@& zcJ7GbJ~{r$jTP(pSvUt}NjJG2&u%p?HreVZ(8NDbpef1pHi@X9dewp% zga|Bs-+X+&o_)nAZHqzR#Y0L`0EMzmDP|1VHZ{ScHX6+?%7FlO2+Rm(Xv7&x_WZMn zJfn!ilDYqR#G&DnK==UBs=$8p>g*e+41LoDDY&v*(h`l-0gs#vIAB;DAS) zU7-ZFtIp;Bb+uqMky~v_JVVqEC-fqp+LQ`H;0y?@%4+kLuUa>+wf_ljn26$-gwkf> z<^Eo~rPd-dz?_eZ_Y(Zn7=#GRI*<^!(+JG&PB;AP5CSh>)g+ z{HQ{6BVlpE7vb7OVQ9)9E%#U=G37mXN>r7bCEH>!VC&Gfl^eutO-Q%Ex z3%&`N9+B`W75KiQce#n)H5nQm42#P2V5!7&067VNQoAAs7)y%*st$JI?T*=#z!_O< ze0Ti#?5#{i`vX&Zj#@$W(bBSiSI=sW|k&dg#BG)vq(O zbN{-YvX_6(Qm%&7#dmgQY)y}g-kYneS-iS%HFa~PvNdj51D1I@aXJ}Yv2BghYxc&6 z_Rg%mbNR-KeOJjjS?%)&5(kna53Kb$r)#lxp*Hp6inBR>qG+~`F4Q3@NyMM|IsXr2PIGA-ywbfYw{Q%k*CGHPj1OCy%NNnjvn1p|!H^JcZr zqLx;{2)#DatK;otgoCt|sUyl&NGIv5Abl>i&;6clz{J-Pqb< zk@rAp1*7s7#ca%TeC?Zt0o!zqw@GHvzJiDJDYA3_@UAYk(sf8{*{ii2)LQmvEe9kr zDzaxcsYDJ=j4Lg}llxVeT}qdKOobUMg4w442i2}1bZMh@X?XT36-kAW0LE+c>YspJ zk`f1C&SDE>UcFK$4X8RG1RQ-4Z4ep+sgq2B5P_*sN~Yo{G^jX^A;fE#sSO;~uVbbR zdD4aTZ)2t+C7mQwhm>O{8eg?}kUGf_Vi?sOE#Yz!hX0RX@{5!oEKLZgq!=);L6vDx zMf!g%Z+9XVEZvO0$g-r<*bFd6dWI=5<^od#y)@6H(Yg`S6AO2^!0w-U14wLO-vYKn z>|0-fHD)N_jRNZc+{U67V2@xmfi|#pQ335Ei^`Y|-3&3hq!qweVEF-D;Z3Qa)8ZS{ zw`*TU&xNL$X~t`a9h_0j`htF*BbpqiSS$OzW?9bh*o!VvZ)SCVUj<^pQ zNWK=zT@`2MSkQ~0Ft2&GruVLR+7kA-KK|-jSyfV+i{&a>;wRTC8dAe66LkglQp?A57CsW+BfJ%Ih+06+Qhl|@tm#lz1pm;8MM8I z#ERiy%jB7X7;0`e1Bdz|b&u{x4+5IeFUkfmd{0QC4={_Jka>+F4+R)t(U71B zA+vcXr^sTZJ=knYZlKgoK3q|-K~$@HJ_O% zt_2u(T?d?+^2)gF+3kR>P`2Y0sDSEHQuNlA9kz-l^hsCHFTwt;Zf~*OtU!qrPent2 zShY)Sut`ZEPfmfkMlXip^@=q|KjFI#4Y;i0IA%?dNjOhfLDh&oBuEilzM`w5H9bIR zR6B9;+>4F{$4WUDH#{nH=PGt>ycA^>$$f7}Gi;5rEX4#K1yFKI{|!`-z|VXY@gvGN zoWB><^QSl_ig5u3Or;z=1*IPe`Yb)y64RABojPzhz}DcbHYFgNv}QimHUbQ;r{L`B zVCm`TU*&0Fub@)EBBLM@%|BADa)&veDEg*nz);v9jtC&Q`y%P)-U9ns_?E~TKX^*OHO1ZXO)I8Gyft2f=!efHw@%iN3h3yX1lycI=&X7L6*C`ROqm%5IbIBr zDlbUG&s;w%8umbwAxFrazko%pk6^I$Dr7)#ZB&^vuFutTcTO*zPDfVj+Y@Ku0=DK{ z)r$ug4lW*9IFe>oT-(4_ROZT-ZON6p7A*^wrTyua54?B1%a`u&U8y_xY5Adb6V=cG zewK1q+(M3Ae`%qj7A_Q85oVp=bR9!AMHewIUVw7|BqY%aCMV(~fs!~#c>Rc;P+O$I zn^NJz!bvZA28(o2eM~RvV)~2ddNH8!DUi1#6wv00hTaTrvw*eGqt#%v5l0u!E#hpZ zB6+Jr3nen>2*&nXldKo05-boC!;Sp5n4xBxr1{cvCt?7RNq?CpX zPK=SVmB)|Z`FMWe`FCDObg$XVlkT^#rkcM0ZD89e=R$Al5;)7Qq|=Z7{A-EVQmrfYrnv5r)s8mTK4?t}iNS~VrmP)ow#{I()#=SnG*F&NoJp~1 z*OGnJ)(US2reXfw=LV|W^IM8Wi1Hj9Ve`5H9=;^T>0fMjAAg?u#q;J97X4qDX~#6uwL!lWxfYq43<}r42Hp-=R>`hkS3$mX zm+A%lxWM8cV}_W%tm6H{k!zqfw{ygE+)485;uv(Q(9w>KsIGG{Zet61KQ`kW6};9W zY+kzza#hGTAq)=6mcc>L@Tb5&Feuvw2X9RIf=Un3!-+#wJciS&!;Fxe5v&p3ghxs_ zP2YvuJ&Iglax6q-)g=27R3tOp-Z!boHC$%v{*329ruty+53E17yE9cgGPdV(c6V|t zW7~q|XvWsKZelzZVC9}I8E$W;YG0;uf3CW*xSlp;s@j$h-0#ioIFhM+egh`NP=u*! z6Q-|+{mffqH_rAv-Ct>_d)jF-R6eaR7;2w7tOnP5J=H_^(d+sOLq*PgoRp8v?#~VI ztgI3)&@lYv6R=iH^wS~8i#ul&TarJ1dOFK{pUhPiVWxlTVS z6GVbnxY5b6Ft90bp#e8UfrBU-!6^(mY3GKfA_~(3Rwns}g40|u?BmH>d>rpbPnHmh zKqNp^P+#dE;ikh=+ysy$!f(OLhMm4hMDznTfs7pzU`7Hr>`8{#8N}`VgQnftsA}#SoZ5^;lp}Df#{D zxD1TQE5{0U%y~sMEsd>&(^@-ZFqgcJ0GRVu>mtlb$U*5o5++7M6H50Jp7|Ac^J7un z9?VO8)1YefD~xU&X0gcu<24idBkM*cWd`?2HXx}J2cfVvY(v*d!|pgkOp{=Ntj*Ol+^Jcrd06vYw&uB&nhpSWJO&N2KhdAsm9;g1f6sB( zv3w)T!P73(Elc;T8}yZyIP(LuBDAYViEIqk$uR_j2MSOn)yj*M!eD4vBD^2sI{;j? z0AyVhtt?M2IuWoMzaAx%S?Y0_Yd)GNtvTfN+j@ZCa2GbqXRQU<4Fc=*AYZBH9|D(9 zC&pW~DJjy{O-j5(j7<6aGW``dMu7+Iak{h?j?++p}>_G&M~@kb-%}P-M)?yBFV}y_SA)8_uHjq7WhB zP=xq_cF=aq&qv1E!5ZTq9RuM)0@^2d#S;i@Me^6Cwv@OD(cPE8-+AT42n=K@ zijHc80Vpi0;^J4Hq&hrFKL_Ah>Tkj7KK1tDl=J&9tl26vRYyP8ef-j@?Lw~1onr2o zm(1zyS)D+&Q+R+=lScnlJ>^x< zbhiJ2W6DZnR`eY-Q_Sj4Q^b>4;{D*Q1b=GYdZdfd z7Fog+TQZ=jBo)&34{a8uzE*n^&6dw?`_J3CJM(70gd84WRP~q`a%DM66j;Y=RpX5ngo-EIFE2B+lyx~OG2iZ7XB3K zvVl+~*{Dz@SvPrGQ4u%a`u6~MGylLBb>gizLI#E@Yk9_6|Gqxm{XyT|zMnYmH$C9? zz?F~Byzfe1`rzu_t3PSHzw1HMUW|*uo8Gi!!z=5_xLPu{7Rb>W(YMr>9!lRxL1aq2 zC%Hf8X-FHE?CG2L4R^nj@$8Ft&w3Io=n3oc6j zMtw{vuwRgx&@(_R zPN9nLmZXs}aF~tc4cf(V7Nt~9?QJt`%oIR3(WVq*d5iYFKy}$t!JZlpbbq09XznV5 zJ`pom%up=blr(7gF7Q4O4rWoDa|jIKu;u{TE;gl@B~q_7MYd?QLNF`}KQZe_K4=*1 z$Kd~f)6k^B7Rtz0t*)&xO%6fWqG=tUYXy_KP+>3^obMFT5_OG@<<*5%d7y3Q`y0JbY}TEYXPnZwOT zMg{nd&!l)X>KT+^-8zpzJhU$;9qr8b+(4-ZY2*K*em6^j&GO!rbPt3TpZ_Pf?_K$O zVqbrw%t=ReNB!jC(z%mdk!8OHr{S%XO<gQR`scAa;!iw1{`GSr1%S zHWE!uLgO`2?@wWOA9gc1MVSSIy`szoum_#Eia#G|5(s%BxM5|(OUHZrP6EQI2@yqU znZaOquY*W@;y=a~7R`caJ|<2|xeNq=n|@w^z;R_WZ20y;B`8dF3>!$7%zz7dQa0gw z!l8o4=}8D{SHs7wh*te^kND5wMUn$DIG069aYlgo0=`H5C3N@UBEJAzGfRDLq1ZAA z`vKc{ah$SwLo}sLVOt7Y3krr(04-R-A3%12a25w}FcSEhult;!KXU&s!1}`2A4j zD!TYDaUs+`;HvzpD{prd3rVr2lyTjS`p6r&M75j^;Oz*Fq9`NTY`;x4L;C|04n8uXn zcdHib7V5w;v~SsY_uz`N{ZqCBW?xbB)B@Q*eAp`6vEdD$!YY~oLy4pD0}JdFTmSdJ zeTk;3uh7I%`U|7`w2^s+ga8?#pVq=*L&F+q&~z<@H&02ZdlE-K2{HB3;z!U9KRPsm zas@G<#pbmk=n*md9v)hBIiWt}Om0o?iXVQjGHY$jFpWf9jv9#l9mIINQ9FrQ6P!5{ zK7VL%kmz|)uku5=!<_PC#XVf!YN`CJ6MlxsUBer7UDk<1If5OaiXt77Ii8b3Gs?4{wAQ&ICBLCWvgh}Cas0&0R?B5_$C0ss9iYf zdzc{+QO5sUs70-C|3MES?1lkY3#}RJ(AxDF?LX`FXi4nzuM^u003St_wKgH}{VTL;Z z>RQkTKXVl)WHb5YBp#7XdYa50QJjTG#s3OJ;ILAX03>!@Pt)|@wNiBR-%#dX3%voIPdMulFE9K#SQa%PRn*rL_Yj@Dq1PDt6!V-a?BtTHE571^63QL5-5}}|Z zP*ARWn(0P@3QGjS5`my3Ku~^hmL8(%iq9y_Kfj>wg(BJa(7iqD-u^j-PfsuD4$-cs zw_z2wfGLu8&l(<5t}NwBzVy)DmUXu+cYIX6N*&Kp9_;aCDNm~5VNFN2repcmDs|v7 z<$7kswpFStSE9Wg;q}&d^nt$Sk;xL@gQkiEsyIJKKI|u z_W1DpSYj-BBQc)ZyK3grCmuQKQYTg%TOfkNUA=f};Z*9%D)=nAbDg_0w%u79hqjZ{ zzVx2=55iA8NNigq)ss4qZc4wHKDfMV`SNn_{k@sWgP+|18m8ty#6#s1*d&`$!Se4c7u1Bb9&JeH(b0EJP#-dQ3?ZY(2=7`! z7c_;;9&^azv4qMzWg)A_O3U@Z@{rAAr?3Iw3Xg-rMu00ll@vAsT;*|6*bK1CQw^}i zQzN*9vUfR8txzpk;aR6*E-*s*yNqBHjrY{@96a^3)DEQ;_f)yE23qETvP!XRxK5dN z;hAsUsA5FR@QZ~S1ri&F&nR%=DK?6AN?VqpZ95CK3baGpT4j8>mgg1x!n1Tsp=w*p zu0jh1+M%Vh&~ifMu6cs!ZdNk+!r@5F7Yjtf(O!7hotcP<(e5j5mBjhQKu}T#BZKgw z>b@cwdwn5MxH>u#6rTXQFm6sNI};k|4*3Sfmx7~%fv}{ZFOq>i&If{`RQ6JMum}S_ zp$Qy35)>(L_z(qDkz@E8QOYA&9_8qaSjL}QVESr;9NyW@y?SKW1Url)*_L9tW>WoYv{er>0{8o@LhMOykeSpZm_hc}=tDEe zDDC4gqDd{Zh1qUT--KCC>L&FuqzO$iivlG$We&=-lS#2})k6zI!XRj?0WqPw4lEmW z!Ml#W>*;&BQZLBwdZk`|C+zJ#32i6y)`!rSF<~q z!Mdo)+p%(`ZrH9sg(rN&QFv1z9I-s^NmIf!$WEH+sNR54SrV2nAJtcU&+^sZOPFu6 zQTFz+9p+~#nxDBO1xy8u+i!9V%iMm*G2bx`JC*qrp7(O#WLctY7^l50B@D3|rKpsM z8*Wf)3r~Uh$WRbpJItc2Fvb*no9A}gZM&3yW6cVb&?s%UKVik$;XMjo;i=5BR3Cyd z4hI$83)X}NI9c@;@Cl{Im+XrjWJ8Pc&4dm(8uk!TC3Im{(3Tu&Dd|$^L7(qIze5jd z!hZ#~mF>)J0#n04zb3lVO_SwcIivEgI|sq6VAAy{F-xJChf7P@{JJOd++652=2qye ztn8!>_PQ5%c)wCpcqVK@nIiLGL?*#XC5R_htKbZ`Dp27mlz+#dw3@WX+LfANP;<7Y zggs#^!Z@_O9;As)uqO=2WuV4X+{>L7gKS}+gzYGMsFK_zC`bN{-PKlAGfDG zohpD%HHivPyeey$*l`6fp%4wUY#vM`>M>UJf^OfYU&uVm>D z#6rFi??8lvd@)Jg9~zM~(Lh{`x^-^V6Fh$iie7+S2xA5?k1&c{fRU$2jSRntFtR3; z-$EEQOMpR+GXxGV;MOcW$_6pFO+Bna9M64%%9+Bt~} zK`T%VBO?=%AvQD`>JR$@L1ID-<11p+7a9q|tR!7eNAFqBl|D%gS{*2nVp!s0VlYT3 zsc~m#utkw9ZfLwl68k%0k93x6aSAyG+BSJWGbNO~WvZ^#$DE}7)AepH>IGkkb)#ybBf zA!0Zd#Ub(~)93#7p-4z<7e@QViFO#;u;`CP+ed~XvB(H4#Xuw&h_sJP#D+jY7s*YL zvCkB_fGY$nHw_ZhOFKy>0jB@ zs4d!C=Qi|AS^2H=Sw~gsxpdQf+g#gPO>3s6bOjwJ~FDTzKx0wIy5b%9`!dm!~eL_ph4w{+-pn?%cEH z+?R3gTRge8|6~S!&Qtea&N#o3;dz>&PNYVK8rzvt&>e&aA>Yu{+2d;g8! zt4P20yR{1>Q|-=J+_%oJ+nh;F)>S`moHI^YlA7er$9m(meoFs+d-~OdzTbIs=G>xh z#rEu~{$Ms=F|ZK*o#4#*Wp>4OXjOmspH6pt|JymTJ^%5Er4t$Fk>wl9B;!2s>DZJx z$t4H!ZBys()U4|3a__0i+g1g1uIj55w2IW#JJqZD+Fw@G+&P}q|DCA}$#8M%VrqP$ za@E}O*jkYy@5R?^`T65>#~1n*cdyj8r}XRP)w9+aYt~T*zxB$7S?`Q@;nl_S%U72! z-#>UixKerPp`+(tb)3ztqm)0H5v}wh$J83A);Eg*Ct9rih4r{Th zug}^Yvn?|%cic%GR_Ug6DQ$rU6vO6ByEC@tq*g)D{ao+*tea)*u1(l^jK5gXLbH~d zvUsR~DNDUCaNr{%O=x`f!Lic&1m&fhCAfRx?9h%7aUd`r#m;#0D&&&R>+}1?kr?s7 z+c^BA6_CLuH`!86se{QAzgLwpH9q7T$!k#VhkridFd(s;3CL#|k@2ts<59f|t{_n@ zs7^sCh17Y7%R`zxq|HORJfzP<1_~LWKU2QUoQEt3O_aHBIeADuN|F5ve2;fDl1n7(}kRe`JITchU=}pIc+-qIeV9xAKs^g$HN|PPQAP zJ|apc+KX2JY7O;*3q$Yq;#uPLN=C02PPfq@!e*}*(1W=etJhoPC-Hih7)nPj zBW4NsM^8fb8$kE6cP?hl)^{#t%WUslmNWWlFu&84HCo>3mTL{J6%HgBBHA1viRFH= zx6+Gr3~CCCBy7Bo<&o6x!~k`4%rZW%wS z21-I!p^W$ul<7E1JpGpXA$!h&Zs1eZ=%X<>g&Q0a$CO5 z>xH?;yxz7`!HC}%jGhKS#({0aMA2fn#Vq@N9Qsj+N+CFD)Yrv{f6u_k4d@JpMrTK` z_rh64@PPX|qxw^9mmk&8kA~=|uDVrZ6lx?L5kVV{ioNbK@*)(_qfavRO~4|LpCcp! zM@awZfTRHhoJ_!R0(J-ntCYi~}TUANb#{VVpShvufo6;(;@wmw_wgop7dsHk=6j`WS+ zHNdL{UhU3Q47J>!+x8?ovgH-C`Wb!Ne#e~b0Cl#qD&?E${NPghEU2jPa%1M|2XChP zlINk$Rh_oY#FAa>_R5qmZ3A8B?0U`aY*lU6S)Z-mm94HxADnZnJK>S`-I+k;iA^88 z)4g8lO54&Mcixbz`tQWEl{KJqU&%V_(l=+m4PDpskLs>2bS<-YFF)Gd^T)!U9lk&Q zz_xPo(#nw@sCoGE)u**(wPndm8$4s78snO|K4Y#=U;mkT-^TNdeecs_OjTXFbN=Go z#Z2qj)yhts{4XnOm7>!RxYf$bN$z__$|+kI7nc`yD!Um30F|v$JF1hJX8o!m#;XfW}}K#JlqX=7I>4g$Hwzj|}j> zV37CS1nb$?9|XY#?88%!1jrr%WEEJOJXKPnZTa?K?8o7w1qOu8@Es_S*dgjH$nhFA ziQ^W9&1kQG4rtK>kO7bBnYKe8dw%Fyu^wCUEV3!vtaHYh-ZlTs+%u2Ln-@J9>#>LW zWB>D!^%xDpOgA3nwgh2N-@S{<*_F)tT%_-pGQvb7OXNX7v5Zh33V|yRFO3_icYs|C9QaL+7(j*9ZCy4O6)f zwnw>5W?H1Jl5p0P&Yb{Irp;4YK|!r^xVTNO0;sFne&~ZO!Nyzj%tVx1%P z9tGIzGIU6$AOqe*Rx6M#ik}5y$)wT)P3YlU5N}G!-vVBghm5jbxnnv$6;JQZxeKl? zA6}_B3Y-WWCsUx9gHSo46i5RtcG|WHmMUth(%d(UYq~8ZRHZmd;ZsnmO7ihAI`Foo zBDEO9gvDdeVg9?m4~Cb(f-Q~DLGU)%xY#e!lvT&7?bo~6g6%yg0~D6u6&Z(OP1 zgwh)5#Pu-+MRORvrrXm0@9&oypP;5{ctN!+ISYY9EI|_o9#dun>NV%hQxW7&sn8ki z{hJ&d5SmFX4Z!YFCOzDwK!s;QBWR(g5+O_!)Z?7_|!c#Do?j1tX zCJ15WcJ`z({HQdZJVFc*3%WQ+5J8P0ZsNlCFKZ!V$6@!yEwIj}A_K>?L%YI!*D$hq7Yo2wP?^SO?UF zRZ1916ZC^h$hIWp1DBu|aKrgPUIA^(l>v}C%}flWpPY7sbq1y{ue=ZMQ=r0=fJ6m8 zVZY0~!Q4JK#*C}qV8+=0r(TAXUfj0$0VCBKAp7E}O5+H8Kp4;CP;;?YwkC092u_9I z{+2^P)ZmQ3tHkz@W_ZHc`#r41;IX^*FnWbO>~)35?< z_ZAjG#0FzVTnu|c&kQ+@8R}G$5p8g=zXrgSXMD{U92I4otg`1yN2mAdE3fvR?YMfb z)7uU4sB?V~Dv5-_oQp~NkT&4V1$O4s{B0Xs?qq_yJasSW#jl66=Fo zOxVIJ2VgiFlVQgsQw(l41#_iVC0gUn1#}FE=EeS^=wMRTFZYyPdzYc2phwe%{BKYc z{V6O2C^JUJUNu`YQ=!IU@?*{d6dVFepdU9$q{ql;n5dt42 zut5DYm#0)ITk;rs<6AS%)<>q+U)mbiY^@nv>*CdqUtfBC#dailX5DOCGw;us_b;CL z_`=eKRr7Njuc?@Fd(!aqWff!RzfJ?N7Hj8qbGij~&iI3~i>i-xOS)xt$+-OTQrXJx zqYs_Ol4ovrWdX@K=UlMO)l6MPO*XYF_40ak(|qGx zpG}^bzA$wm)iHGumDwt)EeC+UpRl_{M7c78ZhlX^<`QwtTc2zusv`*=y>4BH1wuS8(Ooi0m24rwfi%*`?Idv ztg8m6k##jg5G3o`y=l_cRn2s6)G?J#3_GPeW-g}KtfMlmnmM2LeQ@eAfc7+*ADbIn zxG@)BJTv#5Om%z4(VpsfYGfLl77i|u56A9~E#9~rzk7Q54!Q?}`u4-ecu zu)O!j`#;&AX?o#PQ>N)s%KEt6k)Ky&wY)7`$Io}ob>`vc?RnTM`+I)hZ_XFOBx0NZ}nGvis%u2i<9RM~R-tZBxS?p!V3_1J1l z8vgC+HI{KT{fgm$C{BLOdE}AvNVc(gj(hB?|4hSF*KcT`>VG{w^);|QkD~1Pn|;ka zTIN5s9qMs2Kh@Uv>{b7C4~x0G{<1;+U-T^G;4r7&kk1X>SKg%C?JY@5#Mmf-_-=0` zEP}=GA#NH67`bn5^TWU8X3x8|vPkI%Bq}IAH-d|vPw@SbNRT!qC|bUNMwYMvcKx}D zN})EI!*J%X0^7)~e+ZCUPX@4H5VIl7-o*@~u+)?x=x~uOn_+}7CL(Wm^bQcr-h+P> zwZC_nP1UoSUUpMpInD8>W=>p+J;& z<_GU8l>3L!2Pg3T6W|L0GaVhX*m(<{DlNP(79)ZF(U=IhFiOA&j|t+mV23Tafn9|L zc!_}*0)8Bak4*4Gz9{eG!FMTl6>WiTeK9_OrNICU8@w<0p`5!#@xjosG8EHomWD6=Fahehh|ASIH*;&0uD9P|C86)WW_;++&8nlz!-(8S}F4u!_@i1W0C5slEBy)yA2?&$N!U@Zh5 zeXqFeKuY+~;X}ZAVaj^)O<-KqGh_l5x)W$1FZ(IKFAAK{5BFk3^5S3!TwiTKmD93+ zYbX{QiJoY0$7?BVgOSK!P{i7HAMptytOM&_Z9pR3L$+R$l4eQ2*MN z1QlAZrMv<#I-P0) zJH`;E%lhTf6D3IT0icr~K~^*kdPv1>TPA_hq8I0Yn(i$IE;68!^H5*?MYmO+v2eN= zQH6y7XnPW<VVDUpJPH|gexC%~QMW}(0jEunsm4zFXbclz0 z9?Xbk7z6oj%y8N{pPr<-i3&P-8;Z7g^>!k|D@X=6U;`OU4s`PoB@Tq?Ec02BM%mZ*cIF$TuJ zoJu+VN;&otd8bexx&upW!C|ziwx!ZzxQ84GiAEGknBs*ExkJQ(@#cD<(TBW)O70bN z*z|d!0)5yEH3~#*rOTmZenh1s8>Qz&@8`Z(h&KNT7Q(-bke%J7C~b(c$OxNAraT3IhP!S~1~n0<`d`81%C=s)L5Etn}jNw#hma?r-2G{}t5X zH6rWuv8iJZO^pkkA6~e7;lrN0Jc*JIdgKYqB&F1ywJH);eKd# zXCZ|5`qb-dmWGU_Asw5an44I!xRWZpq6RmoKz_q*sy#D%K$Ppy)VVfu4WoHklV$qE zdndBB_46m@P9!^T_h89UxF{&h24(_}OpWVi2j2R7SaWjK3>FG+D{`Q*8Ehb!%vub!)3IGU;6zv5_xNGEg&2Tt-_YR^>9`mWszul_+zvU9q7syj6Z zcN-te#w2{P8*KJ3N^~HDEUi$)%)-G*PY;4pU5UY|MHR<+z5+C z!L*`w8Am?Fwgp3pwl!}vl;9$nSBUuG0+d!(XC=G*1P@WvPXZ&TVv|3Dp1@H<;G`$9 z3Cg%|y$acq$h`ZP_$j0fosi6BAK@!z&*G%70PrsJnaZxwZ#=`4RlrTs>XwIG)h5Sj z91sN8mi&>^{{FRE+)MB}9gFlbwU<5!KOhI6ff=;5tbuwK&_-Hl*4^tFjL)o@T%Cr zC|JF4RgB$;b z+x!d0`VUOiKQcA{$n5%O=JX14`X88G^yicTaGn_}Z)rER7g@G?)1zWp{;A%?R;Fs6 zGVu5xbzT)~{|v+`Yk%6KIm5D+)bX{7y_t%=PZ@mMctypqj$4{FrXs^sqJ`@rF diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc deleted file mode 100644 index 6037801b260113af9a6a1c9ff55f901fa211c9a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12729 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc deleted file mode 100644 index dc490e4b101c83d1231b8306c7dc46fd9394e3c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172275 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc deleted file mode 100644 index 869c913a9f89c5623d877fa2c62940a2fa9a98d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11243 zcmd^FU2Gf25x%2HN+M;+Rvb}w9B1t~t>{RUg_ z$L<{^Q&1bHFp?TAn&io8fuep2q!_4^_91y_fj$=Kiv*&G!Kb1{AM#QNU;-3*>NmT0 z)alQ%Dg`LiBe=77yF0fxGdnvwGk@8!Bc|Z$`FGoR>@h|82i^ErgRH2vkg6!R6kX9( zOUbL3RaMbLdV>|pH(YK&eXkzA5xyMOAJHR#5x^*5RNtpJ0yY9R0X6|P12zN30Aql0 zz&KzFU<=?5z#V|CfUV7n{%EtZ{HO2N+ipZIx2@T_6RkUeV;6Aj0&E9t2Yd+dA;8^$ zy8#~td{}=>?*Qyr@fM~h@I0X(&=2Z+fU&dOnSA^UB1lrL#JdwI`vby~R+_HF`TTD{}(;gXUJO}+NKX<1BT znH=U|SZvaCbGRKhCyW9c=USOr#)M&|Vljp*&E0a*NV9aYoX%L9yh4^oi}>*(wI^1Epq#c zk#U{gV$OE$qRri`ZJBm&vFzqR9)nL9yw@_vya!LE`j7NFrfc*RwaiuEc6u?PUNNDe zoLzKM#d5VNgORRQaQP0rF@eAH2#V{y88pNUKhnLw2#eNZJ%TW0{)6vNjj=%NuSkJ-Uo~ zsSL)9Zj{;(moN>SRXMFbhi1lj3(9Jr z6icV2V3Kg!C6}FIFP(Xv^~jDJl-Xps8n$druZBlRWJ6}Y8qYw4MojU3z6+BMk~Zo+ z@5J*YwNU}Owkwg?JLldycjNrM_|A7h;P;GMx%YFQcO0JYI9%!IuEcxh!ab7U!G&92 z-X8(a0}x!jp9F56A=Bz=>ceM`4+We4DA+V)=ZhLQ9OmW>=1$s@2~IaFn%AIN#>%qN z4MysW8*Ygg94rse+T$x$sjHa{@rlJEywMDSqd-rUp8kH~b;1N%6$pzNvb>sUn@)-WkaTE}P-AW|>&Wmroc;lse z;h0y6?|S#d%@glU+$z6c{yfn$pXiy%-Zf{K5OcF~glSV2yZcMc@+)(pgO(0K3O} ze;e2Wh0rDx!s47(@;?@6JOuu~vLPAhn@{w8-0|t2Pxe$2Cn|Al$S1dv3}}yHPZw;v zR4N+W%olBkwu$-{!EA8XE|Mr1S|-PAu$p^D&~TQO?GnqEEY~bru%~=0z_U~#OQz1o zELeY1|91;P!9Ii$%yeW^iVbJQ43^+pf?_fUD>8^e8XLe+DrgYKjBDtt37p&;*kNz? zVZCI6YXq`=RB!q=BrOw=w$63;oz#3HH8XLyJX@|L1}pLOTsXarq;2Y> zHAGEVafUAW-9n~zt69l`p(%95B|Gb~^JHl<%^J5kj==d%FJQT4I6yrjEX0+} zj0GBdz|5cEU-OK|)^!=Wy|;|1O)>NZjqBeKLvujACPM>_{b1%V@aHKi#Nm2-ob{$R zv(hf&AaB8^v~|l&9@T7#cjX#u^jnUC4Zp(Q*O==sur*I-uz#3 z`SGitJzq%-RpMvo!e^yY*gnGaFHbRyxm<()HelXwNTNIjrv$bwmnhFODD1VZmMCem zJ0(c~{xk{6QUPkJH=aV{ryG)@MWg+*C;rq?NxV>r56^{%x6{`04m8mcv7z%Bd37_E zSu8G9NDrtto}k0n=9Pss=CJ%n^0r>G?3Ei$EYSE282e{pu4l~c{C_v*etyYY6kEdG z#WlP|+}$m<0)K6;$>O%YViD9B$kX_qV=p@6Fh zE7%MkB!tlNOcOhV6?h%INXxxL0+(km&I6$V#+AoVi0pk#0-7s$|y4t zI5adEH1fEpNq15Yte_t0Fv@GrRe=qmJ@QaG2ErJgli|KfiVP|7?bwXANRU07rl7CX zPjQb>BX});9zy%~fZ*<3S3xb>FqOp7N_=20Jg|)fcj`l5YA?RLX`x*ilC0aai2QCb z#~X#}viVAe$9#sPaTvV*GQjWkLsMPziLRNByL)EgkbbHXKROpax}Es_d!OI0e?tr( zvu(>e#U$B*Q*816NOFsp`?b}$UtjLjdLFDtUQOK|S)cuDE_a-D>sLKq-G@i(rK3zM z)9Q4{KZS~@@y%x~!`FduvI}>dpQr&HtrZ*!Cl@khHffM^E|5S`SKrxEArnlZ7$cM$ z&z}g%RF#Mrj>MI~fl#xGInAN(_RoR*0&YanPDG`25@eFJQYMKA?tUH$_ zr2&&%DT2llU<*@dbhIq7jKVB|Q`>j7n6AKtM@Yyji$?&p_4n7FpK}0D# zs@mv%SGCcb^HNEruA+YzN$LRZgqNqO?fRSd+V}jl@m{!jmF%8d_WSnj@tMg=M=*w; zjEYx&9UrDZgiMg*ahgPfS#YaSnFYgN!xPMzW+&?Wb-xA#LKjgF;h|dI9vVjru7%T_ zL^T;(wLcw1tC1|Sn_Tf}{0%$^yrpT?Q5UJx1ND5FdWtzN&Ro5aYzll51;qLHsdyE| zR1DwGrr8C%U$(E2BWQ>e((g9UPsAiG4Co*Rz^Lbxn62UsZkeUG-J<-{$4zD7c#64<23hnxgz8{V*@Dh^RLT zJc@Ew(G^`CQ^wUHRi(IV%r)fVyL-ruyL-$t?j7=uXANcXd(W6}+&|>!xOXgjJZC6p zJa;H}JTMd(&l}1c&mYRiyDZ%|791}aDi|*uD&*h(v7+(fp<<3_kClv<4wb4(Hl@r# z%CezyRSD;ZE5fDW%1QtjEJ5;6T4b|xRL$!L39(=(ww9cjMSM-7x z6umI)z2Fu(hU)lf5uO%1p04MoC3spI&a%>Oa4BJb*mb3WSyVDuh*fHNw^U8iZ?g4PlL5i*TJ@hj6{V0b#w~fUr^Di10qW31KsbEqW{B zoAk{Hx9D3DZqv6T+@bG$L5ZmUUL9&=cy|HbTnmnk{Oo=_YYP_~f6Ro`zFX~T(tGtj z{ec&}L(QD$LF9QT++w|N4c8q%Z09p$x=Y_3-f;Yg`P;sada^NYEC16!u0M?0wwNjO ze*F=Q(ALcLtWbx`%zf)!AJE%T{lHwv>J0LFt%oV?a*3P z0T!=4{)pX1GZtQbK^5_#@+UFNhgLte`i%P7*F@~3dQy4T{iJeIZG8GVC2LfZxuJ=P zXgm~;L?>cBjjp7xYa-q`F*VMSePf}cNRwrR^{J6?qc`bppO{Yix+C$h5gJS84NOf= zMvZuE-&iyhPv)9GQAE;vXaYrECumTrw`)9fG@Q&G9)2cl#PDKx80BW`;YlMr5{ifM zBVgw44~KLDY&e2Ek%^-tP3mwXsM%J{CrDt*fI$>xhm;4eelP z0#J^JC*s<`bSxeo=aM?2lha1z=&`ug(9x)E*|cd(GlH$!qv2;F6Iw@TCUhh^!6{GB zlSf9xla`UF$bT#zpNzG&ww^qBvc>t1voOTkvFLbMn?&7hnzlmnR?#+Unhp9&`9unI zoCQRKohcGSbDd4veEB>2LL-srR1699=mdsRrydqv&Mib~Bgd%Q?r+jY(aCxw7B?bCrU>I?Q8XU0 zcxXZo89HYji;RRPVqpQoAl`E0TPCNq@u)sEhTlf?nTQ^aVVG-20M5x|{58IR%_MsIQ~{H%5iS;r`)e5pr( zvGKIRw9%=F5uQLzS}3NS43CY`9mp9qnn#X>N4O@Gqm7G7V^gRgek>H%(6L+;_3bku z;GG_dhct}PiST3`9eFeifQ%N=5sx1O=4+8Sy`PN6Vv!^GiOwEDDWZqaG8-85G=Vxc z-Gn^#F%8pPI|e)+o0e6giNJL|tjqEr6H`+=fDwus(`}+w!nn;Xn_4z$laVp{fva~U zjuG9wRqMm-ClI=6B5jf7P>M}0$iq1>V)!kvVDqLX#ss@$O6$D(!xN!#;1IB6ax64W z15NXt>Od4@ARn}7j285WTjMOljGKAUT{NubPjetKS&1CbFd)T|Fa~+WqGFNpsWC$C zCho?Si#vHN0&I`ORxBwr5})GfG(}Sh&5|u`oisqB7|>CgaGI>}qqGC{dVh!VyoiBdN2)}~^F`t=5( z3E(>l$`0ySPp^15Rs=0$F`NY>d`npZ^1CQ(WyERMfye?6_jR}LAJAfgH?^!-s>s2K zpQ;_`-8b0R-`l&dt7m`h(=>hc@MvgiEUt}$2NL00v794QkuklGFmccbO~jCNTx*EZ zygeC-iIL%kn*-BIyl7(OaX1;B8sjmI9Gw6q(i<~QD=~65ai!7bE&xh_;xQ${y~Sjl zcF$odw`>7wOdbnyAs-7(XghdbZm|a*?6fi51Hl57$V(x4iv!A7mKreMWS= zcQQNyBp_lHLob*t;kM`(A*O+D7>zs&pdn1`?Z&{-d_@E^Q4b4_8IFe{W3eJkp|VNgLWnC!#0OU(seg3NZqCPDbL#w2>*uQ6N52HUsvK zn!{nqO@i<-9|o6cbTEgB=ma?ROt!@&Mx+SJf+(q>P}I~Le}TwZWfp4ai3UY6isDu( zC?RfB2BR`szE3{%TBLn$NlE7FDiP@ ztb#E2OWspzJlA|at6q?BKCddu{*a1q? zKWtW*HO!^s$uKe5;o)R{yIBCw6$t7cdXsdI$BxEm95n5Nr&~$NY}KcZgr~uzqC8<+ zCyzzrQIh>fqhpaMgj15WV_^d*)H)V9A|GsR*}SDS25q4k4CMsm+Zah>ttL%^Ku0P8 zgdA$f@UT&fDx>&|jUza%Bz(DZr{3{ZU-cI*6g8bca>c*-YOrd-UzNztJ5%{i_9}kS zaK846zxisgd@e}O%m2+De9@pTGidCuQ|vnMUg>G{8LM$m<_r&u5k$WShKD~1DL{@wPG4t#M`z#Qq4w@% zX@6&T`(W2&ox>fy-M#%?2RjG*yE>9N1MP!{`thQ-Ct2FQXP~$H&|rF!*P$b#8l#4S z^=9w_BC!etFDQw^qSGHsRHLz#W^~b0DKb&|%#EkKnHxXtfj*eMmt{CQx6{^@;) zeY#VmrZj0FyYT>*dgBifW(FC$J4OtlcgTk@Ysin#HMMEVBi-$@PmJF5Yr93O54Uj7Uw;JUT~~m#*I^t$P(T45URN{(L?y2)2(K$3dDn^T zUB`3f`e_6_U;=HC3rX-Wf{2G~1S(=G{d7^_p}9&!vP%PGV7)cHjqlKV$G>l%{q&@hMHbKFb z?b{C@wrafoFM!e5gP_r6Y{xC>>FMq1d|ged6ET3QXgtx9Is5y&_V)F5^$ZTo6!6%! z*iZf%>0(4ZPAfO_m4ecjW?r0`51p%f<=FWxi>sR#gDngG7RKhDMvu`&wYUKwnOovh z#st^fShIW@`G$vq8X%VYDTA-4x1+t|KxZ0sATXELwnPi9>zK z`~zM45A=5q^!0akw0CzT^SXNT|JK`3-%xC92gJ} zI=b5j29kM?c6Rm+4|IO~P-jmE;0A~tAY~wE$#M#Z`+5fkhmpCny}xTnz*8n(^mi_M zo=bzWpXud5GN+@r@5$lz?!E)<$&#Mly`B5o51|)22YL^o2K-Fs4cmh=ygB{nmh_+7 z(tqws=BMS|k^Xz@mh|5{wk3mU>9_1k21sI#jEqC0kLt$9FnG&pAK@7f`tKkTdl$hA z%6B{uUCRxe-kZoTIlVvOS(_*<2NlP?WYy_|36Ca!S0{=qPj@Fk+E=ez@T^L#(iS}B z2~TyRwCZ$E!n0W>Z@pGkv*4*nc-AG#!3atco(JTcowA^s#G1MVPgTORU6$n8mME$? z{b<7TaH6n^s(v6*wH{?$E2#ni%YxF?sLc+_)}HRY<}LhzE6dw@!>wc$y+<)Yzj;#S z9&87DdqOaVfcPQU1Jk5rj(pV9{iIP(y)#I`g9wsEJ-tB0G&JG)YCJ(n9-$=up58&8 z9L5g%i5UVFk8#)7Ns0O>*hRr13Lc_>Z0yEv1j#Z+eV!oBxnVp&DF!I`I0g4p&`&`d zf@B_Q80hSOtdlbu9rR+Dg1r>bsHf3MqJ~T-ix3ggu}uky3icTLC?ioKfi4FSb5bDx zgJYrbBYJ4JVc^X_)7v}*rieKr)JFLm#461FzY&=Yd*K{y2}*RRVWU}Np@Iv#f!}c$4RbPcG;pnVzQO0 zGVO_1nF(iA-D|!vw%)Oh5;LEDN88HnUuMi~n+d;p=h~fpN&~>xabhdWE(@}v%#hjb zqjL4EQ=a%*vxr%bS?BZWIwejbEMHi8cpOR-sTF*o2P{=>yK>5%xh6+HXX*p@z4d|a zp?_xUROLxPzfReVS#Z)tzf}CAXJTc;TH)}`yq;rf@lqCm_Cor3o7M@f7m`B=Rt&Og zL1o4|M2w6Q_z{9WKE`IqCaVA{NIZwyd;*qYwp*|`5{gWST(WcxHttYb#(HxwI*M3OG!NKevZU>#(pqHE%r&{#xRSJ)cRC(39nNajRf zog=&X2sAdd1i^GH>4)7ETA4AP%nDDC4I!DOhxuNFB^ipqE`X3VzN9A#yG7D791F*j zo)MUvl7$k;VG=ZtOvl49<5`S-GGIRE96o5Eq_lzST8lEtY|H8b)xZ-AkBugMGFP(5 z%+5s)Pln>hlIp0Tq39Ud2zaQ3PzC)IeHtGgM(b(W$gZKqd~=hsr4T^0Do_GtXO6xa zyOO)^YOv^~*%xQ$Preh}kXYaJ)nEI{uU%fheW9Q>y5&{Ec;Jo->A4;yXQ(p z$B*2~s^;&Ntoo5x+&@V9ko|*LBO3i@g&lRuTXm(K9`{@KZ{54Y`|Tz_;@{rk?NqYA z{eTG_vc(zNorN&@SP z$e8q-bA|B(tAug3E!e*z6Qj{aw=svroWpntu^1JG5$EwXK8+tUCASPUP!c`{N=(CR z*aFJe%y~W=NK|OJ8J!i9kebJAN$m3~bdA!fmHjuT9AP zu{M;&vm^tVp_K<(u#~gOHZP)&p9kE@pgGUtQ89UGm>N|c0H@sGlkaEBmv_8;Q9^xB zUKl*Z3QCrO>lTCS&h7nb_gA_v2RASHH?vqF5#fXTK!CJa&AEvC6a(-yo)Tecv8S=o zO^|weU^p~>i@?ib)c7E{JRRZ62RWi-PE8q&-=!=rQHYo8xW(9De3lXtVi{kcV40PH z_$W&=WcHC(h8wO5Z_UkZ9s~iucgw9Zlf)492G#G7nP3nKdycas4qiAe-G%2CE45#Q zeaA`9UUuEl;X+7c*-|2dxkAs;y^zsz@gxf}S^zRyZnDrEPHQn@=D#xPTEDSqJ9rE$ zUL&ykW95j~q1X&exCQJP!D2sF_cg2+H4!tj-Vv*zC0Z_ylxi|^w;g`YGGL0uh8EVu z4{Jixkyh)+BUqXg_?=;`id1r{{qSM264XLeEMccMx4?ibvsY< z-vzqD%SkN$=QmS3|u z7f>Qyw(0U!6zS`@pL_~dB=>G!tM|FwkPR*vg1exq?zvaJxR4YsctsP0KrTiB_f36 z#Ku?f%=mW*8a*?fZZ4&}ZSxLP@?=Lxd(w@tF(3@$ZdjNFbpqKXs*Cj@jOTT;1~Jwg+$%PTqeFrFK10=iMPhr2!66vCbMAl zf$W*|B13ePS!Z+yL1Nk;|E3o$HGwJp@jSx|t;>5eR-tv~OnBEp)&Vp6Y?v zu_O|mR#Ihws+_rCYL!x^ovXTB(mb~}5iFj6_?_U!s|A&bl8Qu0*)^>-QPYsn>Jw`> zyqE1QE&EZ9Qoictk@>pMM}AnCU09UzDy1!{3MEiD_t4eVHA|~EEw0{_C@4Lf_j2C+ zGhcr0mFLdSyz#)>SqpuKZn#}*^5^z`uIHv-SyQ{Tdi&z)?J{MepzLh^%lX!?Rf&Qs zJWCW*ZCAv}3`)9YR2GzV6kQMDwl%|1OdRD(1Jn`tY?ib#tC~{Z)c` zTLKK)N>iK(MI9ofX&;x<8$YefR*?o2!I@OZ})1# zp_ZhA)YU}nA;1KS*#KDkndcV#s|A2gx%KAU3Qz0d-xkV&_;sMsmU zd6{TICXE_pku71_WooOSXt#N5>uable_0XunMpr)lx%6bc1~R-xpmeBam`Tj3I@yZil96De6^{UsaF08)d-bl7Yb;x6BS1OU@ue=`KbQl`Us8c|;<$@kk6(`N%PY7NB9o zdIL9sBsq_T#-@ZGY@>>CiQZd?V!TPYr2ay9A~aSfmL&5T9YC;$p?Z&mXS7>MZ+Z$M zJr?HVy|nYiooAqfZdfea@J{ZAL{Satj@9!6pKo0V)MUn-qOVuHUU6a775}zG&HAO9 zZHqPAmTDecta&TvN(x& z@D?R5awLYTV2k;br!jBY@`rJdN@D0XQmmN*s+*TXgxLR0`bksQ_-hJUC|E~94Fz8` z1Gv#DF(T?ODDSzvUO$-NDs8E9<6`B;L_IAW>d@cIM@oRPj#l`fI^8 zDKGA+ETvFO`6%XBN-I*?6w6V{DpR=>3n+!2)aSt94aH}wXrU0@7x{1jKFnGGW<&24p>1>7;$xcig} z1D-=r!;G~=HM1lLxspm4THGS)naFnBGONxirhsgl1W&mpYVSV(vuX@Yf=LzaqRYI4 zMY&F+1-2Q{rcIdHSu>x`A#tZ6{Oly0(s+$@tWnz+#w3RujnrbuF2Nc&{Wcw3Os_(n zegC9tVyoSU4-@ts#tNZu1eF3Dxd)Q-VB9 z+VrQz7a#kRsy9NHiynE=_kHKnKYr?sPhQ^Kez|DRoG;{Lag{SZ!Lz zcsqjXtV<3k_MYHTx~dE%)t$`gBS&qvK+b%uft`vPwN7>{Bd=gytQ8&2nkxFAwNx^w zkgsc)JZsruiU*s@B5k#WtWxPt2ZCHIqX6#!D1(B}Q9lvmAqt>+w_{p+1-azc`$jC? z2WkBH<7tR3BqX1CP6xmy@o@PCyE+XMU$bs|&BK~vdAe)XJ>q)Sbz&6&fjbl3W5Eeb zRNZsR7q@Di^_f%RdDT&7R)#VQQD&A^ro*v`%P!-xy-s(hFS%B#DO+*WrN%8{VZtBF z&Ey^hrzyMDt~=ziL=6Za7P)~vl4Mh}>l}CJ$nM#!uVtB9@+tqU*C?I!XA%%>vV`6w zYd|&}!~B_~O*`c&cz{qktbEYS<11cb#Yp?)Yt)VPkit_rjuEn~1hYBM!#C(u&T~1A zT^7F3=g@tET1hN#hc*!*7sUy-<5{YwaPx@6r%O8;c?NzS5i$=p!DW1MlFWx>jpu?6 zA7(vLa$^uH=)zdT{#|ZqBzV(5_ACoX~|m6Lug_P ziD-upqZ;jwRd5lg1wF?EK#PumuESAxiq~*R#EM`q2@w$K;w|ZSOswPFLltI!5}=|j z)Hfm8eSn<`!m${gc4RuuYGw6494HNXDTe&+Yv&d+#WUSUHEz}I&?Pc%dIY7TMZIuA zXFqI=v)uV&Hp~JQ`vROvgugdYRU0)d=Whm2m?hY89k_$;I2JugzXYoy3~P>#HXjX* zTfXEH7tN|=pE|9N$S$g*{-j+I5+?3$xcr!Yslcgtl%W9PVYdkxFKKQ7Uib-Hqpe|c z2@j0j2J@XZJ_V;&mt=#^Ra2FO%q`&-_81nm^SYqf)39MtgUNg)>gRII8nCkj zy(eazd?qTD9YncllZWtErnF*CI15S3!1YiLQ(O^#O_A|7tsR(-A?%jvy>jY?NVZ4cTpyzFwgm8ox=|{t5vWQNBTM z0!}WJ%u8be$>6f~7+>eY$Mx%oNxMC@Jevk)vAr> zAG}<(Yp$D~HGggGmEiqXtM5C1@N#wA+`+3Qa8{{E1S%7O{FnB>xIYmnO9ZMCMddg1 ze5E;a+3&$krZ^EOT?*7K2I|iBUkNl|d1tN@#;QQ!>F!jvQo81B@5{aC_FOKhf3XvG zEqeU^O`noi@`Wc~%UQ_1?+1zsc+ix>&y1fdT=3WaIOWEZ4`Sp-cB!>}L&tr}Tjhlm z-dD1>!2Q<4fxWrzZ|8auACV>jq*N5ka!tzKSsXH8FLc;S8LMN`Dy1m4%4_f7k?NT0 zux?qqb!Jso$JFOkhdSm8{a=8=)4()3^kQmR%9tq#koqH~twBsPoYOsuJ?bTr4lb+l-ULCJnfroht5XCd(UbX_@Uv@n_}NK9 zY?0D-&Gsb`#v(Z^GU08gU!zwLoCGk>rY>ym!R{y1dB*Hdpikz-Yvz`oIwpiAg^;ni5ug+E`Xlbg}Y3)9WZ(>%+#MH=D{6CI|LF#27>89Q#T;3i=S|Dc1`qH*p;{}7U+KV zHlme{H-bt^@kYv^7W8*#9pZ*DQH)HGI1O3|lE=L!f0{O~ySC$qK}0FGEeG9rXG0a| zOSj`NRTorWk};DSTg?=99FpsnqXCyE_32yCz_x)P-!cIReSmDxk;29}_E51h#7~43 zg+*V8P`6lYAZydsU|9HivGqbb88uF@dY)ztA@4aV+kdZ=a#8d+kFWMAABSfF<^|q5fu`p zXxrGaa0tGa69QeNdvS|oOqR6Q0JQ=~CqR7zi^A~-8nl!N_VcFY3ARYFO$et##3MK- zgiDjHwQN#CyJCU0RS2rs+a0HTu&c7AgQN&@24zMF2L(tS#1?zu(an#J(YuhX`b#zk z%M=c3KwhW&UV4L=2uMBK}BG7OR!;bu}Mr{dBy22>o2Mo&yl zV(X#l&`S7eb+bcAf|wIS-w64~Lh&^23|ldBlaU9YhfIs1c}fYx4j_frz0JK!qm6@gIbW*tMvWrC%IOfF7h{c1{vx@n{oU zF}ujjiSrO>>5&>6nh=M#5Uz-hu}+J?TZo*(W0Oyiz>b3np1P*QXsPTNVTl^|CcdRx z1>~Gb6XMeBcov#SvChmOcRvuOOOV9u_*cOsvU1;2fo2^}$?{(blptgod&neJVh9L3 zFyD+Qj&Q-D7$yuBOyU$4c~n-K^(ZrC)!53M6UcT?+mOf}Yp2*&o6-2N_HBj+S19cTT!;*626B zL$8tu$XAx;L((Uyukm;Eian4tim}2*3KIZb zo9ufq*#tG1Z04KKmt8D>qjllqkKJ^;3UX44D?8`?n^|{ZccI-GmulLx_B1GOHk5Sa zx!-&+(BXH#<@X{!LcL&Kw21E}AELx^6*7~$M=GSP?k!g#{SH;ge<70!>03dC^xdNh zxk61pV-?a?ja_$8Je_V0&;i9YONys(^M{KDTsq{q+_mbN?db1pv%hDvp?Z2xWj~kg zP(8Ck{}vi7vyY#y>M4X1tN@aLg~eNWIvUGv*hopoX0g;}3MULw^azeInt)IRF;NIq zV42ZT$@QVCq^3;7lfuUD1VsYjnCX+^yP%dLf-=axgG;R8#1* z#T%~dt`$Sn;E*MMC3MuECca4hHkBtlh2d zd?<$cO>`FXmNjXM;md8#XlnRb99#(Pgyy8VXh9*?zQ}MtQhjxPQ!Gxp= zP~Oon_Ws%DAf7x1T}3F)n0;clOL{;A21Zxuh;%fH<0RpB5+bl^ZI>Y$bCO`qB!L{CC9HiVUl z$C+{3JmAyBIyzwuV?Zl3CxLHc0n1$s53~SrY2T|$8lzw48+_NOW3$lR@XOjv)mR-p77PN)fd`1P?K+Y27G7nVXc<7`VOD{CO zkJrXOQ9!1iWJxAGTy6j&a|ca&aS0R91uB99I@cujJw#vvI_CN*n1G7z#RQbeyNAp| z?8#GmqaJn(ZAFnX58a!EG?o zsv`{nTN}8_w0#Y{jz^ypAjJUUE@mA`Q!$p`p#A79@zWctWauJy5BhQ&3l_@glz(S= z1e=iFX)zObsV745rmu zf`gh4I}<)9L(2I{p_`*Fte%cw!5MY{N=1vpc02I_g)r7xNAV#UsE9K_ZyF2!7Km6q zM&Ue?r2U2=(Z(CO71(_uzYcIDj5YcQG64nAR@oVMcJAd;rFjLtY&HODHukg9(6Lh> zL+k99w5CgPW-63oL&#mYKMSLQMFK%0%v~`i7z`aTPw5&?_DY*F-ns+I9vjXnA+ny@ zj`i@{8#LwfG~WPcKIyM3e9Fm|Mg~*Up`5@5#OQ8xj_E{B?ip~I5Qt*#;T0%Ktq`L^ zW)4i2!-u5{Ik^=PM&Ct`Sx(|s$5?G+cPrXKM>L2}21C3-Kw?5lo5utW;$sfvZ(yO1 z<3k}9T+)eA6o$jVq~rKu=@c*RL3atcpqbPOPA_uCw@lvS0y;_Tg$EF3snssW8D@kk zY+i$njL>7n^O}g0;e!!Gjo6X4lQ!>4Uvzk5T29}~y)nJwpn%_ptYBQF;4KPxeUJQy zsYzmSPoBSE;g#{f@%jo0d33rRd@>(XecpB7$%QcWukn5^`@+mZZtaS`&lRZS`O;?P zmBMD_4}$G^?r#R#{q9SCFQRE@rCJhJ2`|CXq1Vr-2JPEb@YwsV^KAmelx zhx`Zv&Lwy3v2}Pk;<@EBnQ3!BEkT+7mA93_%1^m<@2m=VvQ~m;)(v^gcgp>o+m^@H z-CnA*Ta_-=`A(%vb^cI4I*F&4Db;n5_cX||wGqq~;n*}dz#AKBez9xWQ?)oViX6qB zcyfqtG1{Yplf&*_asaInW@r>7=?Paf7#^P#WQQsPI8l7o0A^Iw%bUFJsfNtLkLfAS zlT%K?yD#<-TckmROlvB!BQBD^Wd(zrEyG18nlXKwN5O+_PS5>L%#2L0Skr^Q3f@~C zPc~Q>)=zM!(87l)a+sU_B5@+sLX?!W3%T(Hn{oQki*-n-wBw9DpZ@PdZAOPKfEu(ncQJa7Yx5pJP)GaTCdwO=9SY8k|9CU4Udp zFi~^wSp$`Kf`lRqaAJh)H7ccc8YN67s~`y~Z7oNKAhG<+5!Z-$%a3W|F6V(2^vnYt{J}pl&@`iM<%b&Xm>}lxi`j`u(2!IcxxAS=Q3yVR zgmXwjIIky-JpIitu{5a*s`yby7D0z2a zs7(O*)!g06`O@}!GC2zVzC!wq-_&u zw|Zj?PnYj3y45QMM_C}Xxa^%rr|5JzV%N*AOlM-9qO-CxrFDAW$Z~M5jT&1!>x!*j zArG0YmR<6U92MWjz#AA^Tt>mHY7{$<&A1?Y00)We#o!AD?)nlAN@G^;nRS7oyT0UM z)}LXEL#9J7Mm=njamTIW%4gkXJuCuv(?x*BtWW@5DU2c}_ue0dahU~0TC$`sU12uS z8NnKT`Nkq%;=Btv(QF2P_^^D$e3$e%bEEmK+yryhTI?bEZ}Pgk;Gd*kWM;_t+8LM} zQx}veSM{hl41GLwlr)Gt8)`CgW=CoGct~e|PkXm0b{W^f*UQKenSlTi2cWc}9(9wz zL$Js`!eTX@w+**-x#Gqz#SsZmNX&IkF2~Gr653tV{=TOmKD5zxfYyx3V1PnEps6-q z34&pPTzG_H<=E~@(m(kikc`iA1L;HZa11ULe%1mr?3FvQXxG^_c%ZX?<$-O|dg(1r z048xm^bNOxxUDtfcrH7}LLz!^AMDg_mLOYT$}S|lF<$bBF6(;qj-&Ibz_bC7>}h4~ z#`rIou}L-O`WoD4-1tCW4|c=yMp$-re34#zNyQ&a2FBqRj?dE)6ETv-vKhm0U>`9e ztUM*%IFsI>qKtI+NU?WK9LH_^h~B?X0V_&Gm(#RL=Z;=3Ynj`Rlg$b%&IVr&E)}d_ELcD1#aY~EKlSpb zmddv-mT#R4e6OJNm1=wngtm_^mF!$B+4)Y%LvL*PR>@*<=R%o(WEq)1l<57HP z<7t?<@r4C9&MwZHb-(QTY_>-^<$;El@lZwk3l8|05_)FQm12G%Pk+%0sN3~5xma+RRHevJ3JCf`fPhL)54vwo{My8GbgSkKwxcqE( z(sLZ@*UHpboM)fRb<%I&2wb=D74f7G-+HD)3zL2si3ws&vMUkm4CK0t7_1vq>ll&i zSCEj%b)Hyf%s{R|pQA5Fm&)#6EW3X$H&Il1w)N%KrK0;5i|)e-eoZ^yC||s<{c`a^ zgy(#3KK|SL7w&7H^Dh)1Oav=m`qYb`nt%3ku;F~$VsJZ-TK+#ja4RJ}D!Zgt-I+9R z0(8%}=e6%pE(Lw-P!dbba<%S1vYxl|peVp?W7K7jzIZ>F6<;0ZmxBDu7%>t`Yue+Y|pEFLeTjdmk` zE(9{I`d@IF^FyazEN~h>#H{JTImhXOrt$yqctwKsx=VbUg@r~SsAAF}I$~6cj2$NN zGqOO4K1YOT2q{5`He_X%8xsZPLTYSWENFbEp!IzJ#chkhoeTb*I2Pf~Lf#FML7v~) zru=y&DgMO)%Lwo*L@o}mNG_Zj!!I+%NNWcXjk~5yAC^?L9Dn!QF1jx2i@~-9f7@Nr48wv1@~Vx-WXgAwlDbGe^S!$EwtljVQb(u zxDU&^pf0m6xI(|@S;-h{IxLDkA3wVVxVx6-@30KF%+8SBoS#rSh>p1xuhqYoW!D!fZI#5*_Hchv-w_b{41 zeY9XGd|WNRn@FsS+cRK#sE7lkuxT%X=`xo-s09qthMdYp=XCdaHdZSzuKmzkGNP zT%`b9Wv_6^7MN?$C(-_e7)l@LI!si%y_s$0iC`JoyO)Bki{^QqcQ#DL*f6zetMVt6 z?W^6F0)h4l_oWIi;v=Zix-4Im1w8uDc?%W?mtSHZ$> zW&R$XPyh{N0%k7!bsP(ioPa+UR^!cYm+Blkd1C!%SD zjj@R72|*6WL~#$(cS!K90f(!ISnA>;98XP8LzHIiTw&PRuU($b*9s~C9{@=UXjzPa z5cNv1$uq)CfH?q&A4Xs>^`RHm^cPbmPjw2 zGMF1BEWk%_b_9GdR^l9VXdxY2!2Al!mSORwd#h(L6i33S5 zajn5T(h#{#_fmM8ppiH|02}0yh~b&UnfDX%2>g6*^@`yU;Ugvavn_-rl3KvChjU95 z;dM*Wz(x1Nt0g@0^I&p0WvALQ!bcqEL*zJO#H>kY51RbE z4Eg;C#4{%`IiO;iI3}YtTud5(<;#v9S~g%keTN3=OBeXQ2Id0|u_Z_C1-%*}r>K@L zN|pZIjow3ploKD;xLrn(Dm`ake{b(T{2+o8CE08?U(in+l_Eh*cS&y2 zn$47O0SB=F(YmvqNIoXl{{>eD_Ff!`NxnX8v4Ryjy!@uTL0_UwW?L|3@@Xo(MOZaT z!TUEr4~jjF?BM-icRQfRkK28fSNBw+eEXd1Q8h@ZV!mu> z6kq4wL+AIljAFY6T-dDF4YgzVNC_zTcx+28ovAx*y=u}Z!|<>yXn44hPYlFqfArZ` zql$v(5hM$(BFwb>eZ{0t=1h8H@Lh=;o1eh9 zb^SRBfA>wF$D4&mfs!u_E|uQ5SbE>r2EP8(>rX8;?_O-)eYyFOZxt>!cYOP)h1|Xc zPal8p5I9PoJrJKv?WPz>Wa1mA9^=0wK2szWC{m}=zHIt8c#99ReuFZ+O~H2%Buj^F zzt#>M!wW$ihwk#Rhej2k7e^hgr}Xq)3uB%F+8LGf9Kpv|#2)zV^pL^%&xirYYxLlE ztf%C8*qARi+jF6Gs-h_V`xGPBF|pg8W3=U7d~KDFShP$3B3?8WWi02PDG!%@`x5`x zZOc~o0Tb*V;%#75sn`ovP5ogvQx&L_WxR(JGpoC?K>~+MJynl=2lY)_J^cRZMxOum zPa8j=QfR-FDBvt&Cc$B-xmarbtxq4Nr+%?k&S~v$<^WAFx8Q)C>x0@xq)YiHE zHx=C8dq!3AiqGsi`{2tDo-4f^s6U;Z$|}uqB|L>^HmBT(UGo&3X-|0(qwl2_p4pzl z2WDLOV2pRw{N_|P#q$+!<$P@_Nbv&2TR!hf6;ixN@dnShQpFT6p}gx-r4%nyyd`G_ zQsoq{P`ssQ^i(CqSJCsqR29Xm74PbKJ++$RYeal4#WgCYE>%PETE$y@rZcsU;&qhw zP-;EJHz?k!`2(qXiZ>wrVo}q3jrego>qn2Mjp~;76a+V)P(QA!Mf2XJiq^%7)|(3b z!U-WoYTeCk9yR++C3RdjfW@bw*R(FKX-%xINt9G3iYv~xz1)@xKCP;S34d|QO_6Iw z^(ik!&`BkYDIZ7uN?CO(o1^flu1e){G@#@crSdqMkFV~Cg3xbS6*mg`=_Bq^bzP$L z5p=)0?wYsch8Oo#n+=DAAg@nFI#leY$hG2zl$RoaAg>_hZ3ZiPYbY0`px`!9nJ&eXK6|Y|`UY{z&H)Ta-6yeG!g33^@kE4F7 zH=Cn5RBtXv15|GwNAs1cniPHbb{(1v5V%ZW2|y_3r$^jM?WP4~O=83S3(7j+*j}|u zO}V$pj;6Z?tfc#c=pNj!dCPBjaZgRE%A;yG5^n;S1QRT)g}sMq7t3Db@Q|D}S@vd%)}do7##4 Kiu-Ma;{P8(_*cdN diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc deleted file mode 100644 index d2a37a549efb0e5ddf7ee0253ff48654f2cb6d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12492 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc deleted file mode 100644 index 2181f7a3196c92c20b8487037c86c64bf8b9f236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9800 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc deleted file mode 100644 index b61cb89afc71723de008ab967b5c90c7de68b4a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23174 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc deleted file mode 100644 index 41e2f441ad2efaa43e67c043201af41e3907e57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16319 zcmds8eQ+Dcb-x1+-yp&750R3N67>O!q(sYhC0bT&i;9PKET@s3)U+K6 z5^2z3Tu)6pPDRy8NHt0gjXg0{Woo%;>!eAW#C4mxA2XDww9F0Ds*}v5ndu*Ns7^fU zOsBuMhXW1}AgeMpo%AHWx3{~u`}XbbdvD)9{C!!Om&4QXL16gnogDX5dNCijk>FSV z8;My?;v_!8MfpCSr?f3%>$3sdBlf7!C$Kyr;)pu?oKaVw3-1oe8F5EFeV(Yd&&%Fj z5nt5b=jS;a_aG;^U*IIqd7IHoUzt=Zd0!Cv%7J~r0jW;%16Kf-0apT-16KhDfUBi? zsRFo0E|&vxgq4MgN$@braEcl1U> z!?N!04+Do|!_km-6d!sdIibjdAx$1MIAB1#f%w%u_J%+bIPlC+fMRHpvC-26h8`fIYxoX$NDt511J42PTG>0TaW^ zfr;S(U}AU$FfqImxDvPuxC*!$xEi1Bf zCg3LEX5ePv^}y?aHvn${-Uz%ASOgYx& z@seWnewF*0ZNjGcOtMm0dYvHPxpq^aE!LxpsWxt*>=$d`bu{V#$(t6n(qB{D3X*9DoR|@ z?ctcFJBA|hkfxAQ((N(%IJR1NTt+7qEGHc8((O@oSS1dKqNos8byt7?Q20bLF<#p-teCb^&aYG($|?78e~y%MN8IXXRh^4aNU=SD6DwlCGMn;kthI{VzI=hB0V z^=%6kZA+CkvvsHHW}8kmrM(v`+cH&V%C0oD&F_Bm?sIp)dC$3f<~tVZ_RQFq>%?^R zEAfSjEmxgf#k#r8uiIaLd@gl4(0-xj?fSRs-)?@Z`TH9$c71ZWzIk@+)L6PYExj>( zcKD6R*~oX z@LHMKaKc?bnRMr{3-Jij)3s5!?A zGxgE-5a#_xJ1k=@l-gmNxttblg`SvjLF18Zuz$@y;m&EXl-r!Kl~iYwwao!`bZm_k;OLV_0hkEIC&EA)V= zV=_vI=_-Zfin5M?2%x)$Wt<)~MIj4FFTWqj@IX?_XgUv_Bn+h|BxCV}?m+c$RH20o z^%jol!k|Lg17Vah?HTkL8qkJ!Qfkna(K}d&x)6@`Lo3FUn$FA0CMu+?I~XM@89Gpu z=3^*KM<|hqjE$F@L+NDiyHQmQVwjWMN;y|ib22rZnme!<5T}GCU-{HMKdY*r4W0_l z^;~N1NcX(ad$xC8dvomE*tc32t3Eb$V8teswJ+B;pLuG2VE(ZSl^5=Od+%F&FYH*@ zv464lV>7m^Zmz8HpZ)7E`q$45q&L42JR5v%2U-|EH-0{K*}w1V-CRY(oc#+E3-0EX zF0Q6wcHgOeY5QVz>r~HDp!($4^w?a_tG%atF9o(-sji>hdungmeyMu%Qq#s)_nqE1 zZ(nR`pXpgDT~g2nlyz;xobamWv?twi+7F!^J{!KkpN%Zm>|U;^FHy4Mus2lA2rF(P zkVp_NRksoedr$98e|laz`}AVd?i?A#OPAM#lN&DjH_R#N-EZtYyZ5zwE(mXX-|~Lb z|1IfzBi|nRPUN!x;pISmhMyl?y_c)m^h?fG*1puxIj_u17g`qT?j+k~W7_^oY`$fo zV#j~2I8gpySMR*ps@K$ASTa8lHuhF=Kis;p_b%?eDo^hn_V=2qdOPgzbvP(}m*=5c z`+NJV9;&eaU4;YbL94Aon~GU7-AFJ?2DtDU$yzSC5>xX_T#`S`DP*H#qtcO#ZN7nl z_=$5o+cPTlm$4Laj2ei?BL&AOBP)bzDjBbn+!ZX9QOXX3{ll61>@bKtq}xLSDu}xqA1QkQtQ5kQMJWih+OjN1M$J{S1#!#+ zedE*Pb6e6ii-D~R?yc98MuTRg(V2}%%P{F&(JmA5!Y*0PQGBbC3}jtS`L6HgRyh!p zhn0KLaIx{DtYG{s=NMK07y)8J@zd>gl-y_@tY@clY$ha$(Q(dZ$X7>PJ1Q%gQ+@Vy z5t5_=idaq@y{(c~%$t#Paxu`c;O@9}GHJnNmON(dL3Cj7su!s|(y*KrgEp&Iz{paH z5m!4ed{pA{&Yz5jYI2|ieOSyWEMOhWNz$M`LEx4rGoMSpNo}zeRg_Bx8F^e{StsbT zM?VrB*E1xVjFcb+3_)Q5Ls-tUM8jG#=$kagWwe@!5~^O@j~gta$a0(#tfEb3<(;8 zjQkZtl)ZF27?Ow|FU=4X7HlDw^ToAhNchGKG04bc2+NwuX9#Ix^SMQJ=?pV>nZc1l zi@{5NVDhGcC)JiEYi524ovZnF!}fH~Vj#HS4&J)-ymz>e%u60Us8_!_7vuqRs6LRwz5n4e@Y zn@`rM{~=~izNTaQGof9m{zQ z)UD|<`W!V_oJX{b3^MYT5zG2IeYS?nhz<+Rh0+2m(RFb(@peg>3S_a9|k zAS#$4wuV&1s zi{V0EP{wy}3l%ru#c&}nDC2v1RAihT*L>`nxRb%4z#@S!-CF}XL#z4*e+c$L1PyB-ijXB3amMu53Y z$W^55C-4A)g9IKXaEQQR0*@1Tg20mm`U!*xkP}52CcxYYQA#BUXaq(Hj1!n3z>Xfj zO{w1@zzkhxWHJly70UYxfzt%e5V)TJ2@mEvFz!8xLFCz0{~h23?#IIZRe^WZt~x6m zdso`I?d|X$uK0F1)?e`lRvf@9POf~zii=Wiu6)aihf-cH(8y}7_&IOYY8moYpW*MIGfzEvc*Yg~0?GdY;29Yq8L( z$O}W@My!?%O6eJ)`UQ`~n^y!TW==JB_k7N7usncom^b}8_fi>)4x!*27|ohO>hWFt zt?LEkHoLGBXMK5m}L8g{XCsc@PMDfA?0PH45sqN#YS;+$U>7$ zdslfA-~A*0RvQ7}81n^Ac29TDNOL{uE%Sp@-HX0E7KA(2nAnphvC1D&syL}tIrbsA z%b@m;QT-x)!gT+29L!GhhgjH!#)r~TnheVl#8r>-C#d-&{Fzo-hF|jBW9hrBtIxVU zZj~%tE`?5%;Et6nRQeW3`Y{dSPYIM}%&l)^_+m3V%ETELHCz19A{Ep#ZOlBMXJu{{ zGf^bUpQFxCs9v#M+_P8{T=caq2yJW>L6@?g+T8%4JJ=%7-Pz^9rtNJiCyAZ6nTY2; z+Dv_*8k>n%%5w2S5--^#yXmyWEogSOiixoEXo{W*d&)lIGSXI<;|$_4ir2`-cCZ>A z>(@rw?4yT!x|8Fc0zDJLgd-QDk#gjsG)72H7d+;Th04F&qLDmhPs(A=Rmz?c_95@( zT>|1fQ=ro9%$PA{w7ofzweCDDE4IYiGH1`$Qi9TDTP$e5UkTT(?t zB@IX9j!0-sR*YCdwNrd7PH}>RvZ{*kf@=l5iyF=IIfnJELB8kUj3-749iEv>jn@~LQzpZfrwF6#lX77`?Gb>c}N2n2IcUm zj5tS83bVn7l(EiCN9^l(f(5O1i!8DVyo-ytAs|FtG<)2pTE7>2%pg_CXv@4UHt`ej zq&P^Sl?dpPacxe_fJKNgA_`2A#bff=@i+o2L&|V6D#tW6kEFJ?W5@qj^cdqYOxAAk zG0>gkNoFBn%8rIr5&x4av<@aX7x_6r!I$kK?%RoI)|fdEF%(hb;(*L*$256ZR@%W! zrcEhCG!chYAdXT{T04y{BqqWqkfpDMpcFM ztr3hs4YR9IC5TkerF(Ov>8?!oy6qUE>o8-g&L7kHQDrykvdg{pM`SeJyiJ* zs&*P+l6$|6a|f2)l}r8|OaAgD|6NyIg2#K+&oys+bJ9de==N%)subUNS=Xrpi88_BH;J<5|v2-W5Ai*HjWQ?^O66Xy)E&_C3&M ze<#QT=1FrhjhHll9>V5D*Ng5KJ!>P=Uvg<#iH@k$8%XB!8SQ7OZ@ZcL;~*VU9p|A5 zJ0f2Z8LL+2u5m8fCS zMyNr?Lcvo+8`+_a$f3v{XrnqaJ(5kCIf&!RjikjIU1sud+Lf}K+DIeS&7Kq|xg@u# zm0xm8{wdd#d&)CpM`*nNC6A4p_Dp9Zj-a*6%r8fp%~TGfHLv8;$Z%j!m=E*QF0=KF z))O;@7R0pPCNrai)+-DB1uS(YU=EV_!M?Txv*)&NM(#lXtKuhFI5|Z5ks~Bmwg->o zR0;|Fj7DRPlJL*9f>3w`;trw@u}^~`MG2!hs-nt+NhPd}iAq>KrjoXmAQ2HdAMX@< zH4?Wll~{w&MDZwOy@W{MTwj(xRPlHiijagbV&21&Og*BLa8@}$T^owjB4UnEA0b1l zFk&F8Bbuzl@LP;g`Tw=1H|B)6rG*gd4`zijQ{16yV-f58<*C;jYkXQ6SWU1dSj+MW zt@Hm*-4`K-EvD`~U7uP1l4UXdx~Y4_$%lsIJaw=9B}9N#-COHir|xwd{9aq}#kI0+ zwCAu3BJtz0H16JKtdsq^K-|2}y8_|MuTocEwzCtzDR(Rw%A*C!gUhavmn*|Cy&-e^1&69G%5o^MhvP}!4Jic|O@XIC&*G0M_Fo_<4bYRni42 zVgZrL-=J78gTzXNBeH}>P)kr@9cB%l$;nB>XZKI2I^JlRoX&lb_#o`Y{hjnd545&Q z{=^U9+o)}v{p^=MJ9Th5P(5?-3(uaB()TWI=(-f>`f)|g%;R77!FZ`_g%c0;9{JKE zER1pP&P#!fxPdwN+9OL1jdQJYb#oI7bsg4U5xno>YB#aNDmh07l3^T3VyZ&yfQR=I zkV0I~xLnCK8?0i+q4GV-{yu;%M8c}33s_gG?m8M$DHv6EXWJrnDL)|a4uO2rk$#@R z7^RROhxKc*CcVmEQSQ40{+hrK36OqMm@A6RNXBo4yc!CzQzgqaV^!XF-+dXw(!yfp zUr?crI7{FfEX!R*Ez5F?Ww~5dIkRoH{Z#uaor`5HulLMXy;*;*{(R$Wk6td@J;lTC zG}AS`_l)ax_k7Eb8rqj?U}DZ3o-13Z+B$V$xvF{Y@GCnP{4FakuKZ4TR~?=;uu~D@ zTH8GL(7gA;#}{kvnSA6|g4?n6{Tehrwf?eDzwE6#*)iQQ=S@F#;ox_7U)ZXeFmZt2e378h9c*5isLA`)mm!=; zLVcP92c2{$xvOoQqkPHTu;lhGx%c2W>Tq85a{l_6@$_96eLLqL09X)q8lFJG@G!E| za_(-*X~`w$rgD}*@pAGvD(U=kHzRv|qxl2jC!eHs`6O0#yNF*7KmD|Um;k+2o?m7N zRNBQxhm;B$4I14rsrzqK&P4AGYF?pAC2Ka4W*JK2P7v2_3JC*c89;ZCT2+~P(Va-c z3RPGqbY9jo?gcv2;`{7MFy@T0@f@}E4FYrxppbW+Ik=fSnfYlA9rYd+kkB_~@qS9t zvC&Ws?tR9M;C|)j$m8*+t^(k6&-4GeiQ_l_lneZXTlcS=_;ar1CtS;~oU)DYc%LJ< z`Y8v`x8ZUMz{~TyDaAl053f5Q?){BRWzF=zV$+hZf&K@?_XBR1ZPLE7j@#I>;@HMl zFIDVZu>)TzYhv%XnDdpdxR3*#?)0pBDD_)Bt9~z4uU@eOv+BT^>Xb67Q>w?tt>3uf aSjX>T)q$`08rgfMI&xU`s~)5nQ~n3tD1Z|H diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc deleted file mode 100644 index 1707faf566d8908f4c2c4b8f91dcc8afa2e63f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 zcmai0&2JmW6`$E%F1h^Fr!C2mMN9q=ZHo*kS*>9~t)wQB5=t=4B(>R(1;trObokZT zr2!HYpu#EOoT{P+31|%HQow~T&VLZ}+6!Ixzz!UsK+uD4OymNEPknE9DOqiRF1YW# z-+RA#JM(6CAO8{x`3YQ8|Bh_c!TJV4_wqOfJz`+&6Gj*V%hj*PzfWn#Nh zG7_w|Vbl{)<3Ved_zZo z$$Cr@DmSbeFLOMUF;)0%y<=P@P&4?Vzszs+KFd5qKc0b3~};VfwW~J;P1{9D8ab zBH*w$q6&rGCl)~Gx-WID6V2$SlQ02^NoC699a?}h$2`BMOl4k>KF~gjl}z`auq`L6B$IS&&0)7~}{$2l5>@3i3P~0~uu(K#tpT z!j>1=CGcEkSJ>ni(jV!L)Fe&m0pYPGVKLA_%YF9=958nEskXTfh5QVo8>Qdz#I_edCMpj<@M` z@}JJiG^mC8cGlQzcwm(6Xk4hpf@KvALFWXW7c?1D z1Wj{1itv&|K{e#&M$&O8w(16v^G0sgl7g-RcLJc03NwPf59pGOHUZs^Df|kc?l9XP z$FO{7c@cuJ`)*Jc^p2p*f-Z8Kpa9|SDTcyh$i9l=8s?yPPpAw3hq~ZWm)7omc$zBc zlAvpX-V^jghvd1pw6Vlbv1C4tPn4E6;N}iZPA~k|5}Xnxx)XG1E16GD=Mr>9(2Ss; zxO0M)=1wvGccnR-`bJ$`zH=*i;}lu8i{X^TE)bT_WzIS}H6x@nRtUGv*$e5dx#EED z3(h0k4W4Y2;ef zoUTr1;H=AL-4xnJ-7+ei8Jyz_Ykv%5KD$K-)hM$Eu6#U*$2t#2v zMFc?)(Za3Bbf*_VAJHPMo|~P11OqM@L~zChXAuk$t*6!dgU&F5ciaS{2+q4;48gcN zW&*)QqV=}=W;>Sx3k85uobhwnYP`K<8O(2K|i zE#C)FyWTTx=ht@@4UhvPdp|r#?Txkv&+V-oEbdLUdj?&OL+CsE?O4yCy1NET=ovlu z=y_y(cjaYZ_~7E9`b2(`c{ceXaI2-E#Zq$4bEo_jn05~L%oFy#2(+sVs2{w`kdU{{!^d Btfv3~ diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc deleted file mode 100644 index 0a1614598b7832385afcea42935aeed3705f3019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11330 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc deleted file mode 100644 index aebe8f9e6139ef452222dd6e997a2cc1d2a79493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29360 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc deleted file mode 100644 index a3800b13ee99ca872deb5940dbbb4de069d3155d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmYLDJx{|h5IyIER;7i3jR}bL}N>}+0nYT(mF a2z{LaI{$!^w@!bxXcwzxyKFttH|t-P3R%Da diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc deleted file mode 100644 index 7fa71f504ce71f9d8b307fbdc1823577c5b0a6cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8453 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 O+uU1k{B0cr>Hh%>4r5>d diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc deleted file mode 100644 index 55d83f29bbc8ac52c5ba35ca18d58486d73fdba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3384 zcmb7GO-vlg6|U-^nVugQJP;tec$POFN#L?$Swl13K;!-y zSM?YM^{kNP1CDHg6-8hvQphQ5`Lc>~NRFH%MOY9Cb$qZC?O|`&ILa=$9Hq5xVsojAU%;l(Vw2wmAi5=UW?~aUonv!4pN%qxSr;j zu0vs{T+}Q}o3f0raJVjCv9%ea94ZWHLp$C-592jtpd!{$QP6Qw)Z@BvS1L-nqKoh= z>j_dk7NT84!wL#&N;DI+fi)wQ+K91G9+|wt zvmM`|s~HPvw)W5J{zT#;*V(p`1JxNYpTHF7}$XYFDYJ&T6+=1dN-iZFsY;9wbY)>6G|g2|F?;2k}{r zYMw`e_5x6Is_GfsbAe#mL43vlRKlWCajD7RnG@L|)--8{?SW|18Op2y^c+m(XI(wcvmah<(L51ckv##e>T;ff;mg(jzH88}X1_6}hEpw_d@$T?DKgh!g#<_}Cz6rpg z`JZ38n&+?|k04a31xl%8I;K}DEuM<-I~+|7f*te%kR|ji)4fX8-`~l+xtkqYzW6Mw zZgg&E&upd7>}I=`rTg(`z5N@~AL74{f8O`St?k|qmZb-6`>+)qi7oRkkL@ZjYmmV{ znqxx8zPV;x4;OqKMHqj}u5mPgyk`6c5$UW$_SVG~1c;FiU$`Uas4jda%;R~qAbyJG zaZVUJ$QX{Uy3@@p%Sk*ggq5^Fx%A0LVJMS_2>}wP*rH%A1lS;1;3+c#0;rNswvsB9 zAnFhb8@$}r;^pS-S+=PFWC`sFaw4~z?pV2e@AAskdso-9JL$gN&Yrak4=*f_ef=!c z^AZUlksV-B=vyEEb$;X4R{HJ#?8z{FK)XQ8o$u$+<3vFg|JYtY;wF-TEjQB$1Q^f5 z5Cdin+&PXO80 z{~7NSvo(qz!@vSQF`w~b8$;b;1vnXF94+kr{NrfByrv|gIloy`e9X~;Kf^6(5yuEC zRip<0q{Er>z#sJ zP|&85C=805r`iks;%2`L{8%Fc4pO{y409U9h~ZU<6G&rF^+Dn_&=82GDKkwG9i zA>^S2X!3ksVKv8r$Dve$@>#N7y=pN&T`JwGYF1+zMm5~8P`Wazh z;|WIC5uC7#Q0Csd=!KAwmHlp69@%e?$+`UwEO)(%#pR)JAKNl^q%<)cbEx(L`qxm) zvxB_mW72$nL?6xII+}qJ;-gV?;~GMB(HG|!B947e8soa;3n!JLQM4kLg&BbC4FE-5 z_T{-I1P@h3S{@4byCjgU%M9jlx;U3Ql!`cCI!u)NpGe5Zq}vzZB-qJMf_hem)`~rq zktAqNbIniU7m9vj>fL1<*zC zM-dty=dgEip^s55XcAb70?vaX-BVf5HD8=fp#iTOgn5bD63b@_tDdm zgtoS^L|BdZ8T``~AWP^~FG_c>PW^UpC)K~(-myHfEId!9moEOJyLUOco9$c6Kg@5# zD-wUMr2eG*`L&(%quZHFPtT8Te7vfxwLNV6O=j!-=u?W1cSYSx zp`P!)NTauh9?|X8z$3bzy*Ij=eem%*eVQ8Bl79F_Cy;Mm#!<&d_?wq8lpdrEqkrl7 zP*669Gatq!@&=3>*I(@CH6^Sps?U9Ty=CeKc?X0S&qgi$^&^WzYO5%0XBCN8p2btl z^GAep3adENRj6H1aR{V43SwTZVmdQKVgp2&hr@!x{CTX>1j>)Xa`h830;}wqq(23+ zCt{5M^(MjtU!vE)M4kVRoxwvd5RknIj6V4Bp4^S!+g0A$6XExH@;yG@i=kN0t2oT? GlJsA87AA85 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc deleted file mode 100644 index b4aa60f2a5a24c0387c36ce89a5d747d6101b6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13674 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 HoDldQsy=s_ diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc deleted file mode 100644 index df1a8f0e281986e819d3fb971d1dda0baded7573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7376 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 Y{@d{iMYVp8aG8IGLGBelbr3`U1>FRW+yDRo diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc deleted file mode 100644 index 50ff95e6379f82ab0386e3843c87eacbb0d255a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10848 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc deleted file mode 100644 index c8c2360e2c705ca3df804e8c201212d88c3da9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5356 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 F@IS@&Vaosj diff --git a/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc deleted file mode 100644 index 39cb68104e70ae896bcbe19e157b16c4bf2f5086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11866 zcmd5?TWlQHd7jzX8+VsC@gho=f*;fBF9ZpMPp@j!C%szi6HO*|U=LAN0e!LgGPQ|1lmG zC0)|xtTZE!%Ce*fbR`>@QAQP63P`U?dhi`d58Vrh9-~2C7e-yguM6?IDC(O0x-hSc zp)T&%MR;8Tbs8bg7Zo zRs3F*3~5x>rO|*ck1Bdd54;l`4eDWC!97$ACL@k=diZ4N{g{gD4W{KSRm-WUQZqT* zm^9dcdTGi~nPC;Ob|yEen&Z<(+E&wOHEyVR&9V$#wN2HYGWZxn`Qp%wVNVT>{rUMb z=LR@^Z)9=+QW;5oYd=Yc!EQ4J!*r9A@+^sk~F!n`J z%6I+`=SCF+GCI;KUgR7ADexu+BfdZ_DvUU{FgM@oGa?br*-bEB7yay}Vk;Fps34vd zi`qp`RP4upJu_`3X6g~GsZ9+tLBi;g*RP^jHtFqp6YjBMAi2d+pcA$IpoO3LaTRJ(H)kz% zJY&yjd382pPmx+xCo@-!oC<+6xbCzvC1XJ4YMIx$su=Q0OtfckPahv|&$&H)>Yno` zOs4L+@al;@12O*M%mg1*&sh1aR)lJQyO4o?2m9ri+ zo42tF8Cx6A3T5wh;AFuPnCT2}m9ZGWrPg{cd4pw(Y9Xf^%sZ7nwP+U9nSw>OFPo(;6JO&iSCGC38i%h{GX!OR(ND3^|*yvDQ{v9KZa6iyqnX)26~w^-UU zaqc(>7~cUEXIE2$wR0-SdRH#78=6X-B1qPg&8cI&ZdT7!CMTxvxT#0|gY^*@8< zTa;|FfBY)THfcV7dGLyLl;x|6E?9E(ga=)se zK3e(hJzWiy6ya*Im=3KI^WsQVw|Q0LCGW z%`enTDSt=G0sNvp5$|NS_iJ_}a8|;4rD;;Jbyr#T=#_z_ic&H-;z*@~IN*(kOB$$8 zoEVPU)g^i|=*WYPe9n>2I|{@%8FykCi%gxCOB;>?c6MTywQRvS#hA&QAPobY21a6Z zFisqTOm*X$h5EF~3@73$EGNWy!U+L;+D0-YEZ$-CVuz?0p#I8?HEGdE#HIokaYRx| z5DxVK*=aPeeu?6m^l4a1bl)(3e(_;^_i9Ja{P1dL_xvd!rTOw|_sJW|lWujn<300! z+rE!GdKQOn4xxqr5O2M|wSOhv|D>bmamU`3j=js59(4514?pSJzBqbw^l{hoD_zgu z3Et5kbRC`#z8hQZ?7^+cy?qpKd$M)+^1fenJlxuUKhb}`qklEgcKz(a*&BsNiJfa9 zDbX%Wv(MKcnfR3R|L6w(_fGF>z^?FzZ2R2daTB|Q^KZcK(>{-34)+2Nx>9mgX(CwK zsGlzdUN1f6rW;A4 zZ|klC%5KuHkvxXDM7q>*Np3VFLG!w+94z|*5?7KN^=vd}uy#&Ynj7{0+If9xRfD5|pnXF!XlN->NIGU+4e>kHJZ0F%rn zAPx}hHm}kHmjG#W!$Ks5$8iLn2atu*0QdzZ1c3$K$B!fZb|Igo=t~-gb24jKgaG~N zI93v!VSCM)46r+)V9WuP1WYf`6JfBlna>cUc0rouPFY1e^{S?9O1pxJ%)|uN4ID?N z*%D)O^Gk!mX+W)x4fILM8EM0^G*+xu4FN`mixh-Y+z~j67?k3wn!34LwGvkkMX+{_2Nt>HCaS)O^2s|L58L{`LTy}sZQ-@0vv-s`7at`CH&q-26#t=V z=ZW3Yhr4&3_?}V|-SRcZMs(}zg|D;juS33lZGp+$>uapL{8ZN6M~cA6jc02l*}&PJ z_JS@^E^cO}8)-1#zGFu8d@2iHGq0}`WQ`mKpM}p5O3h}4E8;u2o^z|$dA6{)T;PPv z3j6O5wGjtgBFEZw6Rjz;kk!d6BZm@l#QnzJ-tWJD>cS63PQ7vd__P zy>9)<)5k|%JvEHija*D2>6OVuSP%NeCoX5^`T@61^$Ou|U<`^MFu0r08(wU{TRt=Z z%fLIEB_)`Ksh%W7Q?2?)eF()+Sr#)$m~&O?@BbVI`Kuig8!*JfCb`1QIDBm=X>VaX z3{br~^+0B#W=q_bBDNybj$86z2|_m+3R@7{AfoUU+mWoO#>SvYD8lBq3kEBu+!GKQ zQD7!U8jnRYe8OkLZAx3X`gYv1zpgRa5( zR|IC-w)6J(TiYLR8(i5o_`&`M+m77`*Q&qEcP>9{JF*s*+PdeP*A%JS^?UkPy87>6 zq+|21thRQ|H-E7fsYOxf2)N~=s21tNmR%?Ml*XR^0fD0AY253tdu|2CCe?nDTMrMu zLG4?xIqVs{^P>TkaiPx|^tk8FO_2ol{3bfDk^dx5`<{Q*9KL7&6<*Fa9?heT#)9AS z8A$c{|2#R%K=6KaiJS|bweiA@ZluNU;fJS&)Z>+IZtRGMXm~JeMzhl*Olc$N122IY zlgLn2n7m3>T=c=CmbwX9K|TwyI1EsSETA}%bOD+n2nAX4iK-fmkK#s&TxZN(g4f7h z!MHg`OYp!Hk2Fyxi)1uwOxS%;ya@R9sVp-&gIVRgXsb6#`MhaMWZ0IOqc%h%#13!O*(VJ^+4Mh_&gJ z9Un=ConY3~bP)@QxVykJEW%g^~gd50gQO-^C~?5|u`2bC63=Z6bP!qim)A+{ZI%(6rdD-VO&ALTQM&JM z-#KiKZ{%hS*u0`}+Wk=NcoE{FYqqx0dW{zd6cbB{C*BjGUg9awa8gh8K*2&{EL-%a ztv-J|^G3ohfzx?}nDU|%g+ooX->ma&=--) zE>*UK$5Xsrt3L?{KVOuabgn)M&z$2BXjA;OG$Jnzj-nzP-i}4w-Q19{I)`B<HE#*XMAu!^NVGXk|@Qimc?GB`A4YW?I?;2>d)flg!qY6)w@~b*QiaLQRbIz zqhdQ1&rm_3a7Hm6Mot_%P6cToMl8$dNa}Ncd#R2JYG%EMf)dH?q3GHH>9l-KUQ;?k zyH>mQi~GPZzkl4+ydFaRdT(2(cdbtv{MK62w$O_ox2bC(+<{+Oo?na5Q&egh;P2LA zQmkb?j=J@uJ)!QkqweUPp}nhHcCIOO-;2?4=cD7k-WLh&`*ceLAvX5~u_bBejJcT5ELsE?sO&NGc+kyCV5BCJMd^5u?IlcYe=UtLQbRPgNes6fn3JslKCO|< ziuZIcD2A`jXdnv_7!e_a5Kj@XK{Rp_A~8A3Gp9~RN~{y#ARxI(xWYhgVTuytZn!bT zSLlRhGrB#6;G;n%zYabVGnQJ#NPeo|Ur=e$lsr{{xc=FjXCHSST>Agyc3ov@asZ-bm5aF|tN&FLGB%8rye{Iyjo|CQE90*TK< zqJ8g1ZUmQN%SV?F-0wd4Ali3F|4sC;SV(>e)D>c=K;G zTV={`cp7XB-8O7{)k2w(*D|cZLdA=JubmZpTyt%<=Pty2gL?ldidv?unVxh`!|Cb8 zZ)t$aq8s9om(d1kV3gweri#hKB_w0QiYrz6rHRK@vZk5eaB9&R01bNM>k6;pKS6;- zpFUlaoN96|_rV#)RePuz+@qSyXgV!A)$K{fM4< z2g-reeJgV}!9$~>ma}>XHRAlvpE%R=C*u6N-pLqy`aZ64cd6q?&By1|^QQ{+iOr4w zB_hY5Vu}h%k+3WkIV#?!qVDUT?^7KW|BQc&`oAN66r>=;1^F`Ue<&1N?dlQtYz1|01czC9e;l{7Ib=*MoX!UYd~cv1N1R zW6ODIP96;d{ze>uq=blH3NsUDkw1NC|Qwd>0Qt zlfUkB2rJ$&(FDr_lN-Pg{A&C$#Ey=TGUHa`0EO_w}l4wSc&N z1pp{{5My&lB;3(M`00eK0vvFT0?{HtEe=z`g~RXcG^JAMEWF)Rs-nuS33rv->`o3) zUCrs``2QONSp<~7fHbylTiW-2$HUfrPdc|Qh2A@h41d>lo{{g_c{_G1w$MBun!f^} zU5KnidzQMEjSpVAAMJS*eMxBeYIW;FqG1gFG@cN4neS9NG!d+X!9DFGJUW4c$B1^C zQ#g)dsU#Jp9o0*%m=B??e^1?ZqTptdT)OM63$06mr3=ejmM`4da(_qPqiDZSMKWV( zh+U@*ulHQw1yw01UyhkgT_T$cGm+>tyQh^lve{HBDYGJK`KN&|i-lalZ$`y`(Tg?| zUyua9{QF=i^qtQkngc@ksL4pOi9R}=DB$B%e00jd>=N5g1+l*Ptdzd;6P(3W10TLt zXE@RCAZmoqR=>-xqA}SK>lBJLMV95y_Dk|}zm+;Z569)LpGYV^-w~I4=&9%P9j^!E fy`M-_ex48Rl%M@XLhtFA33Ax2rxx0txjkD814ZPn=n2oq_@q%)^{B z=bZVSGjqCYL)Db}hE2xN57&D$zxD-ctA}D-O zNC`zTC1S)Oi7SLWfL%(&Roq&o{2V%mi0>96en~92-goU7x61EW1^`Vcgnz4LD=AQj z?j>F2T2hS4Tq5w0EfU!2%&4knWDHqT^{Iy}j0ES16U9tka)K^7D=U)D5D#C@9IISC zk{CUF`NPpG^ok06mce+#bFe)Ok~)%53KIm^fKxo-QUVbPe@jS-Wg+2nLK8)!4e#(1 z?_8<`Cf*snq-lzt-MI}HHvlu78E-GZTt_A-5`Dv06%+FMFlMXAcC&nfxvQgM`ZMPI^_2wt{a zB$051xTo8trq8pg;>XV3&Ib`$7WD2tb@=*e$WSX=0s}YpdB`N_;ksGmEd0rU!QOy7 z3Qu_4E;ZXetA5k()_}h-wyXCzsILz1-Clv`RSi^wW`K0Me)^3Ao}Jl_pvs%PDdafF zPP;d#M`2IsPxc6V?CFC&UGAQc86@2<=O;aY8}YotIqxKTryddzY_m7pQR#+eGMZ6G z;VI{!Z&20}C@UFPA98q_nM-gjG1Ix?BM%v?v$r=V6JuKU0XHql`Dw!ymgJj~qB9%y zMF&qNq7IiUIRce3#OeG;Sv4{@&rqsS%Jw;8`Vx3{1YNGcY)FdY@QS25LQx}3z?7n1 zQe?y7OB&!5G+A|cjS@%9$&v!3m@%@`j+m#~Y{}te)c{ZzPE0e9LhMK9?}#^BCS{jk-4PX8m2?Le9emxvH+1%HN896zyNZc>MO855oIF93Ec_jc>-{Yk~M}(GoYi!}ojo?dVYB*~S~z zc?;X|Cz`m)HHK=w&1kHCu6C|IS(|M3Encwj{YcdA?ceO_wa$HPKJuadk@|(&1v|Fi zj*T>n&eC43g#3ZuROI8HR)^sPq@v0%t@eks4KEGa7|H%5}{(WG@2d@#)BdmFK%mT33( zS?|?9sD03wS-i5|JH`SZSsq#%YM$AMAF+H7A_LaU;`5Dn7heAAKr{2@p_P+gJZ(qg zb|h-OTYK)GCmY7yQ{P7p-j5Fd7>(E8uD#vFi&JpK!5Fg|jMe9AbB&qi*kZLNSlBuN z8ykUzS04<+_1rycow3Ibt%%KG>-6X6?f!vAV&TI-QXO8n+MHQA^F_rTJ7}H$?EKG{ zG3tqILnhG_e71d5GG-}M`jn!uU`+Ju{n8b~L`6MxorD zaEqpiq-UvIV*dm58NmGp(Gx&ul1=QJs=05GX)3Fvgx)FGKUVPO38h+9` pbuV%V%Ht7&#nxLK!qIv09*V4^h&6dH`qX;#sg>dXqUT+YzXG@wI&}a5 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc deleted file mode 100644 index f0342c78a4b49f5b044a5cf23144c1daeae0c578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8877 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 ObCo~zl!qt9yZ-^}C`kMO diff --git a/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc deleted file mode 100644 index 5c59fdb459bff3ba30f1b9c1c24ff5e618cab66c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18165 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

HqG~A@Kl#!N)OgKF(a4PJE!vWa z8Tl5z9*4+n;6BAPZYQrm02X- z`0;|dHDhj_1Gnt05{m&=aR{;72~j>Bdqw&d>-D@(o$O!N1{W96%Wa}Z5f+k+LUb7% z@X(!TW+J&Wy=bk zs(o2a>&l*JAhn{D^U5i;@tweQ;%@|{=itV^R>p~ z1uTz5x&HtleYhWR55fVUElY4oI-yUOyE9rh$lbb5I%lvZo02;dFQlsvWekUawpD8J zh`_N*0a*pS(<@`ZRMtCg!Ff=w!z-cyDF#V|wlD%q+U^MH%=vcipvbc5~7(-DzI$rnY z?jk(u3Wrd^TfAQ(waM8EM+OUDtMa;T*@`BK(BPA80&fA?pPbiAC2(I_dS+#;S?U2? zH%r4}u**Y+G)*+7vtd%8K!^xJ*FqU;-DvIW1T?eMJXgurD zTa|=C@Bk^$yuBpN+n?#NU|(kx)kULlur+aKR6d%)R$MF1l!Nb%@8>4Ae`h!jp&IiXdEt5-G*j zv1r}hAiWo!D4ww9V!=f67@$Fk1Dl-ul{MHW(IyA820Ppz$ac5}@rJw|tZ#xk6!w5& z?J$>uR=Mv$B&fsv{cscr2DCJJ@-I5_LTqJ5bo~xQ$BD@dFO=ciAE8Xj6b)aixHSr? zyO8T0g~V}+CY!}`UZ|$ zMf?x(6Y2Ktf@$@5uxaV51Kqv>KYU*>!X1cJdLrI8{O$XKVfZdAa-dx<`4+N!v~mAE zQ9>w%MgOzjSMQl_981RUL_Y1A4K5gW{cZjKAs6*;xi-+Tw$&ZFhC%9b^?}DS_#s~% z^}{W^E8OpbJ8$sujRJj z*fRyk%6w}QElLsccf2FY|H{I%**SO#Yc>3Vf z!K}SGq0MQ`3!2J|rZQDAuW6h;|Iuq7zBV^_Pc`3iAZK<=GD~LgC|)vIZ@xD9T5=FR z1vIsQ+yvHuO;ejv`{$aowrvx~(a5Kr(xz%=*{o&DL@ydXpPza@b#m@V*4{C30u2pd zqfFPg-(|AS-4iEs8fRM5xTv)y58Ubgv}JbxymrT;(fsQ?^@6{(MgN3SnDlTnZQhS} zpOq>5yWzC9ZV7CVgHwa)hV6G7v*jHVVB;ixr^)wqmhI5FqjLJ_)X|g&zKU_|ns})& zn4YYCCk#d&{Kl+p2Mk_*&re2Qc5~C@rsVEaV^&`a4hr(*Raw(Um^@fq1}6uTKtHK zovxaydcOv&t9nXj&S~vAtu?20fXjJKTS3xJ@(TIzXUJ*Ga$0>(3y_B8Mr);dqH~^c zJlRO8%HBEk=BZ?7N^$GLZO@En?zOvb+*kaK<}WpwJx3l`A9QEy&ZKM4K4Q*&@nkD8 z>(ZqA>z!bK)j7V5pef>Sw3ee=s0UjNNB1fpJWoRm4%|#Ta9oUcULk28iTg=BM)G|H z@1&ie8KBt6y@=5vh+;LO%JG!q0h{tN7|;d~5IG_@D5nB)inL%PtWr`Rp6UR;mw?Z_ zUN6-_8~o1;T)v{D>X63TME7q=$;sSgZKd&so9A&Yw#PT{!#eY1HMt>P@W*SDdh4+{I0?bjzmHDx*J$# zq}|)+<50L3)L<|Kw{;E;E8=%<6bI(5ylRbRW%7lF=xXJ|SG0c+M@o;^*Xa)-`;HXB;H?u;N<`HMr4>QDPyF)g0QUvF((sG? z93r4In*Ludif;NPrTaVlGyR-u{;yQcf2Ve5solR-AE9Z-uPKaI&MRu^@|6Q>diS!e zkEYvUBP=U1vCOE|iWLRnHfJ20=T6;wb)M?UQTC@wdgiH}OH>u+S7oTG9AjT#sxwUW!`c&1lnPn_ PoTx;5#~)G8lj;9|Q1vr2 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc deleted file mode 100644 index 3a3fb84ac26f49720492dad2385e7705d7a86668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33081 zcmd75d0<=Dbtn8D7Gfs|?gTe*CnbuzMC~#qE}|t-s~0JD7>Ey~KylLpWQj27&~7>b zW3>V;w}NW7rn8LcIx}UywqKN)PU|IhJkurvka7eg%#>-J>2Uh>8`@I7I!@=y{LX#v z0U!-Jlg>YVqVBu*+;i7=@44rkd+xMsp8Tp2)j1V=tIw&~TXRms-r93o_D(yO#@@PfI`-C|)3dkXoPoWK=Ztu( zM@*yUbLLUYIm>AJxpd^M5ws)L(TsB$qqcK47ET+<9L+kH&HOs}bI#>5zaIX)b9u~f zfIt6S0rMM2?4yO}3Yp(DQZ!n8u9)Xs7BLNZn@37UOV5=e?$3qvFKNy>@V4SzhIa@O7@LYd3K@XLh? zp;Crd3DrW4?5`E-ge|gvt5A=ew+RhGqYP;hnuQkG-zu~T+hzX_p``M*Im8xzKb2|4bPAPOGY?-ec!Pssi&!c}2X_WOh<1;6Z{5}p#iDEp^{ zr-f%^|8EFi5`I(m|106kLO}M<2wxGNmHpR*-x7XX_For*!mR9nPPidFFZ+K-_+8<St(;op3T6D%&{;OQ}rH? zSP_@Z-zrt3P8(CB zFJh{}iI_%oIR()GXw2B}aSpor34jjPcw8fcv9wXAc+n-s_%RO+a)-n5iO_gqeALw_ zTt4rbY@86shg}0+PvgXeaqsxVxab`mA90U2PE2|);7hs0CtPCVi2J+@Xl-b2Y4o_g zu5A;}fs6P;p2icsM;qfkdSc}AkbA6QVlt*VebGH37NgAl`0r_kGtDjQO@YqqJu^Mm zkIozo*`7VVq%R6xis&8F9m^WaT}^&OlOM`{DeqR^T-ke?%6mw}t@}XKh3o@m!}l-i z15K#~m7f>XK74*(8a}wjuf|7Zi#)X>@%S}+5kQFq~OgDPb>@f=Fg zT&(3d@wfc6{A=x;kjBElnKWS4f=(GaS9z3`k({IC7xYw*DXlk4iSug(gOX~KG)78e z;83!ufKsQeE7Po`UI(=(&_UId&Yvcvv)Wqyx=qTkvi?ciBsPP^ZkE@=EO-(xT zkllvoH97285y23$z!hSY^v6d@QmeMIR^_5qd8}0xe)VwShU^d&@`ZGz?}c>Mg48uF zi1(VE<(JR$*CGEx7S3Q}IaM2rHl(a%DT|S^grzJ(-xPhiW+}(HIx)ssTT59EcUX=N z4PZ)+M)OB1ugY0a;#uEeih@HVEC$2`s9)8*T+*D zfx$}{lm{F8Ccx7DCdx~Wp}f->1(5P8Q|d!$;(3`9rAhVio2B|pS^P$!lGSOKH<8vN zR4HkNYM+TqUYIO`R*74eB0dvSq$pNW2sJNi{02Xp(_>n{Me(DL%&A+Hvj6yNFHcHy zu9nrkJwAHsShz8{PZM-0^*0o@(1>CbW-IIEbbtCLnDraRUN0+`=;1b2?gI!zAhHv! zO*M8KC_Um*E$zR0ezGyNNzRQ@&8Sx@IB&Kx3Mx5K&2wh~y~15ppXILbh%HxQhbt9d z;+--@wG#j7*t(`Zk&5$aJ5HRa5>{zBSzY-h97vL!hnxqyd%IVObBSq&2i=3K92TsY znY{g2>^)%6R%w}CB_?H+mM@WlF|{z^ju{x*gZA>ALD3 zr2JiYuM!V%kDLo$@5JuL#xYNWQy4$*Y8V(FZM^E7Xl!n1YUJ*r7F5dB(TUZ+L1rGR zVfTqgPjNB*;E2<6VZwcNl}O<|a(WLP>OXPncz5s7E^hT7sO)q=J>;AqM#ghte8SP% z(8R?IjIp6GYy8fGy~o`D02V@|kM0Jq$JJ?Krbkb?JmVvmi93y1JKdg%5$B{!cnIzE zJQ_2d-8}Z}>i?@$wu2fK)3Ua$Vv=$(EA#hzMdz4ja9kW^H8^&nn~SMNCt~{1iSfZf zu&8y}Vh+&7TykjKF?LSOr!3UYiHVpF&WPLNjitfk8WUm~_t@ZgEKP7fF*+{93|&_T zTobJB8n0_)BxdfXj_;Rpk7>~wd@r4QV1Q*}M3I7P(0O^p3pTQ~C6?y#ikAnxF|A7! z$HkbjcT8|y?IM4jRir5>+R35yCB}QiE_&^63cQj=yI!iEjQI{9$2%QgI3U$prvRG9AL3Q1H+5E|`xx@O#fabbk z#t^KI=nFzU%avQ^+ZPTkRqm9*4H13Wn#N$*9?dTZmEF<=dY21JLYL;sUfA{Z0pxM& zYs2BfrohoPJ(p1s>iEi2(Tc{P=B8oR5UPq~IHFYzXkYJ4Z}4KoTpq1$lS5;R=BlW{ z8r-pHCsD#r(4QYv~KNh@)lUWW=!}(D@$X5{0PeGDCym+9Qi4N1}yA zFSXxlpKG7*SSoCozZ5BKmfKsksLxMIBUNm2v80KLlzM8*qCQ2oI~PlKuH|zE%XRaN z`L4b&qAv_}yr(Zo%1o}n-o=u=E4HjaS~NTVX76n8-R#;(cI|xO!uh4_T>(Qh-5N{_ z<<6DevWL?v=XHzejcY2qB{!Op8!DSM1=Bvrvxk~PgEyWEYT~e!!lKZ_w{`{fD})ug zaH~F&Q5{U9`0BalTU#O-m8la(^YT$v^?cjQ+roKG$T2G~wBxz`AJlA_Z(Fc^&A;G^ z)a+T_+A!~3IQiP%slIDR+VztB);;Ri7Rai8wx(Y|Bwp9`y-Aw*xom1 ztf}$-#eF}|W!rD=o!tw#CHMV|9KbEPzqp^lW!TrDe&T7zoPTqF@v$uK-Rgtc$I7|C zY}6jx!+k%?aI94Q{Suzs@~mS!)!%RD$=ze<)2V-u#=~7FC(`1< zAMr5qVf0??CSMPnI?aY9K|BK}TiJ+~Ga4>_p0LUJLy7|{Kr}q<*QeoyMWEWfPxl7g zPz*$K^JE(S(9_4))9{=*K4g4PQz4e1sC5H@m>4z?s=@mFOB)F5*y6aRXB||nuc#0d0k8z&6woe0rY(T~1|CII$ zSC=o5$yLw|N%mo~f>?{7FMWXNu^ktjW5S5b;WKSJ@Af)KS`a-VRVv0Gjj2!d927~c zi)juWJA1@u*~SnYZqjLc>NKlwlEm^3Isb{AAHa#3po$%W%G%?8!j%+&GzL`yC+;GL z$Xm<=M!p}&gV2hL4S=lD6c8P7>M}Q_CUAfBJa0=tsn#;=kvw@ujd}Wc=C-#C2N(PX;@lc`BMw67s$@d22FsalSB|zCEB`PA>>mETxx(^(8BrS;3Ck zN+dZ#NuGTA$)FR`K{O{np!qFh6zpr^Oks!zTOQ4^e;QOspcPiYleeA>jn3~2r|(){ zfX))OHAi&K(ftR)`U5hlJgtDw&EGEj zjwWp1_nvvf#2`QsE!{8Oxv zOgRjNzXs}m)LW2NHQnEHuav`?O8$wrU|_394$G$#HOcVnhe<85 z;dxCC^PD%n(qU~eB&{t5s1FT9Wu>(RRF$YWsWUb_=r1EtWyaX5u`z)4XiA-`cSQc$ zpO7+5rqTvbX_G{yCE7fKoSB+x^#S;N#pj)Z|vusK@MGxY|aX8TJh@x{cruIyFVutgRUe~w?dKuG`*K@@=5i|STLq6wF zzne5DF>`Va>QWO*{t0NPuxIHey<5z1$xGUjA@2q83YB_}92zsJiDu`?Gvc#|{V8F5 z0_UGcG>w?o*Q(j{p6SFqhYTp*s+l|ad-by&^Cux_XXk_ra|dswN3yE}hGkQF;L@`@ zg1w8T;%H`b;LvhracE#Evpj4rU$$mne{$x@xw`pFUv0S6x-f9N`S!`%lehOTSsx5& zkn;MznSG(di>Au?f`yZRSWJqGV>8FD9slu;gG-f%zBRI7n>#aK_O(YAMk1Am0vegP zl!eaUg4(5ws^|_32aW~!`*|Gd;k;h`^N+H*s!pEKlehBBod%8jby`j}SW%jM=7Uab zgSy9Dj?P18+;1om&Az;@t6pf*T!Q1Y>(XV<={>;fMmdktJ^NSx+QZWS0IdC4H+e ze^e6g@)gCq zVSOzewH=4*L=xO$T6AP{lP`NiXD|%+Us6^KquE!mu}i3y653x8n!2;&kgrPa8>i^@ zUKn+G-2)D23f*Hvc#R2eQeqi##TUnN*wq9M62a zuV5XzNB*ePdUqITw2yx3^qD4~0V-gqF1?PXK6fM$(VU2A?sG3DB3cp=Eq(5#L_}*M zqP5R`ClS$>h-m9`zn6&Eo`~4q=l)?LVn-rkN1yv{BBDJJ(cb5dN)hVQ$9sM0r&%M$ z2PIy#&;7m}*@Z}R*O=glN3F&X6+^1iK1)262kfu=M~Gl_2fZha^khOO5BFu3y0h=7 zFIPqyyF7Xx)D{KMg!H(7EMc7L_2tPJ;C@;4++$uC9ymwb|3yMMe8N{Mqg-&iM5j1# z!99Sv7yr5#G=I%dyBW&AySAqn#64iMssS6X0c7dXi1IH;{IEziw32%rp9P>f1qHrrN(G;|5U-)o*HAj z`@bp}J5popaQ~fx(ViNk-TmJbjGd`5cDh#;j9sZQcDesMVbFFHs6=k6PHk>-|9u>% zc@vyw_x}^eY1ss)Mcm0|I+fMB2~MkcAdb_v2~L~)f5gk$z6s8D_Zo0${)2or`Al*8 zNfhA2L{xKf6llOliKv$3s1`DMqP$v@p{)wEEg9OTK({ADw=2*c$@@aA>!<~Y1%9h|k0<hLxQ8G;^fBfEb>N04VZb)UdlL%BxLKRWBB+v$*Mtg`@!q(K%pdQODfJjxxg=*L`#(F! zDgN3?zuHSm9ri#e`K3h2&(v0r;R{V^rnFOO{>R6L4at{tJ@C(Ju@n1)KxomkFnfoNjVR zxyR()SlY3UQ%AZ^#WYOw$E--T{bxwAcosM@jThcn7BeaBhy6$Ypg2Ctj0@`YlHTtO zWyNGw8VxZGZTQDbg3B`?x+RkYoun!iV>;1!g^KaeBv%xGlKM~EKMuPFUsl|Xlq`N5 z81Mv<IfXB9FMP*oD0bQ0M*!ldCXi;%M zb4OnQc>68@jnS>!2#_Ctx3n>YXjKiO_0gslQiDY+tLe3po*9*Nh=GnMc4a%iGD%Xg z<|W-N-Am?M=DCwESR>grL4G+q5BkUMSt>uL;AYQk&&{K=N9SxejtBW@M*fO5cau6r?WOSF7TNcTa0*-O@2*7>xBwA|?@0+^7t8=Rm?Q42V0BLyYgQQ;Vb}i|K}3usZjOvGfkO?(>(uF3Ge- zB@N)e0g{KRBkx^e;`GZ&`ulwa8%AUzDnR2>vTBAlHk{QMF*PombAm$X;2m@6a+W>R zHkUQ$ec8U0RUbCjFQ>yiWhuQpoT|@=cCtPT!1L>@)k$lR%CGWNdgH6^Fey?uJYu#t zzM`VH<0k$dJuH`#R_RH#Uj^n#<9orVOj9P2jX6hlL#l#mZFF38NfM-kEPCQ--QyyJ zGS{fndl?8_$GaUQh#fuN(b<3I)I)uTI?i-;_V*s^=;=D`a0-G4D7`YZi|64PhkSUR zsHFqKrURN3x95UGa7k){I9e>NpXqPTu#fl4_v_M<=p-X#IVsDHfgX8iK#2bX-Gfm= z+(FDp&FW`*JZV3hh9w#=ktf5*IARIKm$!aE#3O#2h66URK&IBroW&L=RQ4rvWq|() z=Ka~bIcu28Gd1v1lP>90PK zzlKWCBk*j`mxmE8Hyj@lQXILW6eCZ<1e`S2)E$o@%@p>8iS2;?nplVw!wIIciQ$yy zjk9OU^!2D7dZ$UqQG#DpbSK|r-I4o~x|#BV3`+^Nfz^7E^tH{0V& zSwCr~4|r_HkMNY5P3eR*>^GwJ&`j(6hKrBk*#d2s-K= zXsuZ;cQ8h_QF_C_`Ixf{NuBA4vkf3XGejy6VVO z86l}IEQI!9$3N8`x!*WQM90v_)c6vcbRPApQ;ANzV%oEZ&L0xR_X(t7d$DYXl^MHA zNr>xY;$EFu(%G+2It!y5E)nX*LHCfv))=8}AA_oCYyf+i-pdnUcP zu*JV7=fA+IGf8U&`K26qA;!C6{CJFa!oCu^C|ArfF1m5{#W}+ESs4|Hsn3sJ^`H}o zlqiqP@d%=G(7Tc2VZc8iQt}oYW;0{92E5lNXC|NBA3C`RQ@^Y{&<%6OT~jgX-?Q>o zz-7P+Fm!45u^D544>V(s&IVp3ppE7iy=1s$2v|O_!Xoj-hwfM_zz>D36;YEpaB`+C zxcw{pLTBbaA1Q8)78HXJJs8c%4xSI{106pxS&5O+P|y-k>|E>^vGic`DL=DqL`ywL3c} z(Dgx1$<6-R{<)L${CxAgb1A1OoDE~gYldh^#oWozIbsg&pwrj^eH^vTshZbDa<h z4+$nNNv9&n32p$Jb8)gi9G~teU4DjXOm28EE#p#jB1&0O#L5I&PH9UIuFelGB2^wk zNyZjq6^10PF4ab4LZ5(x!fI>><|(yFY`Q+fBNw8@>>0KzzQj9`%XT`6rAcMlqVz6I za5TelDLg3;u0L)R1;rBnDGLaA;9sK^=#>AN*1nA1G1>(X93&2sWLcLJ(|cW`6BHZMjb8LnAf_7k#Iyt0h=YMS zHgGP)(qR7Xft8D%@R&qu^jtoV-GTvZ)WwVg7hD4u`$4ovVriGhuo-bNraOL`Nd+?tljH|Q@DY+s98>qZN7+FJ zM*JnpZ)7|pYpO3l1vklJ-k~+1T3G|K3h!o?M>5NoGAn0vpz&?XdgFEdj6P_)W?D8` zuD8#$U*A8oKUDeBwp-iom}-~Jxp&QF5px;rwjaE$xh?#~=yyiL znauFK@_8%d!>lTjo{K`KZ#0I@uwmC5a+YnmH|?|bQ0E<6+1%-9M%GRJtp0f;*^X4- zst#(N*ZrfG%Pe2he=4(F`^`sYAG!J1>|-FE#wZr2q~J<+F3e&KAK$OxvJ1%=IOqM0 zY%&JU`Q#tdkzd$W_KW-Gjd8zN(8VcjvoHE05NmlZ8mi7Q-60a5BF_O+hx$bt<@p+ZL^^(U;TC-Pi`UKtx~^ToYU2+ zdAo)ATMb@q0dJ-V%aK@`V z8!ky&Xb~4EaK7C2BSJy{DUAmr&p1PC#lrk->cxddEUU?%10VNBY@+CV0w-liB;iZz)mkh+y9w9*3zr%{-ALRg!|C5O}pWR+B~ zhtc7HYFwe~*D5iPEL5@*QwxsV;DctI2)$oJ9BHbS2|U@EFp?OTWSx{nBBvs}P?Rkkl?x8ZxU5i7{rxQTz#jzOoH-fXU|Tw2%J{ zmGk@^aA}VQ+BiBL5-}Ce<<5KmX!6y`NZHP)Ide^wXQ&2;OeYU+><@H8n>M%O)=1!Z zw6Jt8?bcqL#Zjp(70bDWp`-J*TgR7j>*xKqJ6`=_BzJ#M4RiI3?CZW6U#Q~R7o)jb zNfqXp%epZh&Zvr7OXkWJtraU7SwSyOny90t<#UHZSLLHNu0?av$M<@ifC^6 zb84b;6~DNj%~`VO?EA7gd)b@^eGy3YvblK8qRTLT#OV#yYZ;uQTFGb0T(o8b@DooP z+WM0HU@`aavJaZMH`4dP`=;4+(5`+nPeuL$p8R$-`HS}+DpJ2y$iw~h>6DmHg9Y1U zM0!RiL>hF-RH_DHU-pJC#89VSOQEfJt4KCc2;$!b;kQop?xae}fjm zk_vhl8rvex9zZ{0P-vSNG^S-58K`zh^70vh?eIG&1Gf13a+&P*IiS}&;5@EGQjWeR zDH3Vw9qaMx9c<{!ug8^SkTfabCpm(9z$;~n3n}8U77*`#cAl*tH!YBiY1OwniE89 z*uLLUM0$=R^d&B8$(rtt7Hkb`a_?z&Xe;hb@EW-0bgga8QLQbBW|yp~>0P~-y;lso z?r9OecY-h0=H1)R!<$y9t-imT*A{(RNWqts))6R1K5HFeYsF`;6shjWP*xGh`>H-h z;Glz$c-S*d5SW{cswn_AdyrcFW1B+$Dfu;xKc{TnwOT!x-%g* zL4-^QUhz%PDePQB>tm#qe9Ab)O_^BO%);ix=BR*!?251iP1{{yTM}mhQi?troZ3kL zeU;zr$7UVb$|@%VrqYFsDQluOiS0_i)gQm!Kxx@jhPR4!FdTn|bbdm}Br8(|BSn1H zuZYi1j*sV>Lr|PDz;}+r*eL@ce;urV;n`nIo3i5POysV}zGO9XbWmB4Pa5~^O*O=bEshijB}Cf>-cn&n@k^gcl-f4`0D$b6>ZxU;hl9A<;jjzrrVR zTgiD-YSaHw>e~PP)OB@z;vuvup-`00XdmOY#Q6O&elJrkVmY*)frTZzG)TJQ##cA$ z93dJH3({jJ9PG%nqxSL`@hZ&JSa8Ft*E=pw)~)gjSdMB_;bX5iVHGEz4sol1&e*(| z_UO^0hYyP++~CR|Lwo}Z_NjE5+SrM`m*eaRc}(AhHFL6WygBY`5%*wtj)1JOM@5I- zxd+H`kdwbkhl(XNRoh~|J4r90zPO?yCZSEd%4#i-lC&wJR;2sf@ zB2Lk@OCBJ@nC=NzB0_%(P~0FS#Hkxy-qtNbyWn7zbkv@3j*TPitn-z8Dt5P{maYdN^VP{Z zpCeVg1nU?Z!lhNdg17-PM#%}$4GZ*1shm2UwChiL7q^NWx~L02IBIfeVG?`LKQY}y zV;9H9uZ;Q1QVk-qbw}o1Gyv-Aa-@Z{oYJY><1yVqGEVP3E?q3}K6+Z*NpU&SXM%#H zQyHoKPqg63kIQut+xV`lUXoX!|6mL7gOqNZoXg~pTo5x|9-~X3m`y-T?Q`QUs`KOH zBQZ5rZ|Q7MmLw9KBWw%lV)~(lhZ!CI9Y?rBZKTq^qpynMunk>4uu5d=>+{nV=+v2y5 z-BYWI(*wt#u+Kfo2fCMY?Ju^5o|v0jD%`%5yCcx^L4DIg-tEFjbJx4j_@7*=KefEI zaY1+66lv;wR~KnIv9$H%ry2aZ4l$|wvM)<>+{7Ho^wmS}T(&=fA(wwTedlDli2 zNy3V~Dr(;wwLcKG?~K}aGynDvt@?uWK<`>6SJm*!v6qi6Y`uLU($e#8!BXYvz>$z1 zdNDfj)Dt`sF*~B>oV(_th`A{A$b06hwS8Pc?b?1Ww=|#%?3gj)kiI#6y7%Mz9V*V8 z4QWoB{XT3U)Oi2mzMV7Ye8j2H+sP-p<~qXqDyXagCtVh$VkkQkhriaL^zjLt=9D;} zcs_?|@Qk(F!o6Ya(03PcZ)Rz`_i%3(9%|~bbMIIT-397*@_BNL4Bb1`?^LCCx2oT1 z)slaYp(juMJxzK~ruuuCTJqZsJv-Fjt4Qx@R)4Qq3qRXn6VKCx`yn|$gM*cTZ%#zO z3clyyqs*d7ihdxWh+xMa*+E3V}K)ekdFyQ9aK;$1u5-nJvrOqh%5!^#aD@s zU3HK{HCWw74hht&tRSl2YA!itS7qpr~4z**I_{&w&bF8+ILpI5) zwDrHbkDLl}D#>AOYbM_=a(0umpPU15SijV%A=~OGw3&l=)`7n&elw(X3IGjC0zbgt zTZU)7qB6nWDU72?w=PkN4G**D;U`JSMne0BM?P$ei)7iYOQ|rJvXHKt#XV|By-7Yy zS(w0r=%rVRO1XQLWK{&QQU{fT)Tiu=fwz%N^d#69kdxH^Y2rVUpN*sm@;w13X7D&i zaW-IV$RnP{@IqEuc*XQ_unJg;afq3ORV7Be0mLT}?ZNVmg#u?-&AGwzFOpV%{@@?= zzS?^`H&TBfYPI3-`qi1MIKufP9i9wZOXtd8seQS2zWHTrT`ut9@|K9TW#QDfAN|&& zx1Hbm-0Qa2o5S0?BG#_y!^@^@c91H6u4Tzo9oAG!a;?JZp=8dA|Ljx$CnJ4obTUCV zJg^hNr14l0OD)>)NU_kss;~(Mc}#jXY{JDqF!G3hAO)A>XaX~fhPXa85l1GisU%li z*_EaYLYyqr$tMe;15UP9NSutsDMKqxuuaMy+>*sLlTa06C9%=Ax)WZ zj$FEv0C`WrKLsP%Dbv_D{Dy=^7*;NgiI8+6a>`8jesjutuCGIC9CM-$V`B-K80E$# zFr}?9)V6H)<^0A(%}~#RM99x%`(ItZq_Rz3BIWE+%7&iKl*kh$Pnlrujr2K`y(ZFnyEOmc~LxoaO zd_3fDl51t+vdXKx2QuU)c-0BKse(;#YLam5o8Z(YjsC(Us#NGDUXVS*#LsPbly=~p zd*LuKX&W9zM?F=T)bE8#FZiwUD6iXWl;bMR&04i3VS4M|tW{eRE#IWw^+~xXHgBAM{hU>;W|{^4mQse}VW7jGq*1zR<|%aD~u> zc;d4+JhD9|IEqc;SsO?LJXJJy6f12rv(MDRCmmX;0NwaM&$;xo^4KIUsb>B{(dI8o zH8zBn_&hA~r;F|Du+o(gg!zenVRN)-tjbGr27A_F$H$wLXHsb!@` zUxWLZ)JgmL@%uFVTBae^KBY})h~--!bh!0ldmj@#ePkO>8{b!;h;un$1>~KS4bq(+ zb~wkExekL4o;ZAZha4+yK}S*9n2vVupv@D5#N(S_D5Nm+h+@}9KwEXu1r_I)f$qyw zY?9<;I6Cb0LR9c++jiq0y;^p+FgZi=H!(?r{LQ9El{L5}(qqAh>#8h8cb?x!J+;kbmnUeU}-A<$t{0^cLf$xB~~T!q$w z+vcyU2Gs19C=Y~f}61F6PFBMiI*T;!>S0!vd61z;ZYU16mwS#}hK`-E# zl%j-`qeIXrBOP_c%`vQ|7B3n6 zq=sx|fNc-HqV)LVdsEoEl(=Y|6i66kuFILW8Q7D`OcVFi#4ntmGA6Y!E^DEu^hBnv z^?;AT7?_m)Cg2Y2;OxE@>>b5V10{n|;}B3gR&; zZ7ZOXhTcO#X2bI_e6U}HL8N$`5*b`jmE#fxT(N+k;^D++C|8qslj49j=8CCFm#&qv zJwy2p0>GSCid!Q7vrS1bkATWoG7kerl!79s7s!3HS8T3hYhA@ zf5S$EKc@kE7xjUn-N@lE-vOMD3-m3Ua)LuIdhVDi)>KBz2|8g{R(sdcf@^H=INI)O zH3gYJakPar(b9^Se7Ah_74w&tN}CtTBBgD2OLs>~cmJ?-Z%BP#%jM*U)W36hrF1XM z)N^ntZX4dV+z&Zqa6gl4-+Q~`&pfYh|M$LkTkh=WTe2UI?C4vtg|_2%tCP6f>fy!0 z`tXjvpe}4b&Z_iv?bp5EJQFT$xnpWwhN*qc*W2z`Yd@%O{*#J@p+By_Q-1*Z^}@{e z>krJGe!cbGnm6|cdqRh991YhWSW|Ph{0}+AV*dapm_1*A=#Fjcvb`j9<%MlQ9gY~j zs1EhKV7`-GJ9i0AGZ9nx}1&Ajf1B~7!&pgQ=_n#y3?zKlC>x8Ly1om$MRiI(gR zsR>8@!dN)Je!0Bnm90=N4J>S5D&G}6f=iVvYv)Z%6>U_X=Z>!BaHY*_xiG&B^sQ~> z%xyovmxC_(`A3;t;R*iZ`vxw%1j=m7wrFlkycYA#;f#7xcU!jo(?{uO$jA4KxcoBU z*_xyF9l=A(_R6`_FEq|y3THPFo~`*4&nXP5-_7b)bFc31+L`u7g&N*B_FKF5Yu?H* zbeC)1vg_b}x2?ImM)mg2G{nB6HguP&-!Z3m+tu&bwdAic^r*G(G^Ka%*S@n~3qS6! z#-^21vYh!V8n>juWg2E*_M_M#qoZnMFh`SYWE|Q(nxVh^iAdbPc#$09oh0brh{TbJ zkCSr&PPa%3y_kL+hgwIm`O2(Td^uf@_I7_NUtFj?IzA3lIz6rJ{o>Gh%v3LShDT|` zDVBr1Qo81(U%HK||2*cwMNcei16Ult;*k{YS9Yre<5|e9;E&vzlo^qx`#npjynpvdPN1|YiRuLH!o5>-?srdI4 zdzc)eUoka)*oW;Tida55*&e%#j2Cs@ab_A8v&aP{AMa6*IHglne(4l78*ef5I7+15O?K~jKI+m>15Y|!h?~LW&(18^*r>z)B>RmXk4U_Wbk}-( z+=;JHk+j(m)1ALONLM&|=n4YIXFbx!hhzR*#TWNwl2}{jb$`+xsolMtTO1mSWXm_@r)^I$PVci4W*k0ut4SIONeQUhLR{O^>@we3Z>C8uFRffqx8(;XeMUC)(L!VM!ct~yK=*z+mXW3O8uTy@&L5sR z9DD@#w3*ANyH@O_VNG7tn0~!>rZ%`;`p_?Jy|s1DwPdefGH#nb^uEqW7eSh%6+3Ph zMJl?&*muT-Yo2F!hI1PhO%2h^+I0=E;zU=_AIYk~W%m_dyAa80ShC{A{HWd%EDU)g zwu*3dZ^YL7?xBe7ctn3Zpj}bM#8PJ6^pW>#+R<1t)n z_n|>!tHAKjD)`W(wH17*)}fFtY*Aa%gSMIOnGUR)c_p~d9>>1qA^%Fv%hE#YUMko5c*}T4S3#Bs{u%$XPvK5IoiWh%8Dho9)`m`RJjl+?F&th0Moqys9!!9`OM=881faHw$0 z?AV<6%9WR|%wKxh7s+j&=~=O4hg4sAJTx?)`Fo?k0yQ`P=Fsd=$O%f&@=E*5?btTk z9m(Am=y~5{#fW*{6KcCLIoCWp6~Xaq05c>Yu|^%UPesgCGd=X7bBUvzYkOgGzWLVF zHwPA~UK_sM{OZ_J=DvXL1C8a&$8poR-WWLee8J6998%1k&s`}0cFnhHB6YiPwc*f` ztvj62^KRbH)GBS-$M>&j<-Pp!Xa*)U)eBc4?hL25(PzmC4m>+D$A|T0%sim{pFT2k zrX7r$|C_8ct=t=q%!eGBJFSL?iq&`a7Cn@&elK4O|A4$70IHvKd~gl{wyy^QzwvoZ z20+6SPn&uxmmS(uCm+y*oEMk)Q|WFJ`+q5PKI-*9ZiD-ma4>5ahq^=!stKC{ZNG3C zM&)K&nk?k#$iYvKN_+#@8ro@1TBKnEyWw(qT+l#^dcTzKTZlh_MtXYCW}F6)c2%GC zVUtvoepgcv(G-N*=N??p->wbY58csp!scIVq4QH@PE-4yzVPE^Qzltq4HtkI1c7R)xi$bLz!Tv>t&f*!RA+yKzy3h;2=MK z%2hq8nMxz8GN_Q_s<}kAIIkI3d62;}GxH=)i#>@WFoP-x!uWt^(Hbb3;z|@iVThd& z+EX1M$5t+Sh#n=qV)ltWdT|%xBw_jA0>eW&J1z*~(CF@mrC%c2S1uCJcSbVJqo2QV zip0S?&bu5=h{_2Y%;UH!V#I}m08k3LVdw`0@WL(;tQ%PrLho!04|yMY^gI%0cqMnvZNqM8;W4)&ipw z#0BDhSe<;kApPzFGk;_GdT5%-TpVNA@QX^ADgA>^W;QDR75av5fAahX;IX6N#=M{y z+PP$?oIbdw%F-I6Svfa%&F;FfC!mj-vcjg)xx@1hy?lJZxmekbduv{K@aqramt}&w zP#)yx(BM*5Ww>td>$=6do|VGl=X%$4Tvg-GjGSdVmd?z|V9{M$1s3YLgY)_&TXWzb z45%dICmUzUecl%~m6Iux1@}JVur0Rd=q_%f4_ zA(16Suc8OhELL_mMlzz5(MZ9%9dzns@G_aj_VXL+A&cBPB2l)BT0I1Q}Hy5*e`*ypLLRc9K=tsXUX|7Ibm|xWMoG> z*o<7DwEv1CX32Mh946Bc&1cgiW)WRO5PDrAyDEwal1VUHCP=K7QJ@`=Zou^<;f%VW z3;O{T5@%vx={}XB2q8{a&A1&sW~d-Nqld_XR$O zx3BGZfH$h58e`z$;OFN~hs||sYJ#i~B%IT*pbnd%ts)TStky)p>UjX`*K`c1mw`3& zSz+_GH3I`03HVSrd&_)h*xbBkVnDNu*|KmbY~HzMVZd}5*t&qScdc0&Fhd4zod>Xa z&BlP40EW%gYgsImy*^zI1LhL&kuXlx4TQ}tYk3TqF9VwwTEph{wE_mT6A%^LbNfu# zd~mIh0gGhJowqB(=KX8M3|Jxqcil$v18b!W=vbd;83UFB7&g~@SiwS-QfRG;g{tLH z4GY!Ep*j}YB8RrJP`w=5#zGBpsF8)5U+sRmneZdnp?^!#* zfDiC8v}vJ|dbfjT;DZc|p(1~YLlPJx8P$q|KkAaeu*gpauk}da!yCZ85*XBH9rh6k zd~^f&m;{Eg>pJY?68OXh@JR^_dc6+&v;>AIybk=31b&!-G2Y}^@`wa}bOZRT1U|O` z{5c8y*aq<968Q5Q!2J^V3md>r34ETwGfzCFYugYOVnKVslTmJ zv+{>uW9SXxQ&)WSMV4qf?OwM^#n;`>^r`rwAbuOI2KUe1=O}c~r&aUY?wNaeK7H*A zD$Zz$8q84=foxH8cGQv$Lu-?2TDO*M$WTq2A-opY@vC+C`%tH`sHP3~GE98Uy`oMv zpLVY=O~+f->|AU6nmV6PkLqpGySS0PSF~mKw1BVe<@oGr?OiS_!es@I$v@Rre_MBl udmzeXeJZBv4%f886%f22!WD$J-L*Hs4t%lc)E(~hN{R&a?{V#nM*lCQPk-3} diff --git a/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc deleted file mode 100644 index 29e56e24610731483afe3394c733b33b106a64f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8132 zcmd5>&2!t<5hp3dk|E1q%2(TbJj-n=x)LZ+cH7~!i5uI^IFokNsSmAtpdjLrgbf1l z10b2b^{?n9hfZ((H+t<%{{UWl;>}JbGo7Bg`vZw3AyBcWnbgW;wQu+LcK7Z3y$4wM z$NIWep`V?9U+Vo~w^I2R52imCGNt#jQN7xK+32R|mC+wQ9v(>Q&t3zg9`U zMzZFf`@9C*3T&&njS=Tzv*v7Tuw9t5t;2RPw{eb3uw9A{KKW;TlKfocUCGD>(hgKpQtCP<9o?a#X3p6pcgCsB=wFRUk8awLY4HjI_QT< z827^{2ievgCs0RPrLlI^NnZylc8+PfLd>q`>)5ue2Q;}G`hIxAuE=Og5-Z1O|~2`T$ffiX+kR+wp=H1T89(Vp>n-WqP(sOv?d_0H&jj(`9pLq zgKeug(jBimY_%*)O}qW`&CJ^loPpk)nHUC>*|aS|;{DM{yf9D+cWM#Htnh2+VloaPoq-%QPkVqmPPPxaW^;Xmi1f7XYI(( zoI`o>q%}?_@j6YjpPq`OXH#Dl#H{rlhUO>|zYkNz6zgd^ zVsu1iqf=2!JNuS+TtD6R$)}j4rqo=!}8qeT`%q!ooMP}>;+mS#tCBH;5s+c=s|d_ zts7|&=nk#PF~b{k1n3ea5DYw0TO8M?{Tr&tF$u4ZEz_1zqw1$uSjvpq1-6N8#(R4G zw2f-ow$7#)UyXA!seMH%oIdt3Hby9s9b!71vrz6X?dOT-`_!oXVT62OROmM}-;~Lv;k6))>ZjjfNkGr?KW$0NFs(9Cii%sHJlTO zcXKcxh{C6B1_B(fC=1H9AW;zl92Nt?wUj~_M+61i6@#`|Y_LGVD1;j|-esF&4PJBx zV8NjpFbxhs*gJlc=OPrUk%Nd(05gXTaDc4x5PZc-kV6s)q|P`%Ado{6AqqprAI;;i z^(a?rktm`eyqq0z%xl!abDU+Fv)C+lc!-M$l*C2H5O~K}2^tCqb=qd=i$F@95Mr_mq=7ClSAP__;K!B4<_wz&&1rP`<8epkK zytzgl#AD$m2fM}s*BiDn2jM6iKoAkJL7@T!Lqq`t1S^BUhC~aa$h5Lr#QT5O=pF?9 z=EZo4dnsfBUFIR#v|BHTlTg?P(5eux41)bajzXdWC4obLLX;-g2d@Y@9#V^VMUyjv za>X&PQ3s_$#0DHZQk-6dECR7{XmAeZBN{oo2vr8b40sntk)Wt$VHClkQW-APzF{1l z;wm=^?>66>0R7I+CJbGO69_i93|D}Z;mRNd+(HQBh=Ya93*lurq$-F4uHcp7!bAdr z23*1R3Js})>&!u%5{L~R;+27)_+#ATcqG7!Cj0KtPBWuj3Kh1iI4 zHUu+}XkioyiZaR)2?QE&1zXwh1v`_y9hU`|w^0XSz{3p!LuA?D&B8kehVbJ0muG-t z2wE#)1t(9!0z|;_7Km)(5Dm%85(xwv0xV1k1+Xcf+5k_5M+DxIVf)iFZD)^ z-9`fn`}9(8)C;3XP`MSvR;J;qEOQiW-!QIzezY?AMmVxq$v*6jR;Qn$M(eEQ-vvi& z0A=3@$}T&q;CKU=NXjW3p0)a~jQmsvjBxMHj4OIP2$_UwZa*Zb^JXS*7^g@6qX_+B3H e8gh~3TrU#vbcO%RtmpBvUt6pFX~o>5uKX9F5bi4g diff --git a/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc deleted file mode 100644 index c296e8f614a7e0016354c1169222722965543eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmZ`)O-vhC5Pom}Y>bVu!LEox%3hj z*a8VvIhZIFriaF9d!RQ^BBjS1bF9>hEn3A|<$#n!a@k@n5J`QDqE zH#6_;?=F{v0GthkheH#k=PLE?hhb5Aqr7wilk|jQk1zA7v&UQ5mJ0whze;j zDuUjwh!2IR#E~#jq=!VYsp7olp=GqepYaVIwQ)oh=DXiVai-ely@zR4skN7qJQwV! z{0xiNA;G?_f=m}Z0PIv@PcK0Jf zW=N2qs@nn4acGjTiN2&PQxnMr9gPM4O@!`fX*HzeX4QNs%d~klZs?)x9nH|P8Z#1F zDyfCCdE*X5rn37g3#F2?O~u*aGb15AX{e{Oa{MmDs)uewCPUZb5k=OmsBfflbIHtb zHgDQuay+hP4dw*5eemhMFf5Z=r>8VfI#aw<=^L$fj#h-xUC@&_4lUvu0^L0d!V{vB zC{+lQk4AZgiwcUU@K81}F9apiz0W)5%#^NQjf{`Y6uKKgKxV2ONF2;2X35It$KVXJ zIp1==k1undlW*za*gV$b04elYvtmosX!au^i)}6IGN5Z4^iHeLyB7&zE`?j-jE*+W zwQNBI5JRkOPvPgN;cBfj+%4&_zElM8(@bZ}UI8{NpvAVYC4P}tL@bgbVK*^Ru`SRg zVM)xKXe0I}(y=5c4nU5ykd(5=^MAdbnkKD=b3fSPhYOyJ@WfUyTpbKo>|tDSw0v(zB2HKF=F0if*rQ9e{y@bUD2}gP zthu_1Y~^-IeiYsA@fXKy{{EHlp~`LV>Gz%c`ijD1N6qIiv9;Ufv9kPhy!17ywmsg` z$eOS0DUUq$t@RhB+J42lXMN-s-_!mL&&J56ui7_U^$ZuKJ&CydtJ5pf zHY3%+^S|DIW&6!v`Qm2fvzaaDtsS28If}w}9Sk3nDfj_NOf_;WV+vDRMuoT49*bq< zv>J<pN8u{CmQn=x8j*l|g}F)0^UK-cWUR9%W%x(^5eP#+1lGybu$^$CwQv3Xd1c z*ppW0TfR&eQ|F+wRc7@KyM*ZbftmKv#tAR8F+icIh&~R(4o@lldx+4%x5V`q`EXaF z^wYiW6Vy>kzV-*J{@@;g$xf6K+Pf^iCOuWsQ<{F=d$QVla%1}CSAUXg)_MK|Hpvlg diff --git a/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc deleted file mode 100644 index bb1e23a9f5876794d34fd0e2697615b5a695285e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3802 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc deleted file mode 100644 index 9083c46c10e53484fba62803bb1850e26fa0ff75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8129 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

O%HC&{%9@&T`Xu~qG0{Rw5ekb!;b zNMs=a<5>-!5ivJm$t(dAHg9S*IuU%JVg}@vKuJy`sRSstdk~E=lU@1A1i3IYgi^z_12s9uC#I(=+qn-3!vK|E zb{U9f0&fYN1YdV>F<)D;LlR5F)`rH1iEE7bQ-a5{*eGPkI=n5E4V&O57@2Sthx6c< z^QNqcu7fa5T3Wcj*}3_`40^^4Gk<1tc21Z2~|o1MMzbk{8Yjv+HSlX$IfQgyj_zx zT1%)xYDzD=UEwwor&)uUVGuYHrfD99(jz&uoyghO^&_mp#h7;!d{r;d%)S zh!GuPoK9lA&cy^>()sH`Ow?svz`v9gm4IJ=Rx=IPHQq~_#@qnokx9+cO@l@zY#O;> zP%U9w1CER!|v6`R9SFJrzUsRvPeh~a}+)P!HW}pw;T~*h8KpP0F1^dlv@dC4i z)pH3JQZq2iUxFE;1V=Xj`@F$=N?F6US=akEbmViPaZUf<1W`6R8~-vh{6Go%BGs&f zLD?Aj0cvQvnY0X_Hx0|LKcBT+ZT2LkHuXg(Z6;lxPg<@Y{7^G9Mj01UcGB|Y%9twk zzTg<io4OOWnY5$ntUHO9(x6uj8a0#S72xQR!J(*=bd7it%V2grIwrT4CS@k#|neD-(F75 z%d6qRN4vtsPWf1>r`n80uVa3g-tuzgpmLc*XVu zd49dUce!t^y?-^-|ETxX?>p{w-0xZo9lF<57{1ez|KO|k<*xbR)zG0$PH5~d?u{%q zXJHegD_jXj_%9A2fZD!im4TVs=tKhIG5xNh#A50i-Wyt2*YrD6DA7d_U z$gV-LspXdUnOC^*?d7|dSDTd8fI{)@gHc7Gtj%+Er_X#eo^=gp%$KO)W~k*0qqb#W zCJNIxyP33UluZst9G8wMGMgVun>JL{52`BWnK7B%psH6gnpx4vs;b*@Ri*oJ8~Pe! z_%Ol`P>Nrwg$5YPSUY}BE3)hGhw$d3T`kv6Z3~^E^5k_Q9xOXBvr&wV5hpU3Cq|^~ zuKSXkO((4c71%;n$CH*uv!#1n-am@?PE0>=yqxem^e8IW!8+`SH+e$H-+O@cJ%+Z& P(D9EHAqTerS;_Z5#Vy8R diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc deleted file mode 100644 index 87490cc42a0f3e924729683e8625c6eb13ea4382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9702 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc deleted file mode 100644 index ee0d75742cabd0fe158665f48e20128fb6841f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 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 a-P7u}e05uP=m|NrREEC(YjQ-I@BabF68sAQ diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc deleted file mode 100644 index c5f05cca715f08aea235c8922847880199f0c7a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9774 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 Ym8o6RZW0~agrhnu+tBlb=*3p}KWQF#L;wH) diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc deleted file mode 100644 index 89211c6d723fd2f16c267e1bba4c4bbea00a7932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52810 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc deleted file mode 100644 index bc4f8807913567820a29c98fa273077e04f093f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 zcmb7FO>7%Q6rS0g^}pl9`B74pkfsIV(!>f8t%RVcq-~T^IZ?|24AN@j8K>*oUUzmw zW0Ob`%E6&Uam68);1CrKDLK#shjK#VREdkN6eU^}DH2GKTciYm5C`V1vk9qk;Yoh; z=Dj!b-hS`B@sHtf014{C_~2cchJ z>iL_+Zx}fir&ANG7%y-m!%~(RFWfLJqhN3=ZDe&LUMN~OM0SjS$ap-fPwXj%1_ob= zo4UpN3tH-?NZ5>zk6w+B>(d%{G9S-QP3rl9LeciBS}Mf~77vT4-H;PtK8H4fEtTHN zVEMIL*O_|oOpTn`5qgvY=8}ur&T*kxLJTD_MM;U`q)eqGp$e5n&6OgFdF-Zx-~gMg zjE}y1;aVx`EInK^EyjCv0QV4(&>{|y-wIR!$c!8OKkJ-y1$~T9c&k)6{d&Qc? z)?Py+G_$WY!&I7;EU$ZPMsoc{l>ZY)cF&c>RU(#u|3*xS+jNJtimOdaGf3Uf?U0Yh z^*N;Vy4tifE6>Q(2d&1v)GzK4L);)M;!2rjS2|e5kOl>c(6i4F4Hr-)2P$OcJO*JZ)ww)I5)U0i}|z_)znL( z?bMt>83#aw{0?*?aSR0XHnCu&iO{iZ+Qz0W=gdj|yzq8LwMP&SHO?9ZmM^s(?&<** zw5P%S2f^mhW~6oT_QLI2q_^hl6?`+)yg0HjvUqjjYPIFgSQ$T!bX0ELEp0?km4}~3 zpR178=`@rS?FXeCp>=h=h3eJe*lmJa3bP zk!NC@eX5$*a!gh2fC`XKWkC+9>a8g)yJzvF4W831JK9)P%FGnk3-F%uQ{r9@|1wSl z2U89m>97}tU_uwpqm6Le+~tj~{u=4nC7nv3;SQc9GEkW2i5TI~ZMHH|w3x|X0GUh} zMm83P)Y4NTZIK#>XTU}rCaO_=uR5XUHD2T}=KL5icmkaS>@a7OIy^~EK{-^^j_&K& zw8io!e8%A~uzjyLpg7Nm#0k;L$oxRCZ5d;i0bnXcn-b9^X>8zv9YWI5AK)q|=q30)b H&H?0KEv&8! diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc deleted file mode 100644 index e50e530754e794b478e94a2a5e088900214293f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61924 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%0D8f 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 B);ItF diff --git a/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc deleted file mode 100644 index 38bf0ac6affc59e70725ac50f88a9799616e5d77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10839 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 QyAB+;GauTy<68{>2RTg;(EtDd diff --git a/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc deleted file mode 100644 index 68775bd139122ab415bc08b41b942e8712df4b44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3424 zcma(TTTENYb*}IA+hAk!urX{5q_Ex)+=ONuHrrj1P!JJI^X%@rXf5LzgB`z^dwJM0 zRkTVahfNhnX@#SH6ltr9DnH~a`Q~QPbN$#FZAZE@ zXU;iu-gD;usinn)V4VNAb>W|F2>qRH)S;~a+;ItjO@tBVVkpk}ISyeB=3|;T@8{!! zUx;h{S_LP>baB1k0I&&b9|(S<22CNXdw{T>2vLJ7xVAp$E3n_BL4=QX)+j1OOi`x_ z*H&U8M)fR*l(XG6stPqfiw(~;6%G!ijb3w^ZM>Xp4ki*wDJVsf39-yE94~99Ki3sv@82L4r^Yd8a7qAxdP(0eS;MK_%)e0s0 z{O!B587rVXw}PTXsE1)2g0BaWmEc3%HX)=@RcqaPUvnLO$u*}%tLdm6z?_=6bxu0D z7LcwgR&2qVb&bSyD`M=~ax6Vt(Duu(mT7C^!LB)nOSrn-1XyDPRJnKROURT9y z8}RxnUe|!HUVwFdR=`G9YSfHPbC4I%ty67XHzZ;}=TGS7CiFR=3kuzYEo%_bhSQ$_ zRj*LpSuJikk<;2l&Sh+Ef;|uCx&JwDYr^ToZB4K(*nV18vU>W9tR6e=O@Qw$xcyW< z9mMB{3QxzWJbYH4fuKR2*}YIk)TTnU6?gvs6_?ek6{O}6Vq2>s6m74`RUvFqV&%eJ z^?Aq|qFpLSZN(PcrAl5mfL%?REOxr!Kvu{=HDVX@5O-&wMzEV<){T(Uo)tt#B)2Lz z$}aS`2JXf0G?&jLX8EikYYc0ivn~f?fz?noifIHo+=^Gj-=XEqcWF6I1NNMjS8v~J z*#kCZI^kXL1QQ-;J|0@>J7MTMls%ng_NtXFY+@-XvpAMn7%1}yS~hnf!(X^E&7heK zKXc^=lu^s9%dm!iYw9X}M}d_^=C4lO@@guu0L0I#8z6j^>Asr~ms6~x6YTjUiHYxO zMDk2PPhN~5(3tVmGh9o?lGJnZSb1hhVnJHWIO{o7+MRTYWVE2~%8bn2psYieSsKc$ zj>~N8)hbxUE!qo+iu>!Wq}c7Jte7FFhpd5u~XK^ z;LIKNY6}v~UK3DAEG%=P%*VwAS(gllMIy;s%;F~-nNa~|lx#VXT-mj%J9vE|f}kk4 zs%X@S5{+OYvO@4w2W_orPNqmAW3PX|Mgk0X7Rcf#1nWLJ@*rFLS6vF&nBcl0i@bQG*b^UxccYt#C~x~1J(*%4kEUl@x+W8b|0YU+c3`P;}uWjRz&! zUReWBxgi=!u|HnQ{#E~g6!A*^Qad1&$pe7sfaw8(Ox~X?x!&6qI^V+6tR1NEGuDhS z0AgN6BIGUjb%hJ}~GXfTYj_9r9Cx`%R6m0Jz}m-CTCkfteX zs>mxxX<3HBl&p26Uz3a}7 zLt|~E3RS8Tit4CBaZjY;P*5%)A#vg_;6fA-VbnvU!XXleqNF0?K$)?q zdvD&nH$QfDbpXDO@5ZJ+QUQ1^Oj1*fgDj5X= z30we3y#Y`ND}`_X(%!MUp9`yUQ2ua8~O~-MmNiEm$#S3w>k=|(i8RKYcvQ71rBVd|vGVJh#9=y}V= zx|=QF9M$QxN%azOXDx(1onRB`W-f<4Pp7VK>QmM%cJv}HW--y-Jl9N)j5h#MxmFU5 zjCkb$m*IAY1i&80FW*u&nq;tXIBFIC(!5bgwz30=nSmw9fbnFdDT}7U2RLiA#Kki!u)L zxUDC=pe%R$}MfPyJsWbyR0o~%h9E1ePTWST6N?>tfw~o>1;i*IKR<%q9#A+ zd!?ScWB(LCw3+CwP1bU?lgnq9&aMotCyrLni}R7CNPX~5tU9t0i`PaLXE*xZeEOKs z4lkBB`VZ9Kt$$FvR#SdY^wqA`6ZMH&Wo39hain^FGnS~)MSmmy@@6!C`@+J7+m{zE z*9TV;caMJ6yS6{|o%DU@x1B#n&pa9evBb_X5b0jf*24ShyC+t;+*W>0KX~Y ze=7&oQ-1+Y$WY*t)I{8Tndijg67idpeVj1ai#>W5v diff --git a/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc deleted file mode 100644 index 7b7a8b3139cabc45d8a1243315abccb78180a7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8100 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 brm3P#FTgah6i5(L+_D1f5mzP8;wExaN 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 Cs^td& diff --git a/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc deleted file mode 100644 index e7674d25e50e81ac21872d39edf9b25fd0456d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18814 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 O!T%rjT}}Nzng0V73lYcw diff --git a/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc deleted file mode 100644 index c8dac1c87cb175b00fcee7fb6533921fe471cae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4094 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc deleted file mode 100644 index f8012d2f398615c5385486bd59e958cd767819a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6176 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 L_HWU9`q%sqGCFG_ diff --git a/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc deleted file mode 100644 index a9d9141db25163b2ad08ed099d631117b2dd13f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4251 zcmbUkU2Id=`JDUXe`Ci^>?9a)k~N7b#7!XmVf_n`7P^*F(yhp&@*LlrU}O85b8nj1 zwL7%+!K_R;i?o=ssjjw%ARbD!No8+L+C!)A!LHlJy~-q{B2C$owXkX1!`OGOb8Sdr zm3Ab5=eytE{eI5*zUxoyb_;^F_n(g0>o$bGq7VAwn+V=`8Y8rf1SH@DO5za46lW4l zh!I$UORz~U#3lI6<#d~#ndlzkSU;9bNM4M>Ubv2K;_)eYI-tVs~SgtZn znN3Z9TSLblplNMuW|)9|or(vrYK^2)k`hs3Qc6CyPLmK|RsLu)GApWPZF?@35LKIo z9*-nMMG--bksg=71;YKq-+yH96R+ymQhYCV=t8N%rHVz z@bY8pX5h#a1b6#S9)HQdJ9ve9YDg1tCbl3`YyN*ngQumW7!>BF#Y`|wq_`MWAXs zlKMWw(5nuo5R=e|+LsLSemp3iZD>C9m`WPFYnxHFF-MC^hYGS{U?cXu@e z%Pba5S*U8>pm_P<*Z%=Lj5|NCct1)BC|OU@!VHIJP+6U2R=<|}kO3DT($NFsrQ2wj@||ETyS~n+9^NB!k2dAz3^|kL+5f0GMi>6d!8m%*i2$Al&aG4T zRT&QA_dif(MZBWd>q{=#`iF8J669~1iPD5FT zZi&{lM+C*o_C&SW=O=7WAC_ZT zQMG(8l9&^lnmjlPbDfvdiI}3Y2{EN|vDA!2G$;9RQW8W$dq3$1pmK33mQs!B=F}$! zO5?+?((eIIv&|`DBB62$Py$wmQ|coS2#XxqpCQp;;4#akbv1~ z*$O0odlB0H!Mch#x~{e_7y-JNyMP?25p^pyu{p23Q9aLw7h zylrt?>1@r}2LcXf-PzS}fc9+{^7NEC-t%7amOC!@E`@&`UFrK^=*rNwzN@=`B~`k{ z3)}_Et!*8}zU86Cp;F({?sudDyS9~Z)4Hwb{>c+1wsiJgQ{A*L z?kGN7W~<=8@m7bYDF3{-F!6QA>kenpRdg5LD0x41`0Jfr#b}WfpIgNB4p(ukxUc9b zJyz}LZ!wDarV|`nM&2=6 zHGkQ?BvqUbHJ(8(U*jN#3eh60c?VX#Lsjq43cn(MuyAGJy0I2~w&tAxrtP)?**zCu zKL2uQvi#`E;SY{pIa(bUzovXN|Ka>cxes%{dF#fTHQQ8!Wx6Z{?x$w$l1Ax8*B8AJ z&=K&)7l6=j*0|2OYd-}Vc_z;)o4o@%DXY(i!{{OxWoA*7c^$f4o&yW?o^M%k`kpPT z)d?|7RZP1m%+=PHNn5x*Hy4=;`#6;6^PIrM=_T8;a;>kODewowFVD@>?{2M8YQYB# zWE`}}UJ3>%7zCj5iTIqXkTJkP;&Do{&{hO9>#P3htz=c;Y zzIOh#Rr`*reMil{tBlK&D--V@t=LCa?fa|t{nx(xx&7NWP8D#)cH*YPb#dYRLJ7a~ zX2sO|ufOrgK80oaP5jG8CkDA=0Y)_tQJEvq5@}ZtaAXpgBtXGY04lGA88E7*a5xo7 zis7(o3DcH2m!P;U96mc2No;Zq&{Ux%tFGoA7DPEpVrlv}iyWjTk5E9%qh(yn4544M z8lX9s>9l(r)$Oix&((W|E1YM8JA`@5?H3pmzrCqN6|&q2Oo6O9M*p$}0R_+DpEDxg zp+NJTo0g9I>(1n5YR=W7i3^IDk|Ef;TBpmSBe2%y1Y zjQ{ROc;G8!{tMbuMSK2?ywKBap2FD01LqG^JWtiEPoFbw7%(2Z?R*8}?Zqcn-Gf#4 z;B7>o8fgaM&U5@Ka#xYN_~L5kP_=Vt#dmG~GxW?&)J-|vRn%Sbt@iAx_Uu`i`3#NU PMDDL?Z2ugMYsvmE8jh5k diff --git a/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5829a606f15fba09bc7f0987139a7025f399bb44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 zcmZuy&u`l{6sBw^ahya>7ofWhM0cr&MM64sL)>COe%W(pr&{eSfro*SM9O9(i5f+% z^{t2g58ZjUVSma_JFW0_*rB&{U4dbzk&=UoL3N<`9^ZT4$4BwgZyOs8AfN4jo0FF- z0Q{+pt7oa07;nzx_zT`#uM15 z9(Vby)o3h&X_|)xoRS!aGwAgCFi`p43_c)1z{w2mS@0lqrO%Bq^jR!8^)kVDYBivI zra~lX+qNfEOf%2&S!5?U>UNS7vI{7?jHw_9h5=_$4!L9PSYKE&Lc%X7y`Q<_)!_tl zdI9@cjHmA*b-C}tcB}D9wY+7_*W5T}!WA+neI*;OeD$j;Eo*M>hl%Pqal%ZtUD}am zZ|!FRABxP=f(|mS*@ym9-NvbAA0?XI>`= z2Y;RR)>k;Vd)?XW`LWKW=d*IDjb2nX&0ZwRcC(iVUvoT2$fWGJp&WO<)?5R>hg}_Z zK=m?%Yh}zqqVX~ZsdiFL#|?F+j*rWrrgQC-9IW+h)1gmYy{k^F?ZkAFYY3^1@D02bB6D+OrdsoZHtyR7&4aGdjgxnWGT>a+efUE!Le61wa za-&JEuIYT`;V}PN3ZS+sm)E?na_aYsCVa{FrK!Hd^m92}Rt>{=UD+^dZ$ARY$A5vF omkrST@DKCW@8+#%YcFf-e=pnXm1p&Tu(4{a{&e~l$X8zXe=ww_y#N3J diff --git a/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 3de8994658b570efcabcac9836b93a99b60f9c97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 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 diff --git a/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc deleted file mode 100644 index 079db5615f61b76f05a1c3d36baf77732032a46c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmZuu&rcIU6rS1LcFVRDtE4rA!%DfJz{Vd(V}c1L1VW5yH0))v-JQ1E-R^8=rowts zPndXs69@kS!(YMK#7Hnf*NcXew<0kioP4D;A;EWe^Sw9oeecJ78XYwd*xcz@b5cR* zs2>bX8vuOr8Nd$mkc~X-DIxACwu1Xu4OLq`KQ&uZ5Y14{({@3pZ+3PBK~ATtml@`G zg=X8=2KSeJ`}*Z*fNdix!0Z3sfNp_m?TM?bU3|eVCTbPY{50Yj=vB3iHS~UR9c`#< zXdTaFUp+9N_>pJ2tP}eo^~?_Qx*;_~KMMS)X-a0++|ablS^&8^ceqc5@w+cRgVVed zMNB% zNcACKZ&FZ|JXK_n>Mci{2Zjuw1>!auKGXvF5a?;Xw!E}jTYN@VmL8|Y1z`F0uB3~c zGY+yKGExhkQ!b#%6eP&Y0se?i`cs^FR*QA0<#p>cv0~2J)Rn@DTTHT;aoJ#@ + zEtrvVAY0JHMdJSa-FuesC7p{MH*lI%SWlN$tl=KcH$eG(oTRyjgT+4L6)4*O93jB< zRE+Vlg0c2Di*WS_89z|*SEjJ}Vyk_Sx%FDRuIt{|A*((x3nU diff --git a/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc deleted file mode 100644 index 4d4cdf689e5964c7da36fa158a7d785ff217bdec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2109 zcmZ`)&2JM&6rb5|f2=N(epTo9$2OFnIF^jL?B>?NMRJ~L`u7gkpXSy;>h;lFIJ-U!N%w!;>A~A zNVhp#xpW>OszOxN+3)6z97di%dX3ym?6n>H7-ZaM^hNfX(f1Pj_>O%7s_HlT!CsB> zPB;UdJxLIm4Du{t-QxJJDnywd5DOZ(1p5B!>aGp{9?TsEgL;c`IE2jcvM%H$rkSQ^xx_SC+%#R^1|Wb>n&#z(<#aTZ5853>`+2Bd zPIwz5G73y|>=Jq^V12M-!_`bSXU&Q~%kirCS1ekyyl@X*(02ae&HX_4;3WZKa)g-7 zk~57uZ)flsvFtt2apwp+c$~n$i6{r29s~k-Nda-HtjFB#Zki79=EH?81fyD*L?Q5E zcDG%Di;55@;GtXS{%BMej6(rBdIV%lta%|F0FDj=0qG#;4{$QX$t#@jRCaZZH;Zyo zfL|a3Swid5@s0(TFJ}CpFl~hk{FclGA-%BJwOdkdh9tO5FOmZzG9(M|uTy=aaWJ<~R zsU1YfM16o-LwJp%_EG*v!Bo?<90%I57b2#;*SP}k(+|LmKMp|*Xj{Y>ucMJiDE1qQ zucNVt=;Y7n&@M}x5tgmY$8$G?Z=5Eg2?q2ITd_CUQkfi=1cCU%u%U6FChyIWb zZFKdvCO1T7kMzifo@ssbU+HjLQslvPt=P_>c>4Oa75VEgZ)@N7-amZj;M(ws)%1zA z*t;#|F9pRi%j)enf6|V&oIHkFUNxxtg0?%bsne zo+v0Wi@#EzwLif~?_C*MO&ooKu&n>8C81DR|EE2MlDQ{Hk_Z2mgxKIF0@9XY`#j)d gdatJ>q3<-Mltm9DwUiPc=$O-Nx-=?27{NgQ1;m64ApigX diff --git a/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc deleted file mode 100644 index 826faa6aaf40798e4286ef608b825b8ae1f8de94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1549 zcmZ8h&1)n@6tC)!na)fm+0AZNBQ911g%)=PH=cqBt}crZ;y~ou^ zBu^+>8G30)iI2psTyc3fPy@YiKhOA`Q6R!DT1=?|f=LJ+Z-H=1)NJpFsEKz%)Fe8P z(7vEuXDa=__RJ~b9dbsuU0c^886{E$NtbK8gJ85NmC!~iwS%~}qCE~V(Vj%l>|d`n zNQb-?jygPVWg^|>T_s!DAXRCW3e`*FC~alA8bI(|e8xp9jye;?M)R$kEg30(BMZ8F zL7&Uk-4C}~{zye}Gs|@~l70q0#R|AufKR>z?3nyoU;Qrl;kAcX9(I1(`*H7L?dGHU z#)Y*phF#J{HYLau5*;^zpAt?y8WO0i9a5;A8CF6AR*TzVH8fAG^THbHSII5c(Txvy zj|;)W+d`zGJ4-KEp5~GA!Eh z{V0i)?;l>9bJU#bm+%C}eN28?x%$BRrYf$$-y9IELIDI*13<_wtk2Vzv;ZVtfDP9W zYp`gO$7&8v-S_((+EfWZwDvrr*%m^VbzlH$Y31AgSN#W#64tC0VG|Qyz{05K+w^>5 zw*#|r_;rm<=zYNhXg3xlEbU+yF*OJj6G0?Fs|K9yiy+H*$oN5*XE;r)-R1}FHrpTY zgpDK*-<;hRBq8etQb`uUMJe0N@=dsQv;Bq2vnc5|VFud_WZs;eaj94Zv_+Q6?k?+O zCVcBV(mdJ#rfMcpBX zc?-oWpgJQ3o+6SmJd6?jO9t$Oj16k9jw{r@_OwDOE6)tuULTtv{fSa}7>@wLORyBU z3WSGivlr^)`M2v6w~lCgBY58ct-xjw*vz_8X1}}yK@mpAlfi4gUclwPXYU diff --git a/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index a88550b2071e79acb5dad2e9672b0bd2edf4c69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmX@j%ge<81iC-?)5C%EV-N=hm>>+s&mus^bcPg$6viBeT*fFyMurroD5gqgO_rA+ zC7O)4xD)g8@=Fp+GV}9_tJn+;^$he3{4|+wamB}{m6ntirN+k>F$0y};*O6mOD!q} zs*8_b$?zGZ{a37hMt*LpeoARlYNdWbQGQlxa!Ij%K}LQ_enEawNm_nRX1;zwWl09m z@YEupcKw{pB&dL~o}rO`ab`)XZb4#lc4B&Jv3`K3k3P&2y@JYH95%W6DWy57c14^( d+Zchkm={QVU}j`we9EBofKRNEyNDeq0svT^OP&A# diff --git a/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc b/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc deleted file mode 100644 index 6771432cda45138c54c6fbc9b0ce36aa2b0e136d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13854 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 TyuraI?7c($c=!tYCj9Uh9{5|o diff --git a/lib/python3.12/site-packages/PIL/_binary.py b/lib/python3.12/site-packages/PIL/_binary.py deleted file mode 100644 index 4594ccc..0000000 --- a/lib/python3.12/site-packages/PIL/_binary.py +++ /dev/null @@ -1,112 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - - -"""Binary input/output support routines.""" -from __future__ import annotations - -from struct import pack, unpack_from - - -def i8(c: bytes) -> int: - return c[0] - - -def o8(i: int) -> bytes: - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c: bytes, o: int = 0) -> int: - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">h", c, o)[0] - - -def i32le(c: bytes, o: int = 0) -> int: - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">i", c, o)[0] - - -def i16be(c: bytes, o: int = 0) -> int: - return unpack_from(">H", c, o)[0] - - -def i32be(c: bytes, o: int = 0) -> int: - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i: int) -> bytes: - return pack(" bytes: - return pack(" bytes: - return pack(">H", i) - - -def o32be(i: int) -> bytes: - return pack(">I", i) diff --git a/lib/python3.12/site-packages/PIL/_deprecate.py b/lib/python3.12/site-packages/PIL/_deprecate.py deleted file mode 100644 index 83952b3..0000000 --- a/lib/python3.12/site-packages/PIL/_deprecate.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import annotations - -import warnings - -from . import __version__ - - -def deprecate( - deprecated: str, - when: int | None, - replacement: str | None = None, - *, - action: str | None = None, - plural: bool = False, -) -> None: - """ - Deprecations helper. - - :param deprecated: Name of thing to be deprecated. - :param when: Pillow major version to be removed in. - :param replacement: Name of replacement. - :param action: Instead of "replacement", give a custom call to action - e.g. "Upgrade to new thing". - :param plural: if the deprecated thing is plural, needing "are" instead of "is". - - Usually of the form: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - Use [replacement] instead." - - You can leave out the replacement sentence: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" - - Or with another call to action: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - [action]." - """ - - is_ = "are" if plural else "is" - - if when is None: - removed = "a future version" - elif when <= int(__version__.split(".")[0]): - msg = f"{deprecated} {is_} deprecated and should be removed." - raise RuntimeError(msg) - elif when == 12: - removed = "Pillow 12 (2025-10-15)" - else: - msg = f"Unknown removal version: {when}. Update {__name__}?" - raise ValueError(msg) - - if replacement and action: - msg = "Use only one of 'replacement' and 'action'" - raise ValueError(msg) - - if replacement: - action = f". Use {replacement} instead." - elif action: - action = f". {action.rstrip('.')}." - else: - action = "" - - warnings.warn( - f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", - DeprecationWarning, - stacklevel=3, - ) diff --git a/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index c7fbd5864970be8c38d87f977eac5b8f7d9afbf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115489 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

|FsBS30>wgcV*=%zd%ce*U_ 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

XwNI;h)&vQ*@l}ew8q+6aWpTwHi$6fsRQB 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�Ia z^AM7HE`@m`hD5&%>d<@flx{1PCpumyux5nN74)C!1N11N8_q>Cd zbw6?#%<2Igqk9p&&k#aEmki%3-M>1R9OE1h4PsKEz8?<7q$n)NhYI$~t0)#TTQLtu z3X{HkEn(7vT9tJ7)nL+r{}Gt9cnkRnnD^_E)L>KVkWJ(WL^K1-{PO#AvnUgREl52 zuF(TJmxsAbgig9Q$o$b|IR8$14fCqLW+iJASQP_nQ0SMuI&u#suS(j^@_rATL0%0r zr%(0gxV~>2>beme@Yp>h>7^z2ttgASz!pRY3Zf~fYh4y~9iSQ9ex?S_((!(7HQQ=#rM8@j)8&xA!;L>(^d55efPjMx*tYDRS({C+OB2P_~1Q# zCqPU89A(kc{e=SU4@MPeN2!>Hmij?BgS8N7e`o^jgF&GE&sQYS9vLRk4q@Y9x2`tH z^w^Ip%Dx=KHVVIGuVLO=d~tjn^l%*l9DFaihX;t0>i+Z{h8C*1CcDjZ9qbc1#X`4I zon$;F&2a_sGmthG#}y>Ah|i1L`l&OPI-VdJqI9Y5DFj*aseMzF@P4IX7 z$blih3)P;F-51X>zq%Bnd|jFdatfALX8N#{HV+Jw?3PU!J|f1Ae;ErUqDDewi_gFK z-9NK96DY!k6#RqMVILoUNiNjrzBl<=g$*HUlXX&wqtw~=rW>DDHXM(4myaK^W+(Q0 znkjLmShwp~Kq(Oj`-(HJq{a{udM052^Y6ZBcjPCxRvqrH3Xh{OCHl@h^0-LP=f)jZ zy%O9}jrq$}1*}LDyT;;x!~B+zyr>IrZQANj zMMQN&Js6Bi%Lu7^gLndh>F>93l#t?tJ13@D{VFCk(<**v_V`uM=9yjXe#t>fTZmLk zq*&7&)RGoCMBt*vTs(C5`6luTE!yjw4*NwL{LDxEq8)zb<9;HgQrNWks!wz`bW&$Ph3*sogicLWHz%Tjn&-!}8dBvaR z#DeH>8-0rcpap!UAU-P90?)$88mmO&0V-S|x^Kn)(pin#e?MB==Y8o0sY2A3@kH_? z`e8BWWo6u!7?8LULgcx39RSU#ka>FNfn&tS!2TQaREV3i%`NP};CdOG_ z?*0AjmTJq}^!N9qo0AvZ!x7w_`yP5esb9Q%XOznN7jdY?A(!jFw)w5D zw({SnlFA$^eD=WUWRi$}5++j{C`oJze-IV&Bwh&5 zh|G}}T!f$@NpKOah6ER}Fd|8C5x$iK7op99;37O35?q9m!r&ql++L5N^TpiskKm(#D#>zhnq_dvMZFiQD|A)gNzS>Z-eetitevaOR4zN9VdLn zuiB}fBekK9=42cjJOUoJb2#L&iWo^T;QE5bI9+@yG%rT4RY+f`1y*p_cYlHp8a60? zSe7jflIP?L@PsoNG_A@Pi{dTv}z3( z`ONuAOX_)E&C*b#auebG=zeBRwwl0b<6w)~xqOki+(xK-ctrqn8%*VdRfJ0wO9Y8# z^xNWJ_RALgZTCQp>(jGHgsnMVRFMN$^d_2P9fWC)qsz0?vC1o#k08+?GI|FYMXi9S zQ^|wuy-itp-h{2FI_>KfZIu+Ma36$Mi|$V;BPs9NVs-ll>NEKC^Z7Fu9uj%n9@?~p z{i8E@_K#*i)PaB&*69xIypDAQ^BUvOE|s34E7{nvc4$v%WhOF;mwP+;7cTfGpp-yA zw0by;fJ=sx>5uHs1yBww>Efipzb;v>YTX0}YK& ze@)B3ZE*P$Y(*&56scJ%q7S69>wjbLU1H+R>nM7U7BB$-E73xZa&G_u1FFZigBAl2 zECJTB>ldR1HfSo*hc+u>4jh4@9hP zn66OwNK*I68?kP87~3oAZ>Za_%~uC-8+mwu-KbNLovsRlH@T8UvKqsBBtYP@K?rok zIB8b6JCy?C@bDIoCX)&*Y5@d`dpj*bW2yK>kdOlj)ji_fN?*6YyY5uo`vkD;&jZVVmns9m;@>+OcxJ&j zkl0J};B+l;TBE!jr+~Z~R7KIR1ULol&~CJdpwoGPs+DMnuQN;*&6P^tJPl1~;~hD8wgKl7zlX?A{aFQ`rMKdNSD zj%ju>sCLS{pY9jW_5PD2_Z`&kNOnr?R8-wm`xH|K?JynkV#DuBL@RlEF*%Dl?7DzW z6+*a{UBTr^dxjv4zckV1wlfhlc65qH*3scFiruY>SAc%!B0gWXIjbt78a9@lxU%vK zEs?IM%w=?Ra5I)j`)I6FdZFAu1%Rg;GPoGj5xw}`KVi2b75DqH5Bkg=?V+-6*Mq*& zkzIQ7b+{q?uAg+LBGy-H`X_An%dX&+W!6urIhna|z{cS_Ej3z392gkXLK+IVpc>^v zB^QU2f@ep00s8TieSx%#qEnK}(W(Wh`F&ZLmc)%;PAp|R>4+%v{aFRtY&$+iVjk0{ z@hUycxMe=`AjWPS3^Fan@q+=0NNFH&05qo)$5)CB*MPCkB%6WfWa&b~pUBq9nxuFF zuj{p`9g^NF4*6-oWc=N1H3I9cBOK`w%KphvI|{Jz3iP|rMj?fjw2?mkZ1xQ)@@1%} zLDZAp7xd;X$GUDKhv3sX)a&ii66`k#1f`%VO{KcKN;r)ZJ1vDW33^w-Xt)`NdT5`Y zx(_8zyiT)F4x2(|?OAonls=ct=zAG6uaG8MA!@7->GRW#_FqWe=i}cGIv1>h&@eW{ zWOnL1gC{d%YJxbB% z{RTcr&MkDe*=<&h$g)HSjzI9Z^l`l9+|J{u4aXnXl`PK2p8$urol28E9v05+R1UB4 z$OLYew4Nl_QW+{Y$LS)4Qh_=GGzQgMXLaU|T9X|#VC-J^VcJqAlci!Zhy+r5Txr)i z*qj<;hpZC;7J3{=sPtI_xrqoBHOpBRes!7{jKN%{OIE64v;jR75qz-V&t;yMt54L@My(E z$WXrVCyACpwXbp`O&nDT_w4>!M-6nb{FGnV=bKMK__tU=3D$negA#IM55FwCe-MRS z(&Z+d%H5(oA{PUObF#R`Tn_{C1|?m2%349`Y_PKuZ6;YVFr#in0O9c?{`?BAo0WP@ zPlUWaoq+taV7kAv!;R{3A;iQA*%2^>f{mw?9}Ly{FZpU^gg?YxMya~c+%Y8+nYPK! ztmLlOMnjORM-@8J-KDd!u^a`g^(!7=vPgWQwm_XL*z;v4lzp9;=uFy-0n46I%tXKq z%m>CQ?xDx&$wXIY@+#xcl3R^UUwfaQze<)q$kU4CV(FDEae+YwEpaHvYX6FIT}^f` z-AiU~wcij9nWRY8$%Jej0kZV!eYQa_UpNmkLYAM5l-fwIh zul(~pIc49oRD00cD{+tTqAjFxaz|~yQv1K|CD{Y3M5deDX_(n0F9jD&l%Tg5#35l> z=nDdGz*Z8hhh@1La&t(HLDN@hFPFx5n%+5^$wtwuX4y17OGDLu&Ov7EDPKBX=99F1 zi~|v+e_)556R}*RuV*FT+RlN(xMxs66D6BmG178RjX!`7Y~0t@)^&mrx?Ez6-?*5xn3t~3JCdGZ2_K&dDBy6)5y=&>IXZ#1Gh z8@S3iIePny_R9?SYYHh;O8}GKk|jrtHV(RU_hkfOs5+MTd?Ve_1q8A|K1*ex|2!ta z_TS~Un+*L*VXjEzl|HrE*IlYc*ud3O_%IEe+ZT655plThM-}Uey3k&}G4m$88ZG!) z2kt(D+I)o2+pjY4_SIMK-L;eC6IUxn_Mr0orx$ITzT9-nZ9%_ZpeVoTmfd@HT;HSo z5=7pdx1h7ZJ#oSle~L8UM)k1i9h>_Wu*$1CLNPE<=J$ z9ry@`Wj6cta-j5bkSjS(h~_l)K5k{^BIs|wTo>fZqCkg{A&rxsr=XI=St1=UB8&Kb zoo;(ibT4oMp`cTc%W3X+ILc$!*4yXXVLWvU7OC+Se`$NoNObuVYklLV{KR{F)ei${ z_VH$Di~77ZcEow&rLAl)*yXJoeDM{2>utW`c^c?uN7GSGCdFPVxurrWKmqzJ7aH6@ z6o*m|5*FVKUn15mHo{TXagrTa8I($Hyn|KRXHkU#twsq_z-UTI27Id5Ig zuToJQBhuqx2(7Ng6+-2Sx5>le&-zK^y}H~t{E@XIl32`(!3^m6?(Y~vtGfgWf0s@x z?@YS=Y_9u;_}tr1@I5yLgj!>7jE74s-EOF;l;lwyM8bV4m-p{s8qh9V)A@Eja! zzytIUa1CrF^R@-G7D+^P;48$nh#t?kx8X4D9(!i>v=n(pbf=WbuHqLBP$}!I zB92+dlSb+#UjCdvPk_?x7e40CBdivm-R2i|`^qLigCLzN;Q_-NL`cW7E}V^2@~RjO z7H=vY<0|!%@=@R|M3Hj3F`G9?fOidAMUs-M=l7>DR0us$+U}s&|2&Uhx_97tTXGRs zR!c!gD%`)oT%@=*+V%`VtcF3o_~iC@z%8`N`>!GbaR9AK9X2{K&kMYBzjZ`!WRSlEhq|uhZLN_K@nzgK$MPO@+Jg)atTK7inNZbz zxuQc>3mcUeikKu{TO)gwyO`BWI$&DZPnPfM1L?S{7pk;^8g@+&;!1P&haacL0_8v)r8yK1mTwci2(8F$EUF#@vX zHa~7C0r_wsAXG+F>oC(DBOpozBLY(FZbxb`Z2o0GX{*vWHGBbd5mNOO$1isOJLsUs zPri)8&l+YBB9{q}C&5E#=F2$jR+C{u=acD82&146Y@^aAkdwIvrM)v1G8l4MEXOVt ze$o(uA@)ZsUdL+i$DMxZZGPcSzjQD7p~b{CjyK1VI})L7x+Y|0{2(}))H9F!6+3+E zUO#Jf{N)wq|C9n}4{heXt&0wFU6Map6A_F*@31X8ixNX0>aUYn7M z`F_S7zEZggg<28*x~-?<-A9OvSQEbhkFS0owWe_{qvM%$ReD-Nsg9VmN#Qu;F%72y zRmO7Kk@*~y5O3*a-2JIS@HBBOdjkC@dW0G#ut^W+`KJ4Q%?jVN+M^+=Sx55hRkT79 zcus9+>(FJ@h4%SnI>}ZPMn@h@&E<5VdugETH@PRlDWWAME{PcmV5wq7z8F)q2X`-2u4s5yRsE=W-3 z`Wg}B^jp>allRK_Od=nttTOaRyiQI0m$|YU>mx27B$G7Ro0tB(DBbp@$BmmIyMfLW zD&6gfn{I1R*J;`;uerMf*{(5thaW#4YuovNx=j35cll}h$Uc&%>ARqtAs73l<~d{4 zr?ch_w&f2_el%8uk=%2K3Ey97lrure9 z%#y1NWv%yoUJNZ-mjbm>j+NV z&GEz5WHcE+XQiIb>GrEP`13mb@@;n1(e2kWW(DY{GGELad&t+yBz(zGhAyO70vQo4 z#qtHR8<>O{=2Knj%1QXkWtSF)X{a6O)0#PKZM9u8SJ|%kzi?}=hy#{TEuruzPlkAMDurt^kA^X)F?Fn~hc5_^4@oXcEv_8om5jM(C4C#R_6oJy+ zKaOP+&nJHG| z8$gUH_hi(@C{LtT=>?&9Lc=0u9I;q@Gn{1f7WiJzX@7?Os_c--(amI!peRC*tfYuh zn_s++W_hEQjCp)`1DMqItJ{OgztZef(h0GAZ0bq8J`MZ51o9rDE9hIL#=PA4xY_P% zIdQUC>h6QXbJsR&fO>gcS3fua<2tk@ZuYUKg`zQn2R2DH1f-suQg-7`7#8))VKT3X zLINo+IFkB!x1=Yx+`ur7$?R8Fx~}BcLCY1==~^wUKZ=`+q)-cgFA9s z)uPQic3#`NYyXY_iCHO!EmSDl3>IW{YLbaU);g$Afr_h$!jZ{)V&ypD1!YhN~P*XId#=Dmf(Wy zbtRB41$bDNoyo5x4V5d|Loru&UiQ?9bXzJFr@MNad*hzeX|9j;HTU-Q#J#DwH|9Jy z6~DJn6MN~vDIT5-_0k<&_foN~C+j#fS0|25%|T|UjO#j z0d)@*rx&pJpKnUG)nA~U#O(-t1{l00-up0<7>)>KvLsDuvAiZ=31rIH!cmR88!UIR zuhczWNRtF9yjzY0RO0R?#Mt@1e3h1hbnAf&T9~{aP}H2nVuw8xao`PDjD;r&CsL^e zeQ2ice`EJ(PYa{N4UoCXnk?zI*_S32o50>l(!x}hqsQNfeGg2a_V(|kYMG^RW8UiEg0e4`e|=?nOxVop(% zo}vs8(zuI@uHl>-%MY?UkbDh#SU{2E*Vd;Agt^fn6$xY!_y$B|2b$43j{5q5Emnb)i|l}N@w(s;?+ zBQjV5kTI8N7NN?*k#EqqpC1a6qr4G5pf_F|`od(1SiyQ4&+num5IR+ z=CINmr#y$EsvF6sUXD2tWm1~sq*SIK!iCzMJ=$qnx~L*NN?n0*C0ZQToB&H-EcsRvRmhnS4ODiErm>1Kzbm zra5nN0SXDc2FcgJ@%&3N4e4*v`=NL^+Qrsa`F#Pb9}jm#C{-b09_(QlzKaiq778~& zw7_6K*#Y)xRRgT`6U$`8MT@I^=05uTRh`a)GNMQEYR=HE*rg1}vI0FleZb;3j)m07`=aZdK z+8(HRZbaxFz$V&vqfnvnTEYbU)L$#$ta8IlcKzs`d{wWB@U=5R!*R>74;G)@hf-Kh zRJ%K&1TZ%c3X*TXQbMumtOy1EGG`F$Pd`(z?j zD>SX2JZ1;Eb(Ih>JJrB3`a?AuqUdEg|3bzlG5<0SaX1zp%I6FYCXZGR1^l5i5V~Te zKez9XBy{ABJMVIE3Puw~@+#+D=H3&>(l#;{7Pl@so8DIqybb1+$eUe64ZdEhlVihUC%!Iba=Lj~bHfXchf!Ipp3FgZ+w1SWwGBnNE66uk4C3VrB zXJt^EO!mLEF+_#d5p-vqq3P-1hlX^@ZgE&Htkh^N=IoTL=a+gb-R$QT*0qHxkieIi z_nv4HN~?+=!1c*a;SMm6(m$1A?_a#$mm*-vjFX;KCwPf~0#XxpSDOh#N3*Yfgy6R+ z8FViXP4bKJFk0Z{i8?sPO%kC13{A5!03-=R8g-WSN|?^{oMeiUC_d5o9I$H;HZJPw zI;TzyvsoRrSDjRhw&+qS=Nc?VeOHP$AXkvby_KGR1C*DCD4eFw!uvF2na=u-&9zE0S{^=;$aquJcCGaoL__Lj*888W7^( zy-jm~$bvnE{mX=Y++%G|$&|FZx0lm9(ffTS22Zuf$7cTm$ba1IU(}c)vDq)yr}j$_ zWc><(Vh$rUUkzwkF$*5H?Psdi#+&h{ z#I9X#0_@%eKyLM_V+>P9xw!*}DOk3KlgY~|w=qStIi5>KX`_u+C#;JsZ)~{s)aFYX z8;Fh43Qvi5*qDO?jZlXSdkU}Et`=$vDl&G{PxS%EX3U#9Cj6N6iOx1tW^-YJ%!2s4 z1v9rD$-BhP91__Y9&K>yvS52wQzxV5k*DsbJVT={&num}KYMfPz$pbF|Km;_=0XN_ ziDvXos2hF5x=WDqkU~Jhp4es!Vhm$1-kli6V%3^`h9#3dyC(Y#4@jQrs5AH8ZP{lx z>sgH5^aeF|U$*#<6;}jLB7)IuAZ*)&Px=kF`4axl6?T0Ogp|{nV@9>`4q5=dOg(9= zYXshr-MJ1?E#_!PD8@&~N-a~#7;uez;F~dm#;lak08o}b%&vpa=>)|Y-!Ht1f#wx` z&F0|p*XH*1#W$9H^zPewTh2NT_*uM=^WrX&@%5_=7n1lkWL+7U&)e=w;$;&&Bynpv zXGpwko(zeXO-W(AYzlG_t@E#e%-im|ZeLFi9zPbJWQf0n1K<|imcVb~yOx37H}h+< zt>T_j{CnOl!}(-<5BEEzmQb!Du^~`d1+&+sB1DAWC(L1GCRE3O?Mgo@fkaDOOLjxu zk~2y_1B<_wq~}$Ycg}2_^aj;RE^Q`-BDwrqmm8sL1%HgGy3O z`0dhG-vs~HB!{ummGLj|UdGq17&9yiJmwIdm#?Zj)tfVY@P7R48ZQnqKv z4Lx+E?HXzL0KMCO%y^{~-_|GPeq?bV^6rTkN7h4fcvhXz-%@D1T#Z?>tYUB6i@-J9>K)mm&62h-5E^pu29{ zu{Q+0DRduVhYjCzgZr#tJLCf1u!DFh1RCJF2yZX^A8t>!37%KJ200&xK+HUfXA<@a zpXK5U6e~tbEik5ekts0YX7h*e@r&keL`H@9H0r+jteoP(NPbcLMKOuI=$T%M{V;TxWCF`5(&_4t{0mhxe}>p*KHnVg9#m z%3sUIv&;DMZ4T`QBYZmX>~9~OvDc@AL;G?TQ|lXkTR{~n;}O7M=rWG5i1|gK7Y#&v zX6Lvu^gHib*f(Y0Bp>`OK)JJ<)m@n(hj*led1WC4=L5CK6_@hV?DX~3_K-E6t` zgn#2~8?Sf03Nu&Uyvwh5w>EQG(Y*F(P6QROF|^f+xzNbmDw(_f@=r$yVC(B;n^@cJA5LY4heXTYCJ-l*B9 z!c~=@9j&bL=i<3aHU5HTlN$nq%vK7;>@8t5dh90rO{(|N+zDQz5cf>kp+;{7eUFVJ zr6nkfK7oHlKgaq{&$+cJ zn3HACd)|Dk8&06$VHYU*)Wi;N!EtwnCyY$$#TJW4GO?fjtLny) zssh(g>ugo=vkQRP3SY_gf-2IV=B{ivI-t68tV*C-ZSKVX8mCw3F5!I@0dC%jen0=0 zxLv^QJewC1eBa)qfTRM4zUD5MN%ax&vpPOV`>4vWs=(%TMIYZ;sKMG-5}tOa9OU(l zioU};{Orek#VJrgdnkJQJ-O@2H~Nazx?Pa<6slNFR2g5fnJrz8hS1%@iTE6CaE!<1 zxLbO4g)+$9BEEeUpCM|ELfFGQu#+-Ma6B1qL>W$|;TSz$7?0-)sdEIKpPbzZ-pucK zBCQY$*Eg)^5@()yI^~&0dEOgGlQ#|xe}lu%vwQ=S_n-J1XWy$=`Uc2T;>H+|&-R_jd0KpwI756t20$?Fg3J&?{t-kVEKYfF*JnG*PU0g;V z(#rJbK1l4mO83nokP7aRm77%`1zV>foqNw7}$1 z*K6^JuZ-5#tx-4z+I*K%fLoPpZYDXp!_$(#SbU!*kLk67?+hHs|n&$x{8R*S3zUn3LA78 z)HUPFE!_f_)jKF_=Rzz}NKUCUN+L)uqK#6Pg#a`rp)i^I{B`|W$F=gLw5Z5gjDa2Mgzd7fXe9PY0bV2$S2rKj}x8R;h# zAvD@qZbWuQr=Qd5=Ms~=&CezJIJ_77V;v9&QZ)l6At?xYW$AAaA+giL(Mf^^Kp8#d zs(h`yN{NJD8=V(^6&i(@_N21{VJPerH3^SbtBBhz*>VeDdAymeXXQkZ4fR7goLFJ; zi)!TfPq4Tj-tZ^&Nk8KmvT+RUyn-kJAqs=e*!tT>eQpt-1_*0^kXDHFu6fMPSFRDO z)YS*ekpG-`DUHgL3AKrjnt`2r3bpju*!|}{D5#3v15xT2jC0C;M`83`X^Ipf!Ffng zJ9hh$^N0f6>PxoxVh*`?h=T&?q(8^)d`6F70ngc?zcX-$Z1pSJ{c0qo4ux|fUe83R zhC~eB(w6{TcehfO&r~SD>o{dB7hXMtAm!e3Z=d?}kHq?Ti5mZ9-6_MMSul-QBPLQ| z|HiS)YG2^iVnPWKQ$QGfMNRy6fb7kF?pmLbT6`ZQS4n>!H|`4+S}7c2&~rX&ykACP zYM%{pdn%a+;bp}R61^u@Voe>&p}irZlu|vo{iL0@xx|w*cK^Xtsx?F0CxjV}1wFpP zU_2ByDmDu2(|ru-Aq5uB-={AUayD$#<}28%?-ON7FY&AYjh`F+ns@oSjlF&i7UOA* zSk9-T(atg(;p{_x?gk+kwk-P;xoQRhWIMJ|C4^zlpyGtcgxzeeRT}4^WdB|ZHC)B; z`fLjyf@`mhE+pJ8xGQYJ+Bp3zQ(hO%R;h*li{5F~w&Yi<3_F|GmDjfbB837Btb57b zS9_8>I%XT(0Cw;(XyJ8!8sewT*z4;$hkV@fI;OOP)TLxREU)b#@zzg)toHB z<<|fX`~8||UIiGcq8!+`5?ua*z~TN>4wnladJTmurADX0J6jS!Pzr`&An-P!a0|B> z{e_|M`&i!5a5(HDDZ2w4Ab1*n$>DKB%mav)`Dn*i{9Na7QQpH z(a+l|3Lp-qr&C61vdE}zN-o5Mw;Oj7PKs-i1FK3hxXzHG9D%-Zt%AQnSO)wG_qRm@ zB;efaThl)xFU)%+gx?*_6;o4xF`Sq}JT8XNoV&p<+2|Lo_lwbvZSV`)^>=ZLU(~9w zhoIvncmZuNtQ-tr5}v9ux+~;VA?@b4XMFupKki{)-|fe}VAuc8*OMFkt5)))T|dSQ z9Z85(^c-KVhyK+?zsM#gUuRu(0l%FakQ*MO+b>3sqj{=}-mZt~7k6+;1dw`=i_oy8 z@QgklRYgmyALh|A)ryu?Ka8uqRj}_wN34k(^^i&n_$4Hr-j6Opk;&Si_~HEA7(~Tt zB_5;oZ^mbQ{YGDdGL%Cv4$H89X2R_{u)e-GcR`JAs`3mzEym7de16eVBr6W-?Qx3KkiaoD#`_*S>6&#y>7 z3j{pC@2_d9K*Adf78(YizQ@-wWS9k8?hQkhyD}mX znAXVGeA<>*>2Yf|Xa#=!btd^${yLvX(3_&<6B&DOp+EU*78<{(krw)-?e~;#-RA3w zk^O&I>KD<*MNJi2?KLusw4F{Y5N-2Tzhr?wmo0DGob6A%Q|-1yc&=mwpd8Et-z@7Ux!2xzM3MAXld_4?Un?n8)h| zEb^57l`yAHJ@3aI)g@(z3m6n8(!SDed~+a zPVp%H?6%H>=_8Nr)C-~hG{NE``U*zU#*36sFmL&ZIE$uE-J9_)UvmLV?lW)CB9miB zw?TJ>NbDrOW5_KVLM)p-JCVI9XdNy%k&qJD;$&3cs`)-28s7Sm{EyKf!SAxIPr&TC zZj0^z;)1ac?hLryty>7a5VXg@|*PIOCA@ts6D zfqS;;$XX7APe!7s+UF5cP!Qsx)OgwM;u!Zio55QJdyFVt4ne=K9 zU5Ly>enxbI@ZJm(Ga>ncyRdV*`=m)gCbwlpx$oG4{G1Ly-wrm6=QUkLot=!s#{ipO z2IN!G2aVa~vu$za)YC?R>TvA54~1Z81Tz| z=nPe$Wu`89WmO7i))-~2bCBY3+H$`oxlDS5=M#W^FblBNFu`NL1-L)mjTR!~Ni?*| z;GO&oUkhN!AyKEmF4Gfa?Lg5@&`tsp5Av292YE~MkH)JXAsH-sgzwS?_77*kbfkpL z4BAYjUd(C^9vRdelt6sS4*HcS3_iwlVg_PyQ5S!*pYVdwC8+kJ#kK5{>#ciBQ1F>t z$OX~^5!~4KrWGhq>9I}r+R2_UF`Fc41lHt>`nB=%KoHw#3N_Ll(J#Y5)J7MpN>;EB z+JMu(R$;}n;$a~e_DC6^#|63q(I>{! zi?pKSU@x+W33Np0+#6cs_Hbgw`8K>ID4`sYp=6uqETN(kdqU*qRy@E!e{$fPW-%rk zoBT8m0nn2|HmRfN*4spU=@gLtP|(-zlfHH;nk4scN|FulZ2&b?aR5m~b8w-upc2lX zxRR1|Rt3V$>4MZyS(1F4;hJj#uKD;mLL?7J9>KsNYOV2g>wLp^eBJN*T8uRw^|k4F zv`n^e#)aBB`b(t8J1Zh+wE2!3tYy!)efj!Q9sa9?7%MnkhE+)I}U<}fokplrgHbUSk zR~msi=Swk>PclMkg@Bd^Nyg(tNQQjvP?e`7K(NRqm^~~fX>^*i*}sO}mwr2aoy8)A znMMoJfcj>wpK!=GeAX|5ZDuP-DZWIVAdV)=AlaJklUULaKZ1tyF}_d{onPh~u0#)x zdWb3KZ+!$cs9^;Wf;hIW=M0ExZuJe!DKMpVd7GByt*X_X)T#-&yqk9ThR%~GB#P9q z2BC$TBYLU-ly8!Vp#-wow!@R2w%6`aw?5V5o77!~0@BO-T6oCU3d`$&g<977A|4UB3SGV52}r-GFWEy{T4X_&*H&E`@M!=I8`aAo6Ny z=kwgjXz4~RWIGQh5xR|&^$NGYm+LWYmM8fRO?JvJVhcUu7p?S}7P4$)iFt-C&5YV= z>a@c)*kp3hqY7O3i)f;c;CN8&FYNG}d$6Ax@a>!!u*-?GjN$c4KZ(3WH5`NEB*6B? zo~Q}_T6PJHK+7ntv8D(ZBX#HTTidoKeX zM|MG1d>UQTv3{R<&d(qeAv(GlFDN1*Hx=pMq|ZlfN6gmogmoV-LOc|@h8b~_rX1#E znh-`W-Km63C*^#r5$K1FtBXG<+yj)VpEEdlmyk^`r*L~PG(wKSpunaE-WAj^?9bi9 z+>u?HeRZT@Uy=A7ak}ArVo^0k7hqRL(xfl`xPP%plTEj>FKK5!vNF3VFCBSPHf-{l z%Xr18{^Xtb6gJ2huL2RXA^m&Id~`inif#8f)HU_d&D;QlQIqx``NV9O)+olb>R|ac z84>=FR-0T_;h}9n#l5meJlXj_^~rog?b!(cOWD*M@9RRi2j{<%2Zlw4y%C@>K_EK2 zoFT^nVUb^nQ5}OtDikoihBJLF)AXbt`@%xR9bhV;@=plYU#R>pC6VZWZ|U>%(;bjx z>inpnj;R#LmLA>;8ilvI6ZbYpWq1h`U zxjK27lsFuFFLS+83LTODDB~|P^?dEEer!+OI6EWi8hQ0D~gX2gcH@@cl@jb!rW_%%zvv-%HL10NO5ye&T>SJ(=ay4CD zq$aC#SI9An6iHmkF=~1niBp=J&6eyd<`MXf|DnjBrO-L)`a6HFFhkBAN~pmLOZ=Tr zutdn^C9J^4N}uO1yUowN0uKZky8V9EyAEw@JJ${x14NfzZ z{}^wzVtB~l&nNDz**D?TO2)+#5W0-7d{`MWOLzFDPTxpkrj_xBVZ}1T-TF4<-1V)Ag^LP~&2jN_Cwn_ShH(aj5@do5xb zebKSJIOv%uzC>y}&7@q%*QIql4CilPLL%+B;$w_Pib=BH1RfXl8sbhJoMTATdBo2( z+|eGaJyEX(G&Dy)D*_5x9SU2s2*uuP^;QM>S_Z!0v4A|~e_{ph4(07~NDWBQ*Gn3c zedxLUT_^~l@1G?Bx!750$MF^W1IT@a`y2)%DXzP)UUe5LM;S+|@DUM2ej{#g|D%cg zov$(-^KhrbpRS|tX14F2za`neQ0c7y5NAW1%_0J4Cj5E1Ca6!jD?!q)LRl?Gla01H z1!nk%7n3kptf(gqvC>$|>=gjRX9M@69$!J$+?^C&Zrh~T?Pl9J?5kUT&u5lVzC~8> z{{i^5ka!&fY)_6}O1@3WEO)2w-ERPv#ns4XK=O~s6RXf3=tZcHgu*o{hZ*np=Y7#q z`hJDuw;5oO$`yVFg7!Lme&=&rzm8Wn^6I$%qjyb>RF60Nen0{YkO6w~r-xW@L5WxO?m?eX1)!Nw!cPKIJmB&`ofprzal^Xsg4b#N=l%1d~>5?6b6 zE}xvr-I7*6wNrn`GfUI-(N7-e4_`eNlKDDLf#nL#%#ybl1R`vy?1a+uG_I0@ZQeQx zx@|s5HYlcxbhMk4w=m`BuJV(}9K%qx;V0rLt@j(__b1ie*gij#`ItklL%M*C#bsT7 zuA7IgC8vGdz75Rgnh3(irBYlnALtPH0KPyYePAQa@mZR3x3uwUm0GffZ=u-X??y{J z2`$l(DLAOJJsH^tlb(eEH8L%oe(@Gu4enA)-GJj_`a72dMs5=Xz|AJk4QdCvIvF1> zzC9z}Wj&j-%FpA~brg`C(HR&EySGS%V3Jww15 zN^D9|oN5xsQ&*FyRnA**CF5x%<+i?*aua&`L|fcH-YeG!5dpc)NZaA+72^ee(^hWw zsU?e?P+Tm0`ZR>}HAtN}gzeZ(68P6J)nAV6Bj**7PP#ZM8k^t^JRvN=8RH{kqP9M6 zl561ss?YNiH$lWn>cf=l^r;bwFUp<`o^L5_2So!CiiloOQQjz|RJ2>P6}m&gp`Whs z40TJwyPJT(D|V}dnd_2VivIs+?@i#lx~_X){@UKhe_;d?l0ae<2HT7h7&B_X#seUM zW5+f~VB--1F&+`Nabk#t?WXB%B0Emo+neB|Nv8xSY0{fCxNXuQt?drCy=_Q3-?q5J z?YsBWkk{V6+t=6o{jIgn(f=<5#z~s?zW1D<|2g~Yv(FyZyw+a3m(#TJp7pMcllJGG zo1Nv|dQIKJTumyz%6^$}Z_Mff1X&HH<@hE8N}P^9PCN`&^u^?i|h$R##8+&He#bWKu}7D z+Ni@tyB>x<_Nm&%jIp))WF zTHmOh+*eOYbn+JvXEYB!4I8cL!$hd)qI|P4sG5`9aN6;5{m89SK1>&}u`>_qY;l09 zjXD~)SyFRF=@>(p7H8iOOHZ_Ma{UdKG_n+WIr52?!Z#WC^AhpbmX34o?`C^%;>c@m zHsqjg*eyYXmvNxA30Ry(yqH;KmgO{*iXgekbQWy*YLVtFQ!9@a=pI>4KU@4R9fF&3 zyb?=muN=&^6rGYRB5yhhk`9olDC97IP~%`*qxKK(KciV!chE}obL=(s0G9u_VkxEL zG-KzNH({kkAV>>y-@-GJ!e$`@nzblPRLk;RQrio=)d%!2>q>)7J~k-3-Jr6BU%z^Tk?#f1726^dl@*UtJtY&O9~M_9HYr{QhP zKOLK08eVXEw2Tksy`kq81j?_4=B1IawxHvnWGXvH`n~fd4DI~4Vl^rv}_S`khhuv?!``|uO*%Y^X?ta*B zD6%J>QrS5oL_G`u6UZM^^ zraNtm0>pn<>{*=^9M73`GaZPr_K6KIxN@f3dV{ z2v%n)-tHf=Mu)JCg(pX{;WOfi><<^C&8z3XrQJil?dCqZ6@XyEL~l!B@d*2!?>ikQ zZ;hQ)tDAbR9~gmwN1I`XP6TaI!T@b8> zwv`oINdv_=Nh_ca=!(_NW(>B+o-F)na0KpQMHl@=>{%ZdJ)_BS0)QN&)7lVV>fZ^p zkVqpPv3@@#w0q@=xJu7C=Tbi;$kLBxGO-Kb_(@u03xXne#iDEY75bA$tyV#l$6{?~ zKj&Ld=3)z{z(4PXUbOLuUD)B`kb%mioeFwhDG1bhFjGNd`R~U$+JQA`50m+ZS#PHI z#QOKe`Er!(HDO3NU?Ie=+rgmeKmh4X{=Uy|x5gfomcQYpWJu6$kI8eWvv!yC6=I_F zjPM2hbjNG;lcWy9XLLs>kt9)xN`603+`ATeYcBk^{Ri{AwJGnA5_O(F9WM#ylRG0i zJ1RO(`peUUT?Bzl&j!dAA$xCK{;>fgtooSssLKU~JmmnzBFzCyw|+kCU&cgVo9!Zg z^A*LLXt%m|^y@`OO+4!I+RME3P-?l*;3Y}c+~QEhckDI+86LQ{Ob86i>2g9_8UVAf zEwj;9=!4A@>ndPAPn20tr{b2T0B!T|r0Ll)8>9 zM_VIW5*XHMNuIctCa>|ux<>k^pq_{b3<(z+KTp3t9BXwN zxb1n~1sY7s-V2-)z*27@y|6b<7nAVanbVcY$S*lHoP`#vR*75>bFt|%QfpV7Xc96b z_9}gUDz};;c>AQ9%S6>bZF{9J(V-+Zlj7x#2ne;`A14}iTSH+Q+KH4yVt_3x6$D3= zzp;NsTy9p4<$VagyMeUBEZ|)2{*wt!>}>RRe!9b;2$xO_Q~I;x z0~9fpABRec{MKf_V86ia9ZEY72!5D_UY`A|t>of*PQFC9VIvr-0Xg4CM0p75xeS@Y zoy{_xo>k1w>dIomo30=R+#qsJc;zXgzP}jfz@j8-ykul;z7Q5|UK-sCnwKTo76uU` zp&!JH4ZzbolZ{?Lk$S6Na=14USOrXQ}EuVL^6_s4X9R zUoS;E=k7Iw_5}zu8iQHr+Tb@+UZT-!r6~!A!ynYJl%(1HHR}A#cY0Qj3w_Cq(KWif z+&)!$wLc5rw7^!DTaY&pTetf<$Y#NMmqcCu$>`XlmLA9cONv5$2Zc#M+tQIF5a$LX{MdvVNRDDt7 zd~2gZUpTuDN>=sV9aTPR2KDlr_Gr9OQ&zE-Z+#xV_NHHDUaRK%&EVz#U)=&r-fVUA z=Pa89Dlknyf=l~Nu>fG5ZiRW!5Xi$^bmq1g_mIg!#>FpRo^<&yTx>|_%-Z<%1_^j3 z`P50&`LwYq^sCy>awq1A?drAT?Ec#k7afZPrOKd8M6LdYw{B_2ZGD^Fcvmv9Q#yl$ z(He#3>em?bcFYvvPbLg!uf7fopCZX;CdS}ei2Mk4-d}^M=$iDCT%!e&-Hh}q63|R2 zQf5m{BzshC)NY@xeFqazUS?WmY~;}n?&TE|FZ>lrYjy2$-bwz-TKs9)))x`+m@;M2 z!vQUNTU>VJmvghlVhVG!-FG|^wNAJ{+Mfe zv_J;>(K`u(oQx;SL2XZ*doLe;Ihh|0nM%%Xd}2dhGS_~+tnF?^Sb!unq~Qpz?t0eN zmjTa9g6@mc#i^yqGY%mC5 zDbV&$H}86jqM!Dcjf#G!vi_|9lqoi)@NpaSXKn1Y;mLAu7V6Ikc1V(>42-`6Y%!F5 zr&ab9?a~Xc9060=v$yOt&0=TLF1-&>0L)3fC%kuhR^~S=e;84nBzgwuU({cONxNzA z^S6?>G@Wq9W&=GW1GxX#U9bBz!CnX}~0@U;*JVp)BOtMROR6?Hq?CxY5hB+DlVQ4iBf10Qi9&cghYg2oe+o_ON8={H#b zrtNW4`N{}8I*Kxe+V(V^InHy;JZ#mxNhtBE4anMhv^N((Ki4qo~!emPE$yDYv#6C#1+Ncceq)8+B3?g)63!kpA)>mhI(fj-<98iI=c`ec3@)awa*N(Py(`ci1XV3bmq2Qn!GoJ(>>ADPU`HD^n=) zi&FCBAoat~M;-U}imL@Ci-<>JdaDJ_FltG?fMZTN$eqgxEkDKU!*birMKoD)O6so} z+^CuVw&tpB-Tf9&rnjM{bd)Vsk)s_HNk)o~1bIEkqA*-jj9!*)#Vi~r;fc@MC2R5V zccFHTszQ-)5si(dgZPTS^K4Q!8RN?~X{d9CBVnPFZi%gLi*qm*+D6Ao>*G2U=i#_g z%H2L*?+CvRn7N+v%i6!|En#l7i)pq9WYF&2x|OWF@N!H>ggH&SS=~<$na622aj#uh zAf;xN%)B(+PrD>%&hc&?<#v zwy#)Lrp9UE%2K0Z_Y?&x07AFc&L~~n$V}m=5t8=Vs?8(bAD1Y~IjfEHN4?wBulTl& zbf>QI13a4^o7VtwebeLydK|{3BN+vW;@cEG))hAblFGRR!h~HzuZkzKX>9g(TK%vu zlsY3}WvV13QgJA`;P=NV?F7p;ih_oNLnhBQqYlaw+K}BS|IDlhpse9xzBjDUWv8ipL6dWUmqMeqGwZcl9f%?D6n2Y7%Vkt?uio^?%y17~3jl#cHE!?L?OYiQ z!`)ae0ro6>0AD-E@V=wRGhpouYheum_Ywz*h@|-({u{IM{aQ+kvIsLt2N?FKajYEH z2}@te{phck6QaR$S^Y81&|7ao^}Z|b#X#(rkE7dQM+gY*Ziv$!i}jls9=@?-=TArSn? zB42kxfY*fx*BGuNnOk{Sxg|-wa>|q+te@PF^<0#f;Wh@6n#>8rj%yt|D4ZkFe!wng z4a7Od``FF6-E3#IVG2pnsU`Wf;cbIp68X3q#(2OA@rS*G-mtZP?XY6{J1OQf} z4x=0dmcGjf3pbpyQT&cmd)cSMbcit$htD%(j8&KPd_E7F#W8zwE{Q;Q3E5me`r1c~ z3NVV}NBdu5)-71_8;4EHkS<$>WJcqOK)0?URPLnYwzR(kLFCFRqg=;^QWsWqQE2zAFC<7 z)a*Lf8*!por)y%DOI1CIH8&5rVlS~a`IG&$LTk&F`J}Z80iRQ2;pDr9!mkia!WVwx zUCd&bSnVzth!fvWWw|di0YFW=tiPJhm*QLagM`VUfIeXT0s1J?b**prXc_@mKxGsF z1SAt4UwEn{YC<1>E_!J4|0pXOr|I8JG)_ej%)JVNIe!37#Yt*!5=`^J-9!8Cz5Bp{ z;+UvM_dmFo*cp%4DPniV#?j1^?X4%--o)D_7MaH& z@SK9&+izThI6?yS(u?ezg2Akm6tS&W5OrL2APu|)2Wou|sKu)x`l$WA$Oi&}W09QM z(-CtzM(k&5c0aVtMDQgJfl?rHYFSd&2-pJj@R}c|e~L(O4;ZI-^1$||Q7Ri=f#3}{(2AYio>kapj((!rF!}>6VXfr>+g8)NCi#~$+ zi%k0r5%-#KU!FV{vrvUwY@E2GTGs=$a2P5mJ`nAPE0FJ|lKDc#7k)sbr->k$7!HhN zVFgH8L`fvt0ExFR^!dv-D2M=rnS!;E5?(fp<^1!xli9nw^qG){gDcT0_$4U47Uu z66wo(_G@3_wd3sT=6sPX?1mWA_ocXjYT3tv2>k-n;sm>axZmu!)_B^jTmg_G?e&jK z?Vj>(N|4SZgjcM8X*VZ4)MjfGuCI)!1WSBGxr@g}^tnkFsz^_N` z6Cv_gyG0i&W<+W_hxhqk8ZOpbz6T95m(P)h|K8|z%vMrQkmqNSY1fc8rE)CgsLbdT zQTGPj12`k&VS^;fL|rA<+g8=KUc#K1;3o;GM8@X?4B}Nt8UiBpFc~cW=P-!)@Objt z1aze4@P(tYUZz1RO(ZJHZ~72vis5N!Sr@1`?vTV{G&J#_Q|HH=E3DK))-QRz$Vy_|z# zXV{N^V!eN2{RMvF&(Hsf-_R%K(P+TueB+wT{k$o6DaPBL^C+mpkP%*E>m{Ciqw{WC=fglRqOq98jF#FK4k#J4^!c|+ zONl5RLrh7=KZcl&B3CP8#7fhOVNKaA2O7)s#ONWSx0Q5GxDY2RU!}2pxx~h9=;)V^ z3_?h;P`@c51$vkD%LOg{8?-}VHqyEU5^7*>;oKZpOTZU$i#A2@!{I07!hpd5PZEb9 zB6EaazhO9`sOp+*k(v8Eyvs31o@hrZy+b^J@T-JE*ratW?N&G=nxoFHwaCUr>_p^q zdYJ`Y<^ia7$M!IPrT|ot5U~gS0uQ!({h;k$|CI~bm8Ap|kM8T(d+)u=h8}w8z`;F3 z%T`?3@#sSj4O#Rs;)9-bJh685ovW`}_UNAb_T4?S?7;p94?WRAz5Nf~d*IN0d#WOh z^Jrg%_nsx_cpz{^|sV!G)ds%k|S~UYHZ_ANQ3{JEZSH**|Z=kEj4_0SG-t{EG%OZQavV>T3gC6 z@s!2yiW^wmpbnH0+SY`Ly%tj@j*(CkMsF{bVrDgndoYyML3Y?J6$X-#BWj-bft)&I zN2Xan=5;x{2JF07JZSZJFRqOBYxQ@kj?LR(kWl|?anjK^eMOwKj=rum<`>x>DM}#F z8EET2i42U1YkDB)Y*7}bWATQ)DpYkwxhGD{1IVWt`2TuTT?axEF zFjwJ{B7oUa;&{EUUqA&y`ATUq%q|&?tUfNoz<0` zN8fJ50OF^3J<1Ky%mF5zjF@q_RC5sa{;D#P{1BI?y(;JbShqW+{fj;9P@haxop`;KCb$Kkw`6_|8;TzV^}q8p1P zh}mC>fMOh#BG{qp=W(#S&t}{KM$&~AeglR!JoUQVZE(^k>*%!bco)XZja(e=<^5~Z z#nh$L<8%~TJp087u}Tk>iVKXG77hveiC93B#<_34g-PgJrJt9O zI#E^ipCvVhHcc+Kc5yN_zP!oTrr#^{+a4#svl2RAG~D2PXrNvhBI<}3ykZlV9VUBR zp>r`I3G{mz{V2;+bIkB}st&|#2^gp^^9a3&-p8;=NMW^}cPzgOZQ>pR`2vXuCDbj0 zWwnT9Y1g|6uSI)ztG%|-_FBw70#n1xi25g@-5l$`Kh9mTin+fTz8fB|xm?V=>7B5_ z$61c$dh$;AH$J+?KccxO2$9zj6{^%oX zC;a7+b_+=f;iJT;Saxy#z>TyI*i9ZYF?IU73ds=$lf?kQxoOhQ!O{R@rEMG`{NLVvQP8&Jz zWm6bnK*~n}y`|RxN)DX`XwRW5!zfm;*>ZnxAhn_ZNQMOAO#zNCs#e%TEKI;Mdqo1q zrYc~xmcnk;nV;98ovoa4j?q$hqb_oG-~WB&)i^)w?3Kwfe6mz(Hf9DJ-fD-w<84%~ zpECju-@()LSiIyzbjbLCq`$q=ddhDof{tfvmQcxQH_8lxG@~kI|Ic;v~e~B zax*e#U|S-!A8xmMGE9YcA3an4bNka|bGClJvt}C2#m>TRW^lSz{%*a)k zy3y9c&mDoW6D>P?$LOfR5-8h)*o>jsamIB63j49~GxEVW8zMJ4@~Po<O<-qw` z^O4!Q`}&5lUI>9QK9ZA;uW3D12!z?qbo|9D?M61$TZ)i zN6Y;Y4(Q9nYs~xX@C5@i#tr1KO@J?U4U=h+v&`b<^5nk=RQwseeXG4@z?|JN+Rm@@ z_1`~I?kfLj`7a2+W+p$Q+^CZDG5vADxda9LYcVs3ZFShd zF2a$B$C@N|--|a;0xl^)PpWwipLHw~+9!s2uyjUCUWcV;>a(%@NSrFuQGi8bA8MC* zEs1mZ(%2rgIQ+s>Shku0gC77KCJs{au$|5}|EBKl^}t2kK<*)ch1^dGKE8yT%6F}V zUwMjnEx|zeqP%vx%EDKlqF=fM1nik2!Yc1Y9qfL*Kj|G&4Lwe5O_xSN(uZ+9J2!!P zSkXIeb5p>}==bsg8^e;|pnXpvV14kC{jSG^>k{)2XsE_@{%T@s!W3&d;K+1-BNVl! zM3i*l`=NrW`U6gCwdl_we`-U3L0AV^Ih!kFA3e>w_18-LPpV~gSrg-9cw?AtdyduF zUJGAWh`ug)hOk5`yIPt?d3eRd5X{ei@RZv%r-x70$bI?Mr}|&rOsx-KxKs|6M@1EJ zBYdXjBo?Lcx2z&CvS%dxSWRhqGpO)4+A#v$y5>MokXw?!nF>Bo-dcV@$a{?Xe@CO? zm!B$e>`WGZmfn_tDSKV4C>!B)h5dY+?dqf7jvoXeW`r+jY~dH_Z7mrCDxPDN{&J0^ z-|&^E292nPS87Ox-iA%BwJ+9^N^67t4PSZ+BLtP%WI_Jas!zvwNB$Mq0H5hXpq(84 zfse+396C8XD0Da!8c>Q#;n&`!PDjo+scm{5GX@|39PS^e*q8@1!XK&$9EcOzUuwiM z5`JY&4W9jsz510g5Ad^5Znh05`2Tt21j)R^VQ56g;TDMTu+WN`pQ30iWDZS!`K37J zSGh~N*#7Ly*UR6lCHVI>uyz;esXmQKAhds=5r>*D-j}MO1BJ4@An9@CkES{wMEj8L z4-9$xz|h|l+9-vwvAukPeN~D?kkg`Zj}`z_nyXl$-t4%MlrUm+|LaEY(G=WV>fq9t zy(k?ed=AoRs=;qs-Oo60a7_|^LfZ;j)tgh5c2?q4#f{GADxUaFBlI2aAYKTGw;V#R z(X_cDCx_!)qD4AN-^}_}#M~e8L|5&e;z>8Q{t+ z3>Jh*(m6_Da{nNqh5tajSnUi2#Q6!M&!zx-n`(Gk&o!q3z#_ThR99 zS8mjwFyZZYKY0HQ`wtB5dGu`iS+&wmf}~~qdk}A*8PM)iL51fq?apV!RlD<1@m<|# z+kT-+(gz@UEoHcZ*7h*>1?{PQ~&EZJ#8>Pvn|>9}yeABiR)~MSJ2;o+!yDDzxZlzy2Z@+LhtSKGOP>oJ!{atzjO_~PrBs`l; zEr2!Qj2MS#4}(H$cuaon@OFh7inOj(*z0DM5sRnU;vuPN?UGma4VL7Z8KfUHJxuCw zQ1w?QSdx^+K>~1_muaRRepLj`wv)+0D{_g-QaX*~G&QaW*K2g0r!pLE>}sQb@2*+l zQz0>oGy!7P7iTAZLXKln@yYA#vP%ew{woibdzlBOVK5_@6Ip-voxFy z<6e_Gq4&!}>iHo5dU@BXSxCydQt7mKbJ#@JYQs7q^;40v+0PI6ALuNOZA3 z_0j0ct!6a;Pye=$OjKc&0+EotoZ;ow` z)7bP_USkeiqBv!tp8}4_j>l#Q_vgM)i9sYTc!=5qU}RIQeRm}F=32){(tq?AMy>}V z_2xW86M1a6#qifb#|uZ$22aAMJ1cj|_1rkxE=3->rP4AJA`soXhaVz2LY!}dY(&e7}4&9rGd```4iquX?nj9_2 zrAbPXGzmJ7ktRn2&L)tBtG1?XkFR>GNsNkuKNHE7hqieO!Huz5*>NVv*1wOp;8$q9 zJ>Ig|{@xl}UzB2Msi@l{TkjWa7jZUmZ@QBj{F=n3PG$#CTl8 z%_VHOzajRljcrfFo*T4e^7Af$!p+;zIc1gxKa-y+oI)|ZsVWUm+Qh}%@9%hR5vRyYyH_NUZ9r`X_dRll~F&B6p=`(bgcq$np3Y3ipnq7(o_QtC?8R2&NaY-~T;uOy%M zW%~8~N;UnKX01k(X2pT!(5HDWX&>8#6?b`2hkoE3$tj)^qtK-J$bDeEX?Oj$^^nXb zcBixn%2?ipS#(Jo@}{8(1=A5Un?nOsM9g?CBh%?E$0F9!9txJ^Df3>5tND1K$lM^k zKHZ&OO1^eIY`1hhOt(2k03{WkJ*B(Sl)fT2MV!yn_mi`wMUhwyn*hj6dkE+aeWZVb z9P{(nq-Y`YFWW>yAHj~{7KTHi?yu{LJ)5}OfRiQs@X_AzClmUu9*Y%L4TX=AC3<66 zJg9J?aH}9s%=c@I5g!fFJ5NhJp6>}u@K!E8&aj`03&SGy=$7HwbER%bCKhhtqy?f| zbOjg!xKceh1qbsMleLO?MGW%SZi%b0>2=3N9F@fdr!#lQja%dFO>yJ1arPH@>5YhP zqoHXt;MKZBdEt`yig|=dV4R+Z!P+L9Q=HPIU++^X7{fJXd))eTJrM25j%ZK15}@lz zpBK>|-F16Q9llG>^QVPuxxY;x>^oh4>pLccV2<|9y12!!t*I^fw^GB_fiVsDjO}=8 z-x^B|+aSK}hJ_M1aZ#~!ac#u}4EQvi?+f$v&N3elbS$fQP3UI60=+FB-Pbg}!3Q_s>Lxyg<8(?5| z!HK-~(oK0aBVG0fVzsr6FU1WGz+-ZspQwg9%*{s!M!r)N7@adz& zX^_;lBu-SaQMY>(55&idNiL%{BLME>Morp!`fIo9H4H$rTop*j=h=MId22q zZ>0ePykz?aXvY7vbu)dsJz7V4^C4IR?P=_5Jy$2o>!Qz6<3y}p8jn~(`fa&6fb)U~6Imh+MU8gAkRU+~pl<~YsvDmM-IUXy zM0^r4DyU5VSgK=iUsF6!wC6pET#-iF8@jYBmFzA`j8*}7i4^T7|;Qt;Y$n-rvJ zHc4lLixn3t9aV`KqtpNKH2t>2wHL8rOQn2aD4V1QlQ{~hfjGDdRr3cLp{J^du(`}BU+wwaBbj>!elca`Cj+WcJCSt0pY)UA2Z!QPSHu8{T=DoRS zG21XRNgQ^<&|5*wqoC!)G8u?KOZKw;YoVnr_j<>wo(sUL^#xYlUWHZNaUpWy*(`RE zG&nKWZtZ^m=LxuWP~w%4whli^>m6~^BL12~)O2@@JI{=xyAvTTrKfqA%?QL=%wmhu z0tG15hx^;(`jv6k2XP7$YOo&L5k0YF#p8Cs#g>6$ns(=}1rK4_{m_5c}QwIOB}57!cGLIBU4rZ^8ZS^?n% zpW=_WtSQdj9G8#+m%q#7Iz?zB+FKSDHcktwW|HP&2^MQzqvB3ygt{a`PX=gWVl`Km z1d?c!@L$-?*FcXDdQT{gM=rOULZ2)0dhQBDjnchX9i@D^%pYi0z|wRl2%|N+JX2S6 z$_kPqFFT2L)M==0Cut!?Rl_>djT=lijxva`{B5D9H}-_xTKc^VB6N~|H{D{>37z(o z;na(C_k>wUcqqbq)HFH;IcuNh-jhtA2sdlnplt@3IRasSF}7g)`F#jGfjuo@FT5qR z+7+^8Xw^Z>Vc)Ap=$8<8v5EVRTpcz6@LFU*BJer&<*0~00Ke=;(p$`47nj`>S6v^M zZR>{iN%Inw3E5-O0DvxNLSU+1jBIF+T~#9V$!-%=jaJg+%0gif*q<9C?2fdRdblGs zIGWk$N)@}Y#giBjIj5rSsb+^Q8Lg_Y&)eLg>(t`1qD7Y#tX^*OkndH1fQ!Gmd{;7i zyj0LNIVg{5=h%=8OS2{Va!vvRAeFw|b?C0UvpX(WMz`oZ&$0d`K`E2l@oZJF5W|eN zkFN?okkf1SPn=5?gr%tcQB_cPL~kXTizdb+?VRusZUnhhS#HxDu&rRM)`xjV_0ZPB zs#Cer!KNJyF>sU~oGyaD@-%>ri~=pPk}Z^ljH_W$D3WS2TT4jG4PUcNFJ_4;bPsg( z?j&pw4!LaCp)Eao;_S6)$qs$zfNiiE*ccR+lPWkWAWqNrdi6cJPH>ct@zVmU)Zs0M zqq2i8hP>vinY+>8=LcXq(i*^0O>SgVXT2?EzNkX0N&pyX;eLo7}qTP~Seq#cc zx%5)VE^!la7=In>c4=7@Yr^Sj+UG%9S`crLy|#Bv}>ZH^rT+4({)%-}ZloiezCze&z$ zIWEf*kv@3Kh1t_&VD~FwJHB))L(sS%(U_0-RHM2%DIg&4kJt9+93;oU^70~$X!1yy zkElovrvU>EYxF|`7XR6xpG1X0K-~eq_C8;?r(maw)0^&g`EEC0V#QkT$kjfCu^lmb zlardY1*!S3iPRXw;2qHt;}1qzuz3`B-JNj(EVQ^!b)D?=Fa_rnKB@`N7(4XCi3`xK z+EA#qH93Zp=$S#h!m4UGO)Ci=`RilM&dIzZv-2&v{6WSAYb9RGAtZ%>;ml>wOqw_; zTfzYWUXuXNuLO7p1bCDIcn`=w1K^=FSMZooz*`M1G@FP6%j?xZmlhxaT{#p*-SPf7`xR)$VCS91hs;~{AB-;XyT`Rq1#-%oYjyU-5;-d1Mnq&?W`el5< zk~fHc;ST3}U3oP)Pk+i`2$Kl11=)z}k1H7sK@4@on@iQLBi>;Zk`zM3G7~H0n@{3J z6H)qNy&*Hp4?Aq_rol6e!r*nAgo*X84=#6;51wZ|>q)PpY@|1hK`0ggopF_ZVE_6_ z;-7s7VNI+S<@s;=vUHFJvJU*E!6wE5rYag$N5-aQAZl>PlDunlO%(}Xp^1BAY3*J zdqpuvf{73g`qBprr07;rpZ=^*O=AVqt?3+R6}l8E4(pZjdz+w^G%=EOu2LH=$OaDH z)!p{0!mVETdGG%1{_IG8XD@uR>ILg$@*%J%h^Q8UBdcLz0dr=zW{;3kJD6-bh08MC zCmmMn#Oq|Xah@Z)(NZHX_ncy?b5YbjI^I05uAXI#Y&Of+r8!21v` zM#mObO=okO&bq2;Nb|O%s?fSQCWk@Pn5%@4dk=U_2Ho|6y*?m5XOTBucB|Uz(zUsZLUif)09P|%* z1Os2NVPKEY_ulU{Q^&jVJ6o=_yW9mBr-`R>j5!yz@m5`y4I}yj2XcnJIqgZr#cXU>UHXKf4eO=xkZiSgT%c=puk&wd%lWvI?Seqa?EEgLZVdihQ@zz&vuK+% zMcqE%%lw@*-?;hI!Op7r?(@PgcpK>>oR6-WX+_g48vQ$w&m!j4@e$Y7CZ9zhWrRuk zfi%otI@biP^a;A&>s{lWaWST9lchh9_dqS>(3iuCK}Q<%S&UQ}Liuy#?%3o9W$HOw^1+lqH@UH#CPSomc zMC|0#t36&xB+rW>f>v$4J@qO+1-jmxkdT-PL}U zU~y+Pm5jvd-sR27mSiGFj*FE563s#ucWDx=Lh>)BwTd`RCM7hEpE z38aTg_F;8p4RwHdJVAN~*gu+8 zK!b{#^JRxmoqO4Lj=vH%_lf8B`0K@;^M_>hZ2qkWt03Dite9)}(x{LI-Mc4?5gM&L__6s8mETdylHx zJ*deLzTo4WQfPZ@(X?$c6lv~pz*qHl%X!%W(fqC|f-UQHuyHY&BaWQ`$%8{agY&2cyeMk{b%j1LvHviDPE$v3$k=Zl5t2>FA8*h%{<1 zFo;a*M*?qRZS+02{{gkGCHQ~_6obwZSKMnQXDJj+Ib8LQex zK>{cOBP#{?vuqS^sON@7jR~ccW5A-)gnmYD66H*`nzK^wsD&1v7c7Z6r&VboH{7JV zL{_&s@#>FOxXB@oI4M=x<%LOP^KeT@r%4#MszU0~)sD(*U2;f}oVdW%-u^w__uKvD zL{zu=-6nrMy|Bv%{)o44@SeJp`dHnaUEW3_zDXF`T-9QdJU`*1Ni))wkIlZ&UPUm{ zuv|*d4Rhxr)Coe0W=#w%o4hQ02|E~!Qs>54vzM%dHj`iw;*3Fu_|n2;a;VZ|Vx+^2 z><$1>lM4WVV(l@mSPRJ*H7XZko7dzfOJ2WEAeyHN(^T)sXUB+hTKP1OJG`ECB{4|? zntZtoh|)s#c^k=bomh3c8}MfZ93+UeuN81$J^p?lM1tM1h8Pn^)3i8!_dtAcN5W>;%xe=r1Yi}9P)vbPNZHTrDG^Yz8sa(O+Kx*dmyE|5$J1)ZA^2Xa6>iQ zNKi;?%N;ha_Mch)W1MD}KilMNBxg7)-1vj+ZR;_RJII#mO?C$8C(ZJ*{LWfUR-?2H zD{-D=4NtA?@LfFQW>qW8tK|Rj3`=$6y5Pp=Lu@O53a!8uf+Y;RjUbuhQW8e3Ohm0G z#Q;;$0-bS>d3C`7mf^R}^hTsIfpen@LcSE{xFb8XMa?vArUqI5wRvB`G6naVmYbg{ zS(ZT;XkzG+_&{KVtvnnkN*r+>G|FUpw7Qls!f4jU{LTnN@zh^P6hX6ko7c1Q4USAE zUdzV|hjUa;56DkzZEr~Lc=bdi6BW$0608FD<&EBijM~;c`IhZLF3cIxvCr6_LcApn zn-wT2n{gNtv#C#}>J7x(be%AKwcp7AWhA)M?+2VE6?aaa^5d zpFl%`v{l?ij#q7l3L|0K*jm^QlaWx$;;&9HE8)!?prRg}$4E&2dY48>ui+3*iLWFj zhG3z=@%xd)^%RHU57^mZXq1r7ury(3s#1uA28Fpog@ELQAa7uUugp4cH_3pGp*iZ> zU7{nh@)Xp;b=6e~tGc znWhuWoew3us!*~L_7h4Ty+DvR{4GG<=}{$0rji8qcjW{r**&}cK0$bj4i`zZ!6{j- z;qBQE3J<7NOxTkO6M5_PMv?%T=46$}J%k}bA{?|P8S(7T4dy9crwEWp@Z^c;0=6*) zam&tnz?ZgWfy;4P8qQ15&sbq@vcv4z4&WT*5=SWbakE;H=RSzpwz|eqP_5laac)z3^03)dvcXDIV@nMKKq`HGLJh}on_OCiWBnF@fQ-`__7akH zm-!&;$=bSryt#_WA|s5_T~+uYa~a4aQ#~~y^?Z^kF-__S;?W%azRhp1PX>*AtHm^* z=o`ies0m_b=}iNp0k5zlmr_#&w~kzy;Go{k&57%#Wi^R)v)9<^Fu63pGY4mJXEm4k zvqHADRt8)eE}mJ<>d#m&tBb7l>LQc4lMgi|u|JPTRZQN@D`TS13JzxvPY~M8N+a}w zf=st1jDbRNNm8Fh&*0!9B8?2Cw!(L6ebK%aJisDy%Ds-|#gM{cD?06v+^qRp+oiAd z`9$BwLiC-bfHlZVVInkZbt|Rntmajg5(25=dyp zw$Vf|!VU@hfz$d0?hfay4<-3IG^B4Na<$v)BhXm2J9W3Es#9xHOP3_(?XSZx{Q{@3 zcL58bHPM~!4;Rm^*ruQe$jeg1f^QwV)?Z1%7vjZfu=b{HE)SO&fmhBhM<-*wE$VKI z*ETk6&qQzKUeq++xzD$WCP#3$lf>c$`}$sgFQ>`Q+6TR6;)#XuXroVxeBy~Z=GNIX49U1a zE_N{;_JOc3m-_RPTxeDW$ddoFU2gGh?*MP=P3z_v0LZ%Ml%!TVv_f; zn1VFP)l--3N+ze}dIM)Mde5iiYs!HJE)uZH)+bJ%NF~b8q+W)7!#=IMd^MN(-Clp% z;de=zS(4YZDJ<@+ou&S4r?-;sQsh?Arj53^v-jHlz0~94&c0CG*?Yx;r)S=M_RgmT zw)-SYO7*n+j(>Tz7(FOy^mlJSAnRP@dpAdd%s<;SXGS`qI(U@P$)}fR&$D%i}Qx zCG9stmLu@~TyG-k(FXxYTgQ@(KQ!m$`2O^uFq&9HS+UpaUtZ&@c8A~P&aC^rvXSt_Hgay0 z&^zx`3dy@8Z`~SA`iHh=8?+_|T9WNE6B{|nNh8OMTlx->@I=Op^q+%_ZPq6XDrkgi zyW@VLYgu8c(v#z>HEq!iYGAhmy!c{j(12j~SyN+O`L|57eOypzr`aT{we`}8x(?S3 zIfX_9@)FErHZ1MtFhY?wvD@)AnjMJ*R%2%s^}E#zlgd)iZJWU2&fxsJLB)M6&~3+t zM+-wy@xW(<2Z@CHgF2IXd^;Ji%kCf3aga@oASHd*(AN{31?W#zm4tWcsVLZ>1sJ_E z7g1YsOXb%zo8!_WC_oiGg3%b>=};o?=h>E=gNddXI*;*g9JEm-dXrNw%l{TO`uLN) zlZc3memMy-4Klaefbx}eW@C;a*1rLRkHUOoQ*0t*qXVFAq_Fw^wkbLc%JH2qbqfEE2SkCPa8!^xM;}nCnVu!~$?4gOJ zCkC19144+yW*+$C32f@G@>+e?yjCO1ROg{)yUlr}=!Qd8&Z}8xEW!*?!hBbrkEPmo z6`KlULB-{`b^~RiaDBdfD0#JJxK~Ra07JywJ9RFYKLPZ`ziEFc9m;Hxif5imHD94jSf4#aF4fikKf(y%HrDm&MX4O zo%Ls(KTDR{;?8OocUH6btXUt5JF8jTS_{hn1}Z>t2yUprYac4ExdCmRKH`86(z`5R^rQprt&NyswXN0 z;xB_hHW6b@Ux`awkCIWRziMHU+|ljbDlA#nYGL}SHjK+d%SpkEytnVj zC7I@=CloIkaYztRykvy~(ZD~&cP0LqEC!qNp<44heb&-egmDGH)U;ALxe*e@+-5{2 zHX5nwHslV6nPifaHNrLU!Wv;~HkeB+q*C!Qj+!O%71@)ow{Im|QgX&69jvHn3tnx*>CeYxLrIfSZ5=D@Q?`uBhEvqEuaC9% z7`TnKHQlD^Imd{s^SgWnZgbo+htOE#kTpEkIAplA%jYkD+1GGqLIu3jRw-1foW3{@ zp76yjv^B%CVtAD}@+~Yw<&+i6P>CZ&o0T;${Od(c!-xx7hBqBi(dM{IJ8nOn;7rWp zH3o9U{tD|BGPjv$NYOpMAQVoKgZef9?*bMPK$Y#QO-$XO;!=n z@XzFCAi(m+j}l1HEbuE=1S%P}!k-uE!u+Z>jPV5)XVJMN;;-gfE%dcggvbQ~ro)OQ zVl31fiPhQ+%5!dog#eM5c5=)pWXQz@oH|y~_;LV}y-_}z#ED$8;ZfeAzUH6F#hF}q z8Wnf^?R*P{w~jh##ksj4Nf2zT^p+>P+<|St>L)>l7%`g=OdsAio?8iFt4W%$*AXPG zxbW5FA_P`^N5;4At9dI7YqNTpm|(%$DrsWDdu;B;GOUC+)>HCEs zdg5S4j#9X7vT7H;6RVk&k0cuuOwRBj#W`!Urt_>JQfsO|S3AeL)v4dr-pSjlMF+yd zoE9Rm7J`CL|Kq3gVO365q6g>To|SC6nAAk!DyQn(mKQ4NR1)IhVKKJX=?Cwj-U_d%Ba2m@v?WJ@mMi|T~<_ykz zw)PPkk}z!FTjF;~P|fY5BqwtKAQzd9Iu|FjY0jEK2=Ub(Ot5lCY9EVPYTu?r0Z{4Q z>M!!UBy1OV_H3~~OTu<>XYCYsRx|ZF3ES0USn91LVY|4qxhn2#E|z)C6f9KS*%u1u zlg(0bXU{r(Mb5z$eSVs9m(qcP?fHX7XI(`=%01(=E~{0|x+(*Zb`E2d&B_ZC_xYyQ zB$;0q={gTUIv>+f(!PbZn9zKuyLLx$Vg-o~rzjL9Bz1BQ9Zo!=&=CDW&anzzmUE5N zX5J!PqMAJ@ZSxq;U|oWwTXFKnDC2j*0<1#f4XzZo_&7%SfWd6Q^<{h^jQVa9T<>;d ztJcyw9n_OXm3HTbCkGu${`XZL4gCfjT?@U(z`C%j8j2-AP2;cN1x9rPyuh$#gVXZF zKsHo~$7X-I(@8|y98jf68nKjN#y&V!Z!`qC%T2ecWPKc$B>(Tj5NygWNL{pLN~&Q} z<5uKTeQrWO;2xWBKiNs0z%(b)kwjzMK2<*IwBf&+v{VMXJppOikp&KCJ&8%XiR-%9 zRBnkoWH)Krt>3ov%UNq5<7B#*?QFdI@Si4dCS?|`_4B|c4dJ~$gP=@^)IS|L?e@ZS zj@n)syAii{#(CS#2zaU8cE?KJ!8KmdU0`9#jIaTG-;(Od_G| zrN*6pyqaY}UH*JrJP_x<5|_U(UdmZrWVifkyt*sS-+Mv{?w%|Yfy{Bk+PFXp-MEHB za(&XW^2?qwl_#@Au&6oT376fTOglNg=n3g$5Up9==$Wd^d`Pd=ES?(YlPw7g{ML+$ zY%{O9lpL)*n~#mRm(pc%4J$kFFH*L(Q{&A)!^hA1Oo^U|sMf$7uF$V6i6nc_UpCOl zOkb0|$Gis8f#&Ic*tU^d!R;p08D90iQb1iC2P79FBr|kO8yCZ)#LBf zvV4rRWTk9dWY?mOUep#4P5_q!glz5V0BKbZa>wB!dbl&Sr_LxFtsj^ z9Jk)Qp0bX{xRUKYq)(auskrKkaX#BbH^=!T+OL^EInI9$==o3qMV!``LlKd{ZvsYU z1OPfTc?1{(Mr!~gj)>1lMdM(^QSJ$hu2Dr+viwE`#9X5@`^G@gcdqQ39Ez;TF;L`X ztc9qzphzU93W~r_d$hZNBDs-RYXheI3_y6kt^H`?-W-_Lsdj!8po1O;?gT310}uwx zXNTjOfa7j9zk~QJW*y`B*({J9c@mwi53_VT;@~B6l)$UQ&vf)`22&n$Qk28iK)iHE zY~s#O6Kz9Pow7v`cBm4hF)2zXK?`4ajPat-#c6+#MqO zgtDuy#L3>JUv?QkPb$v!@ye5AOpeQYbd1BQ4ROO40I$aqc=ZVYX0sE^XgeQw06OSS zCURUdVW^(7^^;c`P2y`$htBa-uUKGZr>;^{#-LM1_tB)l);xXokLMY7^%{dY7ch86 zBo2S59ib)}bR~;%OFXU-fSYU##lesdxNV>&)Nv|=YTo2P!hHIhfn!tCi`Ej3Mpg4a z{tAa6t4J!;@kmPRYO+(5Ijz2S9FUKX;h)+ibm(;l((n=9%Y<8i82cDF|?{aQQOBg8gg@X;0gZ^wAXb%Xs|bixb4C0eUvx{4-)Ki!Bxq z-w>W8W9G&vLtRIZDKPnaOI7oP@!_{8XI%J@Lvlv1KrB7z7EPD2OV;StU_5KRjz-uKw>lQB7-LRP=13>K|X5BuiTZ z*OJGR(t^z=3Q?*fYnm$mF(>xXbBb-mH zw%~b*I6vZh`Y377NiLPfrMTX6d(;&-ly}7|bzV_yLFn2LW|xXv&fN^RL2_HkjR0YI znE;#ci(oS+igK7X2K5JV+PL$17RfX3yY>aI5 zB)92%;>;|}gNAcN1Kr1R!C6ys%U>$#mctpah6H@(ZDF#m9%U0xv-FP3b)<3g&xFGx z?+k}e{wScxZHB>4djc8=V3^B{awIh82fU+ZxsY4;oX!B}UI$^AwLPvQLBE|%a?H;3 zycGQAy&I@_DNLKo4v+rfkSF#{JGVXNwifCbRCc*>qSH&$DYr?1J{fOjazjdEd)#Yg zTWmoPGFx5anay{U`F;g@*BL+77zRnE924YCX3reFv{H5j0+O_VMbMB`3K8fvK&|ma zL9R@4s=C7XN`K7VY?2t)fRS+f^8e=Wpb6vYgQ+H$O6fa z92T_bB#vIN7V(W;3|9qUuT6#vO0JSXvfwW6AL2kzWv|<~P2keX=|nv`YwD`dbW%}Q zc8m*0Kg8x`+`!t2(BQ*x+n#5Eq$VZc-w)`>8r7rJl_~>fP9=yTw+#@p${_~Aw{caR zb;FR(4{T-1l!d<)8!#!R5Ggit*Cx=>38In?>k`x)sD_$kW=_D9TtF!tuFIk3q#K6P z+-6S~Q1fD%zn2VZIF)t6M!=l?Zrm)nY$z#Up=!8YqBN*$(hMLIWXBoqOg_WP#hG0vt)&_n!%Z2< zKLNSZC#t~EKLHq;6q!B&F*V>6e}GM@*NEy`2@Q)dq(FG;tQ8s+WJZXf6Nt1g3?8=; zehopV00cIOJyZ>`$)r}yzX5J>bgwb!WMHqD_#ALwF~Dsj109rX>8oapAxmv+Ai-Z) z6XVB#*5xLX4rxBZtx(ANu=Iqq+UE^m7SUr+^jPfKq6@!GB&$7p53+IdwAlXnn$=T9 z((05TkAX`-<#3m^AC9vgiSurZ*CB9ZH60Cxq&i=zGY$4NKP`s2Fb=oHZ>tlHK!)t0 z2!wqX9TfA z`I(hhqJh;}$?qZ-+D^(_X@^`h9ZUogbtx|95GCkv^B=~=(j0VolP-yQWZ&p)yv)s6 zO?N$$gV?Y(`=%&56SAbKn2>z+M<>LB48~4~#qt$&nT~2g#QrrQHrR7bh=C}Iu2j$JoBrD^wr>R2uw2x{OvYH!Euh^1;9N67NJCAq=#4Ht=8fe0OVvix(~l8eI9RAhmU3E%G~`4wHCzzM)UdGW97K{9YrJ7Uvcel? zX6gv&ZOKRtDXleO+F)#C6*#dP^9ELc>}5kUV}_EcIGn){t@%K_>P+NR&#SaLaNDbN z_bM^_4t0}gwkF&SNtI>=}$|#u%47`fZta~ZW(pkDSi<^pN8AZZ;SrQVaWpV6# zf8uWp=-k+smgOw|g(b@8Hu0~7eekcxi3icFpND@Tq&i9l_V$iLnYPE3%ooSP8PQI} zNr#8|;_b>8FLeUO z&d8MzS$tgit2tT^(XAykl?FpQb+6$-m6~O2^w+5?*JP7pZTY!amich6&IjvZ0Ab@P zi|i?V5+&nBJLWBB??9MujCEV$4c)PBM_arctIyLzRCqR3xczk|jCM8k;j)wE<;+2B zeuhRHhuhlQF-mJF;Tr2;;~9gGrc6l%WXAY0`^DSAd^X0W_tXCu5P~!g|83^Xg}Tqu zX2Y#vkc^D7e6(=Rn(8!X`wkl ztO*msgk_}(T>sSip^iuQb?m+O-ep4% zJ#^sUo}pzcuIza9p@)V#4jp_{RrRdniM6ZmTz%EDNB7*f@9v>x2lhXB=!p*M?SJsz z1BdS0Gr{Vnn~r<-4;`#7Ie56bV8VpA?>Tt)0}mhA(|)gdb#Umu`}PdB@0(CFVZzYi zhxZ)hGFb8c2ZxsN@4>2qL!%`_`ybfDvx_E7NF(Bg1|PV4Xy3heA2?7n^eBVnQM5)G zlwWtwHt&)6cM{U(g+j_Bj1%$LX&7O~~AG6;p-rLG+_ps=tIOAlTgZpe)rZP@w zsm;D%Yd`m-?v^7U_e!w*t8mi3Tn3u~dRLm`m!&jw-r-GMNW})Zs7_gEz|JGVn=s*p z$71vUJcSW7JaG!!B8Lw2#JTT|&0BHM4I@P~Zt0FQ$kvLyID==m- zmP#gb)Apbd&_ERv9}Y5I7`8=JIrPJ9B>lNWVG1!4g;f+oz(hnn&ey?<44C*A^7hpuH0X?_)nZT@ zF$ZzYW%-)ve0T!6=FpaajP&rrgLQSYW zqaWbt3+)1q*<|Odf)ujgBv8qJbBMt$A&40)AO^qLmjI^lM9m^;8R+4U#paE1nmQwi zO-0Q=$~_zNjQ`C87@D%0%dlB@$W!8w@~QJd%C+=196tx7G_#{q#-EkhLvdb-adu?? zJ+l10LprlFOn#O1$CQ{%9pq^@4ok00Y|6f`5{8&0G7g>)cr*?H8Az841JY)5c%a<@ zMI$}Upg4+b+CdxOEU5Q1nMF}N7+Z7pL7aPk!a8T4;-)#yC#l?uIR7YKfY|b(G+Y2m zW1<%}wrZ$I_+d}bQ+@Db@Pknsa2Nn2;K*(<1zYQ`u>l^o{5B=GX0HmtZTZpVEmYRE zjzK}d-yI>Dx`9BWZt=#~-pSG*9*VVpq+jfLQ3k@GoC38!7~@?WSOzS{?8n%$Z8`~- zst%SJCo(Wz+NqgRk@lEbl02CSU@r5*Eq+95qD6ha4tY!Vtw5+RaS>Zn8Eh`ieEjeb_+2T&aXmSQy+2N5m z?Ew>?aYzrbnW($y3?YgwI#|luem z2M)4w$J1h6VrC7~{9(%UjHNs!nc%s1G50QDoGldmoCyW>$0AyL%vPvAnd&bN6Y;ae zjJOr~Qx=|#ji;2`vve#@-(tdvwtJSo*JKU^i0Io@8<{i7FXj2v!ETAAq_!CwF4@w& z1Js`(Oji!#FG^CmnAZ8sJoCago?>~+ljA(u*%76QCQJRk825b%ktI%ROf}=&J7c3D zVD8P-ZN`*w&}?A;I04JQC{JUvC=X12;c7sWFV1|>e;a-=PL=hMjr~Nfuqnfyw*Ikl zk>ZGti1AZNtKA@dEoRDAT8dM5#X6ncyq`yqJg{7~^nvu})( z_Qp#jP|U*D5a**p5At|#V-o=(oT-LK1Mk)3>*E!7#7Uozldq1GZs7Ti$p5GvlXq}E zh|t&=CvV{r)p)wX9m1m{PRhcR8l)^ymH-q@x8DYT)aSP!b^`_eSUn^z!seo?7(QpF=|&A<;lIP}s0+7ue$U|86WMjNK0QUgUqwl%U0yhPN-Bv?%?Evj=w zAT8;Olb&V}E6iz*8Q_ZSVQN#MbSK5%=aQ_7AN69OaT3y_0jI&{;S#}fza{X4@qut$ zku4P}nE*HbP_`4iH+A*jCF)^DG0*ygE;2xf~)aUy*lH=e>pQVcMDf2*h|3IBYg z7YBB7GCqS*LrYu}{_zMitSdj=0UuC`273l)x@#Zjl;GhR!A8Vy&WutoN@?FgA7^5q)krd6bnSB0!$`TBHE!DQ)73ljO5u z(Mc#Q632*|bub!mv<30KBd*DAMqo!`Sx7cfVuz63RwBtsd|MeFVpRKGIxov37ARbFuG&9(mdt}!jU)F?J<)ot2dKhodZ^=dDEf-HPl za1g#E81P7@5*~goOAWq|Twht1-l!aULG(Z@e!+desTvsZ8+X`}=B3Lc{u>*HK}NUY$`*ou9mdKuEnt-r99vk6@1 zEo?a7Y_F@B>%V2Ld%@o<{D95$UsujF3|x@R!yl}i-GiE4V11s>rftQtH#)N=2X|kJPgX7kDTbPri+G;Yp4KoKKv#TI>lPI~iVKaf z0t0h$NL4Pz)5T)^D2o9jSuDvYmvPXpV)ovgX|UfT=P3Q#b%`|cTa}EY0kLsmAZ(%` zU^C(h^LyCV-lgE1S5Tv5epHwmD(O^(*7h04(=P!SbF%M=%{2=+BUUaT)X}+QK;9dh zKV;MYx+#hhwksLRdOhQ9{op6^A6u{S_{xtQ=^y1Qf2s-Qg_>~uY`)^LDt`#;P-8XW z<45wy<3FX$*hgX~sPe{oM%}u0i;R71FPe`ShYYcVkQnEXjI;#_z_hu`0x(SgBJ&uh@)RyR9HxPYR#o&78bvspM4tV z`75z?d%S)F6mM<3{uwkLPNv@(uiwUrSxcT0uK+VzrHzH`>z>D-77ct8*OrFPB%AW$ ziaM4tX`6(6+RW$BPo$MKQ#$`sZ_XMp;}T)=DoW{h7@*zK31(hGUPT{-ZwMj6`^HinW{8Jpcvvu1h;Z|D%(K+Zn-iJATWZD_14HHx^f;ohPgv+F zESR#f1bl5q;TMKxn=baIRZrKRabX&Tsx^@QVPU8ptXWQYI@%v$tJQ#g<96bXI|1-` z*;=vE1ktY-^Y|tZ{U-CMi68LEybzdOQZd8FMAXsCn8jg(*nb*@*h<*+i9SY^Vxoyu z$6qN5u1&4i6(pT>QKo-ZPd0L^$t#}|z5WkmZ-kCFiIkgJ9o2ia;ug>Z2G8J^MJXTx z&h&yV$(yUOtTM_nf~+icWxC_{g>(&ik*10Wkrcdno=It$uhUis!c~;ts{Jc(s|h)*V*R5HONMZ1gtR5 zEh?2GfVJ z6r#kPq;A-Zi7>2{lYwVm^A*rnZ=f!EgFErU{V(?31is4ayz{^JzMR)rAc2I$YJ&v^ zuOL8R%p!IJMq)GAM#6S(gmfijYm0Qn;x;%IcABQ0250LUoOGMEA!*W1J1usbq$^Ik z%=FVbX`8Mg?ew2%rzJ@{opz@G@9#P1y^C0k6UTAg@Uiv2_q^|WmghYC^PF=&cKW&J zC>8l+qAeFq(oFI+nz*)?`NF3R;V2YbCJ|UMwunR-!7%bBP{5bDq9Pz+<|ear3i8#7Du}1)v{RX+c0_AJK=~F`1l}L<04x zmz42P=W51ykt570swx#RSZZDvXYX~3q$ETHlG0?v&y&w5{RC%Aao5yNK=90Dg$Tc- zkl^blM5th7j^JK?WU#Y;S=aE%!qK6@r7N3OG&kLo#2T0RQWg5>?Uic`{kBAkRf6`Ld;Ign?N-9twn z%Xfu$yYr)6Bjp8GypL0<;gd(kdV2CBzM_f%C_|#uhgN;K^9BVt+X-;~`QPf6+5chW zQczb3Bcra)yW6$Pw4V1Rp|hblu8{csc&cuY8?r4fK<#q0I4o!7LELyu{(EKYN-1;k z7BkOg2fyGyFv7W_c|wW|0T)63w6&o*GA;Dg69 z!ljO|B+vXbx#fr2-oqERw+R zVYPD^cT35nsA9QJI{JApxL3r{i@;=l3t3E4qW^k|3p>YOphz)U?4b2H5!f;h$zu7> zYos0RgFTyDY|5CsZ7E&f;HnN&=f`}V&2jX*RB*Ge^W&#T^rOz-Db?w#@_%Ql!Z*3a zR7eK>0#c)@o--zX8@Kc6veqzd;3+X4QaW#6=2noXhVR`U*K|8i=E_dkWRp`9e?mbT z&Iz20TKCuvdoY*Dti>II#~tUI)?r3$5ZOfO+)=T(zdwagnSt12!~81mmw`1^k)+_& zZmo$C2gS|C^~PxKOGtq?kvASK)Jnjp@0{oTRq=+i7)mH zJwUxiJk_-UI%(t$@jCv_JnCkAmz%kTpV6BObO+^7xg3%(#9yw`Bg}&-(GLRM`WVz| zIQ{Ht`Z?336|?%MQwWK#p-$TR&?_I*=_?Hij$ELNmcQ1c#H)t*VS!_(6yJ{l8rDtj zQi##RVJ+8(1%RU-0NP73dJm&(m_h2BL>bEoHy~sbKR3&&$K8PvvZciY!_5~UK%IQR zB;#6>a-c-78rJkGc^kC8-abG;)bTf@@-G&qtQV&Ix-f->BSl;hLR8UTAqx1M;7C<; z5-oOe=Jxc<0Z|;K2DFe7M^>GIcM0o*rPQ>XF&{uEE1o&o2CI>5C@K{k3{q`xj z{J<$K*``CkEB>fn_nP?W&` zYz6qgo?mf~^^;||!pvFv;pdiFsVFh9J_J5SX38}8bszH#stm^?t0j! zKJe8!QA1(e*!TZ}#FZsH-4uPD{FK^y!PmKzZgP%axu z0ad71X>_AKar9T;uF&laGx7HPysLk6yW67xZvC5E{Eg*c&DE<`s#qB+7xg%jWV~M3 z7OoqEs&|YA6p}TZYbfBBpgy7875)pL@~OR9$6WnLu}MiQF*uUBtMTOt zRjcDau`AzH$G;tlvRi!_60wTZA8kNTf1lN&uQdRXkE8!O*Ytah0M)lD-2A5{HXG7S zC;(bSRBL-{Op_8ip`r%gFV$4huPCIKhEZIlaeX2seOfdGfEoNN`l>p9!H+D%M6qA9#Cx{D|)up9cWp&Acp#k$=6N!^oo)X}2n57j-kH6!JxBE(^Ww&Jm zmE*w1Tou35rn6C^`OS?e{EdZ1>}!5BsUyAZbc875t^}_&nJsa|@-=W2c7B$u1nBQ= z|LW<_P*=Ep;~~&|UpXDRhp+i7&FJ0DmH^$2W43tV1Gs_wsw{1QDfp;$HU7gIMmJ6K znOFqRYE=Aw#C%hZIIZSVzABZcJK7t0s8yNj%}wI|-iBy6=-OD5$s#FQZlmR?pK)z# zU3L?1>@Id)RDDa6o2F#gW1*#o!&SK&YMFJZbZU_X-Dd0Ts%0^CzzyV`#b{uM2hCJ{ zljUmn5@KN0f4e0ckW!AVL>#l4Kqp_xCLyW5iq+qeX>cB8Z$yKtslKTZw=c>Pu2kN# zr4-SzbJ-y?R~vS_b?aP>V5~1qi{-j2j%Hr4ntHjfb5j?{EWP%&Sgj z#QY7ec|D8dT(kP{oPi;|McEl-x0;HC{ADXsqM93d;X|?faN=s|-AZ%)kO4FB@>-k7 zPFM9=KHmc4#2L1p*K2EyYA_ya&$<;P!s9Ya#|@3l(~=%H{jHR3R@tFPsf~X#w6_p$ zg6ixXb`m1koW0+|4S-2WDro6T->V#(7S_(D-R5>F0ulx47Hn09z7TxHGj2LzWEY>E z#qoS_f)-|gBSB=Z>v=s~6SJik2Y7unyJ@|vUd{+34B~ruI8U^enfM$ zl~OCuK<={nsLA$X(obW_!Bu7gw;*4$o&k|DgN&2~(c?{cZTGU!Hje%vg|aT0ypVxR z+3VN>;l|BgY=0jS79?xEJd^tkp0mg~ngVQV5kmMEBwxia7uU)mJSEPoYT)-TQWYYR zMIdc%ie;*ZhWtD3QR63JbggGI_bK0p1=aQqfGfRPMKX>mswhjLM>!ROf0J($vUnBaF4zq$Pqi(L zv(M;W@25E?2A@`rzReVglAFpj)nP9`tXDJ-0 z!Ob+6eGe}_4Z5X?x{}r;?>PikLzzKIdoPVOT2LkPLkzcu$hYRCps8Yg_BMjYCwtm` zM>kLM{g*3K@F&1+~bt}1XF*@3c56G>%0zS9Pt-$ZK-Ywqk>ej&! zX7F^bT$3cyfr_jet%*M$81j4hb|$~I#6!aM6$f}5ftovm%&i|8kw zM9|4pf!)tOi~rmV3f?zErg5*Ezr(Qs0j@#sjAFkcb`n@{$jw?xq2J0#*SZ<7H1e(S z)V0PRG{DJ&GAl;bR!2MJBVZv0!9|huyNF;!slWdgN#|3k2YNf-$Rs_{=(iA190USs zv_9O~PPmi!$TpLn1c6ZQz86B;ZEDk85||(0*QbJU{)`Dwhbj~}!i~JkDWeZ59w3G6 zEfxl1jR--TDHkd5nm!~rTZ`w+OI3qfB3%SlAq~|0eO{2yTjogHWGg=-aUuZow!3_-w-6Q{Shg$15Sy3z`HKqzi&#TFU&VLl}auTd9S z&hAh}gdXPEL>bGO%jWaaN6NX)XFa!}4R&F|F7O|nD1#6x6^SyKDK+GJ>G93+|FB`Q zS{p@nBby4p>m@YAxhUI=gfxcUunjBku22bKD}T9L7r)|+oo5uJj^aZ;H%xnD$S4BMrg!5|-p(NiTehB^AAfo+WJ`d;SKh&F=m+E-U@nvyg-p{cK=G$Lm2@%!l=^o?Mow>Kr!XaT%eXgE!3%M&D`bV=0Ou z^V{u1xCa~uj3yrG%eA$^+;~p6tGkEtJ?eoTOpRW6@+DWz5~xvE-A3xqS5p=W+tFB>cX&SXHjB0o6bd5G7(?r=h)ofV=5nRBd-h`TjXXhbts`hxB0z7Qq^4;#n`^5I1 z;3x6qIGQ#dx1Z6{OZJ>vO#E`*M!U@U2rYeosU>>Dc*~o)Df%L<%+^LoY#TxZR{RVS z-9+tEUCmyZXfrIW#XCygZZA~9VVAIFUe$UIr(FWWtYViT>Sja4O|FF{bg=SW@xxN1 z8r-xcZYELwCDgRsK!}O{3_G&Qzso2a#-+IcJ%obR3|q*IYhbF21?UxG>LYHmbU#3| z#4X73k!}*{D5l{M0l7*V4o@be z;ZRbUhC@Ly4X6Abqp2(nhbI-0m;$4wU$8daSs%GCgGFVIj%`m++Nxk|u#e&Raiv)M zT9w&c6S(BZ3DcTW&TzMdrD`Cn3hXx+`ZuR8IhM-_v)9M}%p)$W_8?7gS%d#og9~X3 zu0b&`j>5yBffzV~#v(R*+_bgWM(!@0cCO)h>h8yg|ahG-CjW~thuV_&ovrnfnV#c^WZ?kk7W^ClhSua=Q10kf1$xf$9alOGfj^5ld&hO#EEJA?0O6Zaj_l$U%~ zOu9|(e)zfI{vqajF5mW%S-@u|O(OK87+gjkZrN8xOflXj)VveuEWbv8xzbGG&iO?f(dAT#M? zlU5<#;Of&A>CrwUW5#yzzVGK2rC8!nsY|@gD)I)cR7poO+6BO>_)f3pOGa(v4dm{9 zE`8X71?)#jm?1my=e8kitFf?V#=e4K|S~bLG^mD@RN~bm)8`SvxxAc3@Nq>oU zy=0E_+O4QH#2K2HdN%zG}zKK3lQXLv$LGiC`OvT$Hl`!%Qe( zDx&*7H+nGcz~a!+M6jm_s$Q;S%5~Arlq@$qlqdG%WSk?Ziic(j?YuIHkmZn7JIy{!{DrIu-M#f zr)3V`YFjAi6~&Kib;MzJM>;+?-eMl~DE=L9$;}QsMiLK_4Hp(Sut%PLMJzB=N?4>l zQO)pUuWJ3~Z~opL>RgILPV@$Zi_$=I80 zU)c(gu`qWJJfN81QKS40^3BpXyV@_FMQQF}`)qyecW+^yv`R%eYXoI)Re&q{g(q8m zeh6Lo?>@RwoO4|MQ*0lDCRR<`eiiK`w)q=flZD)(BikukGwRdgo3WLlT1f*Jf01jQ z%MvXmF>;Aqd+Rvik5inUb@#E4mDk*xc-08n&;5+OZu$d^7RlF;U>A`VUTTiBi%S&w zVnB=c7108U6miwD#SB}INtdb{*aot-imhE>zLZ zR2i%lxzy^fu#JxG$Y`r{&(p73M<$@ng}89^OHa0hWSv9IENUi%NvO0o{YJSkE!v zpS*#HH<<{>G3$*F5U0YN+1U*+3cWr#{!)n}c^+-$RV>X|%h>NnT)pWmdw{_`qVIeX zy}<*67N=&2`Kb<_L{a2wzC%Fxk5jD>ke1bueEj4&T8*kN((Z=rW*metv-~<71NxZ`EpE(^)M;BVu)vE*uFGWA)ZIWW9S@9-s7iBYYU-4E)0) z6n1#Cg(ULQw8U(y$XgLis@bk+jJkfn)>*(O%um$j3t9i7XUqI<0?F#L-S*u%{{cZP zTXLn9FOl}b(^f2L9rwuCNPMe_CT9x(L3>MPv>OlO6K&3LZP9vR(p;qlkWp0oeVTOB zpx7$mn%a!lT1r}t2v9nv*KRfjK5)z?=00+XnHUJMz}6S@*qJu!5++8Z%W2}${Uj`~ zRH&06CChIREWFb36y2m3QdUcO2#EI*=_A|8^TQLBfh=L zFLJKms;e-LIiCp)PK~CMab6z{6FJW=(F&vbjjs72m2<02thRT%`lIUOl=HJfCeCndCDzC?|;ZGI4-B^w*^)>9Sh=N?K;uGJB>Pq<2c{Wa1Cs<1d#C~Duq#A zk3mv0mD;c7r$+OoJt4pOp*>|tFt1|h(*e@t_)j(CdhMpKXaUUz_Oxc_+_;^?NbMj} z#Bc*IHs)zfSVQC5HsCa9Dn;1PKa=DogxG3B0v)PsY=on4QAgZAp%HZ*uFZ|h`$ zK+#QzDO_per(ii%nZ}!g0sQwV?KG|IB4QZLP!F_Hm0cMBgDIPal5AwEz1^`+`dCq4 zM;uVG?j#S^w));?fSpLdN5f?mVrG^@@uGFIDR9E2XPHk!~cEgTIUONOkXjxfSk_pMrXY?in1XmO+v>F#j`nT~GM-Ww!q zeEma`Dm|h9Dr&17(yQ_oY&;C<@Rf(O$`5JPE1e~lIT?lp_^Y!MX6Y*Z|GM8Q4XJ#V zK3zFU?Ck`Jt;B&-|LEECTBs=BiP+tIkkD_f^Dry#f6~=1;}LAmKl?X*R;6>b#HLB` znjiZj#F3S>Q1S(B;lnzkSF_;5u66@elX*$|N!9E@5Ra<2jjpQ5B7G&e?2Mvo2wB$TE|nL7td6ec9BhAWUZMN@?n|cT)14m+oel zf0XYadk*rz6;darv;*y;Sg4dA@{gvI#@WD)sC^^Uz7Qkaa;0?SW|8VUkR^5Tr_I&k z$$8;=&OQ($fFcwXxvo-3CAz_X1>UTv_Eoe9`D1-lOCU;;J@m1)d!C=WKK^zQio0kfJ5D4leX9SW?6J}uNM z`>z4)LTAYtTp52Aa0XFTm3_WaLJ@!Y)iTryyZ~$yXMfty11>fOK1Bonf#Sd^T*Y$W zQq^_YUqNRoSwa$zqrhBs=HU5 z->Y|9+F)pvb@TL_^tHP9fnvWYygQm!(eF=`_Zu9RcdS$e9lt^st~G$KqF#xBra?fP z{1v4X-t=X^czWt_SG`N8P*%mClLu`+ZdvdKYmVI<{>;33m@I5?Zng`cvuoxMU)x=s zFUhPA1)!G7b!Mc!ko;ag;rBwNqeii9-{Eg*+lpvkS8puo>@Rj%s`3sku9=@_?VMJ9 zS3RqJu&S&foRyiS6m!i!i#=T$M^*MC;dLZ#S-HFlVz-!vzP31f^qci~{!_|YsEYrp ztOHfPUvdbQ6^mn^5q($r6!E*mv>M1?6x0}v0nxS)E$G%UK_!^E8`P}a4y zK9b7k#~%*Tu2}GkUthue^W|PGD^;{_nvsW;nGHLdNvgqeGY{?&0=$ozonYLxUe&lmK+d!H5<<%~tSa^)t{k4% zK=D6amj>F=Q0i6fX0L{-S3lx=Ri=BMD#~OErF#Nu?NndUjViL;ymB`?Uio060hgJw z!E`9oQEn>M8*~&=0DDN#0b(+wv9gmbi6FJ;)2!25K{3f~D=@G*g^|7L*svU563fJv z^1RplH6)68KP@Yc7IHc(C$>Q?Ir!5bmg-)0#NDu&7CutZz?ZFoIhG4Z+8*mkW_GxH z54qbpEs-sP*&S-!-P`2W_BwX)Sx&`#lpN-1gSCh(S0!2zX4frVR`2rdm_Hv0WsmMD>I}AtpbrN|M1J)& zD-@1|!2}8vCj^(Y2rJr{L_jh-z?ElEcBqCWMrr@QdEbw0M%VRL#wTB|O^wRPF$f010G zUmQ%O%UymMw50j-vmIKU6D6D z8R#annS>o79TsC?meWH4>rM3FdHta}U2HS&)4DUF!7rrym~gZg5N4!?ca=F2y{q`{ zFBb29vv~K^74Ax3?7Gs^&|(lKwq0bD`Q_M{R)T27hshXQ0#7sDqD%o z!lwqd%-u?cI3%CayA;IaNBg0+54U}|<6SDt>;X7vE^5@EdzIq5U|;@ZR(sN1&{_=1@R#PLQP%GGz?X8O5)ykkAe9Xj@4N?2Par&i1J9ki3|3dWZsT(gZn}%= zvZXKLGx!L{QPRo&GDfErRH* zB+_Bx>?@U_I;ygRI~X*-go&B$^@wb`6+$k`8np*;_S0p>SBO-UMFjX5J}6ZI(GtG? zraevq8QEiH{ST20dYCN>Fv%g$evPnk%ap9=)-B|Cncojniw}DSQTD3L{S)Ri z`(klgUaymStyw#-X9Lr6=G|^87{8NEJF4QZl&X-w zhrG*wN#<+Wg!#G>eX{Vbd$bjNe3*trD2wZOl`3P(Qzpn& z4oe&IZfZ`cAf;tOOLULTpr}W6@V%`-obSIew|2d4Z%dAPm?#3CO=sNtWJEJThF^XVh)`iE^+#4d?9q_r&4``a=%mtvz&@O(VY?YVGKWd#nY3q_ zT4Cf(kvjhbp{g%_$p2#ND*d{z;@8_M-u#}5U*XNe`s%6Bc<|q-!`7M1kKYjdHl?Bo z-WQES@A64zlSBsn&ag6P2637flq*>KX$k+@ce@$1?@KuPo1URRDC3Kh4M?#Omu7s} zy7&(C6{GtFSIek))4xv*l=GJoR?u+IoA?gpRzX+=kIi>^kBtX!71>lC{Ms(iPeXDo z<`KyU8K$GcT~qn`8|}0CI5j2n<@Br^>6HLuE}F{MlFzR2dVJ3OGpvN25|qSyf|6+0 zhZ9sE6XMJcSj`mZ=NbJeYl(MNR2y!;LfYK?sGl3LAYe^H*wv@7ZD0`it9$ zzTC%?x#e~Gcz(!b&3>@d{onzzgi>Yw`-$(mncKg6#dDkeN)ZTGa38!urnZHIq3mFye4B{vJKLH)Ck?9T)`MW>AF4(e zT)~Z7IA3N=l0Ho zZoLyX(>B35ROaU^Gp$O~>n$(phOo;l<|1XkM$e1n`R=k#1hdfS^Mj>wPoSttRfRB( z#iZ%10nj2+r3@q>R_Qb~#z;KvO`w9dcQNJhDwrULzAyo0;+0~;Z%xF6i46R%37D|u zTbRI}2nnOUZcLDez+*xsvo4pzZYuecT22zga0#2__Jyo|^{R6C9TVkn=8iCL2}u*G zGs&C?;>|BRkA{Jg#!52xqWJ$7Nt)Go=EF%u@kEj?m&Ik{D3a{y@I40#U6G_;C(nx$ zT}Ik0kg(2skz5*FB9o&k@7}MR=nAQ<7~Iuoy6GBjz|1#zrnUA%O4rvg)7kPk#T$L1 zC82}Q&sP4dRs`*o5h^oQ-S8y^D%Z8|xB^O_UTL zuj@J132BYnvhscq5f3c1qI>xJ8g!(C)Pe67q8{puV0Jym3b+qX zC95fUaeiWKvO+F65VsU>4TC`5=G`YNW8y;wwF zkC~(sCb${K?N#c48^yE(kH2iilG%V=Bm7WfP&U?$ch+RF9DJiyS*>|Xy5esYdxyyU z3uUNNe6Q@2H`;qrX2zLB_Dlj%%6JJ1pJiri9)(}Ur6dOJB;$3g_>vVva(Xu&E5pd* zG%?>S{9!>!RG+S&X`7v`VH0=-6J}%7(2!DeO5e|Nx7!c)k@+W zMs(vuf!=9{3l7y~t6&;s%h7jASKtVy36Ol&ulivdWb1kGpzTsiVQI<)(#07^OQaas|jxWU7iv>;>yN zRVR?UzPFo;Gnkz&+~}#mjYpCxG~9R-Q9^-5pTH6cp=}_}^z5L8IyWwZcqaTxa?LPbV ziZ6GBny)*UQ9M1 zNHh!?7rrSPH5G!Lj?}*2li*b>YQ8gBuN096PxDT1S2Q&&t&0M z@*QF>&5F7B!$+`eI9$|rQGvd+DGqu6mVY2i#@->is#HvtN^S#?(Kfh0YFlS<*PC?A|CDyZyDpaM0U>`L4e*MQ2|VC7v4 zD!!dp3jnoO0_rPjk&6sMXv)(=`M#GI9cO~D-pwqO?3Threv%k`W<%mcg3`o? zE|&RFLc1krW)KImlcgb;%dZ$F_~t#F&+07k%3`0qmK2nvq@!uhH>y9V^&2bM{Wq}k z>~sNK0}9D(0(er7WL**9+5ho1!&@6XT?f3AX5WDD{*`aRdjdAT60&*a_&ovMBKols zVJC=If!~?0gQ0v2!OH-yy#vKi0>E`!;^1Wr@9uUgL)eh8LSH z=itS{at^Ldd%YVVJ6&55DzEAz9>q2C5{jR@1`B6XST7b|R%A*#ybKF3Z}y5XP5ShD zc$fgZ*r#%U7YoY)t}ueRUA_hHYYU|xW<|~Ew@;G|x z6lY#ESn$fVjN?k5P2t%mlV^7PoIjc-`R>0Z&-(RU+`@*+9A@%y4Oc(I)ulQ9WU8C@G1oTis`-1T zkl}r{NT~Xp#mdrcb_z@S!xkdTuoQb9j7{s!>U1TP4t?9n?0;tT=ndgZLYmf%;&D_M<=-h%;`95ha=VdGj^DRW|g+OwYn61={o<5 zLtRuz%BL=m_+LBxvnKy0hK-)>@z4HKQi~O8f3fr>{lQbMORO+YT2Z8le^}FFrM7h$ zAhPf4?bjrqGR$@+GAJj7u<#_mF(nt7my>*0c#?%RC&|9ldvaw>vLj=xgj%(HnFsP& z+q3uTulh6bkJ4=>X(hy@_`FNc%G|)|CsUctDD{J{8hVW$?Hn22(>WTBEBRUxtl}8Y zl#9T&GyfQ{ZLUbPzM%o!nW+v!U1nCx@-Jt3*e_W=;$7L5*_hp`lwI7k7a#(!E~FZb8bP4&RJ(mRc`pJ z6WrC(%>}mw_hK8&Cfb3YrT5&~RbdYjSvS zs{P2o*MCqjQeyr1GxO2Q-90O0OrXA=J6oR zWBES^<}o{M2>)C|0|#%_xM?TdgZH@X7MU+b_AWk&RC04?xSBtebcXtxZOf-B$apTo zNL%CS(2;aBvx%c;qsJO`+ai$;w|NK|#R_tslh(p!&i?K(w}_I}3VCxN)*3GO@mK4j zqM9>yYTWE5+p|>%Pf$2p$6VRfFDstiL(4jzghZWIj#sZ^KjN9|C_Bb2%wMsJPcj1f z{T2;|V{4;!$sCQvc-SwSCd=VGZf=bgcz0(_JTTJ+sBTToZnJ((m8c-zDWRIVWJPc$ z{hH)EKB>iqQFp&fw-niGB_E1b5Z#K!yc192<@VW)vt`XtDDX=W)Yj^Wn9As1%AEl2byE&&t zTIEvKN^f(sbOLq6p}0x0&{%qmrPdr&zl;M>Ia%&7hd%Ps z!f33A6MCoU6Atj@C?l2CaBO{^66%(oLe(7D%ZBnd>U3XN#N%g;_GWH$b4T1VB(9=) z8+8n$1hc}A{xmW>ym=FJ9&OQXftz4G95vc4wE&Qy`_K^%=uk&yuohR^&g^zBV|G^J zoS5As=@LDdrykbD2j~w8dGzO2%o6oyRFGkdWDUjOx=@A*5S<4gIZDicx&Y{Uh~5U^ z133Ha@Z1IgP5=F6-^;T3Q$y>L1M)mab@CHZn9+F#CpA^=#RRHLG*0S1ldM zcOUI6EbZ?b96Pa$_xc9A`p3HSmA258ts`scHIcHu<3nAY{a5T?Ds{MT_zfk6pXeGI z?7^1(!$a-QT2{#?R@T8d!aGW}~VBBqHkH3P>7QBQ7T zNg#zRdfcrXZlLXNPaDeL)ZuO<|I~hQ0Jo(MEH-VtD*mMp)x)vscDrfsb_*ZirK1gY ztOVHwiGJ{%p@r=1pm`j3Rd^m~i8D#f;E)-kvrZjL18(EAK`8!=yFL0*4y@P^{qrdf zYlyxB|G~8A^W5L1qf@Km3v8gptDL*kWnJ6CFB(l+_m%|%oo2^%kGtD+I0ZJjz4i{z zZe;RApG;k-M{lXq*^9HEhcUp}5bhC4?{jtKgN3?!Bb!WNnbpbu^I^~R4Ze`0ZEWjx zdUC(DbO$z$tBxKNkBxAx)WKtxqR?+}x5KYFk@S!bIp?(IrL1;X>K1I|sB_Ng7BjBy zcQZJD+*NO--|GUjUx3xka<{&fBDQ61q*e{OjT5}1&z<6oi0CH(nF?;?0fnDEHO>Ys z=xgWF7py~=S}>_N`hio@*=D+VoNyNZvONM6zn{9GhFZnEr?bVz5^90_&A~g!w9I>! z17Oq6d{pnU0=AJ?2?N8>yptoYTX1c$uQ^$kZaJCNY%yuRBDR$f2<0={tt(il%Torm z%m#mI_d5Shi+^RKFZ4jqw7dKD0S9;JvNRm?%^@B72?!!u)6AB``->Pq9QkqD)#*(1 zkMN7lGB$v3A7t{gtrsw8`C2sG%*J8A+)kXW;`-Bw*S#Y=Q^-tS&+XO~B02r@~W(djMp zFS@0i&`#Y*@H?WPImOIxF4!@ie}JlaI}hec!}##2f~$-E5I@k|9iUn-T;M0c3MGU~ zpj8zb?J-J9^b@C=&?yZ6KSvcaV@f!SJ^EZ4wWCKebZk6naW<)mb@WJX=Q;qX1rG8B z==TgI5|Nn?j?B?6uJRtf;A&=_2Anqw?$67i8vPWNgN}cyv%BY=PS9vo%=rTxFGqsX zJebR!)VH#W7F#{HI z)W*E*23(%E(hU9s2(THvUGJJZI^6A#xF*fSJbVewJfFv~ZihUY*Ko@=En-gdP*Rq2 zC1-zmlUrhEAkK^5W9`!0J3&rr?R1T-&uu!%F*?hlw-j_hUQ;x!waG2B^B5PV*}4?! z>aG})s^@HMfkvZPN9Q-NJPQ5*?}@)m(~uVrwzTLONKkrQ7yVA^5|u-jV{X}~yASn5 z2jT5;H=`QGXRJgSOzu8kx;{B~+c+M0q*nuhZ1k_}^o1S% zbGDSxE9-sXq0kVDnY9s?y!i${Q>2ikdKf)X@CEz*%SKWtQud*=Y1_=-lGbBO4YnQ8 z!~Q1j&ghp+A1R#!gxFHfFL-g(g^p1LDCYL27dWIr|Mz%~5v(-y(3_XIKiT-+LWJa4^soGP4- z>wC<${KqNZQYo*kQof;V&sS5Wloh)?uEGETg*YDzm2xkVA)9^Y6;#Tq`2B|RRq^kF zi9t6k6m`RAjg#JjZYWLhd3Ouw+{l@%{+C$VVm1}MtkegsZY953;%DkncxPk2o^0LiZaM8%zuhf*&@JS^GEUz`v0iN_ zBcKme#k-AMtEI^GvhYpmY@Y~_^6C%)gf>0$-Q?uw?gxFv{8vm?c9$WFpS25aLFO;h z)6a)lV_px`+vDa9?v{V!?Ov+WOJAsX=@vivdMRI={{?4T-PT%gfQ#XP6eSIN;%jv2 z_4(Ra-!T-#%Lj0%G|oclg{o**A@G;a1;yj(psO7Ax{5aI+%KAc-Y-&G9^DE&Z8OPr zz-EQ8g@v}Wj8vLIm~}>V&CyuFtrO93hxr=+2*z)XyQ|&Zy3*YwHnl>|1^afkecKex zHAUwur!KMTRw~eUgor_OY&@tnz6-ZTtHm_3)9W!b-iOAtYHoayf~ZqYv379$u;IXx z4^tTWt}mm1eQWw9HcXipM?VeIToliRIPg%;VFxp*R_gs-YzDB3Gf66_f>L-aL=mXA z195dw8ONfEMvQ#Vx?4b5PfT1mZ!6vs_qbJCc;WZZuIt@?5*J4sXi`$R; zf0ui(&8nre=GB^T6HRxH4fe+Sy8TdSdX&vW)@P;NTY>G%p;hxas8r=#= zQGUa-Y`Sn8BOD} zM)Me6tKir~V${bE0Xrg2?QY5UyG0mYt51@Xx5ur13(rD(&*Ml z<7nVQ#f-kgKB2yMrnP}BHP^Xm3lR65aYJ2LX{?Frpmiw;&zQOo0sOUI#qcm^^3PgS zY3lVllV7om_jT!gUe+~yvT$^0u)?#QN-4V3mFwyD5vF3m)Mxl~=jDVYj8qn4N^S`s zRYsdi;in{&OGz=5TgnIGLwZ6c5w(Y8q6wi~-mMJfQc&z!W%!mS{X>Jj#i#r}a^kNnl73<}!^9LPD-EsB2j+qsz`#3a@g zeVVOZuv?`R3z6H=u+q_AJdqx6Y~?eQ-w(R8lvT&kA3rh9n@U-m)!xXCXK}aH`~BBl zZ*}zNPo#aNA981?baV8DCv4YL^!3d$q2KN{uW{2JaZ@|ow11<84QzIv#vQ}>tgZia z-EEbohg*M`_$zvUj^i}{J(wmzS(!Umtsu?<^SZ%@n>+*x-6T8Kx*nDx9}(2)V*rU zFO_of(*~li>Z_NXW?o81&wN{ZyPAvsb<#O@fZ&HUc>3E61nuUqm;vQPseidjril-H zy}@|Z#MoY0f+7hZox}frxz_N>{K&}ANML}a6ci#}MSexhYG9~)bZmHdXe4l~6j>GU zsF}g{a2Hqt8ZL^b;rrTzp9>snh`!{AYWaAU)(0<+en3I2mqkR+Z~ozlbfZW7GsYOw zarF0|Rd9T8qu#k&X}8N~g)V#IjU)OcSoZI-Hp3!X2o<-(6sYz zvY6Xhet7j4flc}3@mZ#x&u@2=$-_dJE7^*bwT{@nu|s+HF!~j$F;@CMFYZNk@3%Th zAvkRg02Rz4zLP!ZX6h4}_tOptF9(0K|Teg~S?UBAe)Hg0)8&Ma%N@uaoK zat~ z^=Gw1LDI$!tBYuau4>~}-6U(k<1Tcxdn;nCl|f#H6ylU>g7*1~Q! z-xS!*+cAI?iPO$!lb?2LN8IGyaF^Ssi*M8}bJ?X(-`*FDbpIkDT>?3E6d$Xg;3gBi z-}UX#G%V{eRuifIvsPF%MTe=YgE84I6} z`+u&Zx0h5cz3ubWUQcho<2ri#MO90nvQ5=;QwQ(ffOJBg+u+>IBqB(Jym`K#Q#9>* zdOR;WYjZ2EO0fTn#DlVTy7X^D?>CvLo8F7D_es@=&DZEAZ#d&6!Cv&IL&Ay%UgaYW zXC#eSQ6@*2RW4x^Z_gIRzIRiQj&343>i1l_*$l$PGo@L58jIjc*+s8hvy$3UINCST zJ={4`IQfddFPUnuT`p6(W;H?UN)2}wj$W>5d2_O>bGR?pH8j9G-c;=AAL=X=IgmFB zJqJR4O^ip3xa8Ipo^E9ThqWX;n~=3=CSOSh3R#PM`1RP4W}F@w>*>jlc*awykyQ=@ z%qWZv_vb6d)!)}uD&UR&zR}Xa`CXorRKemZjnDz0OJ-NUR6#~Mk^fCJZ%dpL>M2(h zCmOT!A+bLXBo_S}&T|My9ugKJaT@XB^F}ZmF_f}<+%yC;nL!Sxx2Km!?aBsw;;u`0 zu+i&nq{=@k0X)nKofZh%0!Q(QxWJZN_5)@@+*WNtfURfb_<8>+*b|#dK%e|VU7UQY zd{j+ta(}^7u+%#A)%!%9)^HUBtIQ_Fru-Fet9O}uA@ ziZ1Dn1q;VeoAmO3=1B6kT~r#eGC}+x{bg58CgvAOX^aNicZu`;h{E5#bNo{0eg)s# z3Dnkiy6PX|+jskcXI4so{iK^hSSH)ElY0^&aIj|OV6}BSmr&!f3%&A_`CYiVMc!%k zMrl3R*7m!@mJCJYbf}c!$#*G5%-+J|YCp5c0)7hX=byz9yIS!)jcap)y?OPoC(de>dtPa)}T zL+Gvl-Qjx)4q5N__^lgzlCju;!;o72tE8n{4IM@3*noSIFT=KwR-J8dh8(dErUro6 zj|*h8OkuX|2Whl+WzuyeZ$TGyW?hocQ7H9O*7QG<72Bz-*qfVrq-jTwU9yT@rYY^l#$xTM$M9JMG$(>ppw6U}5fKhgnC!SSG0D`jLp({l6qu$heJLEajWgnnR zdyIG;?1FTsYC;FIe)tkN$3~@iZa-_G*14QN{u^|)*M89>-OgoX%AFJ)YcA7g^yjQC zgGy_gntiGmq_2)%IwcQMee_d!)not*nk+pxg7^XTxMT|R@`-x5Ux!y_IEF z=6j1inlXQz6;ik0UUQZjN%#AUv^19b=s9AziR`wHF}-%?5VUNUg3NY{t>rg$W7koscA z+N~9-E0uyX*zkpzvqo!v?{rnOh$7dxs(q5LyqTVfU*J9dm06hBCrMAfTh~^1Q?pwc z!7;MYh~(R0k_(})8N^~%IkGphiUUFApLi>Nxoxzwa5ntt*sj7{t0IO?J`CLzhP;zWsE;l{2Rxn^b=no7*vgz_qd%Z-x^|rLN0ZZZPTr*Z z*%A%r3xoDXLoLwO5NqOJiVN`gmg5|*yqVh*^dV#ijK6h%Qr9ZZHIwvHprVM zKSUR?t?1|cigiG#saV78ewiiQar9|0I30Zq+$=+p3FyHKf2pLl>gen#@#w!yw>SA8 zXJ|E2&ME}L3pH^UkN*WJ!Xns3$8xr zrzg(24U%D=HMbsz`W?Mq;`lMEB5+6ypP#t*ECF5vyaeRR4oLc z&}fHdOT z{|&QH-MGddwO(bTe?%yePja2#h;~0Sh7H8luGBG zg$;dP(^q8jB(DbFU@JAym3Pv(Ai!Mx%<=S0!_1!-=VD{&=wJQRm!l{vewBo|=)7Cd zKJLGJ5y>!#JY%l7$m((!i*RYh%+QE>46wrVyFXV1VbqTdFOK&_ta z8QUd+)!R4X5~TCem`$Str);f2{4TF`qW43K@_R1ce}HQM8&}&T$NkPD;8&5Y&5KjPuheO<_9vCy%HUGZWLIw_%OUihouZ+9nLWTNuiV zi=vOFFP3oR&%hBd9tW4;Si<)P5Wd#1<^50iRs5F#+@x3uz^J5BpUP0@^REW#{E(pz z-hbIB?E3HXc}+S3%xJRoo%-m5FG~ZL)a^LZ$b|hrI|2KDE1f>8{IDt5p+e{>*^ByX zx8qhWo(-m55{~{dGX~;|y+mIEpTt8b9=gO9sx-37^NSfGu&coDZI{7sQdY*vB#bdc zC-ZYZdxJ*H{N(%>CUwDi2^?zwT|YT8&8}Mg+e7u|Ri#Z&eT-6|{Xme6TKQ2w&5#`p zSx^nefx+@)FAGZrcSA=6%U_)U%NKy9rUi(6m96Lv^0Wx7@Qm7x@a2YB7<7ZNj~j$W zHy8kTtG4_l0l(rUWt>AaHcONJ1{m;q3MaG8hh6l>`Klb=!d zU*wTuEDi1M4k|~PQdk3uoDrYyz@CvN2};nvylSA8;xk0bkCJ;*&VLx(Sloc4~nQvxT^SRalcOiqp8s+FuUM0 zpI{Z4v^p=8AFkkj5L=MR)zL42qcX!JD&ca!WEhxeAl_a39X8n|rSpBkpuMuv`4d)Q z^wX!#+Z@e~{u>%jbu@^>KKhkYUZ?y7?+Ae!6o7kQhw)s$>Dykbdzx^rgImj&o^4L8 z|974RIgAl)YsvxaX-AC=TNYnn4!TpwN9nSaq{P>Z*`QxemCv(ax$@h#6cBOJ- zgJYxl?q>XxxsiO=*vM$#&>(jMoqdC3qNH*?ef{~tp%j1Y{ZQwFgT>uYsBh0u_gH^E zw=-Y3x38;^DjXfjj~*TB?@pZ<#aoz9b}iufwxNCk$$XOZjk2xg*re!__dU3E_x4m_IM+0^ zI*;!k!apmABY8xr!6UiO?(XCtZ|8yjd>IlB_npZ1TfN|!Dxj;> zcq~6s5OxlZ5{}5z-CWnvq2b)<*bz&G%HeSy>mQQ7Iq6)hssGv^&AZ2N*x~| zGpxKj$%q5kA(gsJc`*V{QZI@;Gc$auy^1d8rF?sti8#akexX9wrFdKYFyU2f#9*k-^S>Foo(!dn=5L zbrnjGInX)yI1|rHss3ZRLMPlKPt2mLkQ*HaQM)z6kbka!tdLt-q{#hnh(aO1YjBhi zGFhP$Oz{2^S{)@`kpr4WxWoC8E=^5%Q-Hj;Pr;F7vUB$aD3raiyRY}CdM0q3I0+cH z1EGBfw=1(HscBDsq*o9=7!W77qjOXYU^kPq?}$)5H8yx;Xl$^X!flbL=_qd%p);AgmtH_`|yJ&_p zb{0mdMx5Wj4PJnw6;y$kcwl5Kf6ykm92<%pDM0rDk!#P;$N-6txlxd=gmOk-fq{n6 zhmZCH*?dYg-pL3CiF@-(^E5$qTr~Wa+^B+ADW;7cGK1oOFxeyd5mA5m(xx%@ zkPzO_sNw2x3W3HrjgQkgp}ywE!@q}FEArG(&w>1CC*gf-PS`RwI1JxNi7f)OuE%qQ zp<%Ue0#EJlKlxDSNEn)7My|K7U+^s=@_~H!SP88UdOo>rXz2023LNO{A3oYCFhix# z&B#d38Y~xWfl`t&9~e?IYnN+83d*HSbU-CtsqVhQQQ1M%IPSBLL4!R(nb_gPkKM zjqy>vI5jX6t|mb1?Cu=tO~$l;tgux8P`{uCaGq|4xe=YWmxxt@o}!WNROmoAEJv;T zKq>v}8KQHh3M8V1rV~`#(>YvJJc9nRrMr9ApokgBm)MIJ=uo+d`O!U{Cj?hs%#YA8 ze|L;@4uDot5)MjGh8FI%Ap}WTK%FXAd-ivgBYOB^hY-?}G3*Hp*xIQM8PDCO2}T%F zkLDXvFy*Hk={!vN2x#d=B><{W<@);u`U)w-uH4X|^aw8?j6V$w+r*3wj`sBq=DQoI ze_HEbwBad+R52VlKrL^~iY1}qsnGTJrLH;lpoM+zh;QQz0u z50F4{Se`^E7*wk6KhZpX;b04xxVZOdS{O)r!& z*agrBz%U@oi>ANk4lv)sZU9gke9oAR=>eUiCIpOHMQ?nW+qHMwf$cj|$So+bTSO<- zFrY&qcggt#r9k=Z{r!EzG^2@=##N40+lNQXRIIX(JXUG$#OOhtvGUKhb`6$6J$&Y+ zN>M782}OfK1zsddM;T)Tca72$DS2;6Tj=rN)<|J@N7(m96nw02h)#vZ_n|cPcS=f! zg4}+XueP=+>nO8jGca`IG5&*zm=-A+R7Qo6c0TANMMVhhMYAB>(j>IsyWM7?B!t5Y zh#&HHhfQ1e^k&q8`fa*EZa=dn{%7{oD2Wjz^_Mw%U}$*jP@yn1VB*lA4)9@6u(vQO z5qw~SC>c_5G})y=@96I<8}AX|7C33yY-~H4M?j$jK7kUzAK+lUJQ2udAlHpL*kgR+ zNRMFP`6HB#qIg{DsZ2gvH8mqx6vq%#LnD$ZR+*=Nqa@go6~O}o7}RG7bZppb=XujT zy$JNGQ*O(sG${S=7fbNA)$us2E#Gf82lMbi$Nud>H4)D+A?4qv)AoJ>w!Xn`;REam zK8eBs?Lp2Xd9OB=>ngJROe%I7&aqgJnBr{+hFN%9S%&r0MZQ{#o}iZ#oP zQH^#U%Lm!jv2*+0+}`c&57@K@1x|w07=o0)k|rhmIT84&y;9O6y37>uZ2nN^$l&%9 zjOD?>J~4tI1I*qE$&v!S*WUvS#0K{yrlIHjMZFAp?B^&T)xmsW7xV8s2B+&C9FY1P z`mR~aquX~4jmXOAKbb?OqDyz@PBI7FgLWmj$goRbBnf;7yJ0sbQ|hEQ^}~!C+Y~y& z-j@Mz)1AGM!$-c!Fp^-)7CB8QR^?kpx`0Z;LUxuEZEuT;tCwlfCgVl}xFNIN!co2! z))^N!^aIU~c8(sUS7puY@5?7jjXVOYS4pb@;F^oB%eWe9Fk!XF`k=br{*%K;i%fIt z(21?G0*@AuP9-K1M08o7NBf5uV9wZuhT0E^;Gi;Za0ZNuLG{Uo9$pcy&HlQw+@e2# zC^E5Ss(PYe1+N9o2j(Dk#gebk)Jp1h1#L0I;mdgtwhM2ur|cIj#8J~$U@8|cSY*4!XD zU{4AD931XP3Ft{YR$z_U+JPYqN;5>bNk1-fef9=RhQKVLL!e6oZiyM#g_+23Dfu5v zO7BT*jod-aTY!}4Kk**e8$;!651TEY81==m94r%y_a*vIk?i2-QaKOG$}w&M;q3@I zM!>z2|0$WSa&VV*?B321F=vtrv10^k@#urhWMI&ew8m0}YKFvOjJZIwnyuyR*OjilPk1R z?k*BN1m}r=5+o+ZqWlA4pnDSnE^#PHLP$Gto5+wU`BaZ$(X+GPK+5B7x$W+eEoH8{ z#-cJV<-(hEz4<}>up^_=zR}Ow1TdFBX3i;7FM*d)!O0-e0lPU(L)|zQ@IT=W z)ribPRN@dKs^+#bO`|v^FsCEF($Uo5P%e;gYQG7=?FSC*JCN!^h+ghC)&w5!>xKiH zSI)Ck5e1T0V-N<&#o>kOK+Y`CL?YQ>l-Qfl1qr<#JI$?{3JPQ}BA6WWngo+^5LKW| ziAIGQ-kt9$9FY4b_4q&@Uxi>02vx4c1ev$?;ZGFLH;!gNGVCC2SdJb>Dj%eLXM7~i zk=r#Y666lq-zDIx=PT}2{Rypv%7fXz-OTQiq8ZF#GYrs@Dh&BciE5Q5+ERB$s;NC|!id;9S5mVq!dutlDYZKPcf;gHJXQc1K}Pn&Ya6zNi+83^2i z?yM|!$DB-F6kJJFIZ>{v&_&#uc)>#lwwlf@^=WxZe^=PwX8XHRn1v)La~*l?KCu0P z2M_E`st}OC56l5M@U0(!v@3Zm#)S7EFk-KrV6E8e!>HJaGA$2vnJs(&7=8wE<-WnU zjP;FJtRncKiy@EEdxys4)jW z{3T)N`%i9BP$RL&!>pi5iW5-P@qFjwmXPj&12>WDA1|GxXWzgs87B%X$<->+zXUD^L_~OHM2$jGrlypTmA$~r%0rjDtEVUuMLp&+p^t)nc*_8o^Y40Kh6i|# zfPJBP!i#Ve|60OxjH@7Tw|UP|pXpjDGe&TgOJJq&4d=|nh9{!_l>8Nm6FhPE$iNXZ z3vOI9ICk!RuyNapdm2|XH#Ik{Xl!2I+`M8%^NPmXaYZ)X*I5V;mfmwmfNJg*cF`T#|3?~unpw1!RuP=!CH!g0}WAu?G#Sn2&eIVegNs)VuX#{E(w|pYSkPpCDeNfEThN!|DTyjjvXX^1XcMvZ70J_LYXykc-b^B18d;kL8y%u z_0~j{VkX1|69<_0zn5C`s#zJQQndDXConmR6hb5)c?{)^X!#L*-G+lu2J<}FZNT!R z2OWsakTQ=;r(}i(EPi5;PsCXz2JwkFy_}grD=+nFe-}Q~qMnq4DBLdOaM$7OYDP2Z^9FoyLBUS1;hAoMJcBU?b)P6+KqF=nwRzV7nHB{ig`tt4KWR=v ztT{aJ`2SF_`0?%fNCE+6nceilHeb<@lP;CdE0U@d+%9o5+>tQa!4*M|2u*o*y2T=r zl6KUrI=#4|VIKnzFYnA3N_bN8>iJ-c#TRicN?cWvRT-+F{`4OJCp!C!s6pfogdl3w z=iLE0Obt0@OqpG=nm~xOTD&lx(uc#8!%mK%*evQZ>CwYpVWpJ{jYr^4RE z3pE0Y_m2$>V!B#D!&hpo(yNsET(fx4du+={wG^0!(JHY>ME{%q0`=Gj%H5 z#A44u_n{}18kLs`IGBlqqyG|%970)=y<2jx1TD-Mfc!4J7$$9-qGTls@Hr`EG{8t$ z?#STPb9&(wFw;A5is0WiT+nZ`s}v>h5FyefpM-a}23e0gmBB*$m`i;)cg%Q%|Mr5i z!>Fif_R{J^*AW$1 zeoV1*bZY~7)s^HENQm3x=F3Z zs^or6Ci{Fjhn>T=6kTy`>;vi9il3!y9del^3l;`(DcuA2k%9IB9rk2 zQ^;hhPYLk)b|SF6oHhUB@UWsHme}C~GKOyjJOkZ^#)*89JPlnmQ3VG?L?{Xj-X>g^ za4h%~Ufb`dC^&19Z>8|;e(-^n_l7jH;PNvxGg2H*LJ{T=HP=%3)`z(Fn!jAyVk&pc z2eyJsp@i!P#|A6?Fdl;Yx{T#?m$QJ0Ifh=|^>rDlmeF2u-X*?wbaGG$lR@rRGFs1U zhf02Wg6y5R1H3dXj^3F09?NUAz>OJ-G=rxel_P~qYk;#&$do#c6HnWy@t+Bv$MgAw zZ!peM>cv5fWjWXhqS0Sch#6iy0)`esp$rpEX-C5<^ZO70`6mjk^p zLGwiuw-L(-eJ!#zSulfOBP@WN84_zO=#B@AsWaS98PCWSj^K%lF1_8-`HC}}K2XcP)C;pdZ%pej;0yV0}`%(&$b5>(kjj<-Lp9;`b_d3hDAk$AmCDyNr0$TGnq`1fk|>R_ue6aNiLJjBpI>|GYLufso)N_ zSZrzC9kjM?Rq0QDT5DUexV3Jy)dJQ9txEm16|`D$|9#K$J+rOmyOL?|C2I!Inyu}xH)OITp4>C3E00pe(fPF0P_;A0 z^>Lg=vpZaabrd;^!sAZ$bwl+=e`C;+SUbF_zme&-@WJeoflWAvaR?`>;0!Tz=HQXp zOaM=Oa%M(6XNAXXlC04ZjhvEP&X1a9+-f5W6fY@QD1$f@gU${^FWI_C=Y-mh&`4pN z+KuK0a{|n2iiO!7g00pATzxw{jCDFape6^gcH+<(e9K`&|S9Z(dzA^>lnf8FKuF1e)uP3LY*X!$mY6!wx}@(? zEN$z+(9LYCkuq3>L{tqqgJkOl(}(er2Hvxb1`Pd2+t#?0B5us+!Ewy^)l783hfz{( z0TyE=t7TSTZQI3bXdI}_u$JUK#ZE7_>N`2}Fd?IL$qTek2V@Gbez2BD3a?Dr6$Nj~ z9+Ean*e20(gOd=g{*iU7@uUdW!LEWP+SG}?*Ghvoi8EGSY}q8IM%43gpPaO|PFjkh zid?;JMB83%l{NLK)>h`+!hCO+K~s!SwQ0{r`Y*Hc*VZ3+Y0$cboMiPL$Kl&OIOf*6 z)Z3r>FxuzU0~<|*rtj*z1W!ITti^elGx~f_Rvxecajl*-waTQ!ju|;wjB2fI*sN7A z)g_+-G6oBh)8n#|jlm~MALhTARao{Ju?T}{nlu+^pU})oceYbIB&i$pP|2ZW&1O1hROYA zV!i`PeKkA)mwI6X@s{k8+Tc1!a-@=O}AOV$ppW&5S=k5oR`aLC&coIcMk z*)-4?Y{-`L%po*7)_@~$chK-YMw{q_@`oLsK=+Qxh3z!CA;?*IoP5@d+t(*BqRh znBHYWDe=6kB!$p=QR<{)6Rc^t6L!e4dTES(uq7h3!O&9Vem^)pj!Kt#4qlbh8c$Z? zbga~r&CULe4ec@@$p=(OyfuNUF)7V!)DJdlE!>=u83)cN%b@@@*heui$g@nxfzVN| zPvJO{6bf$(qcPJZVI&}&!9txny9JS%QK~ECRIN&t)OU~X#{#_7 z6j_nO%@{usY)5+Y4G~7U?nkK@TL*RwSQ9U;ySMqeQ7>(QYJ<~anQTtDC%m4fK9L2O ze$oEZb+Mw9XfLVtX}i~g7Fc+*k=Oz4Gpz%c!I-aG@0ps;_q?@QTddI*+oIiE>anGo zqfgZVinmKXFj!m9#&b?_YrN6xOSQ@mm|H3Fk{as^`J&sLorEI?WwA;|WwYw5UD_;Y z*^lg&EqXQbfYy67U0dq|{TPrSJ9Lzz1wdvfDC)TqaIKa=7>K?aYth=}u)0~1nw258 z-*wuLjgCDs!j=Z$8Vp7;0@{U<1SS?XJWJ~UZq;g@h=5~cz+v+V?Z^fOhDI)0x=f{@ z=idz_Fl{($BU@`AG3LZ+m$rV#b*GaCL~)zLMRPW6RmsLsoH1#2l45S1pv;}%FUtYH zbp_9$gk-o|hXqs}(An4)eY&*gIziJ$-+URs(=$`>hc#B>OwLmma-=)$}?{We3iCUI)lgb$Hv5E!-~AJO-^ z#5gLS*{UvjBH!3ZE!o;lBO5TYbob2eHgD_*}D%5 z?|OPwM~3Db9E8>x92PjSN)Xc*Pi68bkW_k$WRuq)T_Co`6mr_CmP}R9Q%PgsrRdPX z7H)*0u5&d5qYGcx0MuTKPQeUJi=$M6L|Nfv1gfN54b-&nl zmqj9LsrKV&jc&!-^7zCQws^3Tp_5H49JlsP9uwi17f;Cuu_axmSM#)>V8gP2eu<4y=FdjT0C+H-wGjW#~pR zLBs7o8IIeUKT9_{Eg0Z!uykRrnoL<;^L!ez6p5E7<+)7@Xv>EFnx(6DiU_^Etcgd`=1^U6 z^n$02o#g<|-jzge*_xLv3zs@EIHVakD>Xv8g9F&RlEnzIFh%A3war#?#X`#t$C9b| zp>X zE!$cFcA)UcPLEznz*%0XdIX&nrkjT{oZFm0#*2^I3k`c7tKq`qr*eF5cL)bRQEt3Y zqUud!NP+qwEnWvnD6|E$?92(&u+~Ynl`>i=Ofs%Gf|8|m(K6H&YO7WdV@u0xZRn9} z4p1hsm?}J|$e#J_s>nn+RT)bI#d>N#)@wQY^U|1?t6OmU4@$xELBFjbNK#D4Zqn*_ zUk=@(k@MC&?nh;fA*>K>+@x1d4q+YCgh;pU758c#kIiN~ckJ8C4oiF7NjvoJ6A+v{ zwN?q!u49-iP2uR8mSZ`xr-H3VY2i+=B;zrh&ND_h&`$T%Wf}rQbtvGCw~cIM75Ez5 zNOxzb=FN?32GI9Pf*h zdNF$K6z=K_$?!_n)ZISZ!cdTd~6H2YGytXhhC;VYq?g z83Llc8az6+YZz5fBn*!X)MTWsGY_~KD}K`cSq7o`vw@bLqqIxfa$Ei9SSDN96X6w4&OlO&^}!g9$GR8jA|* zt}IAmIK11M0+$@;9<`{i!Fe+s8u{0_!=eWbQRpy-({hZ4M5>~=K$q^cb!m6zWmqX2 z)LZkm-!0F6=tf**IH!Fnd-^VI^{rr;k2$3I!-rf_kffqxbzJ94?ZPG79HS)!bpjjg zX#McWfLB$?PU-it(;z2a+Y7L{Sa(>okYITaXVs2QOi!gkWiwJQ9M(c$C3~eUD(17o zB#dY=?;kcwk+;%X3zH-EP(@@9TIpG%3_dMavU@FiTWNtoNM$lW3-V<|%j?K6%Ij5q zdt*v2m$X_K$H*CVELiy{tla_i$wOLyZEmb}W`$-7mlbe$M|NgpLEbrA<}@8W9}`cR z-Rn1vG^ksgqP1`SIE#!(|YRL3m`ZDoupwfr+MpnUtC;*NV%G4ZG=vGIVzwXZt5mG z2qIqAEfm`!mt&f6C?(<&F|Am&@9(Si+@&SZa$-Lh==B*0O|$b@{Z68GR-i5j39@JG9yG zRs?5wv4M)MWSr=cudb)rQP;AMwOzEeXrbLRwznyb-AHXp&FZ6xs6@A3OCLUeEBH~$zmP-x0YRmg@{~iI41ySC;Q}JLGBQJYh|_z z>kz+aE=m2!;17(63fSiGwe#) zVc&#C|AEEkW%{>I7K+FFF1!%a-8znyPwiiWbr%_z zH4O(GFje1|WcImCA;*}d=$Kfhf%+m9dknY=DAzDC(!u73Jhc+~VUd}tuAr(@hlaAr zX&DWrkIVTH0$oKoGDTL9RMwd22kWP38P3sQo=-ZV(J?+&7iMtY+I(;ks_pIry32+} zV0=o7(7A z#%Eb|JIYc&jG=&EtVSau=WpfEZhEOA_Z_XESC#cx9K`WQEYI*x_SF73B88)4aw(!u zHq7zrRW>=Xd$M2u>K^*!Calx7zw4!^Xp!XX)iYR`I=m0hJ+vDpXVRpm;-KlCLpFNH z(+zSHQO`^wL^q10G=?jF8scu9E;-{EF)GD!KhUUk4WC4cibJ0RQDDjuuP`LYq>o*; zriIT)K{Qt$V-yjlOhH>e1qX$9;&vu3i%I>4k{UwPbl<*l{F%nZ5wxl;w5vE+Y;PS* zrE|VKVTW<=l-%u=)~;{I?iqAGgf2o}_8r@~V<)be&0vZu?O`AO$f|Fj)GI|GF=4>G z5Pzri@4jrGeplYUec7JbYlKhMc;IE1(lS!jQkIsXvZb|i|FOM&V9BPGNyJJFVZR_O zxkw%ua0-uS-Er}Qt>=oeq?lGAazVk0M-RG61E%xL@U#sMr<8JJ060YVozqv2M} zR@u+%Q$5EaA9Cc30gS_+IP~dGh1k_H^1{g0wbzq9pwu*wmS~NsgC9hl);KNP&|qQQWWYE2mF6i_i`<^Zqci5Ck{Q#-Kv=}$^bxSv zPU2d0;nSL_9r%Jx6uFX)R;A^K+I^lPjVyXTtT-OE&j(~qAb-#*$mjzTxuYeS7|KIv zn>ant*?qKs)&y<6qIAK^n&{YXIC+ipxIiQl15gY#Dz}5b?=bkeLmKnv1p7p)+Q!JzZTL$ z`!Unng}W7EMgPV%lEd(@TN}T1_O3`0*UxUMGc2cZuy@Lhn zFy16G4(yg3&=WFpCqlMwGIU(XbzBHAfBS@LN>;F8v}T}}4fXSZ$s?8t>Tp&HCEGcP zMHlHS@Vp{w0Y=it&?KNtia}T5ye<|Zq?EOews3F&Wm-){o1}QmMug?)QVTF^$=5pF zL}Mw?)V!2f=F3IRVTcxAU}P_g-a6vgFPqEl1y9IOGBEmB8CMvx+3Bgh$YG?2L#HSS zyn;9@Zv&VuF@kfadaH~>iY=569F@?s#Cm-c4FhToO0XBel^$1Jkz?jn-(4!GCl+8w zOW!ysx=qDcK3bhNcd9#fVT6unez634a4$+BYJH(Wv-AEks>2S7y^M;}8?)KQ!OMoR ze3z{s+@fn$MYic#TL}Q;u7lH96Wt~6q2QUJ_CeTM^e!Mdc=(X65AD(gEZSDbKIh2z z5fg9`X5-;t>=ercrYvlqG?W9EfA^$?&IQkv!KabaMzZ|q z@(Q`&g=DO?U`&6Y)dyc=nxQK@sA@B~SA|!iF_1ySt`WK7vQHLmkQdkJbFxKM`J|fY zE63ktsRwsFRirK*W6I~Mud`e6skM-coLG{V`;E{Gb{vHjIMdaRM=i%z%(U!&V!K$I zH*IS$eKJP$|2q%kKbNz-Z*2)P1dP-@Y2Gxk<$XiY7f-z*eiUtQdy;T>iC#u}#*5wg z_7qoU$BrFSiwoXaH+c}7<1^Cr9!1e83mxvy#&@9um~=JVQ{keusw^EC=zitNj+xAM z<3&%j6j;HIYe?uTg$TZiU%-9 zkylz=m?Ddr!?&>@Ntyy(J(TrLod4ECm&2D|)@qDwZEb2cmSwq!uKD-vJGj~sQ8wWbUt2Kz@qgo%S3 z>wvX#CPelmGWk4=OC7ECgZ+5bW#do-=UJ~kBCnrIi(;@gjkaK_41?&>v1Ve+5^90c z`Gc8wxC|FMp^_YDE;}pQK}lK?boG+J?}in)}MHFssV4`e7H0m7+GrkEPZjiv1Nq3rsr?&rSB~O7v2-aY9u*}?Nx*n;`YLpqaVzv>I{ zS4|(m=^E_2$abmi#r9p=z%vv>8`o}<&7#AtS?SJN+NTLWN~#Xmu!n)203|rK6OTDz zdZOP@U$Ephi9;~Q*5Z9caL6yjqNPOH!0A%N96XlS!ZO6~{g^8Uai>8^q`kv|xo{1-hn;f$S)cz-mP-xGd0q}8 z%eyH#@7F02B@n06OwUpaCwpeR9E3I@SDI;zYNZ-`1x==59w9!_0;L&hRoX4q25@Ii z%eDPzO4g`6J>Ak?QRyeO(Tazplxr{A+$t3!oP^P(&{{L5rrJgo3I_5`T3Rp9#fm0} zq}6CK(C)u!4=jG51I#FIDXpSe3#0ifOO`(OfN*%jil?-b+6*FnQ5Da82)VR}hcJJ# z_E2&Qr5{<0rFo;uWuV@rlk$y0YpzYi^0OSPn85LQJoR@NGdkJ!$BkEOq@*jCymkku z3vFXUi?8O@PU-68i!@F=Kj{So%j?lT<56`iM(76~3>U{}bC%0j?P{g;S%FspXjG*$ z*@Kq+P;0~bY#JvtW&0R;j(UT=$4M(}SpJd@-kQ$+IFzGFN*^SfEZHHHePA;@pn6Q} zfwY*axwTlfV~%P(jdcgBb<8N~b?`wvap2%m50`0X%LpB92V@_@MROU$nzqxTt)_|m z@Uu`jXM~#&M{M?1^qFZtllPf8NNx(tDGo61NsQ(lT=&KgHsFGpYl|H4i^c671k}fQ zkEI|}N8%2mpZ}2rB;Wja0lf{Znk5Z`sJS!cBV<_GJVl0$Jjr}LB^D*6jRb8fZIvpM zRGY>U5%N%!U~=PnkaVZ3huj^^=a8tXBY^0DQ255Jq0$2+xbXcfTs+^|Jnp$kF)h3(jbh-z0;NUX+ zst~hXeJf>jW~b+KVYp?DWQ+tw?gXARP#;1~oL!S#)WaKLrD%#74zA5Wte1lDn#^8N z#NaDGsieYKnnaqPYSJ2mw#(jHP%2ADDs!&TYG&ZX1_+TmG}ta^NlMf59<4S2(!2?c z4sZmRIcPs;ua^N(Wz`#c$Hy2Bz*H@QT0688B*ykxW(JnKiIW@RN1 z*UE8S4`et3WJ|vJ-U%hsduJuck1{H%;2Q16WRxP(U^$+Hl+9v5y7nj4P!gLxba;o+ z;O$`Vt(0Xz+Y}Mw#Za-<4oWYV$8r#p!{f|^GU!8TacR+&!7PTStfcRQf;RQTjA>_v z5ohZvw2-LPyv3y?a(n~s#8RlOz*ZO?txjI1DCZVRPas>Nc78~Stkm1lC#RZ{JFYUV z(kCvY7gkDh$UvLn()uuq@rz4Xo5CDS?4d{6{Z!~hatf$P?h8{XIY?KCuTCcTAjGM? zpcE3q3+Kq`S)Lg#_{tsxLE$LkF}$$#Bz(iT!nPIw=(hp@S}b1!C7TZXY(hQqV6 z#FZ0J_Oh`sH-C9!6;_3C8;UB!1No&(vU&6K9IUIsFrI ze^(w|cbhe3Zv}$Nw~E|hvYcownh(HKJq*|J!kE4@FPo+`k&b}At!w0UKI}KE+?u&S zUOmIA41Lm)m#OrL!~xxskz7XRXwJ>bV!OUNJ>kr{vLcdo1G!{0j&DmM!}7v3vKNB) zj^LFSY)FcqLt5+LPUSCJJ%Ssms97Q(8IPegR1*(hij&ZC!L2HHLPOf0l#)I!R)KKt z4J!BpKP?%+YqOeAXvD zmU_6%L+rCFez}J$JiO4ui#)s-?@jC$^RojrtB9;?Nqt|a#~QsAY#rsJ>Q3Y;_ROTv z^9$YqpoeT4BH39ieZrtS6dTclXDEWWg^GcTTDBhFSlebXaKkV8Na>P%le^EZa~*ks z0;1W2F*ROlPD<+ujPW(~OS8RbRpjPTYxTjSnv`maVWr-Bl|5lBs8C%W(@2I(Vp>CW z+ZeS?nkL8)-7@@2kp8Zo)G9++iBO|rp%CvnJcIr5S^W5|6`nwh!gy`L zlo7vfh+QSEmZG3+Q>(%l1n!fUV-AeyGgn7YRBbzXYQOr%3KFh9RkeoLsg*}XrIPWtvMkheK8A@@qmwg{ zo?3>V!O*id<2KOG##hU+Z4`Pu5FtIH4`M6yP&Q%rMSAwcK5((;naojpusWL^SS$8h z{_fUPFkHq@3{PY;^e;|7NsmAs&1@XqMefRZpj@eNi_M+xGR(SV1Y;&+dXe`rikB8F z?XJxj_5F;S-R}JCfQ#%8Xmz&3JcAsgi?Gxvdv#Jqkd_?Xl1w-0Xh?I(80e%{z$E8A zRU0(g*IAq?RQVo7x|J%5Gb42z}y^<{#Qji;43#bfUl6lExn zodvTT#7@S zR*rj!#xigaPiD`|;=;_1>6nkUeZpxU`QcvNZWbe9bz2G>v5R-~s19L^A2zzsW5+5! z%ki6np!jJMOMW>d%UlL)cKB=Xa)npu@|FEUG)!v~(+92s!p^l9^j>i^X4UjvfkICI zpjVLRAa+Rgm3;&`B2>%_^*r*`^qI-_N~w?)okQ7(|8{RWeXpZV?CfBGmDIHNhlcPx zfh=oL#f6m6B^rW>ink$^0pG%|=%|HiNcydKxX4 zQ10EE4fk&xxO`I`52MLJF0A&g9zwH#U(+}sKZKLcZu;pRJ%5j>T|<6&MGobajiD;0 zVEgHrY<>TR4YI|fzfL@B@?}b1mmWAW&%BacXQB$9BONQhQwLPW-o563J&(82JEz&~ zm<;*#z(hF{Ej45#c-3IDU9u5p`Q_y`oP(VWS4-cm8&Gn-kGWIOEvGsTGb5i&Mx1PC zw&mywwa}Cb8%>H@A!}arpXlhN&NR2eg4gl%r!!>mFuQvSO3EQwT`|Sbu272ePrtzl z(iN^)tydLsl*iAVgt(|E8z*sx1Gz81z>alX`N3X0-kZzFet!gcwd`OqcfnZ0Yp@4* zW1~@?R*)BU_>By0v;H+0%wpr)aQ--qOm*x=ku(sfn;!FQ$fY5jx*RN?&|g9jYWb~k zc|`|xOBH~4=q@#v@0DBMW3=*)sHIeNn`{K_mK7yW)b%uDT~8cJJv>9@WSFAK@M#c} zOYg~Ms%_WUMzg^avJ_HGI`^hB(l30?Kl_BQXuE9aB7<@L5oC<-^kk6@yh?a6f*#ZsBe zWWz25;|nUSy?eWVw?F!a>j^ma0eex_cVd+x+l?|eZ4xMQ^`x91-HJ;p?Uo&}AFh+s z#Itx1Rlvd<81#iycro4mb!fks50~O4YNV$d{J3r{PiNTs3|mzzEos)^VE)?LecJ-oznEeE_X4wR561I&);Vc@24K zx0kRCZoV|A~@(30%H(BSa+j>bVaL5hgw30hWEMj7MCDPh^y#BX_P@zAHP43u}- zOb)UfuS6ls?Zd&nct}eZAk;7vea&`%ZXN!$8jqs{QB8(DbhqeGHWE! z9D;aUIY4pSI@2dFS=x1WrP4a=X_$OVPg{p+eVfNj($hMovOLj&>3}{ZwCtkBLAz{@ z7O1V*V~1H~ef zHAEBkp6F_*r*90QvPgZ_RzwS!<3}{G`t7OiNywTxq7813K$vgDpWqJz;DhWZ%1 zu(8FiDjGvcc>-rG3!nbi&m_4 zP&T3Ds-aV0S|=|QEFWt7j9Z7c@n~%icrYkzL+S3L$-vj)#63dE%P!g|*Y-@j+*vg0 z;T1z9fmR!-)^O5EG<4#a(wQDOjM(pA*5Vlh@`9m%xL*XcsR%SK;FeIPQD4#sN^Y#X zSlI+knn)u2B2;z_(dhB9R-3(LCeA#UFBYw7vf_&!&N_#X;*_!#Ij=l833~@QT3TatKsi zno=C@WA5Ungz*h6>x+T_N{SnjhbUZfuJpnEL6H+X((Y0*3`Nq|5y4ilIFyR!owJeH z71RtKW3D2H`CarOTKC#b7${r-ifdbuOWKJxG+`N25oDnr$zfVo5jkoQlFexl3V@r* zvJ%(&=omTF$@HWg)-4xsJ2+o!WgFg8!`XngPx=gd8wLfpSXl&>*OI!eUWbJOcaA3R zhM;U0L~bFS)Dtb!)Ou}l9zZ%ka)Xr`=#o6t%?p__NU4xWAiQj)CWPuu#C)%@T;W-0GquJF069#!wqjV`mtQOQSKHhm_|iD`jM`g|c&Qz7cVk+PE)UOf9LT_rL&*apgZQNc&nC^Mzgx5{1rMew-IemintWB~`=DYjFyT6Saaxc65H1 zJkDW9E6~qlDNvq#liy&}9{Q%u19#bWrz)6`u9qIW>FzRWVIiqxmK% zWE$R(Tpd5DiI_38qzuLyrPLEkNJf=m{eWEF#2}Nel^mJTujY7baT zVp#Fm4{3Ucp=H9d(!VFY%uwfg*p<}?-unvs)Roomckop=1d8A-fvORF?2SQ1@XSEf z2=)c4ezAjt2}N)yP)!q>{&or2lV$%s6J8$r)~WBQkw!g9&p}9Isk>)IaudPirct^n zr7>DgV>Bl@4<`MjS zpvF$}1kX(g6MSl*#@_GX#}leOu`KJt|FZ0zF8L!Vg(o`?#dT*(=Z-_(f@*2U!Py&H zyeDZmKe@IZ|qT?i`r=ZisA${_R8|MkSOltQobP@MSb zIOK_+Dx@6;XK(O*H%u?7oBTv)To5YP2(Am%*rjg8WO$%PaBrZ-=$~&TR7!|Gm-6%! zm%J*au*-QUPW*Hn^2ARS(vE|(H~4-tX;D-c@h-Zd;bh&}^E1K>d$Q^4=H_GG=*)}2 ze9MA!y5@+W1hnQ={QI5nnn?WWj4;EFiIaII62ICKCxQ~H6L)?7%ehZYO&!6D1GVj` zo_~Xp_ceknJYCr~mW&?;)wZJ5R+CP1$>*gM);bTxNeMX)c~U|uq#XxmZ}2@jX;D;H z39?0Vi4s2V}GjBp;Emimbf&KvRc_kpbkrngoB>Q46yF>}poEbKoTV#$ay{91m2JU|wRQLgI^@<&_?GXVXPLX`FN~ce+KO z)Ap4J3h2r}vC8OIIm>H2>|`|Qe&6ZB zXd)<}gVFan-~ArKXo6RvvdO>sj3)bcgS|oU$AM}R%uB2?`bP_v#jP!mnCL`uW;0S>X3bVur~-! z1gc3eFR@yko1N)3iJ9Oh9W|diWPfw8HweBhP)&k)iB;;{<}4rfuv3w^%fH{9k|6j* zX{3KeIVSs8gS|oUn}KQ)%uB3NI?H-J&4+s^Y7>5x<9f2ID+h|fe3BDJ@g{;2Iu!5h zVl#N5hbZ0zzw%7`G+zdi{ghyD5PVdingsI_t9@Z9+TU|sz;i-Sjo=@xG!iUa5PW-} zYJcJ2PXbjZ_=`Z*2!6)Rge-!01*%4ns)H)8Ul+X%ieP-6sN8>kw=4+mf`Blu9D#t1$ld4S-Bff^&YDNr?nGl3c-ctfCS1m6~@QD(yz163pV&w&~v_`^We z2>vusqs**Fr<@`9xIm2&yf9ETg3k`r7{O+sY6Pzc)EL3TfvOSwt3Ztr{A{2`%O$2_ zs3wE8G0&Wtlu7^O7Sky*vb@PfzbTR^$&>^j~**WjB5HRr$>Q+cQ4$j_;e5WTZs@1JI!LCI37+3RgIdzYt zE=XahkairLy}^fr|N5`O8&-C2bb?&#^k0r*%OZt=h2XPpLRVH=$`y4hq#XxmZ}8m| z>XyWt9rpLZ-?DJWb1X#HOz;zqvaXr2|CwK^7yknM2R7IeW2vNc;f|S8U*vqRkkT#J%l<09|%;P;P)KWSslvzNH8}D=9xRG^N-H< z#bB=yd@xX>1Szp{pHX{qe%2imDf?&SK(^v#%U7{d@5-K!Q z7OMl<#;C@G$ zxs1&wLV}0d2rJUfnDAx6+#r}|t}cStJJSup+$4C@uS}WDzZ1+2f_diZly7!h-ryn1 z0>O7Us&iQ&^IL+sK`_tUA!S$hmQcG%@O6%wCuOI2Z7??o=9#NgzSW!3w|fYi32yS` zrp_s68QI?(>ee~pewu`LxtgbW2=dPk zIyrGqO5fhkZ=O$u;QG~uxY0xSgWw&3suTREqvmrFCEgtD4T5h9RFhy{V%bHa+kKl& z!}~pih6HhBQ2))R4%xpO>jA(H=c|8Be1Bmc`nSeH3?d!WV$e!@}aLdO0p5fc1G8zEzNKA(w<5xh50O@ja8 zC`*K~2NEH{AGZ-Q_NW&`B5vBe0UhwDFrq>58G))3q$Q$TV~(+hhi-L(D{{Iu<`|nv zgaqjblgJpY#!?Z%{|w#+L7Hm36=qgsIEGZ7^x@Gg;EuJjWRG8H5Ds z3?pQ0QE0uHAZ-LM!LKALf;8L2F-FTVq$S9FH$ukfnu?7@@zdYA5AF;fY^Q07b9>37 zHWO6zQ=OB3!aR=>=n#G6AanPQ@|-DuVP-#WXT$_a)cmt6@$33>W#t z@NDhL4yJ_bf9$AtC8`fNm=Z1xOQR?4`jWeGyC>Y6eSee8qnP{Df_Ns)bcttTU-iU^ zXKp^+>ooDnbc5#A=(jp(r1%Pr6knl{;wv;#d2f%cAYE>RjM3{LB*?;Ige)g)C=DBiJJ54{ z4qy@DprfjtTgZ~?+hzV7-*iO7PLNg^p?xm>?d}fLQrDgtf*lLy0`&&!oK?m^y-@-Q zKF>dair|2wdT|DBIy-xg@fRo3zjpA>K-CDY>Cf~Z1P(b!dx5fV^ZniF7X5ML%jRdT zG6pIL^$BkDPnZJ`tU0PTyE>bJ`ivh*q(67CJ9MoPJSR|_37+dH3S|5#i8L$xi(?yI zEO|5wqt>s=T!Ohn+lYUOt40-xrw@C**b~p{a83bVP)Ke)$Uh7)Dm40Z2aOb8p^@S% zG*WzpMv6BD(qGpoA#%F0a-wDsWaUKlBS@cGWuZq|vUBy6PX3kklwSXp^_1CQghi7L zn=CV^D~I@nH?yq2s2WA9pg&DIXB8!k(K?z0DrOKXC1l;{473MSxx^LhUCe^OuwqcU z_+k9W5dBickh)CQogFH5wcM!u0cWLQDem9bi^3`wP;oGs)>hMi30cZQWF@*~3zBj!O@XnSYHx)<;x z!-|S1j(X!NbJsgPL=Q*sF9KCDwEScL$gpx~$&U=HozuOD-x*d9E%}w{?+mNW;#Y?AnU%%AgP!*#JOe}O|Lcqbsb3oTZJ`or?6!p|q|w(FHM8;$ zMJAK$Ws~bn zh!8;mC|#8T0(t#K2HxNy8b^X}2~?fn9|x*Q@J}2i9bI#du@41do#0;us!8y#+jv8# z96(*(l$e>s?Fp4*P_PSsZ}QLoJZybu zp2!HE>L~MQN-PgC;X5MX2Ei`|s!1>}v1(uN+s;CzDw^J|u77i)AB6l;Re<6pGC8h7 z7KW7v(XnM6%ny1Raa@H6O6Xj!b$fH^)67}V@(}q#aN*PK6Y4v`a~)+4XKZ~UB)GYa zkg>NV!h9AbnA-G*HVuN)foc+@I2$=8Dece=&UkAGsL`AgT%Qxrcq~3^$>Ot~JV(?y z@oAQyXznw@iduV07JIaRKGQ>KnFv!vWwr`Cna^b^9n}eZEgW%f&)g(x9^B1zecE*1S0X3R)sq2$#4v3nJPthFE z+#_K{Wpi+uf4TaPHYW`aa z%;>z!ykoTZ?6A0E_?cy&abfpHsx^XNchm{!&{r&Z^{U>pD{3~byL$p>cqk=7(KCCc(?jkK7`7#8H-8jNO_D z3BI$9kg=a7!YYSk8MV1Cv}q8$Jy1=86gPjie$E-c9Rg}J=L**+m#st{j!%)TH1`!@ zMdeszw|}1YP_mUUMRd$oGVgQd$W|gKVg78rz}$P9hp4Lre>+fhg70>eWh!HLB|?Jt zwh>n6VCFQB4fY1XzCbkz<|THnn3p)?_7G5`?!W7(Tn-ZT&iE8LNZUS`1XWq_2LJpv z4=^#QFq6u$X1$re-cz>#NYbo zfACPUl`utg%vLgg&Y2@yiJ*ke*(y3c$rL-mLu4w!W}xZ>M;&E(#n|pdNN`UZVU_JE z=~IKfLGau_H3{Y=cCMI~(kfq?T%VRG362Mj>SSr}GUG+D4^8v8wsMPSw| zf<#clycKQw#ir6R58+#a-w0Hl;De4bcQf|=L`d+bZG_3{JjA505B3JZn*!A&n3q_U zFCv+0emmG}1Rn@gogme(ST%>NuCA{4I?o-!yP4p}9HqI#$fpxs-cE%>SRyJ-f@J@I zY2NO#WST`dv6fFQmlDigVyII+M8*>Q!=qJylcOwS8GBbEB=~1-gp7SL5fc1z z8zEyqN`wS|(MDLdLosf|>0wNR;8O$DB$$`jsi=t5mpJRKA)-d`wV~%W+IV+D(VFiB zsz&g~fhw)N_T+8zBtPb%WHaFlLc}P+-wafZ;4Og~Wp=&aQ6h{g(ieiur!TNH-C6d& zc~p60B+{ZA@`)&a?$1JjxrIHC*uVF0UDQ8c1szYxjR zcDm&KkwUo@&%W#Q{Z4cmR?uu?X7TxFK0iDAobyXAMQUg`wmRdUNN_X3{f^RxgONjt zPV{a27s3)zX$7zc989z2vLwR^C)Rlzj_DU!%J1|LO$NaqILg`w#(JZ{YZAP`QAWtv zibP0ovW>9KrF2pQoghfI{*MMWThrL)5kK4K9h{ zf^5~g^7V}}T}6+&pd_sFicS|az1LIyHxIFtOOKrut|;3bd|yd?MZ4SMclfaLQ)&1~ z@auu96Z}@7ngqY?C@buY{Wu8g1b-f=Cc$5{@wO{wG3xS_#LOgqkWfWV@!)6u^M8-C zC;0B_EMAhE?zKb@dx!!?@S+p!lX=A8;$O1ABG?-Q-xjDQ!Mwx{ojFYYv@`x71k?zg zvd9$Z%C->v%3?$HWUqehbq{#tajv=|i#m6sRhJvsC%UkAJCjsr!j#&Zy?McB@Q;E| zalt}Mn2C|Lm>x{R|Ct)~Rtc^FQ^US56Qa(?0mW)D&P2!19|b%LLD)O;n95?>SS4T5hA zRFhy{Vuuo$-Q{feC3b?3A2jvR!w`Ieqvq3*67LU*4T3)iRFhy{VkaHX@>G|GLQR7E z0#zrt|2TA{#EXNyL2yl=ngsI_JL!1kT65O4hsbM!e;TMd!S^_7K0i|8kzj8Sd}*MX z1oIL*>3Ey7-I3S{{wz>+f>tLQD+G53sjxpen-uh*OYjA zur~-kJ5Wu6d5N8LoOZVB6Fb2#2dYl+D~_5^M@oD}ur~<4J5Wu6d5N8LywBMlOzZ@o zwm#Z$f=_qUd^%F%k3wRD;DV6YB$$`jNynwmwkoj`e14$n1Yh8&`E;bjb-~^s*a%dU zU|wP;9j|w`n-e?1&jhMY@UxDZPe)38O|UlzzAaEqf_aIZbiB*i?n~?hA3qd%P4Eeh znombcygwv12>u{YO@eueope0QQ(YPgH3{wuRGr}dx{(kvk*{2fp5zf!^kf8i)O+p~O$EUP`1D7qJ)uJcbtMRK30&?dJe_bDl2 zP}hQ=c&ZF5)_bamN+!zETb5A@6~-j0s3=fWFcrFzI4KXm9%oPRElD}4$`$@R=vz_U zUQRGPAow*$%~wgueqOLQ2<`|}lVDzAb(?_$p|0;#=-niEYoO``-{PqGbfm=TU~dq7 zL7eY27|pu@J)fL zGm-z3P}SnHY{*Hj4AL6GHwS8z0^b#=8o>_)YP32H`r&tiutxCKK#dV(N);=ICGn3i z%*h@i8widBs!p)(D9Z-MZc2m%U)4s)*lQ9Y!PmACGIr7xZ}3nKV-Ti@$~|HcL*|z{a~#GXf)eK0Bfihy!~VX9@HfGo&oW(MG{OCj zGJiAnjo%7F1B!o{$d4nD2EkJzktRWklSC?OtTdze?`h7uE=1G_UJmQ9-@vBO!jRrr%@WLh~DpVAxXPdnX_dUmj6E84IKy{)NXMz-w@{32&ObP zGmTFMRn`4SJ%9UWuHi?++|4(7atu-03EtwL7UKbu>Bru(;Ox1-bj)3$V^vbJ&j#5hY$ME8p<_ou=3!?J+lZiq3fn}1Q@#6pOmu@yf=e7_Jp#3D5ARxS@h^FZ zK8D~K1NI4h48bu+9goDXhr|ZKEF?Aw<|S5kDA@_lv@V!OH#*o%sCKIuqu$R9!WzLO zu3i>br-1hGN*8lgh-(sjYoO``zwW5{oJEOO2YZ9y4S{MB%uB3t)~lW6AA_~rTfrhK z_>my15&VZhb#MV4a+{Cl|00d*2|g64I>9q9H9m6%V}p)G0VBAsjgYa)L`d-dHbQFE z9#Y4ThC&U3p9@rzU|wQ{bEVIj=ifiOz~_dlqtyOrLLGDPrGaV?d_|x}3EmQ@2Eo?^ zYLwvH0@Wb+_CSpiygg72f*%ajD8Y{fszLCRff^g5L~OgW&yvsw|i0 zUY41~L0luqf`bCXa&T3mB6uWFb^1FcJa4hS`D#<)^&X-zBse&0pU?#mT<<6=)Qr76 z5fZ$yjgYagCBo`*MQz>^+B69MG*C@~6erqL6kjCqL{IRXNVrDuxq+%z=pxUpqWGUT zW8d!cuq$iP=%c~kqIrLkQ15c^6AATq4*o+z6%+32(Nuw^bcQmfr+CU19OYBE;F!Qy zBB2^VdJOAB#k3K3qn}nVdO>#L;stX>yA4}3-LTY<+8LHQQa{5UzaIEeg2ii2Q2LTK z`ENy?^52S@<-Zm6%YQq5E%E%``)>t#(O<+DwIjZ$8SzD}i0`0L#@u^(6xn()Nwg)! z)PO1`1XM*D*-KsSO&&^#BYa0nvx-$}l>E2O$;N`bMle;hZAAxS4os~-m`XN57Bx_n z4Jn(YZe!!EhWGKP1A=c3RE^+A4;!`Rfx*SUl=#A6ZxH;OKs5>GC6-+)^}zn!?5zE+ z0Sd-|gIg2o3J0%Fs96W!o>1>}kZE`58lLK8PY=%8Ee^gmp{QVcc$X909fVDSXI*2Y zXaEV`eAH0$xs?*X8WI}>SBAtU!Mw!z+?r*Nbmps%P_6o`gEuDBZ#(#wg!&@~H@Wig z;${b12{rB@73$z?OMBEsUJzu^%VGtnweV=?TIH!7~EYBuH_hO{JBn>Q8mH-wpOrs{OfyDl1s(1T*}* z-Z^gcP})_(l-jXfCG*RiIoeesD4}D!3Jvhjf1@lLv2i{|i%o*x4^*AtX(t+&d;Hwf+xRFfdZRp%J8OBeA?k-}g7@@5zL&mPLin(%ib zxf;R$aFjluRkU4rUw4wF^5-7nOgh2O1gc5!9!K?LN4w@2`S(Oe@S#N4J;%t&;mIb! z$2tn~dgd5;TB0MkGSMxVW2Bbo2wsusuA7_j2y;@E{;VUJ58{J@pEdep`q#^e6!c>S zfr9JwkNm%IIZ@V$=#B!onQ~v~@`IKLS};$&xX*dN<00wc49Cwt}3C7-< z2&>IvA`eC)4T2{IZ<8R!RTuRv8*!E^JnZC7(p~0s;T|F=U>^6}=DdIDA>2do)2D=c z2!7sC<{rjg@bDn4b`KM|GZJYK{92%z1SzhQdzi*=xH9L3o;8A>2-N5jS8jDEIeNK+ zy8~4t$h0daXIb`FE|ty##H>vr02FuJ`h`QD z$}l%1((kvsml!UVT<(2A_V~Gb{L9xod>p?#V)jwDEU;_Rk9pM7&+p0}^T@d>57XPn zQduE*UC!x*S+r0p=F6M2BX33to}bGb!YK9vZ@-SsiYrf1$)o|NjJMi zACF44{p$`go6(F3&l zF@_a6+OwD+8Ft#S;CF`I+4C!QEclfneiEZ{#{xq{``7&mFD(C-t2cyCj1FMg9N`NB z*EdIaec+bQ5oXw(t*FS$-Oj6>(8XSoM1xJxq&Xg+sctFMG-TiH8+L3xepIor$`7wt2hBu%bQd zSEH+2M-jfl?Uuf~smmQ(X9ftM`zHGFvCiro7{dESZ1c%rS)zM08u5 zi}}@^{U3K5eO=+>g~vm*D2P7PIU_9j`+TZ>f0}X=eC`G#!F-b7^BgtbG?)^<8xk7? z9~Bat1oIL*O@m$2Z5IBUhbT4#|8YAt9VPhhjxtRdV}mBkG~P0t=%EoZ_Oh!(q5;Lf z_qi6|4{aI*PYG?B1Sw7uskE{i@;O^$QWo#Jxn+n4JzSg}#W8}%_nkXO%zyfq6Ya|i z`Sx?iU3#T)OZQE9pX0i+5rWf>>d9uh=IDfeca89F*HxqoC)nJ1@l&C$2`j(CVBir|XN%(XCz z;By^iEe~VAmk0^Iv5hcgQ66H_FN~xc1V0d{Cc(VK%JwMx4NvpQp-$~(4*qsRa z`%|76!-~#b2r2d%E=xLD!t_MPPL|A1b>`?~iJ*jz>*TAvBN|E_62Th-RVVmLM_ERd zY*qv%)`Go3a7Un;1oINB{hwtwJKO6LJHfjGRVVoOj+#$LO1w4L8wB4Is3yU@#7;Vz zFQ%Vl;Y&P3o)hdj+diS#6a22DOjE{wln4p_w2hFl6VC~W1{D8Nn^%T54TA3tRFfdZ zi8h_A{I;`g4jpR*|07UiWd%#kNq5!_ZGY(E9_hT&y>4=tas^iuD7d1r5~n=!;_6wE zwc^)$yK-)MP=FFdq#c3!^+Op*iQ9Qd2W=>Cc!@oRGr{c zmKc{+0mh!=Sk#rWE`nhqPYa0+g0(<32~u3gl8s!v!P(v%>@|X?gf`nA?_gg-RVe6% z;;k;~eMuz2Byx-*X*;@Ag3BV68o`wCSVhAA9__n5!N2fO3NGQl4Q1*CKj)~PZ1%c2 zMtURddRfDYT$yztFAe#nI!}eE%4ZYlzdQKDgd*4zifpDL=Oq+nG8ET;&xIrts+>#? zhCRW@l;<7bkS)t@_3VDXhiLN&-W8}3g7-Me3Or-?CqjZx>9!=iW_avk4>4gOxTTGd zvE7M~;OpB68T+FktQZ(3EAtR7rcG#53DO{|YK(m^%xe(*VW64>^AEnUX04#Eb(!+~lNq$iA*vE-LV-u5C)U;K60vzg%CfvOXvLnNuqbBw(%bgC1i z7HDV*CWT7tB~wj8yzLeH0K!OLF;Q^TZNSRg))@p^92qoO*8!!WzLOu3i>b(NDA|z_Y$@IBIyfjo=yA5;aQj>5ekDF?MMpB-m^t zWb9Rmkl<_E2pM~OB5YTeF{=I6P`g3!o0I@Xj%t*RM@cclH5~S(#48yYQ zA=jk$7#&$7cwUICQ`B%m(O)l0sIq4|XRR*Qo#Tn#;GqmbzTxn{CWV;Pm?tGB-ogiICvO+6XOAihr5(t-;k?tnzI>cIeJgZo5L_7&>IA8U=+u~FY$6d7q!vcVSkkGoqF?WF{xsw@ z3GSTl>rpTK zsYf0jZWuY+!IcSBw0VIbe8Wx#-}KYPo+@tLFX)*o+HY98;3wCM5IJ8Yw2UqEEVq06 zj6FRH!gjigp|LYoOYGeX=NQ|Tut>_1O@9|AFbtuO6D=Nb|7zQM61ri&lZGXb@1e<(Jo+62eKC z_JNG1t@lh2GQ!LtkP&R=$OzLbAS>Fx$Sa26tDL|RnX1dOQn?h3Xbel5;HWu^kKhPX zrS5E5sX!HV+~XPWhbbcnri|EDcKWum)3+^g_fSt{D#7IQZPaqYsU_hpyXM(*!@P&bD63k1i9zNdTOrJ~41RvqMf%BLJ{s8_ zqmm}U*R>5_s=Y(@1Hs-Pcq~v&f_aJ6>fGu~Z%@nw?{(CC-XZ&YgS|oULxE}%%uB3R z=RWV$@AnX8hv50XWdClkHv)8aNbGVjFR@ykrA~QqVkUUhQS+%o_U8tBgW%>s zH3{Y=R;zQpGrcr16I|hCaXxj(ep9eF2;Lc}Cc(VKYIU-%uQ*#z)Px$r#|Nr@j)O}R zs=9CscIhMS+bcXoei7__lzqa8>tqL4KRQqZ*9EFZ@FR~6Dg&zjmXmHU=@TO9F@jV< zJl>dN?7~QWjNr2Z)gYJ@Ds_-~)yfKOrb3HCp;3ZVK@{3tq0lH5dTuDRnP5`Lo5Z9> zuEPd$(zE3k9_IH{slXPOpZ`YOo=AKA8V4VGj3t&Q58UbY4QG8%bnrlmT_ zc^SzB%E&S%zt7X|&3<^=(|@#Lj&bT#akjXt>%R)NcW19&UreN@h|u@}=bZCUMkXI} zm{J8t58m#%E4X_cW?>c_)qJCyAvnU%ba%=~=XQs`m&4Iz>)ek*_X>yqBXCRS2>&c_ z%jTZ$6^ZVabSn+cUg*}bykbOCE`Bu@KiXC?$mz;X^+cKYle1U<<#o3#=v#8~&wkmH zopIuQJ!ian{Vm-WFF7%L{uxht^{QLCm!G@ojI&FMK?OHukB2U4`I3_#`sE^#v`8hb zTyj$O(0r15Phy5L#QEQ~OG+u0>7YZ=UniD?Ri1-h(95(KqGc?~$`&1QzcZ{LvW+bg zqzq~@gV>Uyoh8T&s_tHTjwji!9+r596*K3a#r((+o?TP+Y?%&^`o`f7x@A#GS}&+N zovdE!t0C*tstCa?j;c1lw;MmshcqeRVy8YSJDi>P%j?cK@t40mV~)sY`NxOlK0as3 z9MMeiw6@Q~Lrcz{bQvP$6C=D%7A=4#SMF|w$NybD}cho1U#emb>oZ|Q1FXwX9>L~uu-MhWh7lu2dmXd)!|{5C>MqV2B~@vaR{ zwJikH2r@-9NlfNQq9VxTDjKeo+Re`}_;nt_M1uDQs!s4rjxrM&yFU>U{MRH|eH@-8B5C9E z%XXa}biRi|=_bJomKtew8SU!o_U~uUOP7*c>U7Wa5E)JI#eu35d`X*B#(p;u61=&M zFeR6VnDnY(Zx9>_RFhy{VmWWRvi;8Tf?%!4=ps?4j6PHl)+wV&cg*P{qlrk`RA#if zgQndYsy7LKH&Atg4>-z70AoK&gajXIBg}g~!A$z?!QLSFp+GeW<|S6;!M)D%onWoV zgCbF<-w%|VV&}TbTy}sJRl-zv$@T5kKF8h zZ}t%0C-@^rnX9XqaZbQ#{&%o92!0??O@eueRUZ5&XZf~=)hTynRdi)}xEfTD*U5>b z`-anp6N#Wg9j{!Jywhix=XnUX5_}*~b%K{IH)^w&v3-t}L4|`a3RIKeJKJ~}`$-Vi z2|n|}d?Ji(b}SSmc(9F-vEK>8ddb)#!Y$ksmNp2!$x&A98GCyoBuI;mkg*qrSq*|T z#0VMN7}_=n(f}hYs%-JoU6J>NLZju}7-b^cB9YN*afnL2y&StW+=NP9M;HD+a?24VYvV~uD^_PTV zoBzVWj|8grLkC$5VK>2^&~-Dxg`w-!_&uSs=NLaPkntqQU?Irt{r_D7UvxZ%$~;H^;n{xH1!glIiGSTE@v>h-aZ>86ciz zfdzqh7Qa!iMZ~iVzN~xOo#Yqd0Axpf~w0h$o2&&Cdtf%Q060>98eYA0;-}%DzsV9%c8=tf~fZ-eq`8b z&6D35Rz2c=Vo6%3N8GbT=evU#Rw&mEKk_p@1u}XlHO8fOzUTPFGm|(5sA^vq@*~6Q zrOT{DhpxL=-WHUI@GQ?e^2J6uy0Z1|oJkL>6a(oo|NQbGs}X!nph{X~-7of!3@cU- zyBF~z!)m+BbQsN*mTY@V(t1HvwPf3sF{j@j7L>9#TgZFzk>iceq0L zc2=x=0Y5UVDArv)EWr#rWbYTekN$eg?rL zhMlsvy+%CXp6m&0HvbxfkVm9p#Q*Fd#44jzPpX<56jIgyFNS+mCk^sq`1Tv&jv7G@ z(-z7K|2dDPm(uvF)}AjZ#&nX|F>!fDq*Lc8m;EuOM&+SvJxMjFE2|ho7m2d$HC{M4 z(C#!_B;6aGK4yzVP{2I1#hZO_^Lh`_To63rB5GYHc#@-JP}!VgY(*k08zUGd@|H-X zLGYu2Y7(Tl`Q}G>@WUCu90F;!bc}cM0D9gAabN2$WGOXw|&?W< zdbS9D-BDHy7<)q`-y)b#zG}5dHR+zAjMP^ZF*3C7v0LLowCN&M} z>Un|FGprc@_AKT{h8Un${<;{yGpu?HaZyQHr^gUc$};Bj--KCXtR^eNtdi?`g75ak zSF~N?r#kED9-_S`c$1^5J0=rG_A`UMLGXe=H3{Y=R=2LJooPcb*RF7IBB6?gbY*M( zlDT}KJ#b*=7rf9h&1aAxWE2tOwT&fCd-$VL2P zSX3j}3JGKMD9u9SMQ|>tY6NL1s6ORiKND1*PReP49_^oh!$bB$j9(D!9ebg>UGR64 zAq0~l+scM)ql#aMG%9*iQIa`L52M2&m{J%mr{Ke45t06p^HfhY{bJ=sj$sDQ^NW>q z3&VCls<(PjD%;yJ4X{L`NW`};9Jv~NJ!5*%@~$= zh^CC-nn&2D>h{^bk^QN`-XM4+P)&k)i4_e;*B7abr(CiA)YY}nKQ0NP&8AE4Z`Y?w zk}50kT@N>=FL(&+37+N>=Chvc{~YWMf{#4aBts&>yu=FYUHyxlaZL!Q5xg@{b%Gxc zRE^++fvPllsq4BTbZ!#7(^2!8O!nsldxPLupqd2p5<8iEz}a3J>@|Y_J5Y6k?+;Wh zm)`;2dWwPX_7LtTc%E~1wvNp23+4vFJagF)obvBl+bo!Cr18Cb9)};B1l!~xmtm!Qj|E$lU$JOB=~NA(ltGEZ0WDlJS^B7 z1fLM7Cc(VKYR~;Y^4xMa4uG%*LmS4@NJ%y@!UKuL_XWx#>$8*>$wXfrmQOQ z13%F>vb}SP#2oOCO6nGKh_ChHBf#+Mc%#6o#?*7pfU8y0e|wEh-~*mC4E(t#Wv88w z>kl4&N>ekU6dtdV-CBqE&0c&2_$yBu1y(h7YTaK|?CHU7;Gv#03_Q$}vaQ>uzg75v z|INZt;Cr>6ZmmQ7w_bb%C{JtHKk*l^sxfVynQ6~Zp>w=&6L^^?WuktH79yVw)yBRN zS2pTj95H28Nz0nrz%8qv=4Z+Ck>yd@Vr2}L?PA4xrotM{WBFHx#3AkHoV+$kgKW& zPt|r$3+)HqsHAQlMSOQJJ_6j&lSYA6jj2b?RQDDYdYcz+0zcqMiJ$6?#af7bJ{Fr1 zS2h+ekC?Km#C_c85L) zc(0~nGjOR&cD5PepLpRBU{yFZuhF-^Dksf2zDK&B8elW7U!9s-#mtu3y;soTlO>;B8t@XD3HS~r$yZM2Xp16-~t#z-zQI-F$)gx4ifWa8~dIu&OcV zi^Emq5-*zd#Z)^n7sW1`ip{`TO6qJg!n=9l5nxp~XP)y^_*Z9MStmw;Cu*ro_P~>r zwS$_J>-LlmK!9GdFu83FF@Nu$83#TI zJ0|LQvDVQi!dLd}St}u+Av5-h;tZ9#)LWR|gf2EdF;l}cy`r>TN?-(jy^S$cS4C94#EXvrpXEuT zz^ca77f$bKDt3k!ZvwCMq*WhLcvB!%&C20Bl=Y`xWE8ls-+>GR5AdW>;36eC$B{e4 zGY$g}_oPwaGuvdz9pf33%NEmu$JNpuJliOeM+H*cRx^S9<0(ltyj-obdQ;twTKtT_ zhC7x9QqHhlo|0svKyGGd^;EY(!OJz3(G9%IlU4!0rzF>@lsIYFZQHSAnHsdo#qxazQBtQ0#PF~ zH?XQP|FndBGfOp{>oqok7br>A|Jw^1eR1H6T5CT+3)}mZ%{AtunyVU=Hqks|l9L}S zbMl!6W#nZi84C+3w%jaY)V#$va6FPdUM@H$QD3c2FYe5e4II!l*F{&AImJ6DNqQML z*ONwpRgI~i&ES{c*jBLvY|iW<)@)Gt=|Fl&AsRD}=($IOQgv%lcb!+aHdUw3GpI2x zQT`Q5e3quN#{&kVS3Og?`2`@E@orGkZNB1BU}#732#TJccuTHTWOg&)ZNU`krIm(_ zifLwtGZ<^uA63<#f=Xa$-7wle;hQpy^3aqd;3g}#s+I(m#v&}gM7azNe5tRe3H+=l zt)qQZ-JyNO9eNG^BTXgPfiIlzjOrHbi2uxsj{s-x;lxEFu&OZ=>?X3Kzptv2$Goy8 z@I7v>(<_eX6_Xu@#XgyFOa!!#k(kpz@$uKV{qyfz0XtgR{BOH=t=+tlmSldo4d%H!Qv zE5s}z;atoT5|H1AGs;{|m4AJoUXiqV%`>!`Q1hA(E9q3saTTrf1NemiX%K_lCYT}wR1FVU|WF%F~6J&qtY12OFJrM%e2V2YCmoGkf!#)ihlfy4tYy7-0@#VdY1q3#)|Z;B$AA#SXxYs zYtC6+KXi_>gEYfb@1u~kQzTJNnvWz(Njpc!_G5TczodleOuaG?i-iD*vJ}w69K>mdI*-kWP=5XjG(s8KwO>rTt|_Y5ILs zS3#^)niSh9q*!6D;q@2JaVkkOO!YnrNjn82<)rywq?ELCFrKBxk>-rE=EFeO2_p`9 zgJ0>^vhQMb%cyJgp^7xaWU55{Q;Um?^pgmHSXxXRM_<>ADRZr}is_nW4w-urCUa;X z|4k4A%63#`{(K%nsHGXpn^pWkl{;S3p5mNaigJPuH+E8vIv#l$gUb_fOB|21xG=6d z*YWj3)mqXFlg!-_Q>Wn)^W}$2%++zYOr!;*8RHrSg?Ko_)H5DUMX}Sk`YPqic1p^Y zG0gO2Q=R+r5I46MB|C6hCvhXxxaT{_-UiYE%((KL<@L2{FKLFU-bW#6r^un4 zG#@#Xl6H)oK3YJUGp?WzA7_{vCnouy?k`(^7j4OWKPP=gjZ!k%&nvmla?8Ui5HL>)&R;TL3SxJwqS!x5 z#-pTm0+oMa9~sMW(#dMe#G+-a>7P|Xd9IdBvh+DE`JCqqltgob5LI?dU$2gPzos&T zfhd$9d8ZFNykUv4CoB;^)N}+`Vy|Wh9!n%MKTHBZhK=PTYX7^c@iUrX4zirxS{iOC zFmi7UZ3fb28Ln?tzcSQ>6t`DMw3fCA3ENNh%^C)t>Pe$(6f!+g)og2uQ^}7wK;&2Ij^@ib-YHn*B}(<)pnvUGJXB$!A}pak6sePCsi6f|oQi z;2RSuB<*A*<)rx+zbPf{_To1&@EMJT@l8<;zcRfq$OW%ER4W)t4=7Wfyb1iV-p`lYMysFZO3^4JN67uVlgjPl z<(t5hl_dVTW9)}ho%H0VyVMeQ-PvXK*VGcv)Xc^zF|In^z0cLULNnIVjB~X)azS>D z!g*?pkOmbV?LPpp_N5AsPy>Vun=YU33=z`X70&lpJ!=;$431kH+dWwbvF-5C-+$H4 zH4`a#gYU65!26YC*uXSj9C`Z~nYwqtnu8Rs3?v}#GU~vuQ#Pya4Vt;i%Qo>Rp0a#o z@R?Bv#($QP44yQMU|eV!anKW`X%MWTB_RmbU~~wAH3Y%SeO#>Jrtg+Ox=P^&A1Z4I zm7RR3tRbdxgFLcA>*x6BSua1EV2Q?P%O%Xy8}* zeokCw*kYd<8vet1vIhg=N5cljp~42lw}uV;LhtV;5WkDtfOLV81k)E%0aFa!V%Xw- zF*N#!4iZryeP!6<&N4JQZV%sqO<2l<4k_!}ZC#gGZ3 zHr4dhLpr~qT4m#AY+smLFCAC0Hg=XY)+ZAzG#y(EjnAqORJCF?tJiEFQ;SNLFJ|>> z?C~uZSuySy`yUlzjyH@nvpQ_RD}C^-2Ch+()ko&Szz6)#Dj$*isE^#keB|EkqjZQ# zh=?=hfj_3vXX_<%pAX5UJ|y`q)><(HWK@gnwlOl#_o2JABxISsOvP#F9+rfz>(oE% z#)M6Y%#FaX#~AjVC@mPmGRsbO(s+CRezJpraEC#!gOVw z<$J9OobO4i%O?h8-VOIm=&cjDI&O)+(=z)yi0J#y75-c-<35hWnMludFK!+^o9mb!NL? z(+pF+fa&(mOg-aaD(Y9Md8E1O`Y0roV~xzu>edrJ>8|A5r8nUk-$(qNql;pq1|l=R z7<{uv!mmO^0GY34rnyh2Y^H7z1TsSi*B8|vzY5(3{EH{8XL|jlPQ9WF_$5zT&tBmu zKT$S;T>j){KwA2w(@DCIo~o&t{K0$pJ@z2*FeTZ=gv`po_Zo$7(A1~{Ume(hpH`Ap zN9Lx$_kD%;YiiVie;?R@+iQ1Ob!4V1Q64H8P`F%EqYiw0U<2~g^Hv?1GXmdb3a_fD z1HUh@0Y9%KtBy-ouzP-rlzsr%L5zm8YNkE zWI~V+5~GiVSdD|tTy_%WT-@{&lZ#qOR1?CE8q1sfXH`Ab$tVG$QY^e<6q73-bQN2R2h`zd|fQ%EY|lX=uV<;&eq*)Gx6 z?S9G;>ZX&uyH;_*`dht<$ynSdkUKia#ci+maKcL}fp={Zcs-LSCY9D7mp-kV^2sf) zYjd}}CMFu?mY3zs4>@7YSd@dY zj8}WST)%Hgaxq>jIKw&BGbMLCiW-G4QKtOmLCTj|F^U>WNHdd1tvEw#;#f&;*TgRG znMCVJ#jIm;!-sOx+;ff-6Kxs0%&7+!k&0#PIY_g{_Dn*8)XjAWkveMH*i_y$11Zvc z(*52qj196VDF0DGF1EqsFETd|;4>2Fatfp77o;dd##Hjuun@cuxuZHxZ7 zUW>ox*_yvl`0GH5glzWVNsjtgO{HnTSEvIzI}71|df^dZRXFvF1bXdcRnNCsWhMZg z?p;3|+uW#ADe~qbF6JugPg50eW#*Y${iKK~t4egw(f0NGc8&snqomGG3gY{D@e$w& zo-_)qYRr4?dKJ3K3pasxc~auJT78ukBA;z;ePhIx_1woJrmQOQ+)BOtI7(9qFW_#f zqMPRsKf#NS0AJ}zqrj@hyyt$VLJxZ3Ca_P<$vs?Ef3@->pKWe^Ys8iH+`SP~R+V_} zO#RToMoqkGwp5qIice%4_xdS%}JYDPQ<~hXg^Wr1GNx^f#s>alFVvYRmreb_XR9Xi- z)oUCEuJNQ~pK6qCP_s_==8XcYpYhCpoDtzOyzmIHDx5Z?-upQfA_onrvu8@=!duqvE-N%q%q$wUKunv$GJJ@{{pBHqV9H=DZ}aNp zNt&8^z_hpH=QpKW?cW4VedQ3)ka?lAYRnv!=bM`nK)`pH%LMt8xB&94LKi^fZVrsV z&nd|`LSs56zMF%@*bSw;8s)i;4nB}uS7?7!Iffxrj+ zbd`_hd@b;W${eya%0KVds&SwVYBKnbpeFyBP}!W4%4n?B5LZ{!)~n1*yiG~WNlC(H z-sDAuwBzSDspExOhkv~n0va-7&sh92m3x)9arFBN9|)wlZN`IVJtavQJSxXmJtewh z_2y#r4a#6Gk9G}8dWSE#Tbi4f56L?h9iVio&nDz*ZD<4J3Q4=KqFFmkip z`L7JwwZPq#0^Yu#^iNL0}W)z6JCmM+_Rnd#RiYAb6SITTdYj*KQ z4rBLRPig|GTLjald`K$_-_>lUOi&i7^5wpgQQ)JVGz|Q!lAL47^|>b@%%ln2PDzfD z%Gy(^ewMFi1bB)kjRLD0^AjH*9)HLSH-T7MFRnPY-3XKWfC@b31(V|)`CV}>L}g}J z)jiYQUQ;smT=je}w&8=~|J$Fhb*nyeEwUZ&8v98**RujKjch zdeSKHTWzxBzV8_`Bc&)_uf^~7Y@IBj>2VbCu*emE1=IW2{#4bI(A77@$@9=Ensk7nbg8I}j zRVlxYtR1me=n&vCPZ|aup(N*Ja;rS!C~$2Xqpz(34poljUbqQd=}99M0Sk>^{#Vr+ zE!$N8AALQe!0@{l!@ya3#p>Ej?o_2_7e{NVujV0N%?NOYmtF-#v8iUHBp0g5tQM}C z(4N2fiUxs&uV@6gnA!V>YB%yU<%Z9?2dr7o3r(cTU;xbeGP> znvIe0Q*)!3I4^0eB_?&rHSe3$Q`>^arcxUoJ5W6*miV$*m$3w0q*Z=seC%3Y1jwmK zmAKAE{Ax8*E~4M1@N0n-Ycw76bv6FCn(izY_1phb{$?IKyE1V8pvC*?RM3GfuAyFI zp`#vY^iDW1=5~2Dgtuyy(iR{_%GGdeQ04;J_?+sGRb|!cp;4h+rp6X&lqYJO*HN(E zTRH@Mz9%(-ukoa$YwNXdYvFA5uh{wZi#tTM>9!9k-!|VLn{wSo@jpCUE5{Z$yI!N8 zsYmR&s@uyx|ALpzJ+#`4pxqA+1&qjS9PT8?2g2w9|GR#NloBiJt-MKrXzl&4cb-jz;);d ziVyN^ph$u5fp#fvyHPOey7z_k9cBM_YrZpRxzllbOaD9 zq$7YB)S)A&{*P)#wR&h&*rg+4HLfF2&=)KPPWGfGkUQcXrlx5wI*X>J9YzGjFZXQY z>fdYP1Ra^{w zhc~_n{GumiN5qZl*}e2Jrw$!K@v}YKI6Gp2>Zcy@#9rMy;#`$@y{6JUAXZ3605PaT zM^OE~s;pW)G%D=U5wRNA5hz#@ECn9vNloDCo|Nf`N$z^1cviT=`GH;;Cf6+W+UHdj zQqro=w;V0uZWM5%yIvfUaLFUKsRfsE{gv*)rYbj5VnOkmjuyZjEI2-6!CzEo!^c>5 zyPq2KuPTTFF=n9KhVZ|X|9(wn7Z0TF4qJ9=BCXa04eedR306`UPUJRwvxb1L_M|58 z8c)iEQ&GHHoye1o9mX}qcYB|Yb6o#JtEV3E#I4M*XU zp8l#<4~+`DbVRJibp#4_36=t9dQubkEKkaI#E$xY(y^L$=m?7c)w7MWBi^XhQ;&G! ztKB=|K9%@=FdT>#(h)!m>d+BXf0Zh$Ru7E|yL3dX#&rY=J`gMge#n!WK%VvOu;uua zdiG)O;q2az;vJ^AiDukaL%XY9>Jd-e(Y+)7O(kBXsTdB#3h4+S26gBNs-LgQs?|fI z!Y&;Vt8pEHf`fylz(YN$34DPkWke-9DhqE0)@w+|SI7h^nwR-9iPds`_hqX!j zSgY7uQ|SmGR!BzxF{ndFQ2p1{jB54JcJ>u@Jl2WTxQ;-MwL~ohem~6 zMntT}bp#5|2$llR_M|58YER0Jh||=wTfK*~BZA`3dA4zO!~Vl}QKP{6xuVkwZ<*kpeP+&8o*-bb2)n#Z+x zk$%vk!-$~xM9((Pj@YRBsYg7qrTZH3C6%}*7!Je==?EYOb?6AH-=xZ_)kCAgE*%l8 zaUFqzHwR0B|L#dm;EkS?9TBfr&)(uaoE;Gq|JbvQvm<&`fO^CeOS+GUQI$ANQ;9Pm zR!BzxF{ndFQ2q9*tXe%ZD(un`u^QJADA*%d3Y_OjP2lmKl~l2&#XlDyvoxjS9PTM6AYj1PVSDECqhT zlbXPLJt^A}AJh)m*1aPr{)cB9=ZNT60qPM?JhOX8oU0PA*HlIX5G$l3fEd)FBdC6% zDyvoxjS9PTM6AYj1PWFJOMypvQWJQ(CuKWgksi@3*R;ckpqTHxjeA6VN~@k)-7>-wfD2~1hn7s@u-n=u63xnf4%d)v%zQT~3dsf+~R<4ST*k~y~U zuhWe9gUY*Gv9Va(KXH!yf5BOWOPBPYyR3I!@4ONwD%iP=*|SmnnChHvo@5J3JzuZ| z^kKwnT?=oF8{n z)!G@FiX(ylp`^ScjRgqzd*MM~RXD9#o9PwsDxT?wfi&dzvLO!>_L+VN%o56ujbbdZ z{gC0Ke6A z^_ogw0(sT0b6+BSr57FqR)stFB??}r3cB_sOxV|PwV-Hh2Jd zvnP!Jsp`r0CAHwx4t=>nYdkH~4BVuod|$euh4_n=w?k*RwFD+ANIJu@QGB85OgqEz zX|Yet1hzqQ=on}lyMCxy1y|OWO`Fy~S)S;e1UKH?UYuHhh?B?}16}2UEbP-tS*SrznG9~3*Z?qu1j~5;SR)zEXv^FzrWPJz8VdXi08AZ^AI}u!{YoCAp(K<0$Z@ZH%d1ohbWw<3@nr@}yP3NfqrQ zCAsO|j8#CI;`~i+|G)^ODUOjGt&zb4tTrs&vxjC~rSLu8`X=xZPZ|Q!gj#Xx(Q4dk zZ{(>!>dpkGS(10ubs1&mYX`BmPG3N9zfACMwG6WiHyEuGiVMuorJJzNz@YgQaJS>pZR#WsIb4Kzyh?7Y7utBaely(T!Tn0>ZGXBM;Pm6Ttm{5w?m%x}9v|Dcw4 z(nI;jly81T&)M#3Wc!Qc1A4R1y=e1pYJgM^dyjVJ!SV`6!ahq)pPiHhMYNk#^+^^_ zygIbNT|602IAlFR`PSeG&$n4T0iBkLCwzHT59KsXJQ4U3Pq?D-dqVkBPk2RmfYeZWv61|Kefq$35C`4bXB-fQ(2UNjKQ8lLNKw)C^YOz+LnKBDcbl+gqvP2;e?#jO3OFM&NK8Be~N8W3cOq z5thG7TObP_@Fl)6!@%Dt$t{-T9tn)Vr%iHIJ4SMglqzpC0^ixjNbcsq2*h(vBe_|= z)x*HUEAAO7$sHXSfq2eoBp3XczA#s_f3{^WRe!bUd08;Qe9OxGXbt$=o^Npp{)eY6 zDXD&)+F36amtah)7fX^jv|~dSzc_u9_Q{o+ngt#FZr@)+z^^GumdDK{nR^1?sCLMy zni_TBfAyU;1bnTMtU5AuuB^5{(DM5$>cGGA>IOYjr`T_J)HFi~WFBGE3Bz{O!Pe+pb!KEs>Y1kwT#1pZgx z0@5hqqAf$dE!pd_$aKj*Plw#gyj`m>weD+Ng{eye3A;WWNZ7NxH)0iVZzVO%sTfoF zqQD1aO1FG8>e+!07}_}!_gUs6ukvX-wGtDvd*-_mrexz<6pYlM>A9&_k5x@LNfwcm z={X4##}O6Y!GtMe6O&P>E@KmK4}>wE*ibq8d^6y-Y0uR$DmYEc|TuEjz8!gEl6&QiMedHKJbvc9yw|WysfS4kiG2q_5vQzd` zh;_mR#5A|+lEXS-1Xd00cD-#3$I$z|p@YB&m1OE0EXiS@L@E#iWjz66os%Vpfx-x^ z+L|6R$#NvWOU{=dpQgSsb250EcU=>>o09Ce$>Yv33mi?s{YD=+bVU-+BI&M`RX--k ztO~@0iSik(#r@~X#R3$JnoP-_JtZ{il(NlMO3Grp^Z8r!#oI^x+qt8_jlM%q0dDf7 zQQ%mmk4H;#mw3igfUjv|B==^|I0}4=C!GSkvQ3uU)qxTC&Njw;lLM8;(-w(HAPsRt zg&b`WMj#DwjN~v}7=c*r7|CI{FaoP>c%s2)+CnSldv^>1X^jjQAWd=OiX5#GMj%ab zjO1vIFal|cV+ieH>}-ncG`*Z2#Od-Cc&cCH(iO+}z@<;t51x#Zj}Y$OXkpQJYo(*MnL?m3xyn z=S+*{mT>*L-JJ7%3sMnSd$en$G7}UZ)5-!b?%0$k|2~!d|MZppps!QhAYIw1_Zc^Rj4KMil%=9?I3szk2 z0%lW(@Pg~jYFL#!4KKLcmu;qjHe0l$|zky7qx=cY(Vq$?c2D zEewpn#chn_4iAjLBRy#p$jw7n3AtkeBks>SexlO(0FG z75P!xkQqq!%m1O0*Jx^Xir~+9twX@?Daq~>$^1U>0Ur;1n@ch~c<*L+il?c}n5M=Q za1bTVmB}W$d|#!s8#I;cejujGEu=F`GLHm4Af^i6ri|T#Dp5&rV6bqsQfi?#+hTnC z5oKCXoW*wSEWcel%kQSnV!H)v*KB7 z*WkLP-5ftFo|THgiua}E%!+4qlhYd7k~>ax*+(>$`49M4CAoR1O-eJV@JLQLKjKp1 z!JKeRE9RPza7`0k zSN3e2b!E@oB{St&)kXWus}hL~y@^~;vGJBdkF(-hy5*bOyV9R&Djf|xe5NasA3)tU zM&>*v3Lo$bp0pnLld340+4^*+hyuqvX+7{pPZ|a8Jhx&9nL#CrHsFLk9iRL@C~%4= zjRNmel5G~5p9enR3y-PPO6EKzN)^D{HDIhhC-T4fH|>y-OozO^m3GKT+99hl9rE^8 z+94xphpbIIWF+noIk`x?VjLfcK&|TXi;|HH{h|h%C_x7>OSiH8y zSiB@~ZW$vp?O0#?wJkCy1>$34WEiT}OJo?V)=Ol*8bA}keS0$1(YzQNy~ue&U3vK`Qpz?X1vf<#hl4kWeM;97f93~0KtVgNwl(0BO`XRGSMb^bjRU{oRT9I_Td_~gn zLKaEKOIjrDBIf_zzvq)bp4M4Ij_J>`l3~VktmK&J zEGrqNH^)kjSMp&CpF!bIeR*VLC1))d}J6?^70^%5oP(vFs6hL$bhnZWEfJy2V_85J~9j`;R7gQ)%Z`->>ZTg%5bGKT{k5vh{Bit@D%X01>74Iad%8@KnEh9|o@Xq!A#O0wtHL zo%)$286r>kfb5S&8<4HCoN58L>i*aESG;Ey(RiOM6|iOgH{By!(RjlwRm2N}^+~)g z2w%J^NUiabAY3d6Y;J`M$f{r~Aj7I4qCl1e5e2e37_Mk-5UzM(5UzMx5UzMl5H3~( zHk;NmGN=19$aO%@80G70KvoKIIFMyR>IAY#NS#17nZgBRV<~|OWG87YBg5h%qCmEi zQUP$s&W9f&7_T}a7_T|P6)!l#6)!i!70*hw;(a=8e9%uH$xDVZwbeJxb)pP6(FOdS zUNzg1msH>-VH5W!Ozthl&i~e5rPcqZrsh5@_+y?nP=dedX^Ttny`HwD1V8R+OG|K{ zwx?bkSc2z!+Ce3FiKiW0f(JcqSqWb6X@`{HS9#i@CHT#rc327isHZJ2!8dx^;U)M- zp7zWVjKk~2iV{p(FIFaZ$Qs@M#@Po;Gkvfu(+A5leXugq2S;W4;MhzbJSXV``Srdz zNhb)gKj{S_?v-?d5Emx>AjCyUM+k9g(i1{lmUM*>mnVMjY5((nCYDXCgNa-79xs>} zHSgzwiAVE(E|}P>7fZbdh%*!GU}CCX9OPRS;^yGQ{t3Ok#d!ZK3Pv*NWckUnD{Cue zntQg;7}?v0vLj~u@lL6eTsq%KLc>o^(w2!NR8ocG_rjTuKIDU&*(k~&FOCp7xmNm3_NQjwJJB)B@EF?)$5Wl|?pQYY!^ zghm`WN$P}3Dw6W>h^rGCGoeUQCUrt3b&{@5XvD0Oq)w=$A~}INp|LuNBxO=3ROVbM zJy#{AG+CD{;b`6WvJaL849GrM9*_cVP;R>=P8FgIHd&?Nk2w)$QzjXSJYzI|k*sL-c9JrgHxzx~vy)28jZ>#SLG=FFWtfBxQk@3-H;z<~!I za>(I_*J^cYATad3vVEJOQ$-)080 zu^CKSFP5c!V>@YqhQ_ZoG~|*4_-9WViThi)d>6NYBURnedpNQ@kO=r&$gWJwvEO0h?}BAU6T*c)a)>> zQ~VWATT+5Yk8u1(7R+&Gb;`mWh7bH3eelZgfgkm>B_)_cNMnnuE&S_TC?0cvNlL$c zX-=>ce4nQcl;B4^ZE*>v&y62HWtLs}yIoV$9`OC1Hc*29=4p#dFg`Z=Mps&O#c7%v zec+2dZJ-3d%hMK@VEV`C`@NReD*Xc9-O~n2@FAYIxCGOWMqkn4Z-)+a;`Zl$-WvRq z!d)~(W#hE3!V?4Oc?vHMq&PlhBlX@nu3oxC*0lGjhv^w1&0XoZ2x55~=4d6|s;Q8G zgt7<%y%&qY4eB6*TDX3pF-pt|3HS#s67@i$Sh)V7r37^LEuC5+6M_EMkktHjN?ob@ z_fB;)vxF=U+xMt5nI#Mjyu>?t@Gyl;9EJ`2lE8MR!Z&Ja*ucy$(nk!rTjw~#4BPFB z@6%M+wkc$k3F$EI2!~KXO@r5UjiSH;In+r-0*MRK9ng(1vU+Ig9tE&_U^KOk3U>48=c-g-RIMZ zz3ntw_7MME+2aHdT+&|=fRTA(Mw>tzD*=1tcy+_bgwsVgQT~eY>V}b-tBY=iMwq@v z3Gn$Vowudu3Da8xiC|l;p(F84$lM>gm{4Kr5nTiVy)GnIPyFw^Jso90)81mt9%qnW zsdSmWf!wu)HC9;@!uwS0S}#5Xyup*!rjp17rs450B}aX+Q0M&L)tsmIJDy(o_=q{r zA-}&qOfPTQ0FUvc5#XpNtp}drNh83PC#?s**ONwoJkTUH@)XmH_H)Jw3CJyN+2;c} zTM({|`#S+{SPLn=QN5nUZOn()`t)w|`t;WF`t&~X`t&yM`t-)^`t+9T`t<(l`nb2u z#5A5i9v+~hq}4z=O56pcql61cM+p~@juI{)9VJ}AC*5b)Ymff_vd`!zp6rmbdLWLJ zi|4Ilgg*gpiK*vSrP01BjrLV(w698|eN`ImtI}v+l}7ujG}>3C(Y`8;_GIqr9PRiG zC&>+y*hNB09WGZmqfM*?))1z&=*pV8~Kj#2v-A6PvH1NztwBn$0AH`>T+94(QgPyj$JbA#$kQ%S- zuJ6RH(A0PU%))DW@)yr^vOE`NXpACKqwmV29p5#Y%AN~&osvuy;5!2wkVn2`lV2-u z)*a$EG&Qndc9F&uhAOEsg|YfOef;0Zf*pOdWqdyj_FHcflY&C~&$b4Cea=Le&#@hFN%n2Wv zFv*VIx6oO%n=aZ`-{G1e5G}E4xneizxQxX=)q(YZ-*KL6TST6;w|He6{eP5yqR`!A z08swmOU~93C=A#s#U{CBF^_xskY~1^fd6&1$yU@GsTnduu>M`OzxG41IyOnT zI@{8@^z;b@C&IXo9hDR%_T3GCvGOPd@ z=8CESw72NoVFk!AkyHgb_gs4ktLImAD9Ifm;PTLqTgS*SJM3g$_r9`c`4tb1U0GYa z|6a9X`c5Tl6#LdJ6TMDvN>jFu5tWs0+&Y%&#;v(-+&Y%&#;s#?W2LLMj?q>0imjdQ zz>${N?x&C=l9^Y{vcZIUhfb)57EhjXh7nJlLJE32qw}VkD9)4TNRKaZ!d-s37b2NyI!W6nPUA*fBCQ@d($#ErlHt*PAs(CT zcD9!-jO+Z^F0*}&%`&vuDszDm8)azNMD<2C_Dh;ys$oWmnXgKpWFIJn!dfRII5saZ z$3_Y>G4%((EFpwL8Nj$2fpz|MiRQJkCp5LLam-plTTRE{W+ zA(}@$%3q}M|6;0?)NFDq&`TZ*R&~>^yeMHd&#+iz4*2Fls0LNuhMjq z{1)k0vEa-?o)lKn>olF|?vT6l`}54+P&O^f3l9yLTMXD8tL$m)ZS_QGW=R9TtCvJ` zo%%g%?YztSHx_fX7Fd6%B8xkTWa>mm5(q+wP1&uJUNNP_2;94{6LZdpr1#|`T^jfA z^6@{C+88tS$Yo3`QD#mv*e<@xs~ZKrK}nN}N&nnf$S*w1O*EKGCUa=gFgGB3Ykjr8 z#w7W-1`3vaRImB()Km^dIR^M^AWhO$XJ5bitpCkYr)0WbDvKaj&r1U7XoaT*($b@y zAgKtxTuG!t;>wv+NL)FS3h4_fNGhbg^xAlZznijtOd+XoeLzX1LgM0@R7iI!7pag~ zv;L?%Xd!X+%$2i{?$zxwdodx!dtf2OyIdiKj&bOzcVwfuu;x#6=t@hBJJS;5?zF_X zLoG4xQcI*WN#!7&&Lp*bbSJ4L(xIf5NSBgYV%oVQbSkOkqgzQWk&Y#`M7oyL65~#` z#JHO+G45zfjJw(rO|^{R;e5^3K!%HDTLTfrsasVG zw90kg4XrqW8nSh0)Ec!3lGb}0eT}{eljPqT$nu+5G+S7E9Yf3!QRZqejwC~i1If^c zBcjC6;^;86I5-S#X|!e-8uJRNp%FWzhDNlI8XCbuYH0D?VrXO0%3)}P5vidOIHZO~ z+>jbtJh2#B94LlHfRI*ctSRQio?sz0d|+b6@PSDUADEaje1sHXWBB5zu}hMfrp%xH zx3_QNq~1RFZ_NE<^4CRsk*8PYt1Ii1|0xHRKUEeMGYCLi>@xlPQPd8-JS-_ttsYg!A_bACd5Ey|Ed(sf_&q|t>36MQXO8=@{ zy;8%4#e$MNBiKB5#d?fG_gK-t=S3IQ3_An)fD_#y5>EjKl++^{_9)366c~X=deR{9 zcqL7#_VOMjSe&KyL0RSNXaZL&$=OG4ZD0hR<4J?SbCrYvSIaVnJVS++d*SD$b)2Y$FX+bf3N3s?XQo=gDS74YV_cnC9btQ& zcljwmdP6?EkxC*5lWh66Ca24$g7>N7k7~MWaeDtrLj-y1xGz!+~1XD#%0PRM?Rm(ANfdEs-pLMg`>a^ zE2(nm1L+g(MdxSEgX#q~@L91QwgtHitwfqGjfGcQnmuM0Lkr10@TI#x9`pU6zi<9Qh| z^M+Q5c|1KM)LU95=JCvoP`}*C%&XOwGT1alZ9%EH?uANvX=gLdMAq%EKE;*tr7!uW z4zTT`U)&38`?3_@jAGQ=sg#?v92$#8Zqf1*n2>mmmYWoYq&I=M?Ik4c#&g?CNIa(f z!egA_LdtweiJS9$D@nLApF`S3_mSKj6R!G+PAxabgv7Rm54H&@_Gou658(xk^iXrKS+# zW1$A%yLY705#V)7GL;%>^7kp-Rcd?y<>y-BD>a3GQ{q88QNx-cg{?pWe%q5)0}q(y z1RKSsdP!!j62))84W2Xzd~pzMlox4cTOjt7WOmpY>qdZ2_oPAKu1XS9CX@r3Ss#eK z`*&`AhWv7CA?XuZs7v{ z)RP8*bDrhh1iVH`;*(lQrgjv3qre_d8U)T(l65DUGXt?vj%nsHFTCc>3P0pYBfzhE z(i&h`;0NP%NE**7)bAJg5#X~tX*KYLo-}xk!q0iq8sMKjX%NU`Gcrh7%~l`LRCwbB!aDykU0lx2FoG#mSWUkWR=93FU;Qo3DD143b zFwLCg4-3}-S1T#Z{ZO9QR$`_@DD0ZT)Xm!dnoz-e6@Dy`fTR+)tp9uJR!iKyPT})B zX%P4lC7DTjz$`~*ZijeT;Ey*DnVH6UG5jmbxV_V2DCX{cO}-a5$zE!>3l1hlcE4gf z@RD7fnp&|Ic$t#Si+yIvB+nL4SmO7~DHPboVZf?^l}2SsL)G>QUMDJv?^j49AB% zEirbeCF0Uo?dv2gv1g&nT%@TbUaC{>Tm0191mb+lcZQDdF+a|mK-_QnZqv9A-fpf? z|KVb3-YH57-fosk!o|XMi;{x3n_tumk#N<~bd9R~>jSz%tH9nVE;Cb8S-gOIc~TQN z*+=?n1iJJLI)H5-KUKnP| z3CX%#@GTrNUuZ8 z1IggiJ#9$|e!r(JEx}ya7{7o?jV)Z`^yt-#@e6o+Pa7z~Gdyi^37+d|OG@zmp0>0E za~)-D0h1bAxVZX+mt9nX|L$o6C75d@;}`IM=_QisBQV!K=J{PPmp;Z8FsZTSm3lSw zLrslez=uzFk#713{2@ECq!Eg7pr6qW)ryW>= zul2NpO7O=$?cfr8y{9cJ!MAwYAtm^BPdl^(-{EP8mEa$E+VT>-&C?Dq!N2shXO`fH zJ#9q^W)-Zo=3WYcHyb+U;cE|l-pYiAS7;JJFGYhoGvGEZAtg1KBa@dG9`@xvAK z8DLvMGo3W*?nBB9n1x#veVb8~|#n{3g<y@_)bq7D8WDUw8bU(K~Gy!g8$@cOH1(I zJng^|OloWa_vi_O@fCP`Pm^^*@$R0sxCGDlv?V3@AWvIbf}iPW2bN&&1Q=T`*7Emw zzD4D=ia7}}_C2h$v-P~g(7=y++Ts$-IfjWLFsZ3GKH4z)xC~00; zFT4z2eC1_mT!nF@V0-{RTd%>4ec+a-Eh)iVEF0PQQqI&7U&|R-3V#>5>HQBvyw;lf$ocSH+<9$&HW-J&VfjJH|?F4_TA`52B7+Emqfkqa5 zj2`eA`@vyM4ft`!I5M&vc99xcFtKau1#=E&WWl6H7EFxWn9$hgz|6>kNsTNxjDZ0^ zE{J<08+v6th$|y@bn*rikVB1$#T9qR`>+H3Wqh&`N;ux&4r?f3E5gzy6|k}~lNwSq zX$pyBW9Bm<#nYLPF3}THW-cKyaWM%9i8&x#eXnA8hO6()FU4ej7G_oARd>44e#Q}U z2DzLJ5i2Vr!s%G5hZ`s96@?tI0J#9MUwt6+%AK8@@Zr@j=q5}^K=xQxl+0}1G4W4?cgRI{3d@i-UPl|Nwxwq zA6DXQ`TG0f{&R|X1O1H$)=jdWGtWZV=YaOCmGH6jb?2`qOQbZEm5)_UNI(`lYZ{|7 z1Z0zdWU(>YqP50~vdEAMv7W3fBFuupq%Wj+E*FvupSFJq%{F3(j0@kM-ifaKU=82H zG?gQBAQ3AEkXy#ctnwGmi~KFVi!`Lo1V>C0vsReQH#E>2#pYT`CPejmAiHWS9EZ9k z#=-808oq4kj6L9wXqjas_(O0@3(5RVIgRvqwrEykJPa%`9tf7mP+$jViDZalIRgbU zCtAKZSS>LQSGfcya!D;8do3c^65|+l)kINjTtV=XT1Mtywnvs2hp{EbfozE#LR82y z-`ao8+25{uR?Lzn9~=RGON-<|!i6)fNWp?9Bv!gd_jW}>Vu{;dPcnq`5`~)r3CKBz z7<InIjIB) zaH<;7D9+wok_ko*1^szM`_It!o8JLgJhLQ=5B4a|mAhn(4Sp83uVidCADCG%&@Tcw zRP={-4$l`x_so4C+x04^R^0qy;C3!#Psh`$EX~IrA_Tt>*Ru|_Ux4O8+ zbV<9ccxH0DxW!t|++{iA?Uf~Frk#shOgok7&_!^CP=0R-Cg&!mF=u|Y8GfJ4{!jFRg#3;9W62&Jl_!T;=p%Ti_8_CZv^~Advf1Qt!`O zH);9TJl_cLcR}BsEi%1&GfEad;6f#dzPnpw4)c7gfzJzkKWvdXC-4EU4tzguk@;ZY z1M-lc)O&x63^&1KbHY6^w#p6p!b8bpeb@NQ#33H*`*R@iP~U33?If+`VZ9Fo5|8Rl z@|TiB0}59M(nESn=YKSvDo?+$US1(@mbYeIqIY;M)ima~Xci@x1&+;C9T&}FBeg_# z53!ETvzF_vh}D`(WCLHVB=O{TTV$^Gd_%xH0^j#rWPa`WMuEHd>x(PyZIRj6UtJFY zpC9;s(jxPUzz5_3Lb2~>Ei&8+k;kKWP;kLAH%(0_&MpRKmSnjpvb%ibZ^;7Zx0ZgY zWt04iq~RoA? zGQn$!*Km7TrZD@Gzkef7~L&<)#qtYjKYHEftp|!>#h7mINNBq?~k4Fc06(^oRRA7bse` zwaD;Dpb+nGk*Qp+{S8yi1)V0 za1bNJpS0plmk@u}YTKS@rd|x{Vam%jom@1|T;r~HO7`#U8l~(~$~Z;n(GM0#*+rD) zYU)h8R%>QsEXHohU6yRgU6yRgU6yRgy#=zR6%Q|4QM^gEL>kQDp(QeQDkEY`?pkF_ z?pkF_E8Z?!oy0@sT4hVF_qOD&RkkEu+HoH%-jAPf+gYx8-8_Hj?8Y`OmCL<|1HG8p z+5FJvoc@V(7PPU&7bP9o;sdb`Y;n(YV$->hZt1{AX!3GY2e!CBJFs1%a~(5T2e$YE zsRLUa1s&MpxahzZkMj;}@dZ~0ws?rTOD3*cdBRs_r_A{k*RAZagey@eKSf=W|4>LO zmw&*+HRvYD)5G#Zj?_acoIoZEX+@|BuS zl4BzIaKS6((|3@lafbP2S37#b3(v|*l{0lWIy?IowY?LE zGjbOCw@HJA>tacFCeje{AJve@HJv1{%wJF}I9GxgQlX9CMV{nuzamgZ7_feJF<^gv zSw7yFk(gQ1v{~xHS@M1UcE!v3Us=pm?Qktr?m6PJB@6h>BNr!CiMX|9u*P*x&(~Q} z8_t{Axwa&v^#I66&37xEEb&VgH_6->TP38}023kk;4fxq$8hi{p@`X>40ef5q)8<@ zfd{B!jZU(mo>S6#PKmv4@+b_F>r%-iI*VeB_H}4Rx{Qc=bRDnk(~EPHK)OI?Ey_{X zsZ$Ma+zdLErtDksjr0rI(8AH!DmhE+}Xv%@iO`eKPrIY^UArvfjn z7%o!|*-+0ZX+7CaMPZO!mr7NyRtPsboV7 zM`Np`Q)2@(Q*bXBwiBW zxK~JDR4z_-g~TfY9O4Rztv0E-D&;9pQbYTXBb=S2hQ?E#q=xnhT- z-XWDC38cd&$a$FzDmsl+=5yde?H2uUa2R?Jk0Bh>s!S zgH(ipZ)+DO8zO0lNFo(s;5XZa$%dF4BIZbW{hd7T-kWzQ<=skg9u%U~d{%OCzq~yt zWpUW3zX_e?dT}O4TR;x3)Qf3E4W$t^lt$E098p!P+QYLWGW&4`|TC zp)1$XZ=r+M(Hp_->u@hl6kQB)QXw(INrl7!ClwOon^Z^)Z&D#Kx=Do;_m+_8DY`{S zX_u@^yJTJ3CF|lY5nXXlRP(nbQ_kQsHC}=>L*G>r$C$Enx?ayGIhqvG4ti+Faifri zlPPDgTD!sAf;7vU`OoCde+KWQce|#O78{d2%vrK8p?r4Wi+1D781!R8_6abl9RRQxWigMhoN+WMXFTCno7NT~k}+!^|1~C=|G97f zSNUpvyo|~-1hP-#T~r{ihTeSVe!q}-50zW{Lb_EqsHA2y z%Bw`AhIXg&ks8`hltyZ34=Ih*(0G-I)X;bUnGg_D8ansT{X$}z;eMHrm?gLeCZza& zmXP9GPD0{_6REMH>V1RTH@nqb6}L;#XQUD@z@xRJ%w1F2t&t7AJ4El2iZJlpc44wt zC|UM&Kte;SAv{QB_y9lQb=sXV*$_xW1QMwT10QS`CL2O-h>#-{Vc>j?Ml*E86=Xwj z4iTKB?2O6tfvB)EhC(>I@h9K@kP6cH@^^Q4*Ekao0tq?wU>bHqY1j>=VK)?qUDcxY zsCnu$!a4$kZkK%?{Tn)R9laL1XB~YJoW2g{;zH5IOh76mCIV6+F%OUmiD`gTNX!DH zLShmi6;j$){&RhFjBur$vM%kEb!n%pi#tVhF$a(eDej(X{u|~drV(aPB?Vif)dDI@Y~wFPRfa=ZaNtW2Wr6O!oqC7 zDJLMi>C`CnN!TO@^hDd`qBu+!k|X_sVtTM7yH3e641lbdW_}hh{{{;W7`g^8Bi75x=aR!K11|s_9dsJe4XWzO=#vs6skZxp>x8NPK67 z$4Z67tMa5~2g z+J(u6KpY|vN%{6EdA@;a<`uVhhC=ANk>*aL(^wiJme%@M8Uhkt>cKR`hSCrlN<(ZY z4za35NvuUz+PND`1X75Yb%Y0yXEfuf5sPbwsaJgJZv z@uWgxz>^Az@lGlvhC8W{(wIlZM5N|{2t|V+h`d@xy`B(fRU(i+vpAgW*cpb;%zkD{$0O~PET^pmX~rm zq|>&~@Dex2`z>!?C*>ywzQi>~ALaCXx4H??zj&Sbtuf_)4}3}8X1hx{A=YWDZ+ICA zKY4;}IpxG?H=PWnU7lcDPB}r|O=leHVKW}k6K~6n7AD4bRu)OwO_IIdFOnlbrcm9b zF^zt+T>;rJyZW_rvW^ekWRl%m$+95?G7l>!bMcCH1!UI+1wdwPRlv;s%60{0-yReI znd4Of^E?ZtE}`NuD2!#lU`bg#LS;3N2ctSO9(TeS53xqEadR@BR6HI!;>viGG>Y># zCqqJ87e~K{$APY#aZC$m9KOmKuNqaq#8F(6R|oxnlN#IA^grIl;zca;)s|1_n^(Mv zWoX;!dse)PWoUd2kaw{R?Iz{pWh_JEYk<6sWoUQmYel4n#*0CuhW6kx*Ah}g}}y~Hz4j;PI`dUejJ?4&gypas+H`n$@VK*PG^C1pjayJH~Ide-$ZMV zCw{qIE7|V_tw6e4w91=GN$-lM=x9>)6n#x9ua5yq#dvz3)V7@rskWU6Ahj(bL#n(< zG>mhU$o`D}q?d$5XW(KX#Y03$cp8@pDIOp~!cC+?!XKnUqUoeUVo;C@iAIwOi6KEM zq}Ue|iitvUYhERt)VJM)NfZ27s0O}F$9UxyAI^h79Hn;~aTcL!dPEeE-PMPlJ!2v} z$A{h^5O14+76rJMU{$?jzuK;s?014*ApK)PTJ+Kpq$YlaOlOeFwK1JRsutjVQYFW3 zmmM{qRWjdFve=|mx;#{E=_chXGjGsWT;+9wJ6dE&_SNZ|WXiwvpoHFk0Oo~Ehj+twmODtvsV^|ZkEK#L5i@bNL6A^qx; zZ7&(pT5-w^T7G}vyQ@WpRQUcyKYe+&rnbFgNQIBjVm==De$*mEDtyn=&t|?}Q`=rL zq{7GNGoSWM=O5vFphbpM_~Q7GD=!}(RcvA*_usYJ-yaJ7{+$*XQt|6{+K*F0e}1n; zhE(`ouH|P2zI$3^NQLiqE&p2JyRSutRQUGQ{@yS2`%hbBNQLh;TK>Ag_wyDRQsE;6 zMnk`Ur$vTTRvALz!NB*u78z3EBLrR%`u(038B*aR1pXHI?rV`D6+S}XO(8yh+9E?L ze1yP`AwGWIB10NQLhW zTK=ZM_rn$$QsMiBmj5#F{kTPjRQQh5{yskR`~594q{4T#mR}S2e$gUBDtmrH;N;Nn zcecoo3LharD&zC+Oni(G0;IzC!%TdP5CZ=Q@$usp8B(d25FizO_h;f`gbUqED?W@ z%DFxMAQe*V7b_Y&MmjC_i{(olGm!bf>Okg$sEacnL|vSG{M1&GhKqc3Mmv_TXpQ%i zTJD*5q)DZkhy7Q>=BR3ULH=R+@RVFSKnY$OPHjRLOrkUY`?2PHvM3(d)v5S{rjz7> zH+j|3ynqJjFIv>$ElR`6r@AgtoAYl`%8{I^hVLDLUk}m33!2O1*>m{ed$01#TbCLB z3-n7PK?m}#jp1JjY59w-&cAnQ4iaN~g)>vX;lxtD93^jPW;ipJCYRrRVj-Q`-yRFH zxrRbF%d%+ORQX3pGhFsIP0jBRxpUl(zw2Bp_qa?m2 zBcunFw9CP0TfbN#--r>evy{Z=V1&f`=X{*n*2&xEe3e4@_y7f;l@L<=vbm6G9I2UH z+<}exHz09{y*~<{OK}OQ97q6hi5^Jc6jGUuft$TQhk&@woXE-Kh5Jb5Y7iJaI)q0_ z%{8N{p5~oA1jO%p+YjH9iZF0}5C+miDoihtW`47aB0942>wx;(fYQ#mYt?sj?rtYI zugd@d(%^%&m`CO)UmW;! z1qg3$8$QYpR=!T}g&1CVm>u@%@D54(39Gr~>8k(b-k$W8VN(a?=LNp3-IQPG?an`> zXLQ0tpzhP*fj*-lzT0`d>c7d`linRPA84Tbw!oLzZTKkvy0_b$<)!c87+!doCijuY zL~^`_8r%JM)nC*3FL$%q)Is^Az?Zd~@~O(#>5i(=2@ga5$=H3Y>VHnKCwZUA)Is@3 z;LF-g`KjZu8y@DRCu290&J-Q)xmV)NHj#3sgFR$trq8RUL0|-QF7Qd89zVN7==5L1 z7*E!EF3W_?7?U{+_P+)+_*M`aXo-%(IpP!UC(k&%C$_tdA(d*5?z zr$K#w^Lw5N4}HE>Z=I?-RdvpL-sRrQbm}R#OgaeWi#}Roai`SfMhlRtE}!;6P`3V5 zBpX*w1XP@K2U1*RcL=ISyK~YY@zNbgj?3;4BvHH9PcZ3;P+Y8^ax`w~X=gM&?W~~! z$ZXbvrBOj|*G&1(|LyJKM$2h>7e+RC+-SKcvbd*mvEDNgDejca(A#Ii;!eq{Ba8bV zLwf%qvw!sW)a9{X`9IjVb{<(~7aUox$Y}xSu8M+Rr43~>EEicI)yBIaiY}n`|I4621OeCGny4nHDxNqSav#Ct9CDk*>$AO7EqF6dLfK!YwgL zbLQqn?7OG+Yys)nTl~JOHKkek#JP2E0AFXUwZN*z#tt<4-pf=4p3ju`@VigFqI>v? zURdu^k(tFh4#9e_9-8A1$q<%zmpx$*>!rv}et1;@4lL5h^%Yn2ibcr96?Wr_-ousr z2W=~kzw5Z%`&F7j_`B}ljXGk#ayExW(q}BiG9xA2`Y%sOQWdIL05SC(a*uj6YD%o^#@M&2VgK|XUJ~7 zJW$VGUvY}E$Z_ULYkx*4*-p*K2qn+t{7LSWYVZ+ST=L6a)LisotnR4)Y9V^=XFW&K zp2L#I;{j?1O(DN^eP?Daa zXCe_wGSS_0Ng|X4FGy_GD1T8~Ij;l%tSoYsA~U) zOkM3BRkgDod~lCPuNW+De{iQg+!ehT`K20L+-9UEjL`2?xTlcK00eCtlR)_QbB{Y| z#a{BUTe;F~|0j>6RNo7=ogofC)yK14(9h9&c75!hx@6$E#fhx;m3X{Z)o#~zjyO{Z z0ql3`;U3vq^+LSA%7maTB_Tefk~{gKuJD81!{3!m$6Fs%Q7qL`?bFyujR6l*R;X>L ze~yB{_q7Q^JMjx+Y^DR&#Sd2ZBQ$SDHzDtExU+&W_qUZX5{ttDO;ZL2LkMm?F#*_y)(Etdy7 z@C%K%(t%%Tyj2cNJ@`0(S&x6qA-I_-YN&CUcElnl7p?*Rypuvjknr?*BEc5 z13$-js~q?e6 z9=z0eQsau5W4UI~|IB!+ z9k{T0DYvE-Gq=liO?k|1A7{T*SO00*R9QR3oJ%Hk?UuK}fp0KY<2?$$99ch7_?O6H zEk8!*m*@hrq{|&aAgjAvgtoN9Mb@!t^IHccQr!w!;zd1hPm^i_nZzP>svc$i_djT@ zET*PNeN0)b?sC}(WWtHm=d^yQaTyS0M_Gw_D(88cX_2B}K5VQpAnUrQ2akfr~jI1859Tr4!0=TEGDVqnEE2c0-4EX4Z z*a?bb-8O+|R>b~UF*PmPfR|RpUa9yk+KL#({N>2{p29yyR*zQfLaW@QO#KC4xah0? z%@rjj`A=G2i{sTtm++&Gg<#I9pebyKecfV zbN=XPoK=A{f?Q#<0&qr<^^e)U(WdNLW;P4ENHL4qxeE)(Mn=>FDRYqmvWklokX2ly zD0nvB!papX3-T+i;#NEQ0BXT za2YGFHY-iwqVQp6xoTVkTwd|K>7b&ST5xlh#}ZaOytM~yXt-veq!-nKYQVYIOk zot3t{p#4v^ag-@+0q-%^I5rlWjn+|#jr3lJUK&}`-EB~TEMAy7eOBcBf`5p)-aIq)Lm9qz!i-Ng~cJJ93~cHk3?x6*;v z8E=&XpKZL=4t$C64sl>-yh9!Mlg2yDfxl$D!yTBsd7qbP!YDu==SnqHpnogJ|GQVC zB_}N4AC0vJ-RKjk(5?O#b#GM%W%~$xhp}3zy5uf=+fzNU()Nr`=r!sb)uXRtKvF<6 z%FjB>+ZQmXB7fkpedPcQO35EM(jS09J^2I2_yaH~Du3Wue*gvn^aqaj2VfA<8S<%^ z@&I*4J^A+`io@=woJdqps)D}SII1q_PIA1Frwg9`Hp%2B|e%>03J6fnq}KTtXg zgGA1d7hcN)^&-g8$177#8NgG*Hb$1u5#X81@(cf{gW{IA2m)_v6NKVPgb3z*fVaea zX#r!;{0iN6M=*5Pau)X+z^|C%Vc?iL+Fe|J9GG$WQ8sLp*Hk3I*D6oWPe8^RIz!>V zH=|C}o9wBe+ zh!M6OgvnUNk@_f#B28I(GV;ANWkqp?>R?O~OdunXC!s*R?

vOok$Iyjnssg$1OQ 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
ms|fLuvh;oH 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 z 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

  • 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

    ssKRr$rz%J_|S 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 diff --git a/lib/python3.12/site-packages/PIL/_imaging.pyi b/lib/python3.12/site-packages/PIL/_imaging.pyi deleted file mode 100644 index 998bc52..0000000 --- a/lib/python3.12/site-packages/PIL/_imaging.pyi +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Any - -class ImagingCore: - def __getitem__(self, index: int) -> float: ... - def __getattr__(self, name: str) -> Any: ... - -class ImagingFont: - def __getattr__(self, name: str) -> Any: ... - -class ImagingDraw: - def __getattr__(self, name: str) -> Any: ... - -class PixelAccess: - def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... - def __setitem__( - self, xy: tuple[int, int], color: float | tuple[int, ...] - ) -> None: ... - -class ImagingDecoder: - def __getattr__(self, name: str) -> Any: ... - -class ImagingEncoder: - def __getattr__(self, name: str) -> Any: ... - -class _Outline: - def close(self) -> None: ... - def __getattr__(self, name: str) -> Any: ... - -def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... -def outline() -> _Outline: ... -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 914f5d1962cb07b5eb7bca5658d64ae6e728b411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145465 zcmeFa30#!b{y+Xav%tWEGs6HfxQ>b=C@SCvBFd%?ib-hhCI~1PBEh({ilOF26nd?! zYh7EfZC7vGwQkpNNo~jKmSv@>*-W;OZMOPPx)FWVx@@w)=F`^mk&q!3sf;1>^8p82vuJ%VdF*%DxyP*8#D2`WiwOt|Pq;|&_ z@%rHWO<^oGS8YLP(r?!_yxp#*_W1^(&=yrOkr#>nI&0?=Zcua8SJW@-+aUsv~ae8kMKB|=C+k)_|vpL?nndhqg9}@iS zLHO1=oGvX0zgy5}1>sxga{A&Rd_x(>R|MgArgQv;Ap8-*zc~osEa-Oz;olVWyMpjF zg8oPl{M+?_zi--B?y09 z&>s)NuNLxngYeCl2)o?Y-aa=9dTS6qc?PFT4#NLg(5D6A+op5+SwZ**1$}W4zGWJx zuMfgMDd;x@;R`2m`t3pZeS&^x5Pn+`r*93yw+i|rLHJ}559fmLp9^|v3+HFznRL8> z7aT!&Nz6Y9LHI&J?+U`(1btx;zGe#NUlWAyA?Q~H;cF&y`Yl2D6hXf&2)`|d)3*fS z#|rvGL3l?Rr}qZorwIDCAiP!3TW{y>RJ#=ybJ!k)w@%>rv><%3;GY$Qmjr!r5WZZ{ zR|Mf5f__5~ezl-)4#GE&;PM;~!p|4-dxP+;BRRdgk5Kh}RnRAh{e_C(mdWX}g7D7> zdRGwMA?S;P@VBV?2H~w^IRE+}e0B-PZwSI$vp9ZR5dMC_e|r!l?5GD_-amj)lFB9XUf@ZB`{LmK=b4Zc-_PtxFzXz+tI_~RP9Fb%8qYVbl;hHum0 z#ni*_=QMb+g=KhqGs~n+2H25wW{3;Dz+@fQ(^%}fIL%%_T zw`%as8hoS%zeR($Y4F=L_$Up2y9OVv!SB@IV>I|(8hlp`zD0wN)!+|l@OBNpRfF%Y z!5`7!duZ^-HTa$yyjO$orNOsp@Vzzoa~ixugO@gPfMTbQ25-{f`)cr34ZfcSZ`a`C zHF$>x-(Q1I(BPdKe6j{VK!Z=y;1e|XEDb(UgLi5012y`W(T^hVtN*TUIgBO?F41Y+2AE)8ps=;Sz@JBRwu{5&U;~Ko!axuJDgU{9Q zY182IH28BG{CEvs+Qb2h{|OqrNrRuL!CN(Wmj-Xw;Kii{t95AbVhhgj2^zfEdNO>n z1~0a-44rLpdi~&P_|)WTG`_Gvl3eRr+`99vu7>@leN5EzBTfK)zW*tFTY6`q zL~sSw`Hr8*r~kVI(-EDomBFtQOhz4b z#O8A__)3E5Xw7G3a4o@fq~?j z{rUP))7ocVm=3hf4CGd9fkR<3_eRR9fA2I27f|uZ-U!? zCjCzk>>&6!gWn~Xj=FrU41S$pI^y!RF!)7+>1fNhlfiolrXwxiHU>XKFdb$2ni>2U z!E}V>t7q^-1k=%#uZF?*5KKo_zG4R7K`9R+n3DX>jKET6>SB?QwEmapw6=6{0e=*oAT!E*>sA-I*nMFgi3+``~V z1k(|fZzqFu2&SVc-!=x1CYX-Uea#F`C76z=eDw?-NH85u`Dz&4mtZcjbJ*O@?|kNoM1YV@+C7^M=%{l`5X-XVLo6wg7R4ze3sy`1WOG5gy3-mxBbZc zPjD8&#~J)C!F0srYi0231k=%yuZ6)c5==)*zMTx-OE4WJ`L;3m8G`8u$=A%_#|WmQ zBVRp(A0n8JjC?hKT}_#uO3YJD#_K3cKj)6Y)OC6epSr@%AGh?b2d%VE4 zY8ufS<+;#L;AYuDTWH0X%e0G4&EKFiW+(7_I#H6&{7vWw_yECo1>j~dJ9AS2z7O@j ztC&f$B+#!T__6?e1;KLz@KS;&2jF6YGXRfIY4Ht1z9?Y6=4mM{WMR*D(BeuEVr{d! znx@B_TulY>5#BB^wr6ij%evRyy~uQp)8iu=-SH;xa43`lTW48rIp`fgzG>JGGdE|? z%$|{bN%r(hT%Mn&dA@S3`P789j(PC!;05OlE@&KaE8-x#F{GhIcI&e}A+9z1iK@WU zHg|sZyzKeemu4^6$K%S?c#YNbf%o6&A>Xr~`~`Urdi(!?9!t;Vd(L|wI!9FpsOtXl zo}W{WBG|^SJHNW?neB+H{Kgq}m&fp~t6`s9kbcI!nHKMq7hIlC#;3fnM1n~?9~5{# z_PW2P@cP302s)ZG8_bqJpWhg=uEnxp3M}So@XGm~5X(ARA`3jC=8f9cOQ#SqW7L46`|DI zi!5KXEV2xduGG0-ay8A1x4NLM=a@Geio2SwhO1zpHvxe7A;erB+*1zu&O8eJ)$!rY zC2AT!15p(S0KS*O_|kJ9nqXDmN|5-+9|Z&kpv!ZT`gspkV6&SRbnmh605HEpSuwuY z-U$4L34We~J`-c-ueURHO%z4161PUE;4R~qq87 zy>AI>1Nvpp*j-k>d<6?hW(%Q?m+0Y!-f)9yMte6{)hOJzsG0eLICzVg=KIJcFBLS6 z_yVI8(LWcMLZpM^9ca0?F7ge7HrydZRW_JEe$ z*bU?qfvKe2<)M1a`wkgnh!MlMo}`rCAO3 zxd#SFX*qKb=bLigdpB?6tK);0$EP=gB=PL?%?B3a2YmKSV|)e*K64l!-%MVgJzW?u z=DK1@x&-~LilmbHv8l0 z2I@|=0^-TLmy3Q8Eg!DNG4b9=zn1Pkhy&W^dwUWNagZS5085I9gGOUM?|lyBBB@@7 z{EM35(IXx9-`n3m7Bla7-ucCBvVoIIQ0r}DmS7{=0Ri@4qvzcULK0v=KmawKUbvXq z<=@z=Q~yP3|L=0;uw0j7xV9iZ8r7!rHKwMgt8j&Oe#A{+xkSoC zjUx|3JRXGvEU`(jQS$l1G&skBTFNn%->j#U-}gGdEL&klj^%h7QHy+xoEjt=GMf87C&-m6937YIvm`Wjt<)4%%Q zAscV8sC$Fgy)Wv*CB5X$6LtUKbq9Ezcd$TjEKsB6`<33ySQM1%t zTJwAubbzT%G`6(n#(oDovg_wjGulE$gJ<@P0?%Ht;7~L)<;C~FWJ;HyFd1A8fUYN{ zLaK7GZvF2o(EgCJj9H> zpt0EM{hr$LIpK5c(h5B1J^Q?;P@?t`o_Dawcn*yBv=w+h@pk!=XurUO=Y8x8iu|MQ z!59i%v3d4xBtD4WR527>>axf;XJS2XG~Rs?=`|wNL1LzPN4KFFqB5nWBl_%_*gDUg z3sPpUM=@Du&&c<*`t4N#>(JFEGZjX_rzRli@=Zccmtm+tf!QmIedn?7Rqei0T8avq zZj7%7xi_D5Y}lVgw%kYUVKW!mB8hA{i)>j~&{)H4nMJnjk=IxjKfJLjVB$1aV-_Y> z%--HVGmBxy&5O5sZ^D+A+jlKW+0)6mpIpLtdk##&l@oZ|y=l}0B?p;#^5^Hz&zeJq z#zLC;C|wXGP(2KtC=6YpF&xHwHtxg2zP?^0dYboLFn~H09ov@;d2H8qFRiU8^^OH+ ztdDd()DK)byB=b+wd6NQ@dnu(3;L=weAOgF$Q#i!$`uLtDt6#Ydwl~?I$x8ui}ng$ zGy0n|8*{e*`b@nZ$oKqo$uwLIYzUJik2}7H_aqB9xMZ}B)SCzEG;NO0(o52FhrlY| z^E_=gyFgj^?WRN!VGmx=3}_Gi$+o{DfGNU&B-$CkS(^X{Hl^;*1xV5WS} zLD#y^ENfYJ#C8a=_3U+dJ}y@^EF-s;c%3v?n#N%p-PtkfsJ~KfF88k*fRJO-ycM zF3H_acTa%IT@35=5foOg_YzbSM-wuK0^))`#9tz)`Cu`j$X zf=d7skU_w52#Rs-9RlD?J^3`AN}Con?}o=DpA)mG*hhZri{k*F5B=k>uB3dacQ=bE zHvaC-?|l3*+OwaE@z+@BC}`@Eh9k&^A7pn-!w))uYjI+UnR76(1(v)Q`I*I!kcFRF zl+)y(o>{PcTvN9nb{t;JV|;q{03V=SbViYdEvfOnZeS%9VV?N_C4~EN zWEZ2sLFCgsdv_Vomv;#Cp=C*Pp3)TK!^(E%Ry8h~V!kDKeE@Djmu!ivNXNlf>9Vv|Y{_RFMp<_G!1*~{81bZO9 zch^-`miqg97kos2&*2!dqyC8AYy18FhIZ0l^5V)`e}78?{Y~wpKce^ELk{|F{hlL{ z+Mi!Ad!}mp`vH7}e#gdltRK;PQ-8m|slVe6mNyhKubU-{4q7Jy*~;?d=tI*o{vc|c6Ilri=V4l zn2gwxxti+iURglc;?yO3zdFT4zKV7|b+qdljfoHC%V_E>b+G*nN^|LGcN$HblWCKr zKktsu`rTBQ<^7tZY1m&#NxMH{@#e0%Y$5b>F#T=-rOaXSb z%SmR_fIJW5KHhK0^BS>W%S(HCDwi&=^4n)gK%S|c$V2qrd&s>({tuR?`)|uL?$`2U z&rE3voN)7tn2)0LgIySI;b9_B=?@RCrZ4sZsm?>!LzaO-&#%Ebwf#A7~x z%|`)vPk~?KRrc{Ir!WPqJAds^u|DTF&cww{U0QzWer$6ZCr4*D?3Z1Q(R*Eu!w-0S zoxoLNMydVkBL(R{TGm>?i8e#G0gXJ{v){WFCe8Dl$n$)dvNvpx=fIi|=}*ENPK4&A zoDO@@vuDreUGh>s+~ZRkK9mV&K-aJ@8E9GeFYIhF_cTtm=XpNf^GRs72Yc}oQ~(Rl zTaD9zpB`V_a5^+Q{cN`9D_lC1WqZCIZ@K8*^uv~m4x?pswx_jmS~LS2J`M$Wf@klZ zPxPL{;MDM;1;z1A5#hM5E6nq}VA=5+N(Rqi)X1-*I6d3*O`c`P7vpJ?8v=2t)#q}` z3)%Qya{|*LU9Z$+H`Sg8>oKU!UUQ0mIu3PNtZrU*)8$l$tA0+O=P8S?0wT?`x4(um zFTNtbv;}w>4ew(RhtkA(4-9midzpG_$} zh2CzWg9(x~Ddk%a&Ld#V;n@FAN@EubbT*FhhifO?Xu+{@imTCu8g@w0BgH?yVG&p9 z+b-E#AfIr_M+)S3$FKX=-2?m#DKB_lZP+7Qo*I*ywP8$hUi#tM&&d?oK<3Hk$IITl zbexwhf7V4uAN+`%U8^-5FuBs*@ea$nYAjlGu$F{&$5(%W^o4?PoC@R($}XZ?R-VpdA{S(CExd zWYBESd)bLEryqkw%i`U>zv3E${Ni~(@s;#rmb|L?8s9?T=)9pA6@_{Dsz8gT;k^-$ zXm#3GM{N-GsF_Z5Rf(@QC873|W&G#9{;1py9nYUxBgXTu_7j6XWYah8C+Kew1KTsr zN{cw6{X`p^n~XkWe`G%q3C@3PKk?TOh?4Cmo_!z1-`Y<+Oa$0Z45J+TiDcSO%mBa^ zwNCaESup-ov)E723Z56A>|Jvl95h5xkr4ImNbK>b{HJ5BS_$ zPc$%<2|3mVGSpxcxuNiFpcAIFE@H_Q`!975fPo1Tx@#3do(i0x12%$|k)2_wdF65VlU7%K|{wqyC1*pXdxG-!w5iTKSO z!lT4O^i~h&s7Krm=E-pZ`G)_Fe6`-bLGsmlYnb`l$@l)dLGt;O-;}S*Z_4)^oCx5z<)7&48gV>nN|7oJA#Qi@s`t|)$=)btO#NC1ZPzSzZ`r~P$z`UvLh0eDS z-NeD03Qfd*lj)B@*6I%_#Qot!2<*Q2 zp+7f?&>!_3>kqL>e>{N0^hcwP^)KsCf2gDCkEhLkTYqryra}{~{^9NQhZL&*5ICSe zwE7+W|1I=am4^P@Btn1GcdS3eCjE^Cb)|I)hhj{FaGRQ>Vv-EZno9K5N}M5{jr zyw?AaLe(Dv2lR(lzoY+~LVs0h=+8|e^hbTi`a^8eAA5D?e>Cb)|FYWBx(?zW>Ztk; z`yKs>gEtkLX!XZ{*Xj=`RQ(}vK!0fUJNmyN^jDRJ{@f%&f7ExZKg1^e*%c(_KQ!t< z|LMEGA%dpN>kuxuK>a5kUBpe~!BJzexO(4LJKg6^MUl1`1CcixH-n50+(SG@4~l%> z{18nw*pOTgr5cTgvE39T2T;T#SCHlmc>^S6AffyxmOt-3Mchll>&(zouyOW3Q-RyUOq?&g%c-`}5U<{{$@duI zEo)b!Bet=h4>E5b3N()~CyO*V!ncLZLJrU2J>P4kNIaw!B19G9^TU22)?I~-ovSgX zF$L^!caNL^>wXG~GmU{A7_EHUA)L<*a){%9{=7kb;vC2epZ{wXSYCZu^|F=KQr?JU zDR1NmDKCAPG$9q>2x+`DAx)~Rs#?CZvbv<&y}*4%O}SLJyta1P^6D~8g>+Tj=!CMe zvc#l7UU!XDSvk70Zb41##QDk2QQh{2` zVZ|J2cJ9L5T72hb(-#Dr+NZAWYUsFdd1Y1E^xBf@x<$)sm#UpIti#HQ>P|M!$%BFPI4p<9X>)zE=zKh4NaC7moJkRmXuyrS-n_Vwy>_e zc13wDIigbQ1eD8=;EY98CAH;Ja7T&K)TyIOYHF&kkP6}GWh))|OG_3L%kisf%1hxc z$AJEI101;}HFeA3n@TBnXU0SyQQq)y0tCq^(QFrCi@*!$r zL2hu<7c7dC~1$6pL!-LWHWN7{vS z21RI}UydkryM?Ak`x!BV{2ukce)4QPI?*(T>1uR9aG1y1WXJ z>R`rpFk?GtGIB68I5c*r>1Rb{Svkh;(&cq-$HH>QqN-&jZbxOcqpX~~S?8EsUbUjK zT3S?sNwCb}UgqG_qNBF_^5x}qG!!{o9)Fr?v8>!(UW+NZ+&{_HRbE+6GSjESNsxrB zLl|P9(?lkwGBKA0*_pG!)Dbi}sgo6EtTGJWW>gs1S9t%FGT(m@>b*y>}%SPk3nw5K4v=dEaYzF#mH|&-i-V{}~@;2lJ$Q_9DGUSEGuSQ;vd^7T$$RDA4 z#QK}ao00#7T*AE&dS(ff+;dq=FmBKsK`!BTk^z@R&B&9HJ8=7L9`Y94_I?EU zaopBFh1`mVp5k%&xD$CH@T}H2n{_#6`%U^Bv!lt7V@|lym~Bp8 zAChNIYY5FZx9HG8TAn#M+nfLjP@+YS*)&nnU1C0@n`Ca)%|MHf2sp|FYuoN z&twz*Pp7sRk6#1-4V7W3n{*S+_9n9JjRsh7J=wM)WFpg*Oq#7RX|AHXIh+|+63nb2)L$=#rzXm;o) z$!2>l_bSE%Xjg&uJvSgFM09jI;%5n_LK-t_gt- z_XGv{BxQ~{E%#Sw^tl4=|TP zT%GW515GtFmzA3BRc6OjbArp9TnH~SET3D8(Pk~yogu^oL%ULp(^bH4?Ev2l{1YAE zw*&uj2ly7?PX*!Q(bW;)e*%6n^(*Ephkw3W&O(vsB&>6JSPy@XE&+5m{sFo|(7pLP zbi>i@D$w=7`WxpTE7>$wCLzW!o@s2u+Y=Ps2WlB@3XyiAodN6hTPUk~75nwlxy==M z=9)b7DjGC-7&LhpGoq)+13WL$(k6rU z>pw_4545vzyX5!yQcQ0EE!_jX9kI=08Z+Fl*0_skKA4E{r+-i1$sj{>vhNY_i@^Tl ze`4P;XlI2{zDB!#Vt%+0D<$S$Oz;f`;T#7reD0k@{t19&%R;n2g?-NLD0BZzG^@6R zI~Qwhc{ONfVK4MYXt#s*9o@bO+AQp?{*!AO@lC=W%=>?U?^^Jsz2ARY-uJ*a z4SUJ|G~eNvD3AXi;CmzZZopG~|4Dh1;I~uYn~aAXAN9xdbpL)r-$Ulp4Ym@wv>;sg zT(H0e3tX_k1q)oTzy%9ju)qZi{6B30_5EYP?;HCse;M2b@&12W;6EMItxX+s97zX9 z_)HM_43RGq`3jM*7x}Fse?a67{8o`aAo8a~en8}JiTt$4zZH2%s_0+jPLYokIi7`JpBW-wB=Qv^UoY}oMgD-u zpAz{2k-sJK(<1*?AnsJx!p`W__Ytb^ zAMA`yeGj4f-oei3)b|gn?;GrlPJQp7`kukg=+yTOs_z%+jg5xR`TL-~ZPcKlMF;?Ot-z0WqFfbdBRZq_-{I#M^LFa{0RN}!->ag%`hLLR_RolV^?iWB_3HZo)%X7e*Q@XUvu1HQ zgX`}X_EX>Q7hK;U`d8oQ7hKP|cK+QNz4{(Ndr(vLJ%B;z|9Vh;PvL*Ppg{t5<{$O_ zioyQb`8(q~i2Z*JsJ{PE6-a&WqYD4G<`Z*sM>`TGUUW&KBPDf6>W~yiYI167N=j;q zBcTWnExPcOBd-`dDiKQH7AJqlIvhJOJ6;}Ek|OOC*9>aj5e<8g0d2dA>&A{~>M!M1 z+92|dXw*I`#XQ>)%{8LEn*VQUR9Ut#!D#Eg>H|Lq)^jU)Km^hz^zH6o0UzyQPvwmw}2aJ`T)}15APcL$JT>D=Y#o- z&TfwqvCdcxJ#=^X0V*Myy3{>E<;1Q~L(&a}?8c<-B%aBn>j7bn&vl;-DAYuK>3RVZ zQWf7 zl)3!@L`RTi6O==^dmIsCsRocN>DGlpz=$4mAzL_=E6fW`ACRDL^}(~0rO^&Vfu!_; zpyo2xCP6ulzl=4Pa|X&?Fo$`OnGBVtq$6_7i>*Jycv;G1bZV}MNdg0xvIL$qS6b5} z@Z^QE3sRexCz&N`gvf? z1L1Wl<1nKdGkaWm5&C|J8h6hS$YxsCvH#H9eN z=CWm_lGVbf6!c7mrPa;9k|$zjHW7?HD#B$K4P57{GU+ZK@ulCCSNx}LQ}D6gQU?f%#=0n{jCF~DpOn!BUTDkTroiS41tpCEO;a+rXJ8Mh5e zcMN0OBep|m+N{*|0r03zMw>0l5IESjGx|Gl+os%rShqbMl@3#FSMEn}*`8!-?^LdY z18q;+DAso=D-qYe3j=U2a&JsG0LX1<}o0hi#CCiZp3`g6) zyF3IaO^&p|^|rUnG;Fiv$Z8#+x0#kMIWm^KdxZ5~C`TS81>RxMEID#NIqqEs70Z!5 z$-GC|_^6O0-^O}odym!C$dMLu_fBm=JBpZP&xx^>XC*B=reaw?U4Kq`H&Q zKSQ!+^iCE(9aRs?EwZGW05f;#8asyM?S`^$3q`*@dI}Ix3*2>*LyoF5rNC0kQ?N|b zis<7|R8rPLrKpt*Fe&sm*iozEPScE}w4j5ijiECD*p=Hs8}%nPCVMDk@2JfTa41*8 zdQrDBAYNI6(22T@0SQVJvEIsnB&CgN?qoo+@(whKy4(6GSf?p1FhJD3wix&~OPNYF z_c6ewL=OOPKR2*40rri0fZJD5VBV+)xp|e5@c{l7dluX(lz+ifQ9HSDm2w1p)MKpE zRSG@oAN2&QsaG6WUZS34VZA|#BjBG5XjV$8(|^Sc0kdn+>&|O!X;94S0<3jT!lX;jE-fa!m7Lg zcSYM7U{|&xgrd7K^)RPlMv3mufOw@9#)|HtoQ4bu$}p7z-AA7TjP5aL72VHbK;(y-!tvd;2tD;f zA(mRivJ#-LAybkC-K-ScL?UfhaU&>i45lXM&5EZsqU1IP?-!!o*L zxoZo6P}2c?cO{YkjRF%#GL&QJ>QdycCm4lSrJ&iF3rzHq;VVR{E>-Rth7lNQvf!IB zqRBNtCRh%~qM#clTShS245B6LOj2nj!zTcB!{x3s8O3~}APZClDCQupbR*=LD;ULU zq98&3q*BBZy<~U^&en~R&D$8+14Kq$J=cy*h_!*NlrEcJX0)%Xv}gRZ%$Z!>nFB$a zAzRKd+Fw*!8(0L?l?;z#Leq_rExmycHTB0g>z>vhPId&sNQP%I;&hp^Wdb8BP|0Wp z=VXj8r+v5&XtQK1jqgy?Dty~%t&Ziji!mH^*|N2n)so-sv|bAhNA^T*jvVthR{I3L znbBxH<^9kIkqj*~7w5_`$CaS?I>g7P6pW4JHWP z1UZI6%g~d0o+!s8pjoJC2)?^6f`e$e6>XzHrgO$6d07)H*| z7p(P(0453GVXB!d$50p=E+?Qsh;tTGg>H%fe!#S-yGV}t2kY!#YG<^Z#?qh)^e7od zViMO)m19maTAxZwOB$!;k=BbkE0SZvk%yYB_-67CL4k8)rNJ;AS2)!4A=K+RgT~Dy zeODT&y^IFZPgkKgm!etkTM!nK;|SJ`)xA?;O<6L~FX-y3^mv#W@3eQwwv4c8R*d$$ zU`tz;m4>aPoW*Kj%VvN{c@g1a%VB_3d4M)KxeTx?DFXrIF~Fg$gmrA=*`6ywS&M1h zHo@{ZxFsunh}%R4q$#&!1+lppkfl&i+w%F&LYYGwy-BR5P-($LWt+@c&r+_(6l*JB zK(TTbbB}Eb11gkU>gOT`)F?M%CbCUsz$&FDd}=FX-0GEIpsVd-HWP19M!+VvB39F^ zyh1h8S(`1&NosQm1GXtUFvHqrFkriKlz^EG*r_CwL1r;ccPW{$x@|VAX;DtW(6%`Y zIHXk3hH@?gT9t1d0Om2^h*C^s^BHhl8B7coFu<#PL9B}z(59G3?Ggr@iyVnzX0Xn8S?hsWZuiV(0nN= zPf+tJ*1)7}C19zI=1Hrvih`n=0e0oO5CF@V5gp3wR8tc}lVyTJe?DltoYf>Nn-PPK@2QDl7r6RMwN3t`Ks~1q<7iLas5S z##K=??c#!E8HLo<`tQ(KH;UR^YtKUaP}2l_ccsv$jYMD!#uA8XngL=Qw)(Jp0V{o| zaA)QU+ku zMHR+g3&1477Q~jQLQRwLt)qrf7wf4U{yjKZqo!GR0Z{f}ZjLHpn<#K}04VK26(+Q7 zMy{KJ7>z2|Q#st4h>0g^u{8oX-eW~KDoe`k)O}?H&0{9Bds&SXwS)my<#pO>US_p{ z%nqI}f=_qySYII6CIx*sNQf#u)rEfyPS&Vu6K&R&Z)iupjBVHG)CNEe-|tB=hNvrz zwD0db3oeOT&5oxGa&M{c0t}<5>jd0O>N}s{wF2%b^}Q47N39od52>#UN=0oDaCfP1 zG^x@k;BHdi6|~vDQNVFh-!mjrlYlWhg_^R#F_c}9gqmm%8)~9`ZK#Pf|yI~ zq;kKM7ZJ<6xoB-Sm z1@$JjF}ExA=tLjGuP(72#Kf-es=onkbhXgN62(^k@MAPZn3JqAm<|~;^I$#SQ%**W zdAOw;Dy&K-Rwr{hJ8H5k*I>akkL^N+a7gi#g_@|nj+mLp>EA#nq3k3p)RYE1TPF)p z-~)nfWI{~?VG7-J7~E=#Nu|~ih*@ixWeLimrW$Hj1Y>#p?WiNZ3yN74dso;Dcu)Bg zl#JcRFTE8SxUqNhlNMzr0rxP#stmN1wp)qK%D1(qN^nFUD_O?41; z0AzL&jp;&|H73bBY^4);2ZK$JPRCG?q?zIxXE#{=3@h)+flsRYFz^Bq(<~#`r=~wrh-JwbuetyoG0^+(A z$Em_VRcp3{u&JoL(QZX^k*@FWVus9-@~$$60ZHVBqNg)9eXs4y7v45LCTs@(X& z5a)7q3f(Vr4#VUHYb0XAyKVY8}Dm(-+QmJqS3^j}j--5U<6@|;7 zX(bir0Rwevo!@f>Yn``&5A>>aPJx8<>;BFYsG^^FbN0gwR!xPE(41bR;H-qqjmJ#h0bQKy;RFYSbdG=-91BYdoV#E%$BN|z&SFeUwF`4+JNqF7 z99OKG?KDC(N6y3|=K~lzv$KmPItO4ncg&dPa@N7~j%fuh=QW7d$+M^AItQZQpu)m| zu$e1&iZdE~QmHT&+7F|G9bO$yg-5`71Ql+EJw{TY+9^q+sIU!&NuvV&K0!Jaj>6B` zRJaZdbEpsjC*)GW4TgDC=!+;DPlW+cdIA-)^azvErPa$3L~68EN&=_bY9G>MmeX#KER|o$DuD2(w(aiN+@JIYal!dInLYx ztdQ#*f=+?Sa~dHJ3gewm!gMH1aQ+j{oD4flhI%;K{<*B*4lPvwd?}l6BmdB;MQt_0 zLV?t^?&_sZ9h9!cICf3~`DN9WRZb&K5OoVnoa;eTirs?^h z{W0k91PW|7VUY|!LInF(o#hA&YWNdGwcp8s0e1T<`mmotnlMYUzpC%H8!e@T*^>P= zUN$Ank?gI!Y?Tc6)AaeeKJ-cM#GbF3%X1IkgQCBo#GZo#6zbvWe2|FO4$K!mf|6C%Hj$@=2GZK zf#Mc1)`iNY2>!Um44AImj5Q%{NyL1R&60FZcp)w`VLN&aHT@0W)_X8O9EP|XO%f=$ zjyDM%=^`g?BjaP@@@`T}K@}0X0ux!><_I?ct0D4of^Ok@8E`=vH#saGHRc+3trS zm=4@|J<#V+h_TBTh1~@-+oH=;#cjfeVNZE#ZyN5n>b@5CkPG!!f~@}%40O3DhK`KG z^xL+A1wP>NkFZk?mCG){WiP@+-qmLh=kf}jLp`l;0a^cexK;kA;3EB*ctAwDC)~A< zU#mgaU>28O(MN{>7p7MqBJWQ3gfmq#SsJtr5iB3qcOT5i)Ms$I)6L#8m299i$UtP( z#_rQOw?FYt2Ms16_ZijJn>adYGtCWCLi&*j{)QH@)u>=!QqpYN%U#Ut=#(tBr;IN) zx|3>Xkj@V2_c?kyLv_S}U0lQx2(uGi(n5UMzYFO{wxJhaax$vwu*51@2ZP7K8QmJ# zMPW8IWZT{$UMvju>$yltConJu~b5@kHa`aHyE)x4bye` znrdmqkdpesiajD^cIjsA2Q>R)N1~yoDWDi!hIPH?2bRG^trAGdPh#ba>0-+z4BN_+ zd{WXcSaf@J*O`g=9IB&cQqluDh;}iTcpahHmtUn=3;fJo7iwz4a7n78=~M}cCyU%e z4Y-Oi2zYy!5T^Ole)Qm(ux9T|m^WS{EbdJ~+jI($v&Q(3Rl-;*!4@aLH0c9cgudh= z888q;4|mYIaE_z92hg?T*&jJNHGqE20kkP3p4R#N0QwG+9v39EJu42NCqOg1k)v1o z(SuX4KXCMA(r+RxGYj*;(05^F`&Y*Jhg9lVDnSL>1`M7FeqH;sh6jjXHmang*J0}( zSLm2mK5oZP44fM<1=ug)gX0&Kv6S?88Z)Q)U>MS07=$@RGZ+FxU;mGAJowiV+6`8GcnrNB(PqEG5Wki1Y*0`M z8i&)M_&W%Dco@H3M8Jctrx9)LH1?;#^ckVq7Zdd~+QtUHuB49W3k)AZHaH)m^zFe+ z7>0R{-*rkty=1?`*q>N92u%#7q3;{8;4akJh7pQ_UP{`Ah_c6Uy{8kJO*8>3B^?F} zdn_kd-T}ej4-s(v?Cg1&TU5S`IqzZcPIS}T$|QW4>baATLU{Y*A^oVQmkG_fWK$ij zxKhe-SiWBjYnBvB1L1@*o(ARDei`UWS4zsqQfWWNCk-o{$Q599$!EZ$+ag7B{QT#pYay8X+A&106NPDUwo~Hc4XYpl@WiV`$Y269A*OeSlcM-`I9enkbjytNc#W%yD_?h+!7ds)3SCmS|fmP1hx(-?N$I)D9|0q z^jogQgN*Y*gO98hFk7>aeAZ~xLxGX^g6bb2r|nzX4gepcaFT#$0Stna1CThkM3tLb z@N@gdXuMeEM!#Z5&*m_0+fbl;H;mgU6pkZFBNl-7QI#8Q;N_4I<443{DQX78^aGGa zU#TH8Yy+9Dmp*Ld24Js3^-84l7d0dyDoad9?4x^D7xo%)JqoJFLH>6nDPz^8yqadP zG4dt4s|n2fMVO!B=Vvq$HJPgE2p=f{F^UMOF zDv@5+o^Smv*gS&Ul>M$I@!R^-V4R_(_hKZO1e`!1yoHoYPfMa*KFxsDh?^xy!&j6_ z^2Nqpx*?MEFyOx;<&BO9VUaP0RscGuV&m%p(UYteuvK6md9E>RF8Ucy73pJG&7$X|ca^y{@nGBkVM3;GwprK{zE>y#^#t4!_%6wH+ z(f#zN+f_}-7)dN8X&>fxX7;>d22=AeeYzjGI82}H2a0epBLJH0=<+MnM4OtNp%6uO zawDsMY{Y)>PXd1H3JA=N>@;SRk#7ch0}?l~(>R5U+&u)7DbnzzF!BInUurcA@N^_@ zgo z#4Ufl%B2{dk;fV%env}X`FzlfC%Vj3K|_|eLs({c5>CpzR8*1WhqbH9&`l)iG?ss* zgd>>c_xk}D`&mCQD@?yj0AzDIof)^!0?8tbay6REcc7E3N`ftHDax550~^XcA_-~2 zc}MVw4kL?uB-A*RJVH-fuR-D-2{mSrNA?1-8)-tgVDLQ#E22gJm3#@Ll~dsP{xGks ze??-3MpnmA5A%8^T{pgGnsh=?zqG?DIVms~!Omc3ZettHvVQfv~ z`~&*DovpFzPyIv)K?u?Rw8k|yoN05i=MFaB2D}oHgvMj(1o`3gCKE#q(L8IFDrjyh@oRe z{l=DS*(iCMMF}d@0?f-ka+@LSM`#!rC0BsSN+dQ)?ndEGBq@C=Y(h>SD4JILgDMjHQB-_VkE-T^%VupaOSIM1?^uTuxFv;699$Idl2xCh0fQa6@|{%tQ8NPn8{p!3Y}gMlm`WP z{wj2O3d&!Fj#^<*3;xhKWr%o)l&8?4E4#;#0--ZdFr?7ANpvkj=LkY)fvD~%bjpP` zJamjSn;zn!qyCXN{k0N(`Bpy144C5$t=ul)m5)Yjhc<8(U z1T9QFbY2V!oueYQWwqcBomNBG<=B!0LMIkgF-R1+{%zlt2S!k`w$sk*;uh&V~QQ{-F*Jt~m`k#nzL zNRe~UFA)VTHv1WGi`tF?=WXFL9ymL&%*gx1awVd6y(+@iZaAaobIv}#Ty236HzD!B z*~gcwNE@DkM;cwa7=ODWnCNO~!?NEHG4eWK3s5}?Y2jK12iNWO~9t%KSi7(MIm4 zc2yaDb9py@qpkH%)R=7Vz#x!!b3>^=H}Dp3fD!i5Xw^`=4P$78T@OL7LE?tmZEzhS z+GunN+08l%TMHfF}X`2?Y<*D56h$515D;+_*zx zR=YvW6|!3JTP;Q(_7nUV7>X0nCI^XGtpSDANK*PIVEL5bqEid&RTbm(R{GVNkw1ZI zALyS$a)q%qaNFw4J(`JZCdg=0xpCWSipM%Q?`x_z^J?A3Le@B0 z${16?W$^nYVUZ9@%3Lp6lBZu{Epf3#50yw6e-l;YX%+wsjg~pz0wX^yTsejFx?Zr9 zw_ZL*b>-8B6mq2=`>pSxEqCS9hD>th)j+O7;;s}-boHU&{EToVJ!|wN5_9GIC>$k# zTxp5Lr3um~qGzt$0Elkeb5{y>@(rS(b>+bfttYgiNwp(E4H;#0w0o zv1l_IiTUCx6jmZ}U)(CV=+uJN7l*)w`Qo3T{|A!a7k7(h#U?{6jf<5K zbtw|}#U?{P8W(Lqe2O%j-hd}>Hdv_{{ULZFQvRwdW=rxd1`FM4#Rwm?x;J{f)zFou z6WvA^KcTtJz>dM_2{pbg+`_koh2U@z67$O>A)l-k{C?SP2wRCh17l=4+SDO2ztAHb zw;$QAI9!o>j4{xy-EsPxsqS3j9WwSc}F! zENbZ<9gbe;X_ax8(k^HNx3(OgjlBvxLfpVFv?j5m!wvibOB&ZkQ`Txhe6gQ+H9tJy z#H;zCfi&(2mV0@HAima5yn=71IPnU;jgoS%f-&S}ocMS?#KQ-}f_>zzpJD652Vf0% z`bm(#gT$R)!<{}4Zk&ZQdOFr-m5I)Z$xW`s0IUP{HdNEYmm?PeIEcb?NTY}(tsa;J z2X2)h@i8aFkbe*bzi;2ug-wG*0pCtVo5@Jbw>P4&0ZB^V43=r)VnyyR3N#w&BOljA z>>@4?fNE4RiSQUoFFJ6Lhva$=fNo<&Mz&~2H+k8}tAIP@;W#RwGi53BTOl0<&>P^# z0*D?>#26Dz{bP)w(J1E;M7~_X&8_}ISis!#@>FwIa&vzNfj&dx=C0)CuIYn|U?gU4 zm5GktUm{;7%>6K`A4Fp2K8nH{NTY~^nR`rMv_@j)zCq|As|BsO_hN$@Fn1~1EI?xB z-iE?fByR3QDwiikL2K>-(2JY})+s#xkp zmEYV9P39hlFS(SP8|OOg6EOEn<5hE)8raFA(huZF+}x!GcCxq@hr(sV&;AVg`G&; z+_O|J<3&Mh?puiqk8Toy%zYLu+mQU`E)nfIGj~@}Pv-tR_%USuJSIy={Wl+>K~+JrXnbAr$CO`?8C ze95!9xm(2&gZ&iy$Xo9L8$Nf>Hl&fc>1nS-ByR56hCDL&5+D{KjeTD*plkHWJ^`?R z%Q;JHL=o?&P1K-?=qDNS@qUW9TmOo>dy#lQMcl2YfH;nnkH3bOrx~K}g9UXPi!%-B zoDV&N(-oYcI9=wtrtWYwCW9fE~--g8eyBmdPk^KJkxHylF{X16W zOphf=IX&TI*~K*=>(M8m!4nu>+@3D(w~x@#he%ul7x!D=L`mv}#5BkhOeD47*C5{z z@c{TS4d#PY#GfCekD{BaF(xep#h zNB1Lf4RW~;P6KfQiD}S9)j%!yHOMnWRDd7TpwB=|8c0lo2`Jw`30$a4+Gat)TEqe>*M!C0=rLqI%$#58zcFp<=PUxRUm2s(6S z8qi}1Cy|&2;e&9Pg5=lWd%>d!AM+# zbiTG#1F-~&Y4E73fm-luFxn9D>13h7gCPGa64T&S6kbO1Yw*HvYoKzbNB^W8S{LPE zTm$vzYwhF+eB`YwaSg+LFpT@)8+7y~64ziD_d#kB{Dw4+$3?0nh_qQqFifTpP$cSASy{nvkPR1x~~ z6Ld4?@Ngt9LVtdOJ{gFKNMo-Ntm(PU$s5|KdLNGPJH4A))HADQZ8x4eUPd z2C!R;#QW)OVE1vK2VxJ>#Qp{_bMR|6nzeoba_pUgYa@03fB@Ll&bVsY@mhH2a{r6e z>l};rI>*AVa|+nKM=QVF%Pw_G_>CS5Jwhwxyc`NH;hf7(!T%es0YYVVp{hbSKPMOr z!TKR_6~g&B!2>|tgEad63T&kW6I~6s$O?8AKLL9Z)yI%VegRoql{oeS z^bC@#D}ZqQkzy{vUtE0|{8O2L(}n>45rp3$rDXt^l#Iy=Da{4o&nWx}iEU603qfSH zVC773ETRj`o~qrTe2+HYA+ZfgpA@WXNK)o2f&=Xx=Ai-GJJ6p!;jtr8MSF*p?W+ci z=Kav~!uPW(vB>JK0f&oq*W$ZKPNrL-$x`NUK}}B{@8i^_6;cHK!g)6-bB2c3SDo?F z(VdA|?9S<>g1#%bDTRE2zZ#lU3Oqe2-A{w3^IQ6S2z*8WpK+JK(-YFrI!u3gF{5K& zIrDI=BO7_lsK4?Zh?%A$HD-(k_SDW|7;`=nj~SzZJ+*Tji1(0K%&1IsJ0rk3M8r(b zRQzoM5{sEi6y_t1A`%uebPM}yq(2lhBZeXDkXX#DMd4ZkC}#dY+P(xns_Odxy?MMb zAq0T{A}$Rof+7%*B^m;RuqCpL%p?Q_hmZ_OG@F?T5G$f$wXP+ty9m@S>aQFAT3fYl zRa^a8tEjEoR$KdXsdjO%+S-5n|DJo#x$n))dlCKFe7M|m&pX>a_uTa@^D6+qKvFUD z_Nls>wgAJp+7vUrC;MaO_!&5bL{c$xDuC5UR^?w=0>#V@FzA@UTXa_C;cK-pikWX^ zUs}SKC}w`GE)5hj38to)`9M?qVrG+1)`V3$2K0R_U;O!E<{YM{n3>1)XQL(;GoE5* zwGV$a<0)pkJbcByj1P{Pa*V(DV2FP1@)Yd|FJ^v{keIRbr217j^BN=_GnSrI$Iir3 z7D>kp3yH)iW^9g`)wmo-QZe&20M{VRCK44h(`R8)L)x#H=>lOJl8Tvo0o*|aikSmv zm1yIBchZDuj@3Sv0 z;Y$=V#qgh5%mP4{m9WVvnDrY{#GwB^N}-|wqd`8GoM7#G4qjg!gF9rl;cfzBpov> zBtmZ~+y8X*+|-ZDmm{f|q21b(NVADV#Y{Vf`c|a(fb@T4cZZZ(;3z?$G~fP_4&S|9@!dIfr%1H$ISbVdSvSgATB}DF~dS4 zJ1Ay8;F$S2F4NsR6*C9Tfe@tGM51Emn<(9cv|lmv5(r;FQZX~V5|5@KshHUg;PXg2 zX4nw>Z3g@?GaNYYeCrS3`8^4tr@;&7;szxWVul$hW{v}_0|W2YBW5_9C}x&qUs}SK zC}w)qr2%7xsVQc@qN)8cLMNW{Lotafb21 zF*BCdz;AQRtj>*@b*D53f1OAv< zgpTCJ%pp}+Z6T?csRl3)2{FTr6f^6=pkjtT`GA;#w;}16`HQ2TJBTd6E)Pf@Gb|*sZ!jePm1AZeNGgz2 z%v=g!8`5kdQ86>N8Y?2C{fe2@AUqjK#mqMW?4bh1%m)D8MA9+ChS+a2;E$QUwf>l? zTZq*bl8TwF0Q!&+Gt5Xab0rv5%+Pl}5HlQ36f@t;zO;ldQOvxcE)5tnOieNKk*4;? zj8E1iv_;_B$R9IIPcc)?^k>sJ!+46BQ+@cW8BZ~j_V5+=GCnwFtl?3^|((kfc2-{=&5s1WC-m+ytf zJ5gA&9xCmdonlfw3P)WBBF&%^?OU7@dR1#9%BLYMnLHGPw`$~LKskIxD@2Nv$%t*Zz@H{IV!L6_VmeO6h|DeoO^YI-wS4tw>7gr2w`g zRsPtg^ic@$bWO7=eiUfLG&bT1F=7uHal2F8wjR={=5IstpOKUi)h9s>k}~4U04}2f z)%+y@zeTG2ozIAs5aJnuN4K5{G@=YfoOKRvH1kz^m;)moateP6^>?BJ)Y#Po2V=M%MRDFy18k zglv!ipjLmRZw9fDzTbiTd8O}>9DUnJAHDaslrPxbr0*W5_yuC7_uky)Kp?62-j)m5 z9*~*$-sa(Q1(I@skT?SPUGT7&v>D{RNLIxwIVO<{v`tCA64^&K-Rl&exq)rk17l(vS^t1>5A%&zifuS_`H(p)1l{ptq%I z8Y_5&dL;=x?I9T!O$yPlhR_ht@AE0<2 zX?Ynedut;k;7eDQ-JmC^891CPLsC&#&2_K^7$KEe=M+Dg@<(Aicuq%BQFtW)I!Uxn zI23(wuSgM~K%}g93Xg*Uv*v^9DbVjjnl%FjIwJfV6^=oHUdKKHseBm;YZ3ym9JAr=}pz5?=oQd3b>uCL2*j*C|1 z^Q@OXf$&@KP?Xb=Hb=R7b3+cy@$L{#%`0AJmYcvr()uVtbVt#sNTk{v`g_-6ra^@0$?F~mL+NI>k zD)kiL5Jx=)Xw6Hxxb)YEIw-RbYPGES>iSM3+pG5`}mG(T{UQ$*M zvgW-o4uY;{LG^87$n}x&o*~yqDwH9;owPV*v3Ri$uUM*&AyqX2zLDXM_Fl{06)C<3 z?Oa7)^|yCN)G%134A~PIN?&!c7R;o@^;)f1emV~$jQX>8jz3+7rL__DcFx^st{);* zPa=cYMyhEwI}|6m1xR`*Sr<|71g-_*6r@S(ALnHn3m#C?wETX2CF*x=e ziZtoYK_HqIk!MpU#ZV15rT5pt&AB)yX_`41*On>&y?rw>nQITV)a9kb6U?d$sqar6z{M-e^50Glw z$}D@d?x#-w-fcB))2KX>Xq^5#w#{h6*98uW6w?>ThSX!nhP0$@0u+tW$aO%}AWRl01B4@xPS^zpztApH>mJD3caUby^K`;ItqUP@GKSH zN8z+nEvp`>+}VO{E`a-~Fbsu?wdhVr<%glL5x{yX9E-w_0nnMu%9$wafL+s2kMdb4 z)ULxojZ|KR!gBzgqQVLkjyw%tL_(T*0SaHlLWusHedLG*_Sm~RQQfcN$}*5FMp|?g z3bW~Q`F8-_0Mu1T<#(d+7Jxq?v9KSpun2uq+^)9A9zb3tVT+QONRYHJx~zm<3Dgxx zO4#cFUP6K^PX)`c!N9KtFlRjgN-Ze#0!SmpGAN*{6t1KU%NvAL4Ybk9Vk-Nk2chfHa_DTBdW{c1)rWr12D2Q9O zO`Ut2ReYkQXNUlSg)sDim0G_5o5`_}D ztQcw5Dik&VSWksTC|nHS3sfja;XwfRQDG7a{|~_5sc<+7GqKq_9%(iyEx!;L`mOC# zkXC*Lh55i<12f96MB!V&-ikEWU0|s{6|N(=@G}Jd@gSwBM$1$l>cgMJ_-(+KGyd&y zIB3)OLH)0tgDvmLYGb=fO@9sQ*_JhK|3A;UauALcnTcb65Z<7VB7`nvw3$s>;28cp z;eCfItfuT=w z@3O~IJRjbSm(Y-Okl$q=OUQLVtVYs7{$mMY#Iy?Xy9FUJeUF5&#Pq#_keI$tA{HG* zh4B4?*vTRMfDYl?pq94gGrtB)Z<$D zkHT&MH&WpV6n+Na0V+Iz0y*=aRJa|56H%CjG@C@1JD8U?q126Z@-P%`nh!Mo=IG2? z3dQBaap9++xDRRW&GYpo6}11&1q#~NGG5T$?ZaCTLBUKx`!wU}_3+~vPy5QikiBdh zh3xN`#XnqE94&EkB+14iJC+l$FEQ630Y+K+&wkM!@)KxQ0XwV(3t%J_urmQ1k5us{ z^9BX%8GJ1_U}v-b{D7smbaMmt7WiUbDUHfsvF)E6ikw=#wgyJpSK9j6=ZsPmuHwQ| z#VB0O1vQ*rqa&?W4W-v|K@FqV=?JS;L+JHfP_cJ|t#(iPz~@FCcdM3NFbuMH+v*oI zVAd5!qnKv1Xwjz4%J|Ld^;@#ZZ^>rAC0qQ;`~1p3pQU`OQU0%SP+o8Ak5|z`Za%Fq z>+P|$zN}U2%6j`~RZyo^^>zihuL_&V)mjV zdmR)G;lhFuC>+X#iephYj0?@gbGR;4r7Zh%8eCP?hZ8Vc-G^EB-3g#sz=c0jp;{MK zVI62M*5Bn@Hi0B9u}fY>%rASGVrQv+a3>1*OZPU{1)|7iocTzdlWAf}A=v{ok*? zIb5$~{^VeiX|2AJI?-NxZ@HG~slUUh-#dX0Bp!z9`$+vgOiEv$So||CWT{_s|K}j| z5~Y6F94&Z|t#fArd^^(k zYbok4Q++eipBR516)#sOE|LC*Q@%w3^Q94_WkVYzAf2jCW%?D#Lnz;iR5_CkqoL`l zv&4D&3}V-MZEWuF1o>8F12fVmj_=Tn>VOa5lcSOOY`Cb6N$A#Y<#r$a>wbE*;?N)J z`wG+0D=juGm(|QJ#{U6vcCZisGse>jq+H=KsDG8M#+TWAY%w3(hd#D0VY>r!o%*X7 zQK3hHHPe)=iO@uI`5MK-^$_DEWR6)!Vukc)oI*T_Xb zf*8Mx9`n1X)vDabv|omG&nQ|%=W&hNk5tm@PIc$i zhf(zDfvZ7nrL1+8=n~GcwzCFQr{QO_oMY9GW7VDM68>2FTyq`$cD8eD1-Y@l?HIt5 zN{AfMOuyw6e_#mCK@M?7I&|+~K4hSvjsvauonvw7j>ve2zGkW}-Jwr&WjAEU!z*Kd@u^<>w=Z|7OaiDNw+R6=a1kciz9DVl4Vx%_scD- zbS@zL_38}c|F5v>nMGf?xE*bC8`7+Qq3{lXH;~GUunC^pfyFn{(lIE|R`CQ9buNoC z09GvOkKVPoPo%bh58o2hQojV?a-hUh{c(SzAUhZ>^m zd_=Eh6CGiQZu1cppOw_pkf4q&!~S1QAMeb$VYI1RLg4o zU_Q>^5|;YAPG^X$SGFTg3ajuTUc|_)NV7(xa9kIn3uz`X(Rr@=n~zRQUtV~Yc!;b8 zB={7l7SIpiawPRN5#fm_p3Cv{K7BChF=;?z=?*Mp<3b&(hIF?&uk!BOU`kKh8 zD6K|P_f}mt!4_Z`n`GmINt0oY*WIoHPd}3CZchPt97%soWGPFD2v8wX@HLT}s8aO( zt`TQqABSYVCK6{h`gFyGpd$BrU)kBtSIvo;?<+e~_!`}@yhm~3Ya;mRBYfFqK3}4n zmWVG#!=AY|Us2!uYCIWk-oY5J)o%C#jBUcDRb(jAtZo#34&Y&=nZ$HIGg;l#YWS+f z<-|i|(H^{GjidyW0XPmxwVLom6wl|m)y}|Wd@Vq?T0eje|WJsqo^jYu(FFfHa%vRf}DR(p5;R#TKy%wgCPXyXr!Ji#-jVCy-Q& z4cmk}Hb}a~zQ|G{0{B~OFjb0LEC%{zNT$WU!fe!HZ$MXei#^C!gIcVUuThJQhkWT! zEmp<3e97Np@B>aBW#Rej;4?R+&grk6~p7ajdEhTsg^K8v|dgmxFO*Uv) z=Aoxdv2v-gNHw%dgceX{kV=3?PBZLAD%OIq!aClNvl$e@^T%AXKv^>bR#Wh(`a}-; z(E^0_%){(yC9CW^78KPT)KIj>U9H+-mTOHbVT##Bb{z=IXLzU+3=_%s*iJNf5r$56 z@%c8o)HJljoJ-EfFH4WS6Zq|qi_wcubXE%8&aE0!uB!1@}$1=Rkvem!_hTUUrh zE%S@Q6J+F2s`iQ^xP^SXQUipGkqVre6NYL+xK%|qc47WnYPTd9#ZjPR$){MzLspi(k%;fgA&fYCkLC2<8idO8} z(3VMOW72)ui0rFGKQ+_Wonj*Vekm#~qTvs+q6WW`+SZBrG1;b}rjGO!JVb>zfj69< zYRXJ$wIaBG-j>doGQ6A4G&iR<;u=nKlm>tpE(Jti0|op%8L3lWV?=K*23HTj9i+bQ zt{zsFY3oPX@aq@XV5BH-@6bOt|lsxNf+;W@F5DI$aD?!Ht{Pgf7C-hehWjJVniF18yb z{48dAI@oZU!Tv=7%P(-Wb#%9Dfq1MGjt7kD<9W8GuI8+&Y;J08B-OYI*P*2}Oy>I) zZ|KXU(tgCo_O3>+t;iUE+mWelOJFY?+u#;7 zxP{S^2Sr>QD4m6?&TzZL9UdL-y3tK;LDX&lFwLD9wWkcSUE6upwV@*FbnI})M?oHa zmWYtA!^Q7xBk|G5Q6t~cpsd$;X!i=)o4cifR+DvrLv`For@ zo8*dMa`OiiWlhxi@mU3PploDGiCYsbb_b7lYmRXTpW)VYxr0}}>=x9*rWNi`Wm~~P zE`F8Bwg0EVT@iJDX-^?1kQ-1!od*}3R!e?>Wn*fUC%$q{fG0LWqVmKX<%!>s&!f&p zRIF5K@jOu&wa>@37FNGqxu_(%F4{21EwmzoB2lMs*C5Bm)I2ESJlY3A1eK`&+_8#6 zT{|C|4pv3yThO5h)P-m*T5U~9!EX0J;0vSMRRxQqy~_OO$^6moQO@_z1~7`Q&2bBy zM;)^G3niep$w7rtd^giw>D)c&5jcdX8XDY_C}8BbAILlAibGe*$~ly-S8c7`=tLdV zVerYW5c9fpEF0H?kWQBi#9~R!|wbaj<^+M z@weT{QRfR=5Tzx65dKA#)bd^jSWZ^&6RU4NKvift;`@k`YF&GcJEX>45_Pt`Od$bi znCqTWyAk|4U=Ul*I=Tj6xO*5_v}|~*CIfQFme24wy(F4tEURsZo~mW+c9%w-UKOl> z{CXF{ZA$h+pi8r4Q=me&eDB3+Q)b)FmvDzw#V$whYZ3U}xpwOmFgQ|pMEqZ@{a*#1 zk8%HnDm0uMw!Z8ZDgPIgn0^gJ0e%}RI+Zaii6jF=r6D0_xzW~wx$Xo&Md!N{=D0=Z zo@-nzec>^*-YK|XJCDI$1jemfABkq7ueig2Tpo4yMhY;flmHy=9%`CpYSel7Y}GC$ z?$qdk6kk)Fz8#d0J_l0!(SZj;0D7()y-){r!4%{tsTdlv5gqzjcQh!9qyM8+6-O_j zOVl@=A?OjfqzA6^sh>ccuE&r0%36$NM6nG2+s@zMq9IYI=Po7cz?V^2CLrmg5zUQW zq<9OXy9?IfqSH*uongC3?Jk)1Ya%-zN}D043#m~P*sbeYVav;@lG;M`+(|n5%(Rj|0;dy8C;6#X1&`jIuWJ0)ICbh zFQul~yrW>vb~2-bDmj+?=d`~=h_jw?3ui>PA0N%Q!<hlF$16nA>mX+_LI3&5f7;1%xl%jkdQ z08vul1)xoy{7c=#NF&?%?s&=|na23-?jp)w zf(1I7hwXL?SL^Wp0xY*(gRl`GXmO{AY6Scqx3HcFk2&8x8q&7AO9G@ETkB3hcZx30 z=F#ZFlQho?b#ch+1tVO$B;%H$58Bk+^oJ7K+ZjB?Eps*@9-YB+45V;#2!}9_L(6sq z-)Ofm0q_Furv(&=&VhF!{1IzWXV13CB)D?yNE^NMRM$NLy5~`c#WdtPg$3VsM?0IT zL7c)l(FXTmaJeI;Z$=^D7nVI5LHnW_6!UxUC}QB=drbuM2txZ?+b~491*bAQ%s2?q z-G!;Z89oIauV5ZmR`o(!93bk^{}BIx<`_ufFq?lJ8mOuVxrLW1klMqma%9E`l$;T! z&i&gWQ$gSi#uF+u47`L@lIz^K4SfwRpuq}m7=0@Gxl@EuceK+>qnlHd=YTC#gWqTe zd~ZJ-@CZ9#7nWdLe{ggCJE;C8Q)srk&DB$t?L5zeB9MC=tojB!FP=Rod&T&(pmh=% z>{~J3H%PA-Upjk-J5D)A7E1V8x2PRCaRj=Ua}{YQk2+6p{WdqiNGkT(ux9AVkf=Ll z;Z*?D(uKUd-7T@B-==15!vunn2WvQIBK(@5@Tx-(8ACoEujZV!YT$mv9qt^3j#s>i zNaC>7Ptrg_c4-py#UU8BTtZutbttE;v`KA$gScXJPs8g;)Wmb^ZXk;So|EAdm-!7O!dqLYduojK7;IrBL z#iGu&=jbsihIw@etrw%tC0o&z)hty4^RVT)qZ>x87^&AiSb>tS|BBUTO>{GPla}+$ z`i1>reJ7iBqSkuu{;+-k*5z6&EpVCjqqFzJ;C}{ceSd#g&%+7?8=C_WZY8MtyF8c! zbuq3Cc0M>8A+f|O@SZ`R1YAj*yWGId8P|W~sGXVfkF!hNL-GQ|>6n5xz{sw)hSD-a zu#C@Zl`oT^SoEvf&^OpnH1ie8(09ntm{<73hW?%n{oDW5&}&GL6aAVt^p9*PHous> z;L$&mp^jJh#D?PQCFEo0jsL5myRr;@(KB?XGW2C_s40A6L;uQ#{_+26=r>3ZR^hK$ zYV)I4;f43IK`Yc;xnn<04}On<5+f*f@is;R8idr8h*9a45<2^#b;Ja?R-eSso^J$2 zY~+Zs?g(cKEio6$qW?-9(nR0gPOGcmM(l$i@Lc7;66|5sDNAG~jcEUZCr^$#Yp_mM z{p&GyGH`p9llPI6PxcB~PX6tFtefsaoe&I9pDjlsW=p=7rX<@*P(4e&gLN^YhR*yL zIECsSNshoW;AqVFwsSKK!bw*~?L}j2(kA z=vQRWVz2Ot4Z2+$^xXa%^h+q7hc*6L`V3?w3fO)f@6N+H=P%rOIOoJ+gF5HDP;c}L zHoAkcI<>dEQz?5J;qygxgfaSEx8z$WRjLifkW<{zOHrDOcK99zA{>vk;T-pf9l$G7OzU@5c^8*ZPh-H;TpN9Cv)m#ZGa2^kElhY*98s#;xWgP|v@kc#C$Wiw)Rz zI{&F82>GdFa8x?VJ!+?0dVzb?iSE&B+;NlLqbuDb=bY=7Hn{UI0MSKsMB)}rb4Q-p z;uhTv%(*z^#A$YP7jo*WC()$7rUp6pNsC1`RxT9*_np$_%Zg*;f zI||zxwXI)<-2!dO@7}heC_l00xD%a4Q{2Ox&9&~aZSKUF28W$o?et|fx)Vpb z$2w=#y2Dlg--p~8dOn~YY!gnNiKEUAP~li)6PT}dCqDnq6j~Dh%xaiJ3vXu=4$^Js zhuS-ONjoI^0w37k?H&;wr8Y871uac(ABb!tiK|4z*luO?xmvgSB)780t**qpSkT(Gmn9`@fN14?p+{VSjm$GLGe?4#c-CBuKigMpr} z_Uwn@Pq5(#0Nc6#|2kpKX^0j~RWsJlwdp&QFEBOGc#9JV+j#?H3Fg`FZ!5s2xCG#E zckp&L+qrD3J}2IvSqV=dA{wwqr%rzr^m(5h}c&|2KH zX4faM2Hzs}tl6Rb$Y)KT$QoL|ofQ2!dFG@nTdw*9w*1>~%SE5s7OdSc4dF>_^m zQul=ZAFSzt|KWk*3`L6Mwo{fUbP!fBMA#yU>F^`mpcBzZwUleBy6A zxA^OaD^IBU-A47RHib`7Kicb|en0q6*YEqfeh>KShrqty)bDHl`r*niRsFtA^{X+3 zPfvxZ? z-yOdCVe9#*so!<}`r*p&RQ+zE`o&D)Q`C>P_Nd=C{?qlt`4aWN@B8Yvih3EH*wOmr zN`L)uxP)OyN`1kIo-Zzdiry`aP`c_g!E8#zviIqN;u)$GRxs#%!TegkyiF z;VyTqa~O_9oaRzMhtle;2##=Y$Dz=fNGnNN6~|yYM%+Jtrf8l1FIt@|xL}>-2 z&hLu0wsG=O}#zowysV<9gS_B^Z-??Zy6rVNiOc`>L7saTGEqBbuL%@FtN9z(=&N_ z_0p<^jhRLZpQcjUV|~lj15L>#smww=q{AX&J*iD?sm*1?ndwNTQ^9t^Rc(#Q4egCh zXC%A3@Pw0<>6V&@RSeI&iI%#io&_zWB7J7EErS=K;0xu{csINQw|6#XdV5lYUcRi( z>fDfQY;LxaNqU~EJejdJ;OVk6_$yf5Z#@^m#b0L#x(x*=|-%sS%fd7C05nMmMtPvxdHKG z$CF~5|4=C`8O~kBH{>&)J77xp)rj|`jWA}cm|DK-P+rE28YVD<5h^OsDcdXEUJvq zX-hY!Ng9V)bq`#Znr>Bhq+{Gu5_rDOLKQNocybfGfaeye>vT!?SejT>wIaTF<*MbR za$#4Zr?E4=v8$)U+7hQa!o22GV>?>jN^NOM;>ogJ6*H*7(o|z}sz)hB&w)*;1p1S~xs-H=)h&%Jf^B%9kdQA40C5z?M+ zZNm!}2vhaYXO@nxZhRH4v$rGO)3j&{qAP8+Z%Ss&pi-6STHqUFyn&}$8N-kE#TwgF znM|st6ORsdHl-{*VkJ@?-J}a`u$+44>Q=--jQS-7I~or`p#22>s-vaRGK=7|mGMRN zpdp@R?7#!6(xq^bhLx4-p-d9&SyR)wu`8=u2uC&EwKX**J5r5l^xKY9XNF?4xh+Hf z>h0V>v1}!`^qqBl5?YkQnp0b-0WmtZHg$D$H=?_DBsZcDS{Ux67svV%tq7cE1Ybru zS`UF}T5D5VS|V76UZPB<&FIlx)7jmd;b>#`keAiq7S#HgR8wmwhV7OG_BCxSG_#m)YaWr)w_j_nKsSqL7Oq8 zphu_M5r2FcWA-f7o6w0;9UD?T)FrjrSbBQ(s)Z_CRII7iM~K#A?8cx~Exu3VDNq&j z%olH>K@JoP@uVsbgb12dspi~i15KkFBcPXL8hg;{EOJ@n2Hy~{09}yBSdgF>h{3wg zliHrPZVC(1-i#Rufs9EcgI988te|Sf`sy2dIQ~@hBwO0rL5e7#&a7rW>d`NUW-3P6jcFeJDoz(C& zlEGtmpfLfYnlFXHD3xqS zgY-~e;f|t1bfy>EK`pWYfdWThjYN|z`c@6Oq#GZLNcAl4!CH*xw+vQ1YAA+sbck|^ zwY;IbsTGT%#!OpNTc(fNf+v&g6;yj$M;nG`8iVm@GFDb>3RW@~d(n!XFF zwV(s9N_Ao!LsU}D^+=6tnDM962Uj(jH?m-*xw2Oc=lTkKF;n>hRaFmJZ`_C)qsdnE z(onHnJ)2IWyoS7?BVh(PG9KI;5yE64tDH8&YdBop+?Z)Qm5Xl68q{pQoph zvAX7JRM(Rt5Q~>pEs0yyg)_ZrTC$!6W~N-y*r8qK8(ESID6-kRzK~JzoX#x6AkE_l z`vp~_35%Y=w-BD2+Pa{J+hA$+bmD9E7ACk*lO`Mu%a{e}jQ~ZS7q45Co0Dl;@lrD= zuVHC|e;8gdr8Uvmt=4LWS50t`OzTf{Z!!&>)coYZhJ}li3xUG*j>hh8BH(_Y;uw=J zZ9vkkO^uya9eyEfq3Hv7b9JAaE`1KgHCy_8rG;v_6vsdhO{&^hIN%L{ZkP;`9D^5&&SoJ1XfxfFJrPoUS^(bwdf}E!JI^EcxqD6?ICzVe1Y|{OF zp&HhWn=I@+n-$9H_Etl&HA@z)NUm7akifF74I`Oa)a11eEe+c?^kS&6n$sDzeNdxB zvzhsu)RuzYkWn>)wbkui>6Elwko9J$$F{Js8~&tKX0i>_F-1LXF^uu-(5dK8r=u0w zqqDpru9db}eafaFRhXVpC+()7>)6L}Pv>`8;6hO2Yj+4^wdc^g9JMxIQ@x?ON5VVa zxJfFR=)(FAV;C@jt);BRG>P2;rh#Oa-bd>lm8q#wsK#W{juDwgQ)G*~+EpB2g}B^X zqWe~fK~?LK`H5>tLrg2i4y+yYPJGr3fD-u>L|d?t2$IyQHe+a;&fblUO|-LDbm)tE zn}#hSz7!1sov9WyCcI!~0U7|Lz>T-0r_nzKP4g`@=ryzKSIb~d9p=|^Ju8v~?Y3lk z)sh7gW9jxT6&YMs!yg6%K7>dnRUf8md+$Thjy(+r>Bc^OIzE`y*x8wCmq5~o0&KAf z1q^~6Gyv0hC6f?U$6MY(Edo+vWF@wYY!o?SG0vAT2dQ%=IG*-z6kU1;XS$x6B%0b% zTl#3Q#}NcATUxw|4ZE2i&^y!(PBiTs{ zGXE?ZCzqkcWaEoHQA+m1Sj^FKJWi|X8amyaJa(czC9F=hSaloD1=1g7mS%|qe@*`dK4`fu!Lt( zSlyhUTu+lKBC;)KiN<70)0?D$jPRgwfE-GGYr=R&r&->9fyNw|h7Q23ThB)eWG~`F zpK?fZ5LtDc7>qipi%fh?az%}ydI6A5o!OhBGXjcQJ{&=H`>Q-c2W|M$x;k7M$d5Z0kv@DVkla#~N(x5$l`r0&Ft12{SoeTpC-oa&gVF zMFg*cda4LO8aSrS;*rBUPg83WocmPsUI5LbMOS%q9eGHdOF>LdC#Inu3*s)dUdPf9 zQ*ZwHE^D7PgSDgGHdDK)_cSpQb?ajwj3%;vj&p0v!k_k{O}(@=OZK$jm{HAPZJ35- zx!;W5sJ3tDo3wnR8XJEjzOXpK@(L`1&}R$nzRT-?Z3FXQSRt3vX?o)Lqi6 zO|`E!dZ(inDiUICooDv8Vf9QNG;1#AUe?xm1_uz$k+3gA6D@5*kf~W=0|q}8*c8O- z=trF<&@GN`+&;=!3sdcxMlF~iHH?=wclBZkXwmM5?lz$Tlf3K0$sP<5ydI)E)mZ?D z;#jJnJ!#fdtJ8Aes^|uW3>To^oN7Eny}qqa5-=!X1(?Appqj(5rfzJ3sk|u4j;FZZ zi^lrY$qlc$QBmruflYxej6R1{8)QBal=C%=khq~^j<{*==<39c6xhhSINuzJT`n%k z2&D!itUs#t5t5FurnaVT9urJVY{YU(z0J-IHr*SkmaM2Nt)4c!6rX9BK4n_z^s?#G zr%jtat#l&J;Yyb_X86M7*~gSl?#T3ZrYbSp;2@_7#m1hd)=GS4Ve+gQrITAqC$Bud zbn?c|uE`iu(ETQNArR1IHUk-}F~=K-X|?9z6J$DPUfhU}IKZoPLk5+=2w=LMnqadw ztvY&CA2M6DWHa6D^R+71ljC@!IRM5OsGR1z|0bl;F=^4SXkZD}wOG9H%`W!3y4IoZ zCN}FMYU5`n$y@v95vcIRC`N{>p%``6(`wG}LDuDQ<5p=?syow*y)c4SAFIj6tc6a2 zh)d5uIIo^Ay+l^D$*SgNj@lsU>a0?BffzblyLxf6if+*2bfsP0CL7|Ys*}AO;r@pkE?8U8N*hzK93p9>;`&PqxR0gIrLt#K zX{2tRxiHNka=ei-(B-sFOZCt(2Ug08yhq)n&d}mXF9cLzEJ<}?7{E9Q$93@96XVD- zeRSTWrWb4yx=$i4wB$N|y0=-Q8BPxAs?1)WIx}q63s4xXPIgR8;CmBvG-=W2Pm)b~ z_~PM;j-_P7idMnBCJb5h2@5^U>akTXe9T#&K8dFrw3{1ou8E~fGaV9U=*XXTfYLKy zDjf-{13}aT#d2>-;_=flEz(^n z<#T-qp>Wma0F5j&ciubnZ446`Y8OI3)CD5{hE?5~Yxdn<*6l~lsUL(;&o;nXbw_6b zErrxFh5f^4p7BMAWKCj`x>rqc>wEq~ce)xn7s9R>%QU^g0M*j=v}!tdgIZ2K1JKyJ z1$zrRO<2*q#ZtAQn;{$;G(FU$YdSDTW*V_ar8|^VA-?sDGh_V(1WuOQ5w8%e7NWGx zqk@VLs8mZu9rh^jQIWr0F;987xQ#=qRD7$Yi8|P#i4F28;wWJC03wU=8rezV5++ao zB&X@I`cS(@*rjebp&C8<4!XWhcci34q0VaPG9wx5BpS7H!r_na^j-^~Jz4@0i}@2S z$JD~N8})r4HX4hscojE^8V$_0s|^+E+Nkwr9V@DH7xmCV8{H4bX>kuWQ@FF>ZHi6Q z$>_=hrao+0xj~(`;>izMg`sh1zpC%U^yrly?b`Epx_bKcHl-(u@h}q>1xeh9!mVNq1iWtt zBL=L#_V%it3@uM-yusZEnaR8G2n}|&I50&8+B(&oM0+Z9h;EFrS)G7(W@&XVS=PO{ zfeSJ^Sq^p!`lmX*;yXC#mNcxXalu#9nhyHFk-x$887WN1erdMq`+E3k*UM$v?dsi@ zS@B_)uiBP2sp{^Qw`-$48#)i2o>Sh`2p2)SIkD7Rs70$*tz6}|!Russ?ajBe=^+HU zhK3~O?k+rVL5H*1!9#0&-lC&Y(|ikQ6~XF1G#Nclg(Xs32c|z*xLn_z!T_L{)nN(7 zA+_+(Jw!DRO|no|lh&KQxPB-O8+INb=@wZt8dr(uXM@xOP1$#s=w=x$r7=VZBPxVR z4MqX28UWoCPiF9Cp@MGRQZrOb=^Ns>-O||HCwKVT%r5Q(Z@yQXOcml*;uLlNi)upm zM7?`bM)pD_o4lIa`SNzGNm?nTu&t)^L_TK4(^`7_#R9zpejd}%+w@8r>ZxznEaaiH z8pkfGZxf+RKYDIOUqDyW_h!@xlCievAe8xprbD>3Nlo*JSo(OG1#eP>n2M+wm$tin zav{%M{BTvRsz3QafvHq~ekq13GX@*2St+X{M!&NQx zb9|=Zv(97WJ_$XF(3Zi1!+fI7-=EXy;aDF-8lL`w89Ju$R9u`6xN(|<<7B$swHd<+ zeS!`D(5h;Msv~KdYV9*pDX+WI1jCO$#A$h8nnyn!v9bpXZE7O&$bPq;XETQz8~Ts7~<&1U+C}8p1}fo;_CCo z@h5aOGye~9_@E^lak?=kCZH#9?XURiyB?K*o(I-uNjHVRu&Ko!uYi*cDj_C+-$NM* z4A}P7Eb3;?2V3SR!FK0T+Z|y0_)YpdY;uox54*P*28{gO0R!3tj{v zgmO)>?K_$IQO|JsJ+wTfWOyz;3>SJ4A$h3bB7=T2hyGx=$WVq0UIYahP9K!C&fq5T z#lw4ydY|)%RkmB;0RjU443f4VoKeHqWdbB5-l(pYRjU5S$MHG0tvUgh7*t%qrHmS6 zy=&L)meRL8LIHoCMJS~Nxe0#(qX3~x=|B8U))~kW0tzQ7PUM9G(VxalKQqj+e6@KY zhcEat{bJ4|RyRZ0nb0j@^Z}q#@gWEiU|T0=b5ecrV=s)nh;!&E%QcX2xxD`J-eJ0Q z2j^%k0iQLfxPZ?wN;j62P93ggpbZ4PmQk8eN=J?`gnkd z0sYLunsu|49j5d7oTKIf))-V=z$Qj%lce;7M<`&;;aY6C?V@<0VNM9>XU?}Bb;W0> zg$%P4fkp6{@7!U-%ggTvWkjzYs39L_@L zGMx!$L5P6Ra26Y{VhK7*rSx^if?YtVKzKNdNb$X|89e5&a9+h4w;0Va0l#cef#EFb zwi~jTfTA`uoQ2@OnHQCN?ws9Hy350eVNg72T#UnhgXs}<0-j+|aRDzforK&Y zr4Kwp0n?xJ$9<4`QM}PGCj|5}hlR7Si)9qLV$VcYPB?)@W^g$7uo0i`D828ZFEG4nkw(@p3Gztr|_!z+=pm2syhL5tvZ*h)IpMb?|jBN#m zt?2m3;}lTT28OL%Y%${VYUR1O3_mGDf90HGR26WwLB$1ZV3e+|ly3J31^i(ap;nRo zzbLLW%n1Sg%=uyHSi<@PW{p}yI(k~0c4sS4r#A{E^ir`;Q%BJi;Bm|9WJA7V>JrPf zh04qMay{o1>;j7~L-!5Byo#Ak4-kY%2baP9o$|Dr; znJhw|IuB%uLc^R8(9fLT+*lJb%RbJ7Mv{Cg1VwY>06_uESe`iGGxCL)89pS4*J8#O zF#&}+Fw87#9CI9NT+wX_T*kQ22omO_nb1U#AVfky1ko;JG4qM77|8^Dj4y?l%~61# z1){&9p&Z!Y|tPg3#aZGkB=QMf=ER7W&d(3n+=U(hF zLL`L69+Qc!`){^(_=_B%Z<|1^6Yw7f6&H|x;*S2b8>KXkvG9+8Em?$`Df@p>{JPPS z5YW#Y6nnzj$V!4^FP93jm+3xZ!vL`-9O3}Po`B*2R8c^w{m1%3%nXk`@miU2WK2L| z4v9URIR+b7bXx+8fuXS{%u!}Gu_p+T5E6SwGoRRs*c0$$%+{gM&HU$a4u1=Hi9y8$ z+`}mCMk(Fq5eoQ07GZYOWh?G8%n1Sg%t5gyHowiR!LgT1rD89$d4Sjx4spO|y0bAErF$ZLSs*uuV!Wwdx8)NA+h&E<`Y{Hdjfup**XO7 zr->VXPjU`_3-}v@iVOG_qqG~PG!pm6=nwu8u#!>X{uagmW3(g$^fTwjo@M=uSq?XP z16I?=@x>DdBKiYM`V;42yGx;amFY|?2|@$}w37A>{ol>!L+6=uqB;S08&q7tJ&fXh z&ZTEOLII!6BJ|XGkSOjm%n1Sg%=x~K*uwfGv!Vx2Z)xiZ>%oRzDn|X6S*2nK69I$k zD7pgs+jm*o?WQgPjgOzP=F8V}PAx02Xbta_%yc#9rnvU0m~SrV?s(BJwgFnvIz5(5`rlT4Rb<3KXXt_2x}v=A|}cPiV2~YihY_o zimt$zn9GJNGIa^`_&C0NEaz&0%CPt{G$w@kXl5`mAqbHW7!zW?BGf9f{};vA8Rmq5e&(Q<5Z1Su6)}-+YYRPcv4vhL z_G#)Ux&mY3aW>>vrY?aoaT{O0i*t$zfyI}hF(J%9WM&f+f)ELTF(KwlK446gvWjV( z!(RffG^n_MF-GZ_kkW-7p@0`<5oSk&E{Wn}40A$2KXXt_2)5V6lPQaT#Rb3#BrbCBl$$1KBGNl=s62lGYAgNWe0`&rf_#*8`v-(XaD9fbKY z!<-P%&m2^TUogvyhBZI%?brFD~1RwJuUz$+LPUI$@rH_QnE{memi=wOy}4QoIhF6N7pht#2r$;yqa zIss2(RCpbPd5&RD2#;m=gl}nS(W#GSfuETqoeHkJT*9#~J2?fPUs6&6AmBreSS_8$$l(Gf{&ft`o4) zpyC3a!zk@BDfN4V0?x!QuhU<+Yen%A!<-P%&zxVu2<{ULa}le-dZ;CEKh_kGRSdh-umbxrT-M#U9617|%I+j({REyyuAfpD|922`J3yCb`Ch_MBg{n3p_p0(#== z^TmbsoIkQ4*Q=a>p1`#taGpmcpfqe?&-o%t@8>+M=Lp^9OlNwIAVk2xJ!d@k9L_0j z7(CCQ;sWks6!#o1-R2PrSjR?%Mu@eZnOY2ULO?%rNY7!WNvsAvqzT`~++EIPks$a1 zdk)KzYJWx^5YxElZ62Y3b!C9G2eCd1%k!>z8xx^_(051NWRGx#w_Bal_zw z1{D`@7o)i6aOpOWP{2C2Av8j)^~}^_m=gl}nL~OGGfiSO)I&O{=Wtmh2!6nx!?L8> zpOFW|H10V$hK2gY9>|BxcYo? z;XQ{1xnAW2^aQRIf%7~n0i|Jsdk#zQ=RCCM@b$|%_j*o_fPs6?5!`b)r?_G8JcEi0 zxQkKTbGUSyM<`$&+YlNd)_P`YG0X`8{mdafhnXg^8uXABd=O!GIhRF(;0NqEEK92W z8F@fVs3xbPvBY+IM1UJP#QM4=dkpC&O>_+U%#Alujk|l7`W$*9iLILa8hR_JH)-zL!VNM9>XAbE(%ruGBpoe67x|?>Fb6F$^e!!l?vZUId zkq5*y?m0Pzh5E%F$CTqar=G*0h#a8ja9y4;PK^mD%+zyoj0x{KEaoLooPeIV`h0QW zJ%f+Gx$HhS0Po3hRmA&|p-Lp@P)Npc%6_C&ZKSrQQsy0C9v#jatlaq{ZrtO}>mMk&8nYQ~}hWmZEdl{C-3VOFn zDv+xO{>fDXRIV1Fa+L%+R%;O*wI;OcM8{$_6~kY?j=FpuflWYKM90AXD%($g<-ZT4 zYm(#|bedKv+a2R7Y&0!Uw)^W0O9g_Sv=5dDH|7ciDpy{pv&Fy;&($I><+(avT&Q0~ zpjYE*1J?Mv#tYMS3p|h)Fz{PF{97+ppA~LBalXJDpN!Knd@}L|jO$cy5j)6Okrab2 z@K7Mk`Xj^MW5Yffr(^g&Fs{h+7#SvFy%}Sj7$gf5+sa!<&`RsmaUNj!3QWE8#9P(` zzBq&Ph_yA#Gg1(`DNJ_&=+vj41R(;jWD=hId@nf~e~)sG5m3OV4XR$ie=tff0HrjG zmrMu%0rxN}eCevyiu%Wmu7rT16B`NvMIlK|?3U8;MtxjBzxv?C?@(qMYnWpK3UlDL zK(7y{Fjpn#G_VT1)JTjAxQtPbm9}@E%mq(PT>HZR|F}G&ybvbxW0*{Iqp1b-#GmFD zEU=J?HQ>y!uyZ&MjGNzZL%qUz#5zYrX5~WnBGVlJIu)IQ5CH*NY)h;Y2ksY9A=cXk zrAHN%9-X&T3zC@U7RRXdoRUXmTc6Ksnmi)M5P81LBhv0#&;DuS9Q{wg?;2EG!0$0? zpl&4+yA69n!1E2NPC&oJpq{dmS#B|`frH6<-heinjcA>KH%4_$2eg^lIt+V4zzYqk zPC&oJAe$|=^*7A=CnF*z;CluYpThPX&pBdk1A{FdY72u~Jyce_bKzl@`;3tv6ON0* zIbpB;d*%=eVTOP{WAk*{e`Y?9D6oNqaRjnZu=r7tiR zgaRIMn4eHe$1pZvWuVE$np=!D2>~B6s5${foF4wQgxvp+;7S~ADiag1&P3zDNaRxYOGkdE}t`RnZOZlxWyzyjeuej7L@{i zdh0yS{qdc$4qsc7Fj~XDqiIs$UgOWT0-nz($2xo4ZYg}xqtgxw`af3@+#q^9%j*S{ zIL6NRmTlK?Fz@7CA@AaXw1h(DDz+`LO#}y=eUdALOqwCMMZ(4VLL-+*mv^&|zGi$C z6YzQyR%->^V^AjtiTgSWdB~8(1boz>0y#-qlu3q}zHy3xKDX}(a{G>L0dC*1EyzZV zD`8!y8M6`so?}p_3FuRQWsv$SgVbLcs(vhM@Y?=V0eza@Iwv5$-a03sqHmoOUeTjj z*DA5^jGMHJG==zt@ zRVSc0*R~o26!o@sTCSIY%Jnf&xgL%fg{xU1I{FXt?9*&*OyX%>m#=kQzShvOo5YGx zsS=Hl0)NkRp*jIqdV|!9=d9v_XHZ?fL3Q~CZLYMvT&>{USZH3 zXt5y``?3+WHdmXY5aN8%jY&*&i6Wpxm&^}9<%-kGvRrY9uM4*23RK8kkqVhBR4*X| zgkBjW^vZ1kLi0y7y`PZ^i>FYfd}r5*4@7W4#Rn;)bH$-L=b8al9H5Z7A{8>X;@X=5 zLcK}DCv?ZQ0HOIa2}QhwvE&r-0!yIU)|y;3|~ z9&K;|r`5J)pP!?GPF0viSc48)0y*pRIrGkA;Rzq_m8KGF1eE$A&i;8$u0V~ZaW!bOsMUN@kP4|uqc#R?J9wzV)4KASDsV*>`DP|dg zYXlTsX!FaqIrCNua1MCexH=uCS}_5=D#Y`}>`w$Ojk zh|1S#Z{v#|QDE=!2SNcC(1Qfz9}0j!;sTEHs019%sDb*KWzE+sFl#C2P$S^U1{D{u z&YIC#l%pVKPA-hs5lK;tK zXhaZr1Y3qf4FP8vRQyB+PxDai3|_)H2@|;Aki`TPI|EKHV4K>Uy~t)AW4P<{_125t zb3H0id%cI^Sjfpl@?=986L7Xc)e9)f;gTFVs<@XqeqcE31U!l(cc5k#_InI_Lcm`b zRGol+iTTY8dz1(Nml@wN0%8LG)1cxJw(daAQ9l6>H>kYM3 zqh+jphOwefz^^lEAdd=rrD0D9SZh#q0{SI}d$fre(?&o{z^w)q-_GEd3@RqzE`tj6 zXe(b9p=b*Mee&}?nqfYVDA1#Ond}Z@MV)}-3$@g6j|%gT4Rb<3KXah-toxbi=Y}~J zWsL`M9?-9BONjg$@_!v7m@e27QCG@p=^0CbMN8<{a)kL%W;PFA3PL1=Ja}nYWz1P) zYF#Jbm(9{HF5s1n3Tu@+SjwdyYhG{|#JQi-;ANa+t`qPogNh6IEkX=xFZJb@Kktr^2Jz zr>toR{xI#QHii_6+5c>U4%t8wa=w}WJPhl0h;PA|)(%~8Ws);b2UrHrfYQzK- z3q!(lPN`zB7I9ADDX^Fn8lJ*j#mpu=1tAhb!gCAriLLu@wx#~=Xa2`HM|cYOD}#y) z_-97x@RU-?I7|J(KLV~{RQTvAiuV~U2?71g`C(^UqBrhSl21n_38k3jv(V2R6rRE= zbiv`7OQplJWw-K&?>`zzg!U5~Lvn=a2;=LRfMQ`tcs^fB{Fe1fsmd%0Pl3gx(C`%I zKQOZiPeF);knkMC=8CNdPXPxoyGdJWUBvl5&gDlTxo9$Zs7)S(n$J5zdFDwTLXro$ z3?l>c2Wdd^1zeVo3MIHK-*!2d%kteB`RI&%VJ268?%Bv5J}{88o?Lo4Bb8hZ7Ue82 z_k3`F`G3X7e7W@U%PW%4DApA6t0(KZEWfUj%U{aR)5`O>@&blDHW?eHIpkT;Fn)Qs z-sPuFi#gAI&OVo49u=2-F54rIj?1&@lAp+O<*|EtP+ju-`MTt}`s5L6$(vc9JW?$W zXiL79<;er(^0c<(d-=NLx%zS+r(Vzgl&6w&>2sft7XJ%hF8y>k2;#__jshG>TzwxtA_;L)8pZ1XaWu}v#9QiAkbALNSe#at5oFzZk zAbEy=jzE4!Vk?((e-A-^n;=)7{7{bMgT`nI`8l3qF6aKPjQp-mt~_}#ua%!KkY_9Y zi_3C%T%JnIKTLlZ{})-# zWt_|7WVdkn+noP^^E)~J73aU>{4bmr^NsW|oXbsqxu2hVD?iNM&)P1rLmr3_e}&nV z+kUzAx{&L46t`b4y&U$)A;DhW!K)^9`KKCoeKwmQNS#;j(-cK|YBf z-#^Hce9Y- z`Q$S~^39+;`AjF@aNEFT`G8x7%km+vJzSP=e8~sClwd;@nTO8{roD8U(NJi z6!{A@{z9EuZy+cCmsM-TiW%)!&gL&!fb z=HSm^e5_W>IhgCaN93HO@z1c{{}K9S8gUWh-xT>d_)$@|XL&X~y;eo`SSvLCI@E{$ zmN0(LDqR+PS{Z+TT;q?Fcwqcn35~x_XV!l)en(w4{^yJ@tIx*2!T5cQm;N{eCX$`| zR%?2}PY`@VHh!t#*JR^22>z68JUt1ayb1Q`m&(;VjSorR)KZyX+A=L z6O^2x)+0Id4m~ztTSr*?a`5_jfWg*_8?)ua6#Z~B56acG3Xijs9fHw$5AYESL0XoL z-vT_S^ZqUm!CxDK{|@jY@}yYSy&?F=fG-W8e=UT5P+_p02Lm6Z_qY)H>JWS~M9%3U z_)LhLD?;dZh2XyvBInK!`bR_Xe+9o@Ll9hW^TU7-cKuFQoxXkhR?SAiAIcQWRM)9< zPMtb+>d{@_?1mOSbWLMw_e&N%U$@Y|ZPD|Bh5oXIe%?aA^6h57y~{$s%|gG^Lf-)0 zB#;SZx|1d&QffHR+96+z_o zg1F~J8O*|Ok*98)Z6|3YeCdW^qNsy3*$zS}dNOzOJQacGiJd^6gsAY6*bnj`i3@q= z3^KHq!yu6j2ZJO<4;;ajsdRl2!%830VUmgv&X^GAhKgzzT5`9G_LJe8VKZt%V}UD9 z_JdrCK?2)EE~A0OKPfv*<%GnZ9nVDM=4r4ivc3!H2|+fRyBYY#>OOjpk>3v8US?z< z7YE&8j-a3+VRfv&aK22ly34tKXRo?F2aPqPGKPgTxM~a$yVA{NTSbA>j57TwI-|j) z^YWxSsvEwYCebuC8OX_y;ns`B&^h6wO{YCtMAiu+Ip1zM2zGz9xwe&4yWL?B`W+5f zGOH{o!wLqNnrxR9Mvr=ZSm@?~7vv)&1ESdrEwN{cblb2+(#;TV5zPzpykRHkAc@>~ zxb1orqvlv+zQmWI(R5$#1fGQXZe|WA*bz&QCa}l`t~WWHY|gHlr*?*1di@x4xo37@ zA&xObV0&dy8Dbk#%9De9h&8Ytgret0mLbS!5@Y<(g?~e;mr5C9c3};~s%aXsGA@Mc zy8|qJwkf9;mu~2KpHPd7QQg!MWaJ8mQ4qVa9*FUJ><$K@+01S@#G1B8KT<5Td({^T zc&RlSMH=>GP|n=8nk>4qy0I|7DmIpvx0X7hGrzF9 z1ckKSWBoiH2Ob z<{ER257Dr!tsX~z?hbs|)#|LlD}0E7A#{Z4&=yUcD>6S;>~WjCkF<)T0NPsG!OY&2 z8O}Gd)2DL)2`oxF;*8hmNt>z3X5UT8>I5T1{Wulfh=`vZ%sJ_0p^PVn0{V76 zahHop55)<&g$T40tFls6c4lLk4~DrO_zClx$*^o$4cJ<3yD7RSMYg%Jpm%&SR8h+Y zV8BNALglBh7=|3QPUk{G`U(4oen{u4j?pKe}qCg z&^)+X?hX%DCs~sbcovc*EOauDvTN1t&atsso_f)s=DxD!3{J!uP5EzQOL>ome%TE( ziQyW0Ip$d}qOB3@Q;u1xoU6UX%MM1a^hPV5@b(5yIog_H{^1mj2G`WWq70s!P^y_* zi%wLWzbA}`ar0?UwB0n5ogrQf1VwWP|G4Q$tYZpln_=WQw5VAMxQSNg$45+(?W9AN z)$0K*4XUq8F|8hcb8W41u%vP7xW%-q^^nGMIc^kquqT0H{Av`fDa~CRej9j~rjxg_xae7<@~YMF zWp~(vYB%oT%}W;pTEe-i+fC&Tm%<>H{0zVGBfT#O<>@ z-#^EwBl!hlLV8@ohB!Z`?{`R^x>lFp1&!>|Y~%ZoSrCyl8c7xKTVKnSWxD>U%Fk#y z&L61>X!n-ics^B=XFLSwFWy=$o=YGwubN-WN zO)c%_@?&_Q{qkRpUM%QIf&+?$kt4zgrF%kw?n^Ouo_NRfVx-&OfD4=eha2UOlxS^1mo z=KOc4smho4d=Dy-dw5{92A1RewVFKNuipP@CGdxu|7Wxw&d%e3baDR~hja9cilZK{ z+%C(%jt8=TmI*p%`9_USyp%ZqJDzcMTc-B+)#E_7Kf{cgqaJ@(qrS#ca6Y2Pp>9{5 z_k9-mb6S4=^QCFULtXv@7WsF)TXDXGE81$R%OA1Gzw%zi`NI3F($jri((?6wKDD6a zpS;a1uWB8qt>q`V9A_(19G}~ntYJB(-e-~j%^wx#&ua@VXMQ3?c+W)=p zfqf6`dtl!K|8E|keePQP(B6QL)J}HGGlz0{WAIekoY)fCm`HJ_VD$hj}O!TuB{*y4obpO9-p_A^JYJ>Xu%NG9c zz!4^U=>6N&?)}hX;{OL6Wuo5+x=GJlFc2pCS&N>5Mb9@adS)$pzGC4|;RlmFS6SM9 z$l`|;3;$m%`cGKKr^nc7UE-za8 zb+3i~TT8o#EOtI-Y4?|w{yuA=e-HgK_4kwDH_@-Q@WUKu20!%_S^RdFIN!AN_h}et>KA=RFwyDnCrtWZwX{29@z1N4`2Pa>WztWt(Enr^ z$M?W~Q-2?}*x9rA|DeS`2Q7Yh(Be0G{WbOXR!h4tTJ+yw@dLrtP5u3`rQK7Oc5es& z41VhA7nXi4gYl+1Gs=%z;{R?-zv%CWO#V4s#LqNN@Sgp&?}2>}?0aC}1N$DhtOpDm z)IRBd!UOuVy~F?Q9F8GHx<-Ew=JI)*6DV={pSp}clTc|^Wqggm_oBte161*SA>Z@z z_vP!gINt~AYvuC$^A#U`fT+E&fJL1V;WCM5A&km22CxPyYh{GenMOJ>6p3o4kT@V30aF%)&J^ryjO9~c zxe9O+D#o=M>BsmR!dz)I6PZ`Np1{9zHDTik2NX02o(-aa8fFK1?8>7kg#6p(* z3T=coOG*VPR)OW2@RtyoMj0tpHJlcR6*Q^BxoN0l1;j*7EU}-2NF|6CkdBPhQ-G}r zU}b4_9eE0X4uF6ZXJ%mBG;|Q-RspI(P_ay4A(cH9C}zo4L5P7i1zrTr44bP_mkBNi z=CWUf5mme?OsIk7N*l(YJIyqOyH#Dn;M72RQy9P!#m2Z)G@>!K6yFngNh6$4!;2^S zG66Q-3%fRrwydH{m3s*Prk*B|x>Zzf1$0_MKg}>d_`CF89Y0&GtAagMFpOciC|B`> zQ^3O#)Tl;b4$(aUfz=q%G32onfCUABQ1y2jpE>qr0Xb#Jw*lu}@rZ)qhCw%k+POxS zH0B(X26=(frt&P6J$gFqRI%YKbB8>9M9S?C9w~$yvyDTCom)0GTPv;ggN??)L4ZFe MJJ|rY`b+$O0iYm1#{d8T diff --git a/lib/python3.12/site-packages/PIL/_imagingcms.pyi b/lib/python3.12/site-packages/PIL/_imagingcms.pyi deleted file mode 100644 index ddcf93a..0000000 --- a/lib/python3.12/site-packages/PIL/_imagingcms.pyi +++ /dev/null @@ -1,143 +0,0 @@ -import datetime -import sys -from typing import Literal, SupportsFloat, TypedDict - -from ._typing import CapsuleType - -littlecms_version: str | None - -_Tuple3f = tuple[float, float, float] -_Tuple2x3f = tuple[_Tuple3f, _Tuple3f] -_Tuple3x3f = tuple[_Tuple3f, _Tuple3f, _Tuple3f] - -class _IccMeasurementCondition(TypedDict): - observer: int - backing: _Tuple3f - geo: str - flare: float - illuminant_type: str - -class _IccViewingCondition(TypedDict): - illuminant: _Tuple3f - surround: _Tuple3f - illuminant_type: str - -class CmsProfile: - @property - def rendering_intent(self) -> int: ... - @property - def creation_date(self) -> datetime.datetime | None: ... - @property - def copyright(self) -> str | None: ... - @property - def target(self) -> str | None: ... - @property - def manufacturer(self) -> str | None: ... - @property - def model(self) -> str | None: ... - @property - def profile_description(self) -> str | None: ... - @property - def screening_description(self) -> str | None: ... - @property - def viewing_condition(self) -> str | None: ... - @property - def version(self) -> float: ... - @property - def icc_version(self) -> int: ... - @property - def attributes(self) -> int: ... - @property - def header_flags(self) -> int: ... - @property - def header_manufacturer(self) -> str: ... - @property - def header_model(self) -> str: ... - @property - def device_class(self) -> str: ... - @property - def connection_space(self) -> str: ... - @property - def xcolor_space(self) -> str: ... - @property - def profile_id(self) -> bytes: ... - @property - def is_matrix_shaper(self) -> bool: ... - @property - def technology(self) -> str | None: ... - @property - def colorimetric_intent(self) -> str | None: ... - @property - def perceptual_rendering_intent_gamut(self) -> str | None: ... - @property - def saturation_rendering_intent_gamut(self) -> str | None: ... - @property - def red_colorant(self) -> _Tuple2x3f | None: ... - @property - def green_colorant(self) -> _Tuple2x3f | None: ... - @property - def blue_colorant(self) -> _Tuple2x3f | None: ... - @property - def red_primary(self) -> _Tuple2x3f | None: ... - @property - def green_primary(self) -> _Tuple2x3f | None: ... - @property - def blue_primary(self) -> _Tuple2x3f | None: ... - @property - def media_white_point_temperature(self) -> float | None: ... - @property - def media_white_point(self) -> _Tuple2x3f | None: ... - @property - def media_black_point(self) -> _Tuple2x3f | None: ... - @property - def luminance(self) -> _Tuple2x3f | None: ... - @property - def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... - @property - def chromaticity(self) -> _Tuple3x3f | None: ... - @property - def colorant_table(self) -> list[str] | None: ... - @property - def colorant_table_out(self) -> list[str] | None: ... - @property - def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... - @property - def icc_viewing_condition(self) -> _IccViewingCondition | None: ... - def is_intent_supported(self, intent: int, direction: int, /) -> int: ... - -class CmsTransform: - def apply(self, id_in: CapsuleType, id_out: CapsuleType) -> int: ... - -def profile_open(profile: str, /) -> CmsProfile: ... -def profile_frombytes(profile: bytes, /) -> CmsProfile: ... -def profile_tobytes(profile: CmsProfile, /) -> bytes: ... -def buildTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def buildProofTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - proof_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - proof_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def createProfile( - color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / -) -> CmsProfile: ... - -if sys.platform == "win32": - def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 185e47e51852608bde322169d256abcee95b9074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298281 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�n^uZhyKJgK(!|!`JEb!M4R4mA zlLse>Y)7D{H}KMM-s(FuwY5U%`aZ5qZ=uYSG#q{K0=B-Cfr~D~O$%Br3L{Ut+U0sH z$Z2P>KcHpecM)jy-MHBG*(MB{bYh%$4SUD7lML!MQCAadE&RG6Q`aRc)i4Qg4~~NR zJirn61ksv_-)a^zhew6Hh%pPFi^yjnNi2(-84++Th&>EWY2=q;%?eFObDQTAG3gc; zQyc0!GV9|uaZS1#^BShkrXj{w;cmwDg4*d7Qc!KKSN|FDZ6i#cza*VjX)T7Swt6Sl z;xN^=so$4r#Uvq5OX3NBdl#syI^7RBDQOL(E~fE8VrR zjzjclY@CwXGy`K4SIIK)o(&3 zLt1g!6wTa)Xm4(-Pq>K0kQkK`V~bjJ)ZyUKKDQjmvwnwP{60G#4{>u}=jnp5((SQCzx3#ymw5@M*JE#_a0nOlR zq&M+@97FZpt&LPo*@D(hnRF9=Ix;?8)6iX)ZNO-$x6m>yV!$4y#UQ{Y>`2$f>7z4^ zEEPW|)~X51yUCGJgqv!z*CO21iU)5IJ ztXBlnNpf_w+^$S@T|U}6VYRfHU~Xz5PEh-L+((Le0}Iszam(9!%oVvB5`^_C$evW6 z38`Muo~cd9P;S~tUkLdYngfJovMs{z#AayewXQQDB9w^7)3o-HH)Zd5t%P1%AEX8 z>Px^;yXH;m3q}=P2p@3J5L2sGokmRvrr@9BpvDAH+^L>IKHaTNt!*1y6GWjTek}Z2 zDE>hv2)7i$+3V;qXD=4#akPTQtVX}O)m(6DUz~)<7K^vv^s%!49kGpy`)}e~<*j(3+4H(-rLt&%!9D zbt`nk-P$7w6Tw@X!7a(+es#q6sVR+ck4tvcfA>Z(L&s^Qdm92e&;I~8`6vkFMz=UC zS6er7`jIr~J0%3Z87)zr-i(XwzWWm)MRFBvFibv05-l&&O8A(RoZ2%&E(%FQJ2B-n z9JxWtSR4j9f`|=I*te}KlSNnv=SI_#fKF_n*|Mm{fV_iZeLejGniBw92P8w!s&S!C zF*Y6h_s8PEINDhs)sWL#n_^;#T4E%-iBWjRjgxoGX8Gz&o=YYIHVog}o|9f1CdTDO zSkBENHbE`m)I_oBGwpp1F>}rbHhH}kp#sAK-JZra*@ML`-~VFQ+(HUHzG(@96xIx; zQW3Ws>!~5j!G#4|WgN0Ke-$_7FTychQ+lJSH{Bj3(P^h|Zrhk|FXy4PCT>HDrj-?j z0enmS(++J#))ciI$#ZYP#$|d}cXKyqMfekqsBD-2Hu7S81Gp)eS=EvoFoI#YJT&Pv><|EOODeFUF5vHo~L7O_eo8s8RFy@dhZWySSyk+x*dj!9GX)uDl znKPB>uBoBBHoXzw%LO6rr#bUh!{Hf$!CT>9e1uxg7h-V;`}`{HkeRa<=V_gqy;V)Zd!{(9J~ z-4|aAtG4*!We$1LbDb-<#Oi#x&(#5~FGgFi#iQrFVXG~^_`6|MyDxquZC6a zzWAfCYKt!hAr-az;?l5ci!WBWDp`^*-xxM)_xs?lvR}!>EQgwlA`}%_)TbOwFSx5r z;m7gUb10nMXugNProw)6BPjese-&^KyT|X2nt6ykLX(LtzK6e>u-~ImKmX8Q`35z` z|K%EZDq*yg!{DqKc754nzR0A4jUuC+MbA{&@6`0*TCmI9cFYM$rrj4keFK_@($ho{ zXl1y$Zjh*FyYG4N8K{U)gM0q*SD}uK>kpAYJ%xGX;T^6;v%4k} zB%;`V@y=aEJA3xdhMl{8vENlqKeO-L7k2LQ#dzo9Gmp7W2gA%)awS!_Hm481Gzs=8wBhpAS2C`{JLy?##aPpN5^gd@VpyJkM24 z52K9y@eAzupK(`2hcBMG&^}5g?(xNMxhgxRzx(;Ju%Rs!{`Hf5F`T5!7f*#%-M;9D zlS!t-&oKwc2SOOzeerW)Rp(s}u#dYd2rC4Q-}Fe{?t1tu&HNxI-J@bMT!&I5pX*vJ zjkWgWx4Ak@@xno=@+iD1gm8lg_8+3ELZG?VdHH27{Wmk5qum!h;Aq{cb8PX5@u)7Y zn;iiq60_a-eoa`Vz8KAO_tbgr_VYw*x!V{2d6|Wsv3xOt=5G6}@b6X!M}*UCnHy%Q zyCxIaYh5wIX|`~nM9C|T?)(+HFKkpY!$0)ba}sydU2^R8+m$3Hy^IPQr>2aSqE+hR z=Rz#|rpb~-iAQflk|FhYDk|#R`F>Y8Oqs-!zkkpV9J?~b)vn1+?#f2^Vl->W2+^$V zv0=0*3pl&MiuJtVtiUMjX|$rSZ%JY-;n#3$v@Bor%PL7s6poiTr|5t)81R{ME>0dR z9MvSolE(_i1%rj-1_?jumJpsPGH6EFsAl>`GtZ_`$vJ)+e=Q>NWWPKo?TRLxyUYR~ zanck(P1tWB>Q}gAx&MTF{26zZjqznqNhWdM!DDCY{QItRxCy?(kC05c?_U~RY};pO7aWp)9gUVPbK=O*q;n8Zvg z9?rjRMc81E>omWh0c7eQ?T2LletlX76R^edq;AzWGyUM#9U|M;f zyYUFs$^uAZxBDD|JPrj`U-qyj6L)(^KO17|ZjYA65G{8fESQ^)v8nQk3kqP7>My#-b9wyazaEGh_y@mq4ayQv&-0yq-9fi!GZIfP)=@om zbUT6wANUH7y(!cAHGaFWr?2q49EZb`nBVRxqfSLjRCASEnBQ%-!x#N_K(Y^n8y~R& zm42aqJ=)T*A;ty|9P}{8NaTTONyJ0<76;ph+!fe-@l}U&W_;~{mlrYEUOP|(w$~1L z*naBptKGdIsfqaZwF4gDy&*fb`{JYVb{^JZ*S9+E{BX#n?Y?gl^o72!-9eDQ{` zs@)eO_TJ$4+vBu|t?Qxsh{NC?N0{`*zj0Nd;$IJV0v&bu0po>~r|tZ>Q?H&W7Dtla z7c*himh0X4ZP7fw=t02S`l@^CK`8Ek<-y?R7zpQT_r*U7tF{yp35E<_6x|t1dPS%C zRfkN4P=75>J9+!Sja}k-4(qET?6+-quUL{OflUPq?dWnJ=FTf$H=t zy(5I6(-&Jp2qq35^EZAGxC*zW_|ByDOtaiABF>FlWqwS31s8LyRw@_?mWVG zhBLMMqMw{?`{jYc>9w*D0Il>OTpI2AFAsPW?}=A>`gks0c_wg|IUsL}fc3=~un!z8 z0_+0^ivat;K@aSP2!sa?dSE>gSypjBWtBsGZMXsLzVB8yAnbCc70I);ZZ#XCRr#V{ z73!{VO;i=Gh$_Dxk9?|pu_}Vd7yWL~%I}3=GgVXJu5%D>bXTGNsja;D^^`i|up_N~ z*r_Pi`bYcYP4dOBf8>SMlxYf~Rt@T8(6`*Uo~;CKkJpq#qSX1azfRHh z{=s6`sfbD8A1#eH$zO|qbg64HWtzgZ2zP(Ptsy3lA2{gu*vsQ0!4nhq{G=P9DDjK1 z_VC>5;L?Vkl_N5mB1+E*dwMb~I)$vF&kgPAR2zEe{ZvI);d}0g16PQsY3?tw^%uG; z8rT;vyUackIQIFQr(C7g!T#=PcL1(U{mrvgw!dxa@BZD@YEyr+c~!irzuV<%wW+_E zdriElzpHk&+SK3Nd2PI@El>ID*1bMlf0r+oFSm_Bi7&=SobCu(JB5*0JH#KXu-9uY z^+RTxT=93KDv#sN2=O1>zuckrR(D0j`eNcrI~t4r;QqVZ&E~6PmHuYHRnC%@&zy6h z^qF&(AM=%dXLOjKx$W^gBdmYE+Xufd+R*Pu+3MJQOWlp%7HwI$9a?ESP4m}@CjZo9 z?*@k|26%j*$KPOxzsT~;xAoaQZMUeX3{vt?yZofy^)T>8fNr zJzVcSo?zY56`uUxur@dx;x9n)z-&bA;);{mfoga!zq} zGwZ~}nLGp$OcfW~vWE#w`=Xy1hWK76$zxLH#rx*yqB#9_`i+u0Kd)y3sq>1}i+`zmx5KK}uO*2!$I2Wo zJ({J?mp$D}UoV+G4@kR0`13`Gi)!aJ@`N2zyYJfPZ#?dkiMzab^Xiu>U-YD{6zVZk z7s{A+UyRA3*Y*|eB;yr|9a*GDYE16Dw$EEZZ;z~?*Y^ESck?lKg#>-k?*;(Awy&53 zE+U{_+voSm?~V2@qNZQl=Xb^LgtpAXa&!Y7{e?3*Uk**rc3&)sjKU+K41XYA>8Z`j zaOOG^A~OcSk$usewj>m6saWn0I->uRkoY%vwEoN)nW+4CI6>esNL3-Os4B!1RV4*P zOjRMhQe^>)|D8&ro}gmX^Y}gweZ;z3eDNo4K_KSwkW$hSr98f`-raa1p)H@8veIH| z>+xb#@%X+XRPp$}!u9Gj@wG}h+K@!zki+|X+*Rn`myd>f((a4rUu6eNCN}w^H(HtM zd;2`~$CmlM5K_NC+OiO+_G%}t zjR?cfO#e+c z`FA5Ad@%;Z$zt=J4CnKT2`rr4=f$H}_gYz~@3qn+uiD{ND$gP=Bqy9 z9?c3Lae({VuJZ4u_WJ`TVSXA)nhm~qyVG{5#4ZL~e$3z3xcX9RcO{lHz86H@F6aZO zzUXB{QM@J+o82P4^h+i-`@y1~n+wr8{e7id;c|CHB>Lhd|F^w2fv>8%_Qy{`fQTR{ z&Wc9BSz~ZOthPlEg*x3SF@c0jfB>n1#0&@y0c(A>+FB~M+VP^btxs#kskK%u?Ne(9 zl{&Oqwd$+2+7X9mt=0Np`|R&`?{oLwCyCnr|L_0%dHImF_Bv~?c@OuTeeVTn`)E~k zSw;2RyY@tTtckj!Jtj_CTT$ZG16;2DB-aOUb+!@TxESbaOF9qeXDx{+)3i<0t&I@z zO8p*)X)U1K1t5AfNZUu}h_$=-sa(YN#~rUi$TynMx7-c%zYVE@=<9}5Pjr_lI-21p z%JDVkvdXaLh>kR*#v_5=Wk@-qPa0CN^eO*bV_m~S^my3x4D17=h&|Vvp3R>|j~|(y z&7pExf*xm?p4nT`Jn_OZV|O`& zENQ&7Jjqh-8ZXgKPmOD}O~~z#dQZY?;)I?!Uf7&8De>_Sv6`12O|q0*%}Y;!#Z!}R z_3zMS3!o|^;)Gs)dEs?qQu&8g#A;r8E6GxBH7`}5;5{|2)s+zk+>q`q%BN{})gt~0 zD0c&i&fQ&Kk|(Z2F9%6K(PZm!%SiNvGDf!kZW&#}b(_`<-;JsZM3)&-JyD8N*7y%2 z)w(bW3bzGRsUw~@#x#YDq037QTZZUo3@IP#sc3J&+J73WGej>ny_@d^`cp&75M?0c zhJIMbS0MQ^)3?RXM~feM@8clDME))ib}yicliO9%TvMtHff61`NFe@8(6*M1Ty@Rl zy8UGrS|YIq_HP~a+l#IzL$$}417x#$yC|>2^;j@hJ*C^1NN2%TIT{tH|q?I?TA z^z$QGU?e|fBH3^y(CaMe7eH;iLtE*;J8QId$ z2BWK4*EY|ui@$`*~3qufN3_BOs_dz%9G zz8b9hrjWg__J{0k3dFZ5WN(vaZ#?g*2v_JZyAf9F22K93Sp()1JrN}N#Pxy_8z-8D zVLs7DGrtNS8_bg2Yhj}3osirVgjUZ=DG&9ZnsYE`c+_7rb)OQOON`+e>Mp_{aI$&2 zG2MIXpeiwnPJpNfjmU-q`dD`w=+4%dS%OcaL|`nE#-D0LW{4hQ!uHue_0#lbYa>yr zmWuvUKb13z__+w-UZJ?b07DkDX=la=r!CFc*VZn1D3!dvAN70`THU!FeQoj4WMD_Wb;Nd z*JX%ug9Xlka@~x;D@DYa;J7;3I4{9S{Ij5K6ZO`O=$$rV;-R}uQu9CQtbwiMehw~? zM5y!_q)^4<=X zlQdA0ne?TYsMpvDdo9qfS`sI%FPK>)^B7ROfO+eoNq4MlpfzMq2$MWM);}2yE^Siu zL=#igV`dGZ1#xFKxU@-U#*|T1(WCnbh+3zsAA=Q&n>e9&i-;H2p;O?7CNF(1$x?nN zikBE=PffyFqOh9TcsXG;aY9cVFGNUGz-nF^o@6PvnwJ=PPYq2?ffF=+Ye0E_O!PHF zY9M+dzBx5^Ti3V%dmNdrFmy`jFm`lA%jvcHS_-$Phi=SlB=vv@m_k8+{Ri z7!J8T>gPJotX^z%pmJ zG9SHLHQM|r+Au<6e*}~fLv$YQ#p&U}))}A*BhkCd7%4dcF|Q~J_5Ic8D-bPI>n^gb zCfWv)GNDjni>3%8(G|w30@1S*RuxKY(N^i3FmMpmH#$qB9~nub8;H_OWpvgU-EF*U zAo}ryci9qK-?WTG4^Fs}EwS|h<8uR1hC{1ntIsfIi836Tk*zBXV*^pfOEU)I6u+ra z^dcg0mWfD)DAOq;kHMi6LUN545)Hc47?dGOgM`bqMh`}p%H%OUYS0mX-r7pTn1*3d z^>i;MsxOoBq{&l;=wA(~f#@jf!45#_uM)--G2Dvw4e))(b|q?^58NAl7TW(}tnfBb zQFJAQejRWhIT{l`&YwMbWkrlkpS;(~${3p_*svJe%iH6qgH#nzw2M)gKN~2c7|fD9 zu?Aa}-?QJ6+)Uc1snl2tW)(K#gx=PH7p9?8V28p>$0k|IcPPA+2aBi1wL00Z!D!hZ zP$p5L%M2+`v>hZh_UcP)U2YkPUQx!#){~YoX@kXSO`TyZ5dEMb)f1&SWlh>n_L-JM12<9bP7}_FWr-5DX&gm`W09_HLlkcQ6NDs6WWPoeABj?_B%i+WTMaP zpfAZgsMq`1_~1^Os7slxJg6}%8=YmWY`v0XWn;q5NvUj212vY)#vk#xTpOUfd4CfQ zs%vy|&+Rm)e4jkgk|E`Z{wGMf2HB!lQmaJil4fM<5?C#aL?2JMS17S{fO+trCwf)F zxk8DppIAns$ta|a;lZMkjLbeJ3|XR=8d8xcW1$?*me~5fWhDB5A!Ui~HlDFB65R&{ zrp2*!BB=6snCL=7$`bwdjz%0&7NZu&7Lz67h~AMXOnF9#);N>5B2gBimdMr&%Sea>YN?1>9)LaBucl1i|8`U3c^K{6TI@jsl*mt4ZaUu04Zda_xY~pYJGnNi!be| zj6Pe0NX(5YVs+A~{{SNEj zRj<3dfwC6x3N2xP{&!8OA+P-TWhh?#Z`uijyz-Yt>lJgvZQi@t@o_ZDM$T0)Bvu2V z(oL=G8E;(OzA=%#%3&{-(6weM&HUH)n&nMEnL#MtXC zazsZPQidp(?RbKxZq75Lv%u{DRrU&l!-}(4%4H)dAiA1VS~#aOJ;_vUGA_<% zJgHa?+z_P=swbn!IuSO{pke#MVZz|Z7*@f{M}l2`8DVzdmk~U^5$b*Gh)Le68C6gc zVQ5(%{voI%6tyS#YAZaxG__S8XGm?tJlq2HvbuPY1K~xag@vsG&pKmeD;letiBdF{ zHxs02X?jR^^~L$3!YfS8XNb~10h|+stD_J=MjFkaPqM~v_NSvP?Y9kDo7e%yUK$Vq4W2+iLX@udx;doFKaZY#& z4yk#EIH7m1lNVk$UV16XQhrO7mxdwLo*Flv73Pi9pj)ka$mH9{#5+m82b6a= zEc^l9GukaIMe^;p1lGP6r%?T#g>w0xTvOTNoAOuy8#H0SH$8#-Nwms3`Y*X-lk_JS zxFz?$|Bek3H>8mLOYUMOL-zmAyO=yu$Z^No;%&Udt@fm|1ydiqzyAN>t#(O!oO#;L z=Opno=-#4?i5#r2BsVyLvHE&H<3cDuFf1=>VwBVjN|_6Ads)%=^nfEhw8K;K=40yO zmOUwNu)eB)6s>@S)qt|<5M|!vR1a;Wt3o0=+1ydj5T)k8aiB^JHLYCzr3;~uutt%IsXHbQWC?ClvHsYJj6PpZC>rmbruCb&))wu0F4^T-ZzR=tf zFK`;?{b|Ma4|p{kx1trT2Kc@SntM}P@wq11HVgV9qkMh^6!9*)yt#Aj5fa15JL5uf zH3!}m4jbN!Dk6*rjkQN(!z+0ClVA_OEA;u&-kwDjltdWVJXH+84C)Be-WBpXVVc@1 zPhvo=oQL6ewZ!gUg9n4zU+j9k#bzAc2z? z1Tonhvmm#iuwDfO*&Q4pyJ@V5Tvx)+<4r$S;pL_pGel{x6qReMkT_80nxQ}6HC?z| zvjYWMF>F0_6NVC2!He`y>LlCy%3**zFq8ej%xLuqZ82Ig%ssC~(SLwwHNy~p2{ie+(wY(*uNxZ* zL|KM%FR-TMCNw58e;Z(JOk{)gs8lnn^d)9wgHv{B7OWht4>%9x5ABttjSDFsik|X_ zK8s*bvSg4bgCaLR-H-^$4Tz9v(br5yGente;c^2cq;iv@sA>d*Kq$rGGL6`p7YW0& zvd(e-3{?H_(Y#0)V8Ss%ag0n1{d>v65aL@s6zkMRp#t+YCw9qI zpcLH9$Vol)s{#z=cq`TyVR+W6^7ukiQMJc4LME)xkI+_DQ6FJw-W8Wv;Afa>HZ%4O zW`6Q+G!HZV7TA7nfYe9RDE0!wR-{;t;!xB~zh2wV6<-l?B-&vYFqBLjqk%XmLn*_~ z)AMN{r?WuMD%0;iW2k3CMHE;mU2ldNrdf75b(vKAeiYl^OwnbCvS@?by9(3u7pA9Y zDn3mpzfG>*g4IC(Bxj|@kw`Qt(SNL4ZW5p8$b%806eCKACMEihzmpQ#Lk<)W zO?D0+U)g+&7V$WsgqG;_69eOT0-_3l=vwrUyOKmd4bt%F zoV9DGmDqd$WbF@IJELr+KhaqrX-2jhEF;lN%NW_Z)-n=(ql}TQk*GsaO>}3F#PsKX zJF>*)WXnnPD3G*~Y@J{kiSl=OMdYV8Mdl~0uPy7(*6pBznav|H*tIgY)`Kec6TP>L zkuCnPqc9SEvy73g8hqAB7?G@Z3|JR3D2d(zA#w|bD6_8|DwNnd++?nSD6>C2TB&M@ z&GRiMQKnyuWb22Pk?3QIVknf@;%}{rkwhOg$ylk1fz98T95)dCOCp(t5?ilZMxtX7 zc5z1)1DiJP4eu=A`-A;p6XFa}4m-KS#Q2Ue!N@a^CtDIjw!xA(QpOlh@*EQTSQ3jr zXGyH*TP=xId!DJU6BB*ZlTCceA8{Ls^T<+z!YZ zxd^1IZ8RA=&P~F_INf35lwq7sGwx;>0S;m5$Ov$-3duFmezgH4B^YJ{r7kXz4^_o=G<6P1Te5Ld(Y4k^@DAadgl@A<@TG#@9T3{E;Pbu>9JRI4oYaB-TG8 zBjQ;ToT!wotN;!ZMN0%GMu$Z!AeV*(e=!2x@Nvm#FSI2UMDI7G7ABvcosd(v3E1K()qM-&1P`@)>6>%UW=3bhb zn0skLVxl#2fGA=51vt#*kZ))QiGh+8p33aB*}!V!#zVM>a;;3?gV0htb2bqD1!AnX zC7eDOQqjVwa{3YyXE2tIkQis~O@u_0Q>~cyZ{DUb!J?dHYv)04=Q1)K3Dw%*Mp^MO%=A>zTvrv%ud;H=+7IaV z_W{H&)(ms*nRkI`Wk1!^fcINmG9rqE>N>ueilm+~OlTbZ`p}tnu9^l^3)LiCppvPL$2|y`R-c2nB zX_e*b2g=$Gy!{o$GX1oG@f_1PN0c&#Mcr#kY*>LgYdNrZHX9E?G+pLGqDSIVERc<( ztYS}Kkg(uzO}-vbCM%*dj?kB6ks~^KswT;3y=@H}6F^kcetn6piJ*!=qMtLQBGKoQ z0@*n5D6K^cWb1HH#T=sZK#I*_<6Km`?yV*Hf9dyi#_s}AdLU9au3=-cvAsZ)ief%r zLy|&m|7o;ki86|^sUk|9%7d&4XsxjzOLVdcNi$JKOZR1qrizlJSxKBG-eOG55lz~Y zGxpRNdvZjnMk!Bw;&3>siq6WQVKMAu+-YHkDKT)fLK~m=#5GVH%So07ierrkDd~F> zZ-u}%Q~epD*5tgeBk$`7t^@6myVA-h`X7eWn6yaY$=wYlkX_A##9xL8`Tf;3B{oKx zOw|*mD{=&7O^MDt0=~Gj>rPB`&C>15p_D>pl5$0=c?;RKIq>GZ@_i1KQT#n7JUOC2 zH>51lUl~%4sI@CgyEd4Rudaohnh%%D0@uu6ynBvaTF~WG8 zC)2&Jww`M5HaapysVhz)8&gH+`UYLBv!S`-g4%K7k z*oEJK0M4=U=#}U_CW=|24}c`!6@E^M4eOg%QA(SuK}{1>VY}A5hS@d)w!cYMBheEK zDMvJCNcBXSQW^YySiQlo6;mmfIAt|)E3e?oD_Fw~77wh~Vc7H2G+nGAx(&vpuDKR$ z9G035geut;Xq^ct-Hm)AWqK%7O3sxiBww6YUm~qc;F=?~9u~bh{hpzM zNc8<4w5z0!hdOIX#+8?zdo_X5m88&pA@nHYOFhwJK#H?|EE;*kmmP}oieVMQ4nY^f zF;QPM`fYjbdg$cdXyP1PCLAL_;+MEAb~~@FFh3q)rcQ6Qa(YPf89b91hu?aa1%c>s zhiZ1&ClWmwB>lF6tH>7%^KPl_W))R)Y!S^Cb@jWWgqoa(I zEkxHRlod*B(K^|26Qy->Ym+EV6E32(Qu*zl+fkERJgdQ8*Hl%ewDkyMYctVVASpKD zFB-P_Oh=2!+kD@jX4fAj>>&h!)`x}*r%2j2!6?p81WKFau92@e?Vi`y@HB4t_F)^Zz8c_N>!!2y^NCw3EOy z($r#(=oFADqu%Wqq>B(YMI&yLlk+kmvo`W_x;51-BLKeRjf^*;BNhLyXNC zN~BFvjzp;>6a{x%5z=-(w0#~>?n@KB8>D!FVZ;6)Z4=SAEMH|Qg4H`1>$9}}0#lXQ zp;&LDeJT{3V{Dwe4(OehbU)BHEQz^3$QYBOF|;7Kttf#1BEV2^#XL#>dT`{8Z#klK zO)>Rt?+>}0bq`oV8oNp{`8`vLiI&`zuz3fV&}gj7y7EG<>AF$(JVQbcg0N$Z&?cfE z25DH-TTwa=4XeB`6y<75G6h`;$3&~mo?}%saW*a!j){7cm%YdiLRed)86E_by$8{U z4XK6b9}KBz(7m((z00UTYb>CMBYNn*no(wTqHX(;G@s}+9LEzbqBkB$t|HMLv11Z0 zqPrW?e4_gsQVY?khBTjOzag~{J>QV(i9T#d!8PgT8g1i)fHFz>p$KdR)ieD-a9=`T z7=my#w94dPeXQFRsP0PlQ)DFqTp1l!B5u{>i89i0-=qrSdJjcaPt|C;uy5#p77bG( zQ3EwiI6(8s;3m2O>5aRxLG{9?JNSQH)$%BIB&2U`v}A}Iyu=)!L|meu#zF z^uLYx4YN9kQee#I8q8IXHqr_;2N9odWHv1YI>{7&3sI_()yh?(+WI5e6ge4kl$zs# zTQ!XbK>Sod#Z~}*o>5&OYE?IeR4ZE6Q8GMQzk7Cl)glO64G1!uRIr%M_?CPLHarbDEb6K9?mI-0%NE!TS4Nb9(MT9Y5OCPu9fF31@6z47L76~_2g85utwH3l}&8k?{NUv&dj+k`dT z3@Zp#Onwg91AvM~^$94uVeaDgKtaktBDxPq!=jaIN^D$c`4WN*N^z46Tk|ZSt(Iii zf#{{J4-Bj`8K_q|z6t4ekmzDyau=x;N-}LN8O<4@R!4)cqrunV?N;Pl6+GJlOhb?) zQ-geRSVw|pv8I#t&5z9u==(H&lP?%I2&riO<3U-dBE$AYuvbQ_77({Hu{T?U~lz|?S)MLIW8tX0yv@8On*bZ&E4$fWcAA$LBci|Vr1K(@-eJJ(DhxfTk^HBLyb zT|#nA5>lBd(oi9@v3t#lof=Ryh`XYgh8+@PDO>qid(4xrQp5YpJ5Srp9fP z<`I+h^-+K_j}T?%Wo4rAG*n2gnL=`{6q0MCkX##ulxiXZE7vRcfPn>TC{b(ZeBV%W zBZP%1V~vJ#>nTnXWtj?>Z+nKebAKvaL@zZHL53(xSh!pdtI7zhmlAwaX(N6mXj{qQ z?TjME|66B6HQARMHrCeWvQ&&v%)#t3ba*WEUNu~x@ zkC6PBnK^~Y3Ct-~ct|-5Ta4Y!yWt|y8j$2Gl-88kV13954_|Sy+WTsIBH z$m%!+NduX36%OK7b>3H<_f_YIqPj|HRgYQZbuTA9!1yHj{b>9NP!6UMeFdZuvJCV` zyO-F01N4zXtvMr_SgJ&5M**^fYoN%E4JrR4*0CciQW%L&HZr?nBiP;#^w@|lF``^3 zT9vGA200nxq8U zkP6*E&$lF^UofOBQ9_x*iCzz`xE|QJ$#x~W$&hkHe`dPMxnedRF+@2l#=1QnZ@6M5 zY}nnG_r_P3EFHPss4h@o4+P376`~Xu>tGNGmB5D}=1C(iw-RF5H}J4F*^|C)6P;06 zT{F45W}n%6td{EY#dvQ&hs!5`X~6GbfT|g{tD@0p7j8knR{=-K{%?JCSM_@NN7|eA z+A_J;rLK_{VKEyMb>UiWeZ~5bB#*`Ak!MUsUgiL%KQAnMU;2tMWq{SA#IB{HaprkI7Ig{q#{v17nY7hxqlapZi4jvrzm37 zzH6d3e=B%6&3IZ@B2M>2iSL&8UQ3i#Rh4O`oRc7Xr>Jp#b@TeF^;PHAjZn|Z#;vcO ztD0mu4UA*RI6A&eGBY59DHgN+bKw6Q;5O`6b+(9JUrl-y^0RH(^;kA99RikA8_B?+ zY%AyS`?VdTKf9@4xxpZH3?_>VtPIEBvLH%BeKU+31Gz0+fErpPgWc^ZYhWd_KnZeN zWh{D9Lf}qIe8)1-H$NVIPX-i2h+1);Ar%!DBS+T)1|G#!L}dDmVe;NXg(P|RiBufc zLB`caR)#2TkST7XKbuwbqDQ~!=_!yx_t+|#&gY)8p_E6v$HBD zHqIqV=3-&+Y{o5uA z1)^iIfJu#Q=y&J)nCOdi#RY$vTJ{O#qYg>Bt07be*kg=@Wwv*QD4`5$3cSq}M}{bO z2!TgaTmgUnfnm4{yYi(R{-t$(-*Hlq*r3Swd;?%9?RyXsbER9kqnHJtUnvf z`g2XZ{%|Kyi@2rAA_KP!j=yeURz@QtHwKdX1u&Tw1?DLs{T#1rhxC$D6X*4ww{WVA<WyL3j<@mgV}(C z8;yepB=VCjF+blbquzzqxI{3rr6p)FD0)b;#i)q!8`rSGxX6Ge%BaMApFzAzfLf#< zqHG{U8`lgJ7(XmIhQ$~cFL9=23N1%dX@{~ZS7M8%$Vep0#A(KX%;GivI0S8y=R!nT ziE{stD94s?F<}h5kciR~=|~S4Y#|Z7$oSbvlvx-herDBDJZ1M1Y4lq3xZVbDaN_oP z^gGNSF9ME@GV814yW*;(I@VVe*H`hvbr^+XcC!8O=pU^WQ#t$(@@ z4c&=RX-@FM8ZeBZmxVY8Br^!f%ksALUl)R7FlQzeND@e90S_J_gox>-;j$*U#tO;J zkdWM*2#L{8Kxlal#q)VYPu6ClR4fMvH$}ecjITQ5s}63n_JA_xMpi)fWVlkck$z9( zuI(9c_ds7`A{J%n5n!EVA~Kg~y&+|Z&Ic*}wiPz4U;aHn(dBATI|-_=U7O0RN;DX% zd(AX6kLd3VDMxgRAvF@UkqYiIDgS5asmvpOq}dpxn0FyoFgsJ4xt`Ob%<8m&gCb?i zCFj09aiNO$#RW=WohK^jy$bY~!TN1L`BVVWI}IsI^j?tS5@5snA1nb^gNiX#Ja1G4 z4>{{f;NaWAq<1dSBMd1^^jJe`Bx&F+>u7Mro3nd$L3iHl%u@45W1A zuxB8J#L;(yiD_!$TuYQQG{q_@P|1ZxV!>6SdM14=$NBy3eAXzHP4vI<_)+ExqJIQQ zz1OHOu~itZWeOwF<%TpsynWrWG1a1eWpvLcN^MGaA)tG{uRBn&T0Au$Yt&?kQi@WO zEwMGv_>(0{7d2yfRN0~)x+SYQQA$?bb4Cw^rY`$RvM;rfQW-3H@<%iox5hx+T4;&Y z?G0je{6KAs*C1Y0CuV*Vq+0+-D1YSFe}9TL%^=+kU%*qn0l(1EHC(<=yl(%}y^dVj zmb)Us$t3u2^NyN!z)l*fR}A2R%dCDGCm#)d4>Q6On?Y|XKZMCpf`E{I#7Qs*gp@(+Ym(n*w7=?Z6S zyoqLxDAj028zqY^hp#=x=iH|uXT6nY`F)H=QIgn6^^_!}35d%+CO$c$wIGdD^{tNQ zk}%cs68(_N>)WF!zD@PMP4%>iLR0r1TOl|J7vH;$%Fdl3m}8_Onn%?BR(6Ky@!*b^ zZZ@n<8QNt1@m6!C)K{x2lX|VZ249}Hwbk;}U&eQDQ#Esm^5;rrG9Y@g;mQ-W#Zq8m zXn=IIijo+W9sqH%Bfzb^dA_`PNhu0fdvtXW%%2u=oEH9KhX_YI1xta4M*Gl}WT_-E z_xMV(??%Z3#_UEa8DpZ~=qqV-mB>^)m?Kt4y|1I**HQ252<&E_h2@Eu_=Z$QtXMmR zWtsc+#!+vYRmt{y*84pJhAAtkjjM}nLW#15^vW=VDW5xex$6a&KW36PkLc$NDMR$D zAjJ~`8`Lh#x3Aip5R__Ptr|zvYvnb#@)Vn!5!+_)zhROvm*{^PQi13LhSWfmbtA){ zQyS|gbw+TNDif*I%A4oPOZVh5EWh6{%W#(Hk3f=NMz10MQ_E%}L5#A<6xQl;1%36I zQtFht6ARGf=BdwhSW^-E|63i*O%CO%rMpy{o3|gteiO|dJRarFI(ewFpNZN z45^;zB_@Q;nmzq59lFjKRUrC(Luw&P7nD&2vYRVv>zl@+Qe;0yjeII2tN!tMug!|>T@P@_nF}2h|(*~$QE;>wx)2GHfhGB z8N@$`SRH3#*6cv1!-i|qa2@D zBB8L&B9G1dG)LP$6>#06)?pzz-YiM{c-q5Qkdchki z^&Bc=OzJX3cLXV3GTE?RXK0i4$6GSBYFDi)c z#gLlm(ZJ5pzH;ZRi9zR-*}j^AQk7I=Q)SiU1CfyFi#{ALS;u;^Js~QO=){I&NESN%>V$PxG(JQ!`TU@vn+x zLq#!AvUHTIqe0ynkS50$NnGV!l+Gl6!jUV^id<5kbgpWxq`v4}mA=A2D$`bOv74!i zh?ysUYPsvKPapvdxvYvrFGmDrEg`zekTOK+xo{D^2#$y>qSl(MYqD;?20NHO85hh3 z#R|y{m5_!iF7J!W`{Dvq+A#Q>F}|nhjG}6=>||IQi5_f78KP4`ir?C>VYOsJp1B&- znnD$}Ys!{P31k!|m>e|{{jeeBh|V#jdZIQPIX`^4kj+-k^y&=^Twb9J^?&m@}DBt!h`aM&vQxZ3h(Q^L_P}X{)zci#~qQ3%3 zuk~zgGgixx4I$C7AZbRnS~2aU-UiWfXw!YhfCAC`4XK_etv_va!^WGaW{K`-;+H47CrDZx zTN%qp)cTn%_sF(<-*R-5J}Nc25?e2tY~+Yijb^m6i9G^GD~)#V(9o?qj0bK=crh%sogFrdnR2A9i`e zmiaa{`!+SxCJId*Qg8S!z84#<&7+VS*19|hC3>*QT88LUko5A4h7Eg$Hd%i%R#g&n z)vDEvdab;rr#3@IJTX~JX zyvB0l^^J&3Mz$_6j03LAzD)(%G}%aKAxbNhO$B4qRKr*xN-N~fG*N3%$|h5Sk`ksY zO=4_hQ6ZW%DQisnfH5gcl;M)TL}{8HV{BPNy_G)xZnVl5k;lD}$4dE44VsaGVnr(g zr#eM*i#$zYT|i=8K%zf(WPR34w6T-XlX@pg(MTwjFbxuO*Z)S5E4 zYV%ZUb>w{=-h?YRxRrB8$LmOi`i{-&$$OO8wuK#c&f2jzW5zDy^!slFV9<)N5oF~@_MR$c?DmdH?NIU@+$Z| z$i|k^WOgLF2nNe8kmy>FhDEE+DY0>#H8;LTZqN3lMnj)2$ zhz8OCxi4`k6jGOvsDlE-cQ4|}PQ`>m>1vwS)I?W>k0_PLrc*ur5gmT#RKB|jMbfywIcYQcx? zs<6GhELM7bx0b$B_dYe|_t@oUjG$r{Q!d^-5k*gUO#VD*nEndp&=dzZ8f7Fj6Qvb;f5g^~hOt1D zR>-_W)EeZ?Bc>Ko!jz>+jE&5)L}`THF)2%w;gY^YX`1fKmNnGhAH~NG{uB9o z3Q*;pitC_Q(ar@Hcz!yN8Z=rjZB%!%2IGEQo#KY+g8zhU(tMDQE-2>2l8i4 z%&_MLroQ}np^{9@dmvVo9#d%Z9OCjf#E~Z}xIgl(@}gTMDP-iX9i`K%_CgE*MTGW8 zp}yj{+cgl2aL;DHXUcwt7Qd1hj>PGO>_mKd-hM0I&zJ~MhVqv9*ANw1|9yGhyrwph zYT>mn*H)PyDf$2-I(rb%g_cD0^B~0^U1!63nWa_7m;%iboez?9J-5V0hvg&6EDK*? z(-iL{Xfq9!aLj;Vv}tG&DvuAvCPG26^j~HtqSO?J;@|H#cTw?PN}@nxZ49yl7<*YV zZ*0&5acThjo055BgUOPvL|0k9{t_EZrtsM+)L2FIJ=T{g0&hx)qPsjMf66mV4}m$f z)Ioo|#xKD8tFHjcR*2|!7{)S*5uE^%-U_kRY#E6zC}U)6kzpKgD@2>VX>2MG-PK5F zCQ2*xR*0=hhOt1DR>)8%Y7O$H43ng?FwqXlB2mUhCRCy{LT_i-+SizrCCYF~U!pWk z_hri(>Q~ROsPc1&)V+Wz>r_j@p-PZBQN3w2{pnM}J&F_)DUsF-7f~t+tSYe%qk+Yh zs57e}PYqU_KMus*D;;-bQSp0vi%Jw7hz!g!neazYA~Z>D z5X~A=U?O-NQhs9;c)qH&{9Ih7JqgnuH9fu5DGx7pdaC46itXwtO$KKRKJGt3-^r29 zMLp4545@+W?S@oO^!p&`P_flu4JX=eNM5K^6t;pKYEKx_Y_tZWu$|L0o-;tRUA-t& zM!a}Ix_teu*|1)U+8E~-vgYoa8)-HJ+ z0+@l^M!?O0l%u)rU$_5Y{7azc9Kbrrp9Z+e(Q7qn%GKGH_>&mIOF0@%+jEid@ze(gy@YAmSQ}mI37_Jk} zM0*WjT0N)rpPHiY4A56Pka}Ey()d@W$mck%h5zojbmdoImE8sKY`{+drtw!f{QW8X zlv}{{>DZib)9T8<0@uF*cpc#NfG+d@g?zpxb}n@tQInux@+ZUJK~*zv%F-10O%=#t&@OLI1iz^uG#u zuL1rY@J+zC0V|=0pGW&1+LV7yihu7`KJ~c%lYadW^=|{d@qmoa?uZZVPRozme=z=C zpl2`I2S~eJf9`YaV!be~E6w6 zKz?h>T(n#8Ej+IRUIjaTl48$#$iE!$OMq7ay7p`WeFykk1DIytJGJKzkWct$v|mcG zrvmzEj~gG?e%gBo`nk~Mr~PL*@w_1=p5(g#{N%eMh5sJ#Jq}2|w0uq2Q(O39z)cQx z?O%xND*?yVXpR~{mwzMZn*e_c_-DY#dHrg#CTsz`Vqe|92GC)To_vS=YxdC+?gm_N zh;FY1bmjlx9r9D|Bk1?){#xR82WU91PQx0&afj*lzJR)A|5D!19eHm;F8lAC(*KzK zw5(ZxIlyK>{^U>>+UEkU2fPz@{}}M6fHendxl;iv57zCCfU|3Ln|?ksMYsRsPz^5u z)Ghn>z1rL1*z*wV`8A-`q_Ov^?_B8n`axRWjex%e{5{|w0RIg57T{p^-4DB6z7He5 zgT=EEb+!xQe-I$^;l{(|KN|d>2K?M0{bwMr83(#{ek&#atcwz^6Q=P$0X~icj-$Gi z@lXN!Q2EaWe?Q=PfL{l^4X|sf8%f>X`fv^R0$g{5Zf^km4&Ww0SIS`hUH+8 zyE#SvL*RP>a0L9QN%6TL9hoVAw>n zabX$YrGT3OYj8j43czataaAl6#d%mOhKD3`nv4i%s z!HyMx8vqBhlV67lGYsIDmGT=%x8Qv>?;jaPApF8n-iP2fn(~`W2kXxpr)?v&z;?h3 z09}2gufz3CfV?T{^7H!r;Cl%0bwHQjyZeconF|12{&ApB0Ne-gq!fPMp(p$p_;`MI@6!*JpHIPVfV`UlzYBOfARjo@;JyQ&^tk%J0RFE4lAlj(Tz>cP(73HN z2OlZ(5ipOVxczw_ow?B`g?><^z*$a^8 zSnI}Ux_i)&$CF)oe@1*>Vw{}*E`OR{9zk{Wy8Wla-m?Jv0eQTVXDe?5eK2`EE14$G z)&Cs);|IqG-vGS=ACTb(ea7KKCj69-E06sM-Tp2=V2O<+a0)4nWH1$6?a?yZzGiQ;w^DBkX$6f&7%c%l}vKy#n|eAU`oaZadv$E#NbN zTL4{o|8D*b+iHzh1M&mf{Cx9B*fp3PY4LDBrR~ad{pEKZr0IA0&rgYCnmznl7JlK% z+VNTbl4i{S|Qoo!F!I=}g8=N+^JetDBCkNpVU{%QO!AHVa7Uy1aU?RC$M zfV{6qJNRWp{Nf?^TZhiv(bcTm^o!8b>-amEp0&`!ub^_ZQvMwHaS|Z?9IU_FZ!mjY z{aaw)tAPBvY{EA|=l5QZ#eFP(U+&Jh56Caeb>*`kq1!)=-{s@C;qohJ`CaXg!Jgrc z9sKfFe$lJ@Ew2l3|I5`+zX)Bu^pkL?dieG0u0G0N1wYOPq@T1it-srEFne76*B}o3 z9h|khYmO~|)f04kE#Pf{{OP1LdHnUR_bTr znvS;X@4uU${yl?yJU>W&XeZ%p*qxTIb&!`P-}RTj95qyaw|;0B;b8W?*Z!<){%*|% z{6-Cb`ehT^{MnZ-#Dj5Phk9QR$e#n^FZO&Hbp9ZW8?XP<^)ase*`Pt=ig>-#xNby0 zH@;n{?_NOnC!%NLIRt+`*X_?={pBzGlJ6rmE~jok2KpZWU)oR8Z#+;#_pi(UKj8m6 zVCDWp>;F`Z=DQvIcLM$taKj+_)B2CZ{ra^2HMl+>aOoiYUAW#4_%*=IfR6$`4d})z zjc-TzHwo~76o1qDzX^SWLzP#(m$uN&^YaI5`kw*U;>O|mfL{W<3h-vY+W~(L==x86 zk51HAHskqK-QK!=9_r>6z~do@`roO(aqw?fz&!vb0nP$!1$6E01O1nP?^Hkg{R#d5 z2XMi=^xw6Q@~RbrB2rnq&vPl`UuyEvuZ?}fZkh|?Irae#yMPwRIO`n&d% zei*J#2W(E^UjceIU_apbfa?Hn0{jl(4*~B5ybq9hoQ1r)_ALN?_mp_L{C(hG1$aK- z_CxG{H~4=H_%px<03QORywg!nJ%B5n`f}}i0sXfCz79AR_PP97(3jADLg?YV_afR{ zch5pye+!Ux&iR>j?&@2XBL4@F|1jVaDf(`Fm-@P)m;O*+#X;J_;ecBKHbKu)z%u~T z{Gt5m=zlBV&;CX7Zi1Y#u!Hsu)t=Lw{)H5OmV)o2fENQ^3+U=w4th6WFJONP|8tmjUC}v+W6TE{MQ5i!0EsL5c^+?e%oT4QNL?1^_}MMFF-$+pM3Md zzXY%yu*-oxXs-lx<&mF!=Y#L66#i#H|101tfb`Rq{~+@I5a82*oEKdFBXBNh2HnoG?{izXI^UqjdXlKv&+s zo4*d{Kt?-uJ&QK&IvMum0P9oioslB%k#{Mt{a-Av8}eQTWFFqFeXql>afnCD2XqF{ z1a$M6#=ipmU4!)h_>o%T>wrg3)9p6EGXbvzyaDiWz~=$CcI;i6VsE>{N59S;BL8ae zrSX3c@_!9D9{hwmpuH#HA%I5#&H>B=y79gS^lt&)0(kJznzIpb3*fk8G<_Z5=K(hW zy7IpVd6WM|@}7E^@~%j+Z!rH{f5<-%{!+ifDWkja8cL_fyP_@ol2Uw_>vS^HIT+oCS`Y zl`;RADC6*dPUs=~uY#N|$l=Y~TR~sv(0>B@M$pGdTfLr=|H__Cpl=^jqv$2jpK<8J z#ZAQ@&C!gzgMSy$Ye2_M;iwk$=??!4&=-KdKjfSW`a00>0KEu$<|CSLbCrgjLRayx zM*PLH_;n`u$DOL%lW`hwP0YVt^i2G1Zc&8ED*6QI3q}eeuMHYRmkLz=PS0sM+YHz6 zI?ywx>GngF8r}hV-CW(~hxs27y0UW|?1cHzZ@|A`k>=kDa{dT7XA4`ZMH* zJ##=`FaiXC2BC-Qc7f29ozL`Z!D_sz*TtZ30UctZZ>7k&8T^^^bpIMS_AuyO7ijv) z5cE5tS43l@wHROf>C4fdV*2=~(W##|WBRCQ!Dh|)3GiZR0#{M|n0 z9~~`tI%X^T6XKs3^N)|FJN6tU^vY9T%Zq3!z$;;@~}XCc4#O`#tl z^cpRq>~B`+p}5UYk+VF7{;?D}pN{!u-ndMw{U_|dHbu_uDRO?1LVp4B$6e?v?ce=pbmVsjMrfWG-`O&=GJAN?H`Avss1=)Eq5ekbH_ z`VTFCxdzcsVmcZL@cR_{Yml?~`;sf~)fI9?7GdMKVBjQKTh@^2=E z{!z$}KBKvBgx+&f%^B_GP~_!RoY z6#9o^dUdqx3SP=k1WQ@snB(-eyGirSLzVBL8nG{KK~n z>)k$uJ}HI%L7|80?X(p7M^ogeFAfaJxj2P>MT(q_DfAzt&^O2OWj}-UdMD)ZcQGA} z1o&GDeUxnAL-wmrafI^w;S~OSOqcq{{2q6uSDi#j@2wDm;A z;^NNY(vHrBtsTY1y`9}X#n!%6(W1`fT^((`ZHsH`!W_jV?JL@gt=-+NtBY+bdb?Lg zOS)T^w-p!nEnmJ`x+Gdf;p{DAEw(RjUE024>5^WtYDwpc-r~}>-qzmU?qW~x>W;Q@ z(vsHY?HwXM$+om(b=R_)VZRkx2wCeOJpr;UD;ObZau>~ z+tYrQwWXtN#nRqoTAVgDHZ2ZdciRf7f@o&`w8G5UwTIOm8ZGZ!+}9y_YgI$gT-N<@0dpj;A>v1>&Y?=#yL7ngRob}eg@%8KKrVymx0Cb;hwL6;D0> z`24Iwv2g5+lV+8>9Td6f9XLt(dV-o*qT-yw$uc51TS^$!Tv=#cC<)H2K3+s(EW_^; z+qzdME3IfX954Q<9}>Vec||NASXjDvuGT&VrF&mI80ob)w8<0i>GvoEuCr%8R;`+pdF7+GOKvJSR8P~hFQALQ4_wMD+~v1iqyVos{0eR-Rh z*4Zun6iFMXDX~+Fy4zZNb$BGG4Kl|Z*Vfa%bcNJdXSd8Wawh|x`1Xk%%@SCmnq<7|T@L6(_MS%%UU3r({0U^A6yhe#|%rHv_+P^u6V zb8W4Q<5JAGb*P~+Q>J!tL@uAyDJ!a)kra{`h@!r@M2&u>HC7nUR5NFEq8vDLh|N9A zT1Cf_zK)KB0A61dZvfnYpQP9OVuPNq#gG}DogHO{Ak8u(buQ<~RE4#?t4x?q^oeb% z1kGSLHLqJXpvs^26)W3&+GR45eVdxDlxIRt*1jt8_+spLuI-FInIPlgop4RbGR0af zE?q8TMXIJ-#;)SxrLx)CM6u9`a!{qXsB5)xX3F8ZHWqcX$yk+rORwy#62l|j)%5i) znU*XIwJPY*cj}@=eciHb+wr72$i zXLhbw(!R7fQ<-R+s;)DuWrwpuUspPoNcpJ28pkSL4OvWT%<9QX4_#BoY7&i>2g^mJ zNmsp0z{hqkEoNkE(pKn`y*B1vHD{k9^Q?@QzD3Gyz1kexb6jViT7Jsr`PN=>peG(s z7@A_Zthc?&a@iD>)tqE5*Cxweo6HK@V$X(SS1gtSJX5CC9+)G+R{LI)T($JZCUjGj zti(O5m$L@dfRwpMO}1FavEDO|Dp_jLv+0$$8R{Jg_HuTSW)D687mY%vGKx}4Q>IdX zLDtfqC9)|gE8yhNvn!vjIWBc-?vS9XWn3cFAhSznchQQ=tUjerwzl0e<+Lq2U7U;O zqd7hKzJc! zjIpRz%DlIAp}^j54VMvH(b?NpyL3fg?Lw8cgWDHJacfy?&$6g?@#+<7fW)x3TVLUx zIA&w^GP`BNKf(~=kV^hENObNO=hrr3H`tKOrxFYHr0uG+%neJS;tB>&YN7I{1pzjg+kE%5EP-|l4p9dYo7@BrMF0Wf;VUoZXtndm=#f)-3z z2R*KSkfX(ds9T$q*M|ZloUm{#5&;61w-n$}H$6}KGd2WsHLUn*F@nS!c z)cwI^f1V>DMEc1d$J#Umxd{C$N!$bkaI*?p;#HHt6?&=sSNhqX=RF9&r7k93Zu~aL zwPgRb4{K(^=a4^&VE)*?RuH-682^xrqVb$v=Fh5S^Q~L9O*!9@3#!C0Y|Od7#v%6q zk@Qvevp>(@EI|L+axM9)Nj3z3O#UbPU-7nPxZE&-&x~Cy%#n?Ir|d zGP?g9tUtWu>Q~dFseLjD{6bOpZ+AL4&3JuL^=o`k1*u;6S>JW&UcZrWvX6@mga2 z-4FfuL;vT%O1<=-5*`#ptzE{48gQcknNc9|2c-9wg|?S;DYxVq|!%I$w1ZM$}z;#IG+YsGo_fYS{7aZ~PUAJl4`1V!3OAlK%`TNh#`0u@!UjN+V zcO4hi-220G&iLwY-hSoVQ}6rvf``BOqwM!9R~_)1?Q5R@$Tnx5R5kJM-+iLvfg3A^ ze`?3w{_>H(DAkSczuu3)`w@6Q0`EuQ{Rq4tf%hZuegxi+!2h)oz-Ih?@O}i|kHG(t z5#Vk0ZE$}Wca5V*( z*Mr}G!R!C?&$l}j3-7PX$A|R`_q+N0m(Sf{R>b??ybaFh4(5J4Jmvj!KCi}O3-fG? zpM&CaZ9enjb8_0r=jHLu6S0u`)H8ZzFrUk-Xa1_qIB!9l&;9?7Ht&ll-hb)KIfpmU zQRMhq@OV%8nVI-NQQ4s~{|u2jf>U;cQjW{m^S+5Q%;uO|d|cBzLWa{y(pyg3xo1)J z8Al#!)JLX-O%4IYXS~gM930ibfkyY>4i1;&%#c3C6(1Q-pdvMKdfb(uPI$%6K|}Ds zm2+rN@z}%EI6&x~81&-dAE|RrA4(6L^Va4kPCn^_mC9JTRCd-7r1&hh;AQ7K<#3H0 zwpP8IL$X3ioNuRFFCXXO5Wb zK8XXZ;S*w-O}v)##`>@;EK3|E1ck@!br*XkIzIK~o&dAQOwFM%9%xnP(dGE9Jp zIL$rzWsltXC+@w&+_5sA87}L|gY?Fn_(+#&m7k}J$vAi&<4Yx1OZBIowEOPSc?rEa zI%`TQaTL`*W0&|GgLj-!BCf`7%4vILtH^UsL^>x`F`?iHt_U3PT%jEX!4D*)d=w&Z z%rZW#xI~qI@{qgoC;8zDY3qX5RK>2__E>YGiyE1UrbH$opGR(mA$dOD{}hBdp2;K3 zh9CnmKCkJXa#zz!{K*kj>q@16+&npxo71P|XVByN;UPmQeKpsr5wI*ilj>ZsC2J4F z@-QbpbE6OZ@`DI+2D2~uxvR3%;)#pl&lZ?dz3L2R*(Z7I*-nn8*bnDax#iNIG>|q& zd6^+N$83i@rw2JYoa~c4DJ=BR*?mcabB;PTOlCm)p(AxB7AKkgi;0iQ40O@$pLR~# zJ?Cv?2F}2mYwodM@s(M`r$qGU9pbd$2)us~TSX{*K3=ZiWUf6?YiTN0P*YB1?h+?* z6|X%wT+XgP*ilXkcvk+o4qB{c)cEYOBvh@0_N=!RXlC8SM+-t%)v?$3lNR2&am$Sb z$`X`td`2wJi)yQtDDc4~bKOM3e%L0y=6_-)CiC+%&PSkl{5a;}1i%jy$VXVY7S;B2 z%CF`MK~D8AS=e{hS&C4n2wlC)WJoPG?M0fEpU{)ffDl!m7)Xdbxb4WrM;w0Gk#X0l xwTITp=Qa}x4xV!O;jK%Kn9`;tPd+s_=Y%<@98z0*NLRc1KxnP-_Qd<`{|90fOWptg diff --git a/lib/python3.12/site-packages/PIL/_imagingft.pyi b/lib/python3.12/site-packages/PIL/_imagingft.pyi deleted file mode 100644 index 9cc9822..0000000 --- a/lib/python3.12/site-packages/PIL/_imagingft.pyi +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Any, Callable - -from . import ImageFont, _imaging - -class Font: - @property - def family(self) -> str | None: ... - @property - def style(self) -> str | None: ... - @property - def ascent(self) -> int: ... - @property - def descent(self) -> int: ... - @property - def height(self) -> int: ... - @property - def x_ppem(self) -> int: ... - @property - def y_ppem(self) -> int: ... - @property - def glyphs(self) -> int: ... - def render( - self, - string: str | bytes, - fill: Callable[[int, int], _imaging.ImagingCore], - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - stroke_width: float, - anchor: str | None, - foreground_ink_long: int, - x_start: float, - y_start: float, - /, - ) -> tuple[_imaging.ImagingCore, tuple[int, int]]: ... - def getsize( - self, - string: str | bytes | bytearray, - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - anchor: str | None, - /, - ) -> tuple[tuple[int, int], tuple[int, int]]: ... - def getlength( - self, - string: str | bytes, - mode: str, - dir: str | None, - features: list[str] | None, - lang: str | None, - /, - ) -> float: ... - def getvarnames(self) -> list[bytes]: ... - def getvaraxes(self) -> list[ImageFont.Axis]: ... - def setvarname(self, instance_index: int, /) -> None: ... - def setvaraxes(self, axes: list[float], /) -> None: ... - -def getfont( - filename: str | bytes, - size: float, - index: int, - encoding: str, - font_bytes: bytes, - layout_engine: int, -) -> Font: ... -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index f64ac145b1b6f62fceaf03884480804954cb4983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156856 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 Ck7ye}r^m#Mfbi~?T5_P7Y?I<6|& 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 diff --git a/lib/python3.12/site-packages/PIL/_imagingmath.pyi b/lib/python3.12/site-packages/PIL/_imagingmath.pyi deleted file mode 100644 index e27843e..0000000 --- a/lib/python3.12/site-packages/PIL/_imagingmath.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 9992d4ab5737e81da46b17a073b5f873a2a6e308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36112 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 E0qHrs@c;k- diff --git a/lib/python3.12/site-packages/PIL/_imagingmorph.pyi b/lib/python3.12/site-packages/PIL/_imagingmorph.pyi deleted file mode 100644 index e27843e..0000000 --- a/lib/python3.12/site-packages/PIL/_imagingmorph.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 2f17f6e4b6618e9178225f4a59b7b3151405a104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46352 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 Skx0ca(y`%aPOFdx8vhgKtiW;r diff --git a/lib/python3.12/site-packages/PIL/_imagingtk.pyi b/lib/python3.12/site-packages/PIL/_imagingtk.pyi deleted file mode 100644 index e27843e..0000000 --- a/lib/python3.12/site-packages/PIL/_imagingtk.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/_tkinter_finder.py b/lib/python3.12/site-packages/PIL/_tkinter_finder.py deleted file mode 100644 index beddfb0..0000000 --- a/lib/python3.12/site-packages/PIL/_tkinter_finder.py +++ /dev/null @@ -1,21 +0,0 @@ -""" Find compiled module linking to Tcl / Tk libraries -""" - -from __future__ import annotations - -import sys -import tkinter - -tk = getattr(tkinter, "_tkinter") - -try: - if hasattr(sys, "pypy_find_executable"): - TKINTER_LIB = tk.tklib_cffi.__file__ - else: - TKINTER_LIB = tk.__file__ -except AttributeError: - # _tkinter may be compiled directly into Python, in which case __file__ is - # not available. load_tkinter_funcs will check the binary first in any case. - TKINTER_LIB = None - -tk_version = str(tkinter.TkVersion) diff --git a/lib/python3.12/site-packages/PIL/_typing.py b/lib/python3.12/site-packages/PIL/_typing.py deleted file mode 100644 index 0a7d87c..0000000 --- a/lib/python3.12/site-packages/PIL/_typing.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -import os -import sys -from collections.abc import Sequence -from typing import TYPE_CHECKING, Any, Protocol, TypeVar, Union - -if TYPE_CHECKING: - from numbers import _IntegralLike as IntegralLike - - try: - import numpy.typing as npt - - NumpyArray = npt.NDArray[Any] # requires numpy>=1.21 - except (ImportError, AttributeError): - pass - -if sys.version_info >= (3, 13): - from types import CapsuleType -else: - CapsuleType = object - -if sys.version_info >= (3, 12): - from collections.abc import Buffer -else: - Buffer = Any - -if sys.version_info >= (3, 10): - from typing import TypeGuard -else: - try: - from typing_extensions import TypeGuard - except ImportError: - - class TypeGuard: # type: ignore[no-redef] - def __class_getitem__(cls, item: Any) -> type[bool]: - return bool - - -Coords = Union[Sequence[float], Sequence[Sequence[float]]] - - -_T_co = TypeVar("_T_co", covariant=True) - - -class SupportsRead(Protocol[_T_co]): - def read(self, __length: int = ...) -> _T_co: ... - - -StrOrBytesPath = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"] - - -__all__ = ["Buffer", "IntegralLike", "StrOrBytesPath", "SupportsRead", "TypeGuard"] diff --git a/lib/python3.12/site-packages/PIL/_util.py b/lib/python3.12/site-packages/PIL/_util.py deleted file mode 100644 index 8ef0d36..0000000 --- a/lib/python3.12/site-packages/PIL/_util.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import os -from typing import Any, NoReturn - -from ._typing import StrOrBytesPath, TypeGuard - - -def is_path(f: Any) -> TypeGuard[StrOrBytesPath]: - return isinstance(f, (bytes, str, os.PathLike)) - - -class DeferredError: - def __init__(self, ex: BaseException): - self.ex = ex - - def __getattr__(self, elt: str) -> NoReturn: - raise self.ex - - @staticmethod - def new(ex: BaseException) -> Any: - """ - Creates an object that raises the wrapped exception ``ex`` when used, - and casts it to :py:obj:`~typing.Any` type. - """ - return DeferredError(ex) diff --git a/lib/python3.12/site-packages/PIL/_version.py b/lib/python3.12/site-packages/PIL/_version.py deleted file mode 100644 index 963d8c9..0000000 --- a/lib/python3.12/site-packages/PIL/_version.py +++ /dev/null @@ -1,4 +0,0 @@ -# Master version for Pillow -from __future__ import annotations - -__version__ = "11.0.0" diff --git a/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so b/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so deleted file mode 100755 index 11cb511ec1a0c8c4693512d734e04019ac1d0164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84193 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Η%9P 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 diff --git a/lib/python3.12/site-packages/PIL/_webp.pyi b/lib/python3.12/site-packages/PIL/_webp.pyi deleted file mode 100644 index e27843e..0000000 --- a/lib/python3.12/site-packages/PIL/_webp.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/lib/python3.12/site-packages/PIL/features.py b/lib/python3.12/site-packages/PIL/features.py deleted file mode 100644 index 75d59e0..0000000 --- a/lib/python3.12/site-packages/PIL/features.py +++ /dev/null @@ -1,352 +0,0 @@ -from __future__ import annotations - -import collections -import os -import sys -import warnings -from typing import IO - -import PIL - -from . import Image -from ._deprecate import deprecate - -modules = { - "pil": ("PIL._imaging", "PILLOW_VERSION"), - "tkinter": ("PIL._tkinter_finder", "tk_version"), - "freetype2": ("PIL._imagingft", "freetype2_version"), - "littlecms2": ("PIL._imagingcms", "littlecms_version"), - "webp": ("PIL._webp", "webpdecoder_version"), -} - - -def check_module(feature: str) -> bool: - """ - Checks if a module is available. - - :param feature: The module to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if feature not in modules: - msg = f"Unknown module {feature}" - raise ValueError(msg) - - module, ver = modules[feature] - - try: - __import__(module) - return True - except ModuleNotFoundError: - return False - except ImportError as ex: - warnings.warn(str(ex)) - return False - - -def version_module(feature: str) -> str | None: - """ - :param feature: The module to check for. - :returns: - The loaded version number as a string, or ``None`` if unknown or not available. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if not check_module(feature): - return None - - module, ver = modules[feature] - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_modules() -> list[str]: - """ - :returns: A list of all supported modules. - """ - return [f for f in modules if check_module(f)] - - -codecs = { - "jpg": ("jpeg", "jpeglib"), - "jpg_2000": ("jpeg2k", "jp2klib"), - "zlib": ("zip", "zlib"), - "libtiff": ("libtiff", "libtiff"), -} - - -def check_codec(feature: str) -> bool: - """ - Checks if a codec is available. - - :param feature: The codec to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if feature not in codecs: - msg = f"Unknown codec {feature}" - raise ValueError(msg) - - codec, lib = codecs[feature] - - return f"{codec}_encoder" in dir(Image.core) - - -def version_codec(feature: str) -> str | None: - """ - :param feature: The codec to check for. - :returns: - The version number as a string, or ``None`` if not available. - Checked at compile time for ``jpg``, run-time otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if not check_codec(feature): - return None - - codec, lib = codecs[feature] - - version = getattr(Image.core, f"{lib}_version") - - if feature == "libtiff": - return version.split("\n")[0].split("Version ")[1] - - return version - - -def get_supported_codecs() -> list[str]: - """ - :returns: A list of all supported codecs. - """ - return [f for f in codecs if check_codec(f)] - - -features: dict[str, tuple[str, str | bool, str | None]] = { - "webp_anim": ("PIL._webp", True, None), - "webp_mux": ("PIL._webp", True, None), - "transp_webp": ("PIL._webp", True, None), - "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), - "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), - "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), - "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), - "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), - "xcb": ("PIL._imaging", "HAVE_XCB", None), -} - - -def check_feature(feature: str) -> bool | None: - """ - Checks if a feature is available. - - :param feature: The feature to check for. - :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if feature not in features: - msg = f"Unknown feature {feature}" - raise ValueError(msg) - - module, flag, ver = features[feature] - - if isinstance(flag, bool): - deprecate(f'check_feature("{feature}")', 12) - try: - imported_module = __import__(module, fromlist=["PIL"]) - if isinstance(flag, bool): - return flag - return getattr(imported_module, flag) - except ModuleNotFoundError: - return None - except ImportError as ex: - warnings.warn(str(ex)) - return None - - -def version_feature(feature: str) -> str | None: - """ - :param feature: The feature to check for. - :returns: The version number as a string, or ``None`` if not available. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if not check_feature(feature): - return None - - module, flag, ver = features[feature] - - if ver is None: - return None - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_features() -> list[str]: - """ - :returns: A list of all supported features. - """ - supported_features = [] - for f, (module, flag, _) in features.items(): - if flag is True: - for feature, (feature_module, _) in modules.items(): - if feature_module == module: - if check_module(feature): - supported_features.append(f) - break - elif check_feature(f): - supported_features.append(f) - return supported_features - - -def check(feature: str) -> bool | None: - """ - :param feature: A module, codec, or feature name. - :returns: - ``True`` if the module, codec, or feature is available, - ``False`` or ``None`` otherwise. - """ - - if feature in modules: - return check_module(feature) - if feature in codecs: - return check_codec(feature) - if feature in features: - return check_feature(feature) - warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) - return False - - -def version(feature: str) -> str | None: - """ - :param feature: - The module, codec, or feature to check for. - :returns: - The version number as a string, or ``None`` if unknown or not available. - """ - if feature in modules: - return version_module(feature) - if feature in codecs: - return version_codec(feature) - if feature in features: - return version_feature(feature) - return None - - -def get_supported() -> list[str]: - """ - :returns: A list of all supported modules, features, and codecs. - """ - - ret = get_supported_modules() - ret.extend(get_supported_features()) - ret.extend(get_supported_codecs()) - return ret - - -def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: - """ - Prints information about this installation of Pillow. - This function can be called with ``python3 -m PIL``. - It can also be called with ``python3 -m PIL.report`` or ``python3 -m PIL --report`` - to have "supported_formats" set to ``False``, omitting the list of all supported - image file formats. - - :param out: - The output stream to print to. Defaults to ``sys.stdout`` if ``None``. - :param supported_formats: - If ``True``, a list of all supported image file formats will be printed. - """ - - if out is None: - out = sys.stdout - - Image.init() - - print("-" * 68, file=out) - print(f"Pillow {PIL.__version__}", file=out) - py_version_lines = sys.version.splitlines() - print(f"Python {py_version_lines[0].strip()}", file=out) - for py_version in py_version_lines[1:]: - print(f" {py_version.strip()}", file=out) - print("-" * 68, file=out) - print(f"Python executable is {sys.executable or 'unknown'}", file=out) - if sys.prefix != sys.base_prefix: - print(f"Environment Python files loaded from {sys.prefix}", file=out) - print(f"System Python files loaded from {sys.base_prefix}", file=out) - print("-" * 68, file=out) - print( - f"Python Pillow modules loaded from {os.path.dirname(Image.__file__)}", - file=out, - ) - print( - f"Binary Pillow modules loaded from {os.path.dirname(Image.core.__file__)}", - file=out, - ) - print("-" * 68, file=out) - - for name, feature in [ - ("pil", "PIL CORE"), - ("tkinter", "TKINTER"), - ("freetype2", "FREETYPE2"), - ("littlecms2", "LITTLECMS2"), - ("webp", "WEBP"), - ("jpg", "JPEG"), - ("jpg_2000", "OPENJPEG (JPEG2000)"), - ("zlib", "ZLIB (PNG/ZIP)"), - ("libtiff", "LIBTIFF"), - ("raqm", "RAQM (Bidirectional Text)"), - ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), - ("xcb", "XCB (X protocol)"), - ]: - if check(name): - v: str | None = None - if name == "jpg": - libjpeg_turbo_version = version_feature("libjpeg_turbo") - if libjpeg_turbo_version is not None: - v = "libjpeg-turbo " + libjpeg_turbo_version - if v is None: - v = version(name) - if v is not None: - version_static = name in ("pil", "jpg") - if name == "littlecms2": - # this check is also in src/_imagingcms.c:setup_module() - version_static = tuple(int(x) for x in v.split(".")) < (2, 7) - t = "compiled for" if version_static else "loaded" - if name == "raqm": - for f in ("fribidi", "harfbuzz"): - v2 = version_feature(f) - if v2 is not None: - v += f", {f} {v2}" - print("---", feature, "support ok,", t, v, file=out) - else: - print("---", feature, "support ok", file=out) - else: - print("***", feature, "support not installed", file=out) - print("-" * 68, file=out) - - if supported_formats: - extensions = collections.defaultdict(list) - for ext, i in Image.EXTENSION.items(): - extensions[i].append(ext) - - for i in sorted(Image.ID): - line = f"{i}" - if i in Image.MIME: - line = f"{line} {Image.MIME[i]}" - print(line, file=out) - - if i in extensions: - print( - "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out - ) - - features = [] - if i in Image.OPEN: - features.append("open") - if i in Image.SAVE: - features.append("save") - if i in Image.SAVE_ALL: - features.append("save_all") - if i in Image.DECODERS: - features.append("decode") - if i in Image.ENCODERS: - features.append("encode") - - print("Features: {}".format(", ".join(features)), file=out) - print("-" * 68, file=out) diff --git a/lib/python3.12/site-packages/PIL/py.typed b/lib/python3.12/site-packages/PIL/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/PIL/report.py b/lib/python3.12/site-packages/PIL/report.py deleted file mode 100644 index d2815e8..0000000 --- a/lib/python3.12/site-packages/PIL/report.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from .features import pilinfo - -pilinfo(supported_formats=False) diff --git a/lib/python3.12/site-packages/__pycache__/colorthief.cpython-312.pyc b/lib/python3.12/site-packages/__pycache__/colorthief.cpython-312.pyc deleted file mode 100644 index 53ba3ea8301743463b925cfdbe972d10df474765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21079 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 diff --git a/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc deleted file mode 100644 index 8c3c94d993ca2ab75c21c6a6e17b08de655e2e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41208 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 (3, 8): - import importlib.metadata as importlib_metadata -else: - import importlib_metadata - - -try: - release = importlib_metadata.version('APScheduler').split('-')[0] -except importlib_metadata.PackageNotFoundError: - release = '3.5.0' - -version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.')) -version = __version__ = '.'.join(str(x) for x in version_info[:3]) -del sys, importlib_metadata diff --git a/lib/python3.12/site-packages/apscheduler/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 89fa9470520e5f58c2c808e3c6477a2439841f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1238 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 CaYkbR diff --git a/lib/python3.12/site-packages/apscheduler/__pycache__/util.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 0625a8913e8f1caa7037f320469a4cd7ad7e4938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16399 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 bH*vqPxewQye^JL%+GIbx+58KENBaK&xO^#D diff --git a/lib/python3.12/site-packages/apscheduler/events.py b/lib/python3.12/site-packages/apscheduler/events.py deleted file mode 100644 index 016da03..0000000 --- a/lib/python3.12/site-packages/apscheduler/events.py +++ /dev/null @@ -1,94 +0,0 @@ -__all__ = ('EVENT_SCHEDULER_STARTED', 'EVENT_SCHEDULER_SHUTDOWN', 'EVENT_SCHEDULER_PAUSED', - 'EVENT_SCHEDULER_RESUMED', 'EVENT_EXECUTOR_ADDED', 'EVENT_EXECUTOR_REMOVED', - 'EVENT_JOBSTORE_ADDED', 'EVENT_JOBSTORE_REMOVED', 'EVENT_ALL_JOBS_REMOVED', - 'EVENT_JOB_ADDED', 'EVENT_JOB_REMOVED', 'EVENT_JOB_MODIFIED', 'EVENT_JOB_EXECUTED', - 'EVENT_JOB_ERROR', 'EVENT_JOB_MISSED', 'EVENT_JOB_SUBMITTED', 'EVENT_JOB_MAX_INSTANCES', - 'SchedulerEvent', 'JobEvent', 'JobExecutionEvent', 'JobSubmissionEvent') - - -EVENT_SCHEDULER_STARTED = EVENT_SCHEDULER_START = 2 ** 0 -EVENT_SCHEDULER_SHUTDOWN = 2 ** 1 -EVENT_SCHEDULER_PAUSED = 2 ** 2 -EVENT_SCHEDULER_RESUMED = 2 ** 3 -EVENT_EXECUTOR_ADDED = 2 ** 4 -EVENT_EXECUTOR_REMOVED = 2 ** 5 -EVENT_JOBSTORE_ADDED = 2 ** 6 -EVENT_JOBSTORE_REMOVED = 2 ** 7 -EVENT_ALL_JOBS_REMOVED = 2 ** 8 -EVENT_JOB_ADDED = 2 ** 9 -EVENT_JOB_REMOVED = 2 ** 10 -EVENT_JOB_MODIFIED = 2 ** 11 -EVENT_JOB_EXECUTED = 2 ** 12 -EVENT_JOB_ERROR = 2 ** 13 -EVENT_JOB_MISSED = 2 ** 14 -EVENT_JOB_SUBMITTED = 2 ** 15 -EVENT_JOB_MAX_INSTANCES = 2 ** 16 -EVENT_ALL = (EVENT_SCHEDULER_STARTED | EVENT_SCHEDULER_SHUTDOWN | EVENT_SCHEDULER_PAUSED | - EVENT_SCHEDULER_RESUMED | EVENT_EXECUTOR_ADDED | EVENT_EXECUTOR_REMOVED | - EVENT_JOBSTORE_ADDED | EVENT_JOBSTORE_REMOVED | EVENT_ALL_JOBS_REMOVED | - EVENT_JOB_ADDED | EVENT_JOB_REMOVED | EVENT_JOB_MODIFIED | EVENT_JOB_EXECUTED | - EVENT_JOB_ERROR | EVENT_JOB_MISSED | EVENT_JOB_SUBMITTED | EVENT_JOB_MAX_INSTANCES) - - -class SchedulerEvent(object): - """ - An event that concerns the scheduler itself. - - :ivar code: the type code of this event - :ivar alias: alias of the job store or executor that was added or removed (if applicable) - """ - - def __init__(self, code, alias=None): - super(SchedulerEvent, self).__init__() - self.code = code - self.alias = alias - - def __repr__(self): - return '<%s (code=%d)>' % (self.__class__.__name__, self.code) - - -class JobEvent(SchedulerEvent): - """ - An event that concerns a job. - - :ivar code: the type code of this event - :ivar job_id: identifier of the job in question - :ivar jobstore: alias of the job store containing the job in question - """ - - def __init__(self, code, job_id, jobstore): - super(JobEvent, self).__init__(code) - self.code = code - self.job_id = job_id - self.jobstore = jobstore - - -class JobSubmissionEvent(JobEvent): - """ - An event that concerns the submission of a job to its executor. - - :ivar scheduled_run_times: a list of datetimes when the job was intended to run - """ - - def __init__(self, code, job_id, jobstore, scheduled_run_times): - super(JobSubmissionEvent, self).__init__(code, job_id, jobstore) - self.scheduled_run_times = scheduled_run_times - - -class JobExecutionEvent(JobEvent): - """ - An event that concerns the running of a job within its executor. - - :ivar scheduled_run_time: the time when the job was scheduled to be run - :ivar retval: the return value of the successfully executed job - :ivar exception: the exception raised by the job - :ivar traceback: a formatted traceback for the exception - """ - - def __init__(self, code, job_id, jobstore, scheduled_run_time, retval=None, exception=None, - traceback=None): - super(JobExecutionEvent, self).__init__(code, job_id, jobstore) - self.scheduled_run_time = scheduled_run_time - self.retval = retval - self.exception = exception - self.traceback = traceback diff --git a/lib/python3.12/site-packages/apscheduler/executors/__init__.py b/lib/python3.12/site-packages/apscheduler/executors/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/apscheduler/executors/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/executors/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 64bd11d5c912e46c96fee727ad2bf7ef1c45349d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ8aK?=e!5Nxc12nE04!7l1m1V7*xN}H}twC#pXD)uG5!MFGWuf9Nf^JD^^9GKnN z*@1Z^$t?2V{k#hM6~;e?v3G7!A1%b;9`VRuL&$sx6g3ECS6~l@>4ef*Fp3-*Vt1rk z6PVs9YAx~w8ERepj7_>)gVhd~CYR^DLJPUEQeoNEK8RP8og=o8WxCZa%Tm)nr`v|Y Sf5#KwFFb7!?^p=Iu~%QR<~kez diff --git a/lib/python3.12/site-packages/apscheduler/executors/__pycache__/asyncio.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/executors/__pycache__/asyncio.cpython-312.pyc deleted file mode 100644 index cc295eddeaf3b2d162ad2db74ea708c518d97e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3303 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 CW3H_L diff --git a/lib/python3.12/site-packages/apscheduler/executors/__pycache__/pool.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/executors/__pycache__/pool.cpython-312.pyc deleted file mode 100644 index 9e665fc61df51214cfbadb5c9e69561fe5cadfe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4656 zcmdT|U2Gf25#GJy&+$hhEz7YfN6yJVbs0mH9skL$npT$WCP84RjZ?scfz$EsD3T(1 z^xm~eEl{{RK#LYA@+Mmf;`*sG zcRZ4oWfz6f0$qS}d%LqUyR-An%<)fcZ9xK!4Ms@2vg;I#-BFRGKFR znxqu_T%Jqv@Z|HJf;Z_c_>w+K0yyKz`wK!+poAkoBC2qkUmYDd}b4iv6M3F^S# zYCn*V=@nu&Cd~$4g?tbq#MMPfg;t2?<)nrzxhc z;p}kdn@?BzERh<6Pg(sxv?@e_-!`HEe@3Yr)7~Lo-Ddc$CSdeq4#3rztv~=7pM-wXc6I#Ph3oIkzq2rPOTTU2 z*?V?z>)ZEv($+aMbh+cNk&fkPXDzy`8r?NF^!e$}PG1|k(XkXg^cNi6Q;qJKQ$A0B zmcAxm&&+2Qa!b);3^8?apq_0+jD=#>5L0#z`ku(NQeIZF#ZhNwJZok|SxkdzGGex9 zm~v6k;vt52ZTXxdGBk`8!IK)0+B8YdXJy0kOL={CRAZK>C>Jz_D6stFGAn{`7R9%) zRFEg6ah;86%&<1esw$~^QIlLN#l5!SSr0M?@CwarK{MD+cxO9+*jF+#0+-@kNjt1> zvHQiB{>{apDU3e=`R66_4d)9SUx|7H3I&s134Ro;MSH5zo~wJW9lXKU_77F}5B>h! z;_%tp@cHWS`P#5t9hUDzQ!|4rVG;<|gzZ&f`>$VH681b?3z2Bg1Hz-IaP-4BXWy)a z#cEhw?2+z$&+{Epe)vICUp>dgkQ&Z~RBv-y2-CAk}j0xyfecv{`Vp znDmU7fIOTg%ihha9Ovy?<%zFz1$z&KsP{YH?xxF0Q-au z>S76MK768%a#7V-eiCAWEelWmq($(cP)?T>2ro9?%@Pet7N$E7W3DhDp+s|`fBmB?I`&b|DXFrkyKp@~l_*Epy!QU%5ZtHD98Xns|`*)#ZVE6^3-RA_a z@NFmWJ$j!2alnO~&ke54E#FiPbnSW$bio%1mI}{;SDoeg@KqP0{g)87fm!~aA;ylP zTj8fGJAvdFk_N6ACOfxydkirzZeWK7WKQC$XF=w0HFEf-a%VEYLfx5B4Eq6+^?+lya%wxG1`M+Qc~U-<^e@BD*4{tGV!`Y%?9Ib#3- diff --git a/lib/python3.12/site-packages/apscheduler/executors/__pycache__/tornado.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/executors/__pycache__/tornado.cpython-312.pyc deleted file mode 100644 index a1c501a6ea1d3cac57946573093afd096e10f721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3219 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 YjDJDren->yqbKn){?yq=@*9}`3w_+V$N&HU diff --git a/lib/python3.12/site-packages/apscheduler/executors/asyncio.py b/lib/python3.12/site-packages/apscheduler/executors/asyncio.py deleted file mode 100644 index 7d45d6c..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/asyncio.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import absolute_import - -import sys - -from apscheduler.executors.base import BaseExecutor, run_job -from apscheduler.executors.base_py3 import run_coroutine_job -from apscheduler.util import iscoroutinefunction_partial - - -class AsyncIOExecutor(BaseExecutor): - """ - Runs jobs in the default executor of the event loop. - - If the job function is a native coroutine function, it is scheduled to be run directly in the - event loop as soon as possible. All other functions are run in the event loop's default - executor which is usually a thread pool. - - Plugin alias: ``asyncio`` - """ - - def start(self, scheduler, alias): - super(AsyncIOExecutor, self).start(scheduler, alias) - self._eventloop = scheduler._eventloop - self._pending_futures = set() - - def shutdown(self, wait=True): - # There is no way to honor wait=True without converting this method into a coroutine method - for f in self._pending_futures: - if not f.done(): - f.cancel() - - self._pending_futures.clear() - - def _do_submit_job(self, job, run_times): - def callback(f): - self._pending_futures.discard(f) - try: - events = f.result() - except BaseException: - self._run_job_error(job.id, *sys.exc_info()[1:]) - else: - self._run_job_success(job.id, events) - - if iscoroutinefunction_partial(job.func): - coro = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) - f = self._eventloop.create_task(coro) - else: - f = self._eventloop.run_in_executor(None, run_job, job, job._jobstore_alias, run_times, - self._logger.name) - - f.add_done_callback(callback) - self._pending_futures.add(f) diff --git a/lib/python3.12/site-packages/apscheduler/executors/base.py b/lib/python3.12/site-packages/apscheduler/executors/base.py deleted file mode 100644 index 4c09fc1..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/base.py +++ /dev/null @@ -1,146 +0,0 @@ -from abc import ABCMeta, abstractmethod -from collections import defaultdict -from datetime import datetime, timedelta -from traceback import format_tb -import logging -import sys - -from pytz import utc -import six - -from apscheduler.events import ( - JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) - - -class MaxInstancesReachedError(Exception): - def __init__(self, job): - super(MaxInstancesReachedError, self).__init__( - 'Job "%s" has already reached its maximum number of instances (%d)' % - (job.id, job.max_instances)) - - -class BaseExecutor(six.with_metaclass(ABCMeta, object)): - """Abstract base class that defines the interface that every executor must implement.""" - - _scheduler = None - _lock = None - _logger = logging.getLogger('apscheduler.executors') - - def __init__(self): - super(BaseExecutor, self).__init__() - self._instances = defaultdict(lambda: 0) - - def start(self, scheduler, alias): - """ - Called by the scheduler when the scheduler is being started or when the executor is being - added to an already running scheduler. - - :param apscheduler.schedulers.base.BaseScheduler scheduler: the scheduler that is starting - this executor - :param str|unicode alias: alias of this executor as it was assigned to the scheduler - - """ - self._scheduler = scheduler - self._lock = scheduler._create_lock() - self._logger = logging.getLogger('apscheduler.executors.%s' % alias) - - def shutdown(self, wait=True): - """ - Shuts down this executor. - - :param bool wait: ``True`` to wait until all submitted jobs - have been executed - """ - - def submit_job(self, job, run_times): - """ - Submits job for execution. - - :param Job job: job to execute - :param list[datetime] run_times: list of datetimes specifying - when the job should have been run - :raises MaxInstancesReachedError: if the maximum number of - allowed instances for this job has been reached - - """ - assert self._lock is not None, 'This executor has not been started yet' - with self._lock: - if self._instances[job.id] >= job.max_instances: - raise MaxInstancesReachedError(job) - - self._do_submit_job(job, run_times) - self._instances[job.id] += 1 - - @abstractmethod - def _do_submit_job(self, job, run_times): - """Performs the actual task of scheduling `run_job` to be called.""" - - def _run_job_success(self, job_id, events): - """ - Called by the executor with the list of generated events when :func:`run_job` has been - successfully called. - - """ - with self._lock: - self._instances[job_id] -= 1 - if self._instances[job_id] == 0: - del self._instances[job_id] - - for event in events: - self._scheduler._dispatch_event(event) - - def _run_job_error(self, job_id, exc, traceback=None): - """Called by the executor with the exception if there is an error calling `run_job`.""" - with self._lock: - self._instances[job_id] -= 1 - if self._instances[job_id] == 0: - del self._instances[job_id] - - exc_info = (exc.__class__, exc, traceback) - self._logger.error('Error running job %s', job_id, exc_info=exc_info) - - -def run_job(job, jobstore_alias, run_times, logger_name): - """ - Called by executors to run the job. Returns a list of scheduler events to be dispatched by the - scheduler. - - """ - events = [] - logger = logging.getLogger(logger_name) - for run_time in run_times: - # See if the job missed its run time window, and handle - # possible misfires accordingly - if job.misfire_grace_time is not None: - difference = datetime.now(utc) - run_time - grace_time = timedelta(seconds=job.misfire_grace_time) - if difference > grace_time: - events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, - run_time)) - logger.warning('Run time of job "%s" was missed by %s', job, difference) - continue - - logger.info('Running job "%s" (scheduled at %s)', job, run_time) - try: - retval = job.func(*job.args, **job.kwargs) - except BaseException: - exc, tb = sys.exc_info()[1:] - formatted_tb = ''.join(format_tb(tb)) - events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, - exception=exc, traceback=formatted_tb)) - logger.exception('Job "%s" raised an exception', job) - - # This is to prevent cyclic references that would lead to memory leaks - if six.PY2: - sys.exc_clear() - del tb - else: - import traceback - traceback.clear_frames(tb) - del tb - else: - events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, - retval=retval)) - logger.info('Job "%s" executed successfully', job) - - return events diff --git a/lib/python3.12/site-packages/apscheduler/executors/base_py3.py b/lib/python3.12/site-packages/apscheduler/executors/base_py3.py deleted file mode 100644 index 7111d2a..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/base_py3.py +++ /dev/null @@ -1,43 +0,0 @@ -import logging -import sys -import traceback -from datetime import datetime, timedelta -from traceback import format_tb - -from pytz import utc - -from apscheduler.events import ( - JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) - - -async def run_coroutine_job(job, jobstore_alias, run_times, logger_name): - """Coroutine version of run_job().""" - events = [] - logger = logging.getLogger(logger_name) - for run_time in run_times: - # See if the job missed its run time window, and handle possible misfires accordingly - if job.misfire_grace_time is not None: - difference = datetime.now(utc) - run_time - grace_time = timedelta(seconds=job.misfire_grace_time) - if difference > grace_time: - events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, - run_time)) - logger.warning('Run time of job "%s" was missed by %s', job, difference) - continue - - logger.info('Running job "%s" (scheduled at %s)', job, run_time) - try: - retval = await job.func(*job.args, **job.kwargs) - except BaseException: - exc, tb = sys.exc_info()[1:] - formatted_tb = ''.join(format_tb(tb)) - events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, - exception=exc, traceback=formatted_tb)) - logger.exception('Job "%s" raised an exception', job) - traceback.clear_frames(tb) - else: - events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, - retval=retval)) - logger.info('Job "%s" executed successfully', job) - - return events diff --git a/lib/python3.12/site-packages/apscheduler/executors/debug.py b/lib/python3.12/site-packages/apscheduler/executors/debug.py deleted file mode 100644 index ac739ae..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/debug.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys - -from apscheduler.executors.base import BaseExecutor, run_job - - -class DebugExecutor(BaseExecutor): - """ - A special executor that executes the target callable directly instead of deferring it to a - thread or process. - - Plugin alias: ``debug`` - """ - - def _do_submit_job(self, job, run_times): - try: - events = run_job(job, job._jobstore_alias, run_times, self._logger.name) - except BaseException: - self._run_job_error(job.id, *sys.exc_info()[1:]) - else: - self._run_job_success(job.id, events) diff --git a/lib/python3.12/site-packages/apscheduler/executors/gevent.py b/lib/python3.12/site-packages/apscheduler/executors/gevent.py deleted file mode 100644 index 1235bb6..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/gevent.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import absolute_import -import sys - -from apscheduler.executors.base import BaseExecutor, run_job - - -try: - import gevent -except ImportError: # pragma: nocover - raise ImportError('GeventExecutor requires gevent installed') - - -class GeventExecutor(BaseExecutor): - """ - Runs jobs as greenlets. - - Plugin alias: ``gevent`` - """ - - def _do_submit_job(self, job, run_times): - def callback(greenlet): - try: - events = greenlet.get() - except BaseException: - self._run_job_error(job.id, *sys.exc_info()[1:]) - else: - self._run_job_success(job.id, events) - - gevent.spawn(run_job, job, job._jobstore_alias, run_times, self._logger.name).\ - link(callback) diff --git a/lib/python3.12/site-packages/apscheduler/executors/pool.py b/lib/python3.12/site-packages/apscheduler/executors/pool.py deleted file mode 100644 index c85896e..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/pool.py +++ /dev/null @@ -1,71 +0,0 @@ -from abc import abstractmethod -import concurrent.futures - -from apscheduler.executors.base import BaseExecutor, run_job - -try: - from concurrent.futures.process import BrokenProcessPool -except ImportError: - BrokenProcessPool = None - - -class BasePoolExecutor(BaseExecutor): - @abstractmethod - def __init__(self, pool): - super(BasePoolExecutor, self).__init__() - self._pool = pool - - def _do_submit_job(self, job, run_times): - def callback(f): - exc, tb = (f.exception_info() if hasattr(f, 'exception_info') else - (f.exception(), getattr(f.exception(), '__traceback__', None))) - if exc: - self._run_job_error(job.id, exc, tb) - else: - self._run_job_success(job.id, f.result()) - - try: - f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) - except BrokenProcessPool: - self._logger.warning('Process pool is broken; replacing pool with a fresh instance') - self._pool = self._pool.__class__(self._pool._max_workers) - f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) - - f.add_done_callback(callback) - - def shutdown(self, wait=True): - self._pool.shutdown(wait) - - -class ThreadPoolExecutor(BasePoolExecutor): - """ - An executor that runs jobs in a concurrent.futures thread pool. - - Plugin alias: ``threadpool`` - - :param max_workers: the maximum number of spawned threads. - :param pool_kwargs: dict of keyword arguments to pass to the underlying - ThreadPoolExecutor constructor - """ - - def __init__(self, max_workers=10, pool_kwargs=None): - pool_kwargs = pool_kwargs or {} - pool = concurrent.futures.ThreadPoolExecutor(int(max_workers), **pool_kwargs) - super(ThreadPoolExecutor, self).__init__(pool) - - -class ProcessPoolExecutor(BasePoolExecutor): - """ - An executor that runs jobs in a concurrent.futures process pool. - - Plugin alias: ``processpool`` - - :param max_workers: the maximum number of spawned processes. - :param pool_kwargs: dict of keyword arguments to pass to the underlying - ProcessPoolExecutor constructor - """ - - def __init__(self, max_workers=10, pool_kwargs=None): - pool_kwargs = pool_kwargs or {} - pool = concurrent.futures.ProcessPoolExecutor(int(max_workers), **pool_kwargs) - super(ProcessPoolExecutor, self).__init__(pool) diff --git a/lib/python3.12/site-packages/apscheduler/executors/tornado.py b/lib/python3.12/site-packages/apscheduler/executors/tornado.py deleted file mode 100644 index 3b97eec..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/tornado.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import - -import sys -from concurrent.futures import ThreadPoolExecutor - -from tornado.gen import convert_yielded - -from apscheduler.executors.base import BaseExecutor, run_job - -try: - from apscheduler.executors.base_py3 import run_coroutine_job - from apscheduler.util import iscoroutinefunction_partial -except ImportError: - def iscoroutinefunction_partial(func): - return False - - -class TornadoExecutor(BaseExecutor): - """ - Runs jobs either in a thread pool or directly on the I/O loop. - - If the job function is a native coroutine function, it is scheduled to be run directly in the - I/O loop as soon as possible. All other functions are run in a thread pool. - - Plugin alias: ``tornado`` - - :param int max_workers: maximum number of worker threads in the thread pool - """ - - def __init__(self, max_workers=10): - super(TornadoExecutor, self).__init__() - self.executor = ThreadPoolExecutor(max_workers) - - def start(self, scheduler, alias): - super(TornadoExecutor, self).start(scheduler, alias) - self._ioloop = scheduler._ioloop - - def _do_submit_job(self, job, run_times): - def callback(f): - try: - events = f.result() - except BaseException: - self._run_job_error(job.id, *sys.exc_info()[1:]) - else: - self._run_job_success(job.id, events) - - if iscoroutinefunction_partial(job.func): - f = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) - else: - f = self.executor.submit(run_job, job, job._jobstore_alias, run_times, - self._logger.name) - - f = convert_yielded(f) - f.add_done_callback(callback) diff --git a/lib/python3.12/site-packages/apscheduler/executors/twisted.py b/lib/python3.12/site-packages/apscheduler/executors/twisted.py deleted file mode 100644 index c7bcf64..0000000 --- a/lib/python3.12/site-packages/apscheduler/executors/twisted.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import absolute_import - -from apscheduler.executors.base import BaseExecutor, run_job - - -class TwistedExecutor(BaseExecutor): - """ - Runs jobs in the reactor's thread pool. - - Plugin alias: ``twisted`` - """ - - def start(self, scheduler, alias): - super(TwistedExecutor, self).start(scheduler, alias) - self._reactor = scheduler._reactor - - def _do_submit_job(self, job, run_times): - def callback(success, result): - if success: - self._run_job_success(job.id, result) - else: - self._run_job_error(job.id, result.value, result.tb) - - self._reactor.getThreadPool().callInThreadWithCallback( - callback, run_job, job, job._jobstore_alias, run_times, self._logger.name) diff --git a/lib/python3.12/site-packages/apscheduler/job.py b/lib/python3.12/site-packages/apscheduler/job.py deleted file mode 100644 index 445d9a8..0000000 --- a/lib/python3.12/site-packages/apscheduler/job.py +++ /dev/null @@ -1,302 +0,0 @@ -from inspect import ismethod, isclass -from uuid import uuid4 - -import six - -from apscheduler.triggers.base import BaseTrigger -from apscheduler.util import ( - ref_to_obj, obj_to_ref, datetime_repr, repr_escape, get_callable_name, check_callable_args, - convert_to_datetime) - -try: - from collections.abc import Iterable, Mapping -except ImportError: - from collections import Iterable, Mapping - - -class Job(object): - """ - Contains the options given when scheduling callables and its current schedule and other state. - This class should never be instantiated by the user. - - :var str id: the unique identifier of this job - :var str name: the description of this job - :var func: the callable to execute - :var tuple|list args: positional arguments to the callable - :var dict kwargs: keyword arguments to the callable - :var bool coalesce: whether to only run the job once when several run times are due - :var trigger: the trigger object that controls the schedule of this job - :var str executor: the name of the executor that will run this job - :var int misfire_grace_time: the time (in seconds) how much this job's execution is allowed to - be late (``None`` means "allow the job to run no matter how late it is") - :var int max_instances: the maximum number of concurrently executing instances allowed for this - job - :var datetime.datetime next_run_time: the next scheduled run time of this job - - .. note:: - The ``misfire_grace_time`` has some non-obvious effects on job execution. See the - :ref:`missed-job-executions` section in the documentation for an in-depth explanation. - """ - - __slots__ = ('_scheduler', '_jobstore_alias', 'id', 'trigger', 'executor', 'func', 'func_ref', - 'args', 'kwargs', 'name', 'misfire_grace_time', 'coalesce', 'max_instances', - 'next_run_time', '__weakref__') - - def __init__(self, scheduler, id=None, **kwargs): - super(Job, self).__init__() - self._scheduler = scheduler - self._jobstore_alias = None - self._modify(id=id or uuid4().hex, **kwargs) - - def modify(self, **changes): - """ - Makes the given changes to this job and saves it in the associated job store. - - Accepted keyword arguments are the same as the variables on this class. - - .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.modify_job` - - :return Job: this job instance - - """ - self._scheduler.modify_job(self.id, self._jobstore_alias, **changes) - return self - - def reschedule(self, trigger, **trigger_args): - """ - Shortcut for switching the trigger on this job. - - .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.reschedule_job` - - :return Job: this job instance - - """ - self._scheduler.reschedule_job(self.id, self._jobstore_alias, trigger, **trigger_args) - return self - - def pause(self): - """ - Temporarily suspend the execution of this job. - - .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.pause_job` - - :return Job: this job instance - - """ - self._scheduler.pause_job(self.id, self._jobstore_alias) - return self - - def resume(self): - """ - Resume the schedule of this job if previously paused. - - .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.resume_job` - - :return Job: this job instance - - """ - self._scheduler.resume_job(self.id, self._jobstore_alias) - return self - - def remove(self): - """ - Unschedules this job and removes it from its associated job store. - - .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.remove_job` - - """ - self._scheduler.remove_job(self.id, self._jobstore_alias) - - @property - def pending(self): - """ - Returns ``True`` if the referenced job is still waiting to be added to its designated job - store. - - """ - return self._jobstore_alias is None - - # - # Private API - # - - def _get_run_times(self, now): - """ - Computes the scheduled run times between ``next_run_time`` and ``now`` (inclusive). - - :type now: datetime.datetime - :rtype: list[datetime.datetime] - - """ - run_times = [] - next_run_time = self.next_run_time - while next_run_time and next_run_time <= now: - run_times.append(next_run_time) - next_run_time = self.trigger.get_next_fire_time(next_run_time, now) - - return run_times - - def _modify(self, **changes): - """ - Validates the changes to the Job and makes the modifications if and only if all of them - validate. - - """ - approved = {} - - if 'id' in changes: - value = changes.pop('id') - if not isinstance(value, six.string_types): - raise TypeError("id must be a nonempty string") - if hasattr(self, 'id'): - raise ValueError('The job ID may not be changed') - approved['id'] = value - - if 'func' in changes or 'args' in changes or 'kwargs' in changes: - func = changes.pop('func') if 'func' in changes else self.func - args = changes.pop('args') if 'args' in changes else self.args - kwargs = changes.pop('kwargs') if 'kwargs' in changes else self.kwargs - - if isinstance(func, six.string_types): - func_ref = func - func = ref_to_obj(func) - elif callable(func): - try: - func_ref = obj_to_ref(func) - except ValueError: - # If this happens, this Job won't be serializable - func_ref = None - else: - raise TypeError('func must be a callable or a textual reference to one') - - if not hasattr(self, 'name') and changes.get('name', None) is None: - changes['name'] = get_callable_name(func) - - if isinstance(args, six.string_types) or not isinstance(args, Iterable): - raise TypeError('args must be a non-string iterable') - if isinstance(kwargs, six.string_types) or not isinstance(kwargs, Mapping): - raise TypeError('kwargs must be a dict-like object') - - check_callable_args(func, args, kwargs) - - approved['func'] = func - approved['func_ref'] = func_ref - approved['args'] = args - approved['kwargs'] = kwargs - - if 'name' in changes: - value = changes.pop('name') - if not value or not isinstance(value, six.string_types): - raise TypeError("name must be a nonempty string") - approved['name'] = value - - if 'misfire_grace_time' in changes: - value = changes.pop('misfire_grace_time') - if value is not None and (not isinstance(value, six.integer_types) or value <= 0): - raise TypeError('misfire_grace_time must be either None or a positive integer') - approved['misfire_grace_time'] = value - - if 'coalesce' in changes: - value = bool(changes.pop('coalesce')) - approved['coalesce'] = value - - if 'max_instances' in changes: - value = changes.pop('max_instances') - if not isinstance(value, six.integer_types) or value <= 0: - raise TypeError('max_instances must be a positive integer') - approved['max_instances'] = value - - if 'trigger' in changes: - trigger = changes.pop('trigger') - if not isinstance(trigger, BaseTrigger): - raise TypeError('Expected a trigger instance, got %s instead' % - trigger.__class__.__name__) - - approved['trigger'] = trigger - - if 'executor' in changes: - value = changes.pop('executor') - if not isinstance(value, six.string_types): - raise TypeError('executor must be a string') - approved['executor'] = value - - if 'next_run_time' in changes: - value = changes.pop('next_run_time') - approved['next_run_time'] = convert_to_datetime(value, self._scheduler.timezone, - 'next_run_time') - - if changes: - raise AttributeError('The following are not modifiable attributes of Job: %s' % - ', '.join(changes)) - - for key, value in six.iteritems(approved): - setattr(self, key, value) - - def __getstate__(self): - # Don't allow this Job to be serialized if the function reference could not be determined - if not self.func_ref: - raise ValueError( - 'This Job cannot be serialized since the reference to its callable (%r) could not ' - 'be determined. Consider giving a textual reference (module:function name) ' - 'instead.' % (self.func,)) - - # Instance methods cannot survive serialization as-is, so store the "self" argument - # explicitly - func = self.func - if ismethod(func) and not isclass(func.__self__) and obj_to_ref(func) == self.func_ref: - args = (func.__self__,) + tuple(self.args) - else: - args = self.args - - return { - 'version': 1, - 'id': self.id, - 'func': self.func_ref, - 'trigger': self.trigger, - 'executor': self.executor, - 'args': args, - 'kwargs': self.kwargs, - 'name': self.name, - 'misfire_grace_time': self.misfire_grace_time, - 'coalesce': self.coalesce, - 'max_instances': self.max_instances, - 'next_run_time': self.next_run_time - } - - def __setstate__(self, state): - if state.get('version', 1) > 1: - raise ValueError('Job has version %s, but only version 1 can be handled' % - state['version']) - - self.id = state['id'] - self.func_ref = state['func'] - self.func = ref_to_obj(self.func_ref) - self.trigger = state['trigger'] - self.executor = state['executor'] - self.args = state['args'] - self.kwargs = state['kwargs'] - self.name = state['name'] - self.misfire_grace_time = state['misfire_grace_time'] - self.coalesce = state['coalesce'] - self.max_instances = state['max_instances'] - self.next_run_time = state['next_run_time'] - - def __eq__(self, other): - if isinstance(other, Job): - return self.id == other.id - return NotImplemented - - def __repr__(self): - return '' % (repr_escape(self.id), repr_escape(self.name)) - - def __str__(self): - return repr_escape(self.__unicode__()) - - def __unicode__(self): - if hasattr(self, 'next_run_time'): - status = ('next run at: ' + datetime_repr(self.next_run_time) if - self.next_run_time else 'paused') - else: - status = 'pending' - - return u'%s (trigger: %s, %s)' % (self.name, self.trigger, status) diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__init__.py b/lib/python3.12/site-packages/apscheduler/jobstores/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bdff8e7359360d66617f70e24ee02e10d0aed3e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ9FO$x#=5QP(~AVR@wxUfOpir@vjLg-IyQrk|Lq(V;O89a+OaO(-AJ6BG?l@Dg- z%{LF`k){hq!sD`z^A+2_#wn2-3v9(tcZL(%#+dnl(9kJS4TTEAA~dS>PFM{dETBI_ zYe3lGHS|v5RiS82@dLYTvlY&GwYGVA$!q0AZe6KWHMA6Lpl}|LsFbERUdqgd=X~Em TydQ8z|2dV5=ACfPF(LN_v8p;1 diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/base.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 83513c5213cddfa7810f46a05d4368727fcd6105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6928 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 diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/memory.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index 12f42cb8a7c9c07c198b679dcc13567f32f60ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5479 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 diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/mongodb.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/mongodb.cpython-312.pyc deleted file mode 100644 index fb73d1aacb6ade52a97c4fd1be30c1cfc4d81153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8414 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 MIHb)rLtXs;0!n6$ZU6uP diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/redis.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/redis.cpython-312.pyc deleted file mode 100644 index 7285d7d20ea2ecd95df5daabda71782a15d63e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9749 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 tuH#_A@%4)U?pKH18C>}L>mv`qH1{{u}{4UX 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 Dik1YE diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/sqlalchemy.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/jobstores/__pycache__/sqlalchemy.cpython-312.pyc deleted file mode 100644 index 5a1fbc0b156ca18c3ab15ae4ee45d2945b0835cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11670 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 0: - paused_jobs = jobs[:i] - del jobs[:i] - jobs.extend(paused_jobs) - break - - @abstractmethod - def lookup_job(self, job_id): - """ - Returns a specific job, or ``None`` if it isn't found.. - - The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of - the returned job to point to the scheduler and itself, respectively. - - :param str|unicode job_id: identifier of the job - :rtype: Job - """ - - @abstractmethod - def get_due_jobs(self, now): - """ - Returns the list of jobs that have ``next_run_time`` earlier or equal to ``now``. - The returned jobs must be sorted by next run time (ascending). - - :param datetime.datetime now: the current (timezone aware) datetime - :rtype: list[Job] - """ - - @abstractmethod - def get_next_run_time(self): - """ - Returns the earliest run time of all the jobs stored in this job store, or ``None`` if - there are no active jobs. - - :rtype: datetime.datetime - """ - - @abstractmethod - def get_all_jobs(self): - """ - Returns a list of all jobs in this job store. - The returned jobs should be sorted by next run time (ascending). - Paused jobs (next_run_time == None) should be sorted last. - - The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of - the returned jobs to point to the scheduler and itself, respectively. - - :rtype: list[Job] - """ - - @abstractmethod - def add_job(self, job): - """ - Adds the given job to this store. - - :param Job job: the job to add - :raises ConflictingIdError: if there is another job in this store with the same ID - """ - - @abstractmethod - def update_job(self, job): - """ - Replaces the job in the store with the given newer version. - - :param Job job: the job to update - :raises JobLookupError: if the job does not exist - """ - - @abstractmethod - def remove_job(self, job_id): - """ - Removes the given job from this store. - - :param str|unicode job_id: identifier of the job - :raises JobLookupError: if the job does not exist - """ - - @abstractmethod - def remove_all_jobs(self): - """Removes all jobs from this store.""" - - def __repr__(self): - return '<%s>' % self.__class__.__name__ diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/memory.py b/lib/python3.12/site-packages/apscheduler/jobstores/memory.py deleted file mode 100644 index abfe7c6..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/memory.py +++ /dev/null @@ -1,108 +0,0 @@ -from __future__ import absolute_import - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import datetime_to_utc_timestamp - - -class MemoryJobStore(BaseJobStore): - """ - Stores jobs in an array in RAM. Provides no persistence support. - - Plugin alias: ``memory`` - """ - - def __init__(self): - super(MemoryJobStore, self).__init__() - # list of (job, timestamp), sorted by next_run_time and job id (ascending) - self._jobs = [] - self._jobs_index = {} # id -> (job, timestamp) lookup table - - def lookup_job(self, job_id): - return self._jobs_index.get(job_id, (None, None))[0] - - def get_due_jobs(self, now): - now_timestamp = datetime_to_utc_timestamp(now) - pending = [] - for job, timestamp in self._jobs: - if timestamp is None or timestamp > now_timestamp: - break - pending.append(job) - - return pending - - def get_next_run_time(self): - return self._jobs[0][0].next_run_time if self._jobs else None - - def get_all_jobs(self): - return [j[0] for j in self._jobs] - - def add_job(self, job): - if job.id in self._jobs_index: - raise ConflictingIdError(job.id) - - timestamp = datetime_to_utc_timestamp(job.next_run_time) - index = self._get_job_index(timestamp, job.id) - self._jobs.insert(index, (job, timestamp)) - self._jobs_index[job.id] = (job, timestamp) - - def update_job(self, job): - old_job, old_timestamp = self._jobs_index.get(job.id, (None, None)) - if old_job is None: - raise JobLookupError(job.id) - - # If the next run time has not changed, simply replace the job in its present index. - # Otherwise, reinsert the job to the list to preserve the ordering. - old_index = self._get_job_index(old_timestamp, old_job.id) - new_timestamp = datetime_to_utc_timestamp(job.next_run_time) - if old_timestamp == new_timestamp: - self._jobs[old_index] = (job, new_timestamp) - else: - del self._jobs[old_index] - new_index = self._get_job_index(new_timestamp, job.id) - self._jobs.insert(new_index, (job, new_timestamp)) - - self._jobs_index[old_job.id] = (job, new_timestamp) - - def remove_job(self, job_id): - job, timestamp = self._jobs_index.get(job_id, (None, None)) - if job is None: - raise JobLookupError(job_id) - - index = self._get_job_index(timestamp, job_id) - del self._jobs[index] - del self._jobs_index[job.id] - - def remove_all_jobs(self): - self._jobs = [] - self._jobs_index = {} - - def shutdown(self): - self.remove_all_jobs() - - def _get_job_index(self, timestamp, job_id): - """ - Returns the index of the given job, or if it's not found, the index where the job should be - inserted based on the given timestamp. - - :type timestamp: int - :type job_id: str - - """ - lo, hi = 0, len(self._jobs) - timestamp = float('inf') if timestamp is None else timestamp - while lo < hi: - mid = (lo + hi) // 2 - mid_job, mid_timestamp = self._jobs[mid] - mid_timestamp = float('inf') if mid_timestamp is None else mid_timestamp - if mid_timestamp > timestamp: - hi = mid - elif mid_timestamp < timestamp: - lo = mid + 1 - elif mid_job.id > job_id: - hi = mid - elif mid_job.id < job_id: - lo = mid + 1 - else: - return mid - - return lo diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/mongodb.py b/lib/python3.12/site-packages/apscheduler/jobstores/mongodb.py deleted file mode 100644 index 5a00f94..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/mongodb.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import absolute_import -import warnings - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime -from apscheduler.job import Job - -try: - import cPickle as pickle -except ImportError: # pragma: nocover - import pickle - -try: - from bson.binary import Binary - from pymongo.errors import DuplicateKeyError - from pymongo import MongoClient, ASCENDING -except ImportError: # pragma: nocover - raise ImportError('MongoDBJobStore requires PyMongo installed') - - -class MongoDBJobStore(BaseJobStore): - """ - Stores jobs in a MongoDB database. Any leftover keyword arguments are directly passed to - pymongo's `MongoClient - `_. - - Plugin alias: ``mongodb`` - - :param str database: database to store jobs in - :param str collection: collection to store jobs in - :param client: a :class:`~pymongo.mongo_client.MongoClient` instance to use instead of - providing connection arguments - :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the - highest available - """ - - def __init__(self, database='apscheduler', collection='jobs', client=None, - pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): - super(MongoDBJobStore, self).__init__() - self.pickle_protocol = pickle_protocol - - if not database: - raise ValueError('The "database" parameter must not be empty') - if not collection: - raise ValueError('The "collection" parameter must not be empty') - - if client: - self.client = maybe_ref(client) - else: - connect_args.setdefault('w', 1) - self.client = MongoClient(**connect_args) - - self.collection = self.client[database][collection] - - def start(self, scheduler, alias): - super(MongoDBJobStore, self).start(scheduler, alias) - self.collection.create_index('next_run_time', sparse=True) - - @property - def connection(self): - warnings.warn('The "connection" member is deprecated -- use "client" instead', - DeprecationWarning) - return self.client - - def lookup_job(self, job_id): - document = self.collection.find_one(job_id, ['job_state']) - return self._reconstitute_job(document['job_state']) if document else None - - def get_due_jobs(self, now): - timestamp = datetime_to_utc_timestamp(now) - return self._get_jobs({'next_run_time': {'$lte': timestamp}}) - - def get_next_run_time(self): - document = self.collection.find_one({'next_run_time': {'$ne': None}}, - projection=['next_run_time'], - sort=[('next_run_time', ASCENDING)]) - return utc_timestamp_to_datetime(document['next_run_time']) if document else None - - def get_all_jobs(self): - jobs = self._get_jobs({}) - self._fix_paused_jobs_sorting(jobs) - return jobs - - def add_job(self, job): - try: - self.collection.insert_one({ - '_id': job.id, - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) - }) - except DuplicateKeyError: - raise ConflictingIdError(job.id) - - def update_job(self, job): - changes = { - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) - } - result = self.collection.update_one({'_id': job.id}, {'$set': changes}) - if result and result.matched_count == 0: - raise JobLookupError(job.id) - - def remove_job(self, job_id): - result = self.collection.delete_one({'_id': job_id}) - if result and result.deleted_count == 0: - raise JobLookupError(job_id) - - def remove_all_jobs(self): - self.collection.delete_many({}) - - def shutdown(self): - self.client.close() - - def _reconstitute_job(self, job_state): - job_state = pickle.loads(job_state) - job = Job.__new__(Job) - job.__setstate__(job_state) - job._scheduler = self._scheduler - job._jobstore_alias = self._alias - return job - - def _get_jobs(self, conditions): - jobs = [] - failed_job_ids = [] - for document in self.collection.find(conditions, ['_id', 'job_state'], - sort=[('next_run_time', ASCENDING)]): - try: - jobs.append(self._reconstitute_job(document['job_state'])) - except BaseException: - self._logger.exception('Unable to restore job "%s" -- removing it', - document['_id']) - failed_job_ids.append(document['_id']) - - # Remove all the jobs we failed to restore - if failed_job_ids: - self.collection.delete_many({'_id': {'$in': failed_job_ids}}) - - return jobs - - def __repr__(self): - return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/redis.py b/lib/python3.12/site-packages/apscheduler/jobstores/redis.py deleted file mode 100644 index 5bb69d6..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/redis.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import absolute_import -from datetime import datetime - -from pytz import utc -import six - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import datetime_to_utc_timestamp, utc_timestamp_to_datetime -from apscheduler.job import Job - -try: - import cPickle as pickle -except ImportError: # pragma: nocover - import pickle - -try: - from redis import Redis -except ImportError: # pragma: nocover - raise ImportError('RedisJobStore requires redis installed') - - -class RedisJobStore(BaseJobStore): - """ - Stores jobs in a Redis database. Any leftover keyword arguments are directly passed to redis's - :class:`~redis.StrictRedis`. - - Plugin alias: ``redis`` - - :param int db: the database number to store jobs in - :param str jobs_key: key to store jobs in - :param str run_times_key: key to store the jobs' run times in - :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the - highest available - """ - - def __init__(self, db=0, jobs_key='apscheduler.jobs', run_times_key='apscheduler.run_times', - pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): - super(RedisJobStore, self).__init__() - - if db is None: - raise ValueError('The "db" parameter must not be empty') - if not jobs_key: - raise ValueError('The "jobs_key" parameter must not be empty') - if not run_times_key: - raise ValueError('The "run_times_key" parameter must not be empty') - - self.pickle_protocol = pickle_protocol - self.jobs_key = jobs_key - self.run_times_key = run_times_key - self.redis = Redis(db=int(db), **connect_args) - - def lookup_job(self, job_id): - job_state = self.redis.hget(self.jobs_key, job_id) - return self._reconstitute_job(job_state) if job_state else None - - def get_due_jobs(self, now): - timestamp = datetime_to_utc_timestamp(now) - job_ids = self.redis.zrangebyscore(self.run_times_key, 0, timestamp) - if job_ids: - job_states = self.redis.hmget(self.jobs_key, *job_ids) - return self._reconstitute_jobs(six.moves.zip(job_ids, job_states)) - return [] - - def get_next_run_time(self): - next_run_time = self.redis.zrange(self.run_times_key, 0, 0, withscores=True) - if next_run_time: - return utc_timestamp_to_datetime(next_run_time[0][1]) - - def get_all_jobs(self): - job_states = self.redis.hgetall(self.jobs_key) - jobs = self._reconstitute_jobs(six.iteritems(job_states)) - paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) - return sorted(jobs, key=lambda job: job.next_run_time or paused_sort_key) - - def add_job(self, job): - if self.redis.hexists(self.jobs_key, job.id): - raise ConflictingIdError(job.id) - - with self.redis.pipeline() as pipe: - pipe.multi() - pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), - self.pickle_protocol)) - if job.next_run_time: - pipe.zadd(self.run_times_key, - {job.id: datetime_to_utc_timestamp(job.next_run_time)}) - - pipe.execute() - - def update_job(self, job): - if not self.redis.hexists(self.jobs_key, job.id): - raise JobLookupError(job.id) - - with self.redis.pipeline() as pipe: - pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), - self.pickle_protocol)) - if job.next_run_time: - pipe.zadd(self.run_times_key, - {job.id: datetime_to_utc_timestamp(job.next_run_time)}) - else: - pipe.zrem(self.run_times_key, job.id) - - pipe.execute() - - def remove_job(self, job_id): - if not self.redis.hexists(self.jobs_key, job_id): - raise JobLookupError(job_id) - - with self.redis.pipeline() as pipe: - pipe.hdel(self.jobs_key, job_id) - pipe.zrem(self.run_times_key, job_id) - pipe.execute() - - def remove_all_jobs(self): - with self.redis.pipeline() as pipe: - pipe.delete(self.jobs_key) - pipe.delete(self.run_times_key) - pipe.execute() - - def shutdown(self): - self.redis.connection_pool.disconnect() - - def _reconstitute_job(self, job_state): - job_state = pickle.loads(job_state) - job = Job.__new__(Job) - job.__setstate__(job_state) - job._scheduler = self._scheduler - job._jobstore_alias = self._alias - return job - - def _reconstitute_jobs(self, job_states): - jobs = [] - failed_job_ids = [] - for job_id, job_state in job_states: - try: - jobs.append(self._reconstitute_job(job_state)) - except BaseException: - self._logger.exception('Unable to restore job "%s" -- removing it', job_id) - failed_job_ids.append(job_id) - - # Remove all the jobs we failed to restore - if failed_job_ids: - with self.redis.pipeline() as pipe: - pipe.hdel(self.jobs_key, *failed_job_ids) - pipe.zrem(self.run_times_key, *failed_job_ids) - pipe.execute() - - return jobs - - def __repr__(self): - return '<%s>' % self.__class__.__name__ diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/rethinkdb.py b/lib/python3.12/site-packages/apscheduler/jobstores/rethinkdb.py deleted file mode 100644 index d8a78cd..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/rethinkdb.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import absolute_import - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime -from apscheduler.job import Job - -try: - import cPickle as pickle -except ImportError: # pragma: nocover - import pickle - -try: - from rethinkdb import RethinkDB -except ImportError: # pragma: nocover - raise ImportError('RethinkDBJobStore requires rethinkdb installed') - - -class RethinkDBJobStore(BaseJobStore): - """ - Stores jobs in a RethinkDB database. Any leftover keyword arguments are directly passed to - rethinkdb's `RethinkdbClient `_. - - Plugin alias: ``rethinkdb`` - - :param str database: database to store jobs in - :param str collection: collection to store jobs in - :param client: a :class:`rethinkdb.net.Connection` instance to use instead of providing - connection arguments - :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the - highest available - """ - - def __init__(self, database='apscheduler', table='jobs', client=None, - pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): - super(RethinkDBJobStore, self).__init__() - - if not database: - raise ValueError('The "database" parameter must not be empty') - if not table: - raise ValueError('The "table" parameter must not be empty') - - self.database = database - self.table_name = table - self.table = None - self.client = client - self.pickle_protocol = pickle_protocol - self.connect_args = connect_args - self.r = RethinkDB() - self.conn = None - - def start(self, scheduler, alias): - super(RethinkDBJobStore, self).start(scheduler, alias) - - if self.client: - self.conn = maybe_ref(self.client) - else: - self.conn = self.r.connect(db=self.database, **self.connect_args) - - if self.database not in self.r.db_list().run(self.conn): - self.r.db_create(self.database).run(self.conn) - - if self.table_name not in self.r.table_list().run(self.conn): - self.r.table_create(self.table_name).run(self.conn) - - if 'next_run_time' not in self.r.table(self.table_name).index_list().run(self.conn): - self.r.table(self.table_name).index_create('next_run_time').run(self.conn) - - self.table = self.r.db(self.database).table(self.table_name) - - def lookup_job(self, job_id): - results = list(self.table.get_all(job_id).pluck('job_state').run(self.conn)) - return self._reconstitute_job(results[0]['job_state']) if results else None - - def get_due_jobs(self, now): - return self._get_jobs(self.r.row['next_run_time'] <= datetime_to_utc_timestamp(now)) - - def get_next_run_time(self): - results = list( - self.table - .filter(self.r.row['next_run_time'] != None) # noqa - .order_by(self.r.asc('next_run_time')) - .map(lambda x: x['next_run_time']) - .limit(1) - .run(self.conn) - ) - return utc_timestamp_to_datetime(results[0]) if results else None - - def get_all_jobs(self): - jobs = self._get_jobs() - self._fix_paused_jobs_sorting(jobs) - return jobs - - def add_job(self, job): - job_dict = { - 'id': job.id, - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) - } - results = self.table.insert(job_dict).run(self.conn) - if results['errors'] > 0: - raise ConflictingIdError(job.id) - - def update_job(self, job): - changes = { - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) - } - results = self.table.get_all(job.id).update(changes).run(self.conn) - skipped = False in map(lambda x: results[x] == 0, results.keys()) - if results['skipped'] > 0 or results['errors'] > 0 or not skipped: - raise JobLookupError(job.id) - - def remove_job(self, job_id): - results = self.table.get_all(job_id).delete().run(self.conn) - if results['deleted'] + results['skipped'] != 1: - raise JobLookupError(job_id) - - def remove_all_jobs(self): - self.table.delete().run(self.conn) - - def shutdown(self): - self.conn.close() - - def _reconstitute_job(self, job_state): - job_state = pickle.loads(job_state) - job = Job.__new__(Job) - job.__setstate__(job_state) - job._scheduler = self._scheduler - job._jobstore_alias = self._alias - return job - - def _get_jobs(self, predicate=None): - jobs = [] - failed_job_ids = [] - query = (self.table.filter(self.r.row['next_run_time'] != None).filter(predicate) # noqa - if predicate else self.table) - query = query.order_by('next_run_time', 'id').pluck('id', 'job_state') - - for document in query.run(self.conn): - try: - jobs.append(self._reconstitute_job(document['job_state'])) - except Exception: - self._logger.exception('Unable to restore job "%s" -- removing it', document['id']) - failed_job_ids.append(document['id']) - - # Remove all the jobs we failed to restore - if failed_job_ids: - self.r.expr(failed_job_ids).for_each( - lambda job_id: self.table.get_all(job_id).delete()).run(self.conn) - - return jobs - - def __repr__(self): - connection = self.conn - return '<%s (connection=%s)>' % (self.__class__.__name__, connection) diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.py b/lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.py deleted file mode 100644 index 716549b..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/sqlalchemy.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import absolute_import - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime -from apscheduler.job import Job - -try: - import cPickle as pickle -except ImportError: # pragma: nocover - import pickle - -try: - from sqlalchemy import ( - create_engine, Table, Column, MetaData, Unicode, Float, LargeBinary, select, and_) - from sqlalchemy.exc import IntegrityError - from sqlalchemy.sql.expression import null -except ImportError: # pragma: nocover - raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed') - - -class SQLAlchemyJobStore(BaseJobStore): - """ - Stores jobs in a database table using SQLAlchemy. - The table will be created if it doesn't exist in the database. - - Plugin alias: ``sqlalchemy`` - - :param str url: connection string (see - :ref:`SQLAlchemy documentation ` on this) - :param engine: an SQLAlchemy :class:`~sqlalchemy.engine.Engine` to use instead of creating a - new one based on ``url`` - :param str tablename: name of the table to store jobs in - :param metadata: a :class:`~sqlalchemy.schema.MetaData` instance to use instead of creating a - new one - :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the - highest available - :param str tableschema: name of the (existing) schema in the target database where the table - should be - :param dict engine_options: keyword arguments to :func:`~sqlalchemy.create_engine` - (ignored if ``engine`` is given) - """ - - def __init__(self, url=None, engine=None, tablename='apscheduler_jobs', metadata=None, - pickle_protocol=pickle.HIGHEST_PROTOCOL, tableschema=None, engine_options=None): - super(SQLAlchemyJobStore, self).__init__() - self.pickle_protocol = pickle_protocol - metadata = maybe_ref(metadata) or MetaData() - - if engine: - self.engine = maybe_ref(engine) - elif url: - self.engine = create_engine(url, **(engine_options or {})) - else: - raise ValueError('Need either "engine" or "url" defined') - - # 191 = max key length in MySQL for InnoDB/utf8mb4 tables, - # 25 = precision that translates to an 8-byte float - self.jobs_t = Table( - tablename, metadata, - Column('id', Unicode(191), primary_key=True), - Column('next_run_time', Float(25), index=True), - Column('job_state', LargeBinary, nullable=False), - schema=tableschema - ) - - def start(self, scheduler, alias): - super(SQLAlchemyJobStore, self).start(scheduler, alias) - self.jobs_t.create(self.engine, True) - - def lookup_job(self, job_id): - selectable = select(self.jobs_t.c.job_state).where(self.jobs_t.c.id == job_id) - with self.engine.begin() as connection: - job_state = connection.execute(selectable).scalar() - return self._reconstitute_job(job_state) if job_state else None - - def get_due_jobs(self, now): - timestamp = datetime_to_utc_timestamp(now) - return self._get_jobs(self.jobs_t.c.next_run_time <= timestamp) - - def get_next_run_time(self): - selectable = select(self.jobs_t.c.next_run_time).\ - where(self.jobs_t.c.next_run_time != null()).\ - order_by(self.jobs_t.c.next_run_time).limit(1) - with self.engine.begin() as connection: - next_run_time = connection.execute(selectable).scalar() - return utc_timestamp_to_datetime(next_run_time) - - def get_all_jobs(self): - jobs = self._get_jobs() - self._fix_paused_jobs_sorting(jobs) - return jobs - - def add_job(self, job): - insert = self.jobs_t.insert().values(**{ - 'id': job.id, - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) - }) - with self.engine.begin() as connection: - try: - connection.execute(insert) - except IntegrityError: - raise ConflictingIdError(job.id) - - def update_job(self, job): - update = self.jobs_t.update().values(**{ - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) - }).where(self.jobs_t.c.id == job.id) - with self.engine.begin() as connection: - result = connection.execute(update) - if result.rowcount == 0: - raise JobLookupError(job.id) - - def remove_job(self, job_id): - delete = self.jobs_t.delete().where(self.jobs_t.c.id == job_id) - with self.engine.begin() as connection: - result = connection.execute(delete) - if result.rowcount == 0: - raise JobLookupError(job_id) - - def remove_all_jobs(self): - delete = self.jobs_t.delete() - with self.engine.begin() as connection: - connection.execute(delete) - - def shutdown(self): - self.engine.dispose() - - def _reconstitute_job(self, job_state): - job_state = pickle.loads(job_state) - job_state['jobstore'] = self - job = Job.__new__(Job) - job.__setstate__(job_state) - job._scheduler = self._scheduler - job._jobstore_alias = self._alias - return job - - def _get_jobs(self, *conditions): - jobs = [] - selectable = select(self.jobs_t.c.id, self.jobs_t.c.job_state).\ - order_by(self.jobs_t.c.next_run_time) - selectable = selectable.where(and_(*conditions)) if conditions else selectable - failed_job_ids = set() - with self.engine.begin() as connection: - for row in connection.execute(selectable): - try: - jobs.append(self._reconstitute_job(row.job_state)) - except BaseException: - self._logger.exception('Unable to restore job "%s" -- removing it', row.id) - failed_job_ids.add(row.id) - - # Remove all the jobs we failed to restore - if failed_job_ids: - delete = self.jobs_t.delete().where(self.jobs_t.c.id.in_(failed_job_ids)) - connection.execute(delete) - - return jobs - - def __repr__(self): - return '<%s (url=%s)>' % (self.__class__.__name__, self.engine.url) diff --git a/lib/python3.12/site-packages/apscheduler/jobstores/zookeeper.py b/lib/python3.12/site-packages/apscheduler/jobstores/zookeeper.py deleted file mode 100644 index 5253069..0000000 --- a/lib/python3.12/site-packages/apscheduler/jobstores/zookeeper.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import - -from datetime import datetime - -from pytz import utc -from kazoo.exceptions import NoNodeError, NodeExistsError - -from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError -from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime -from apscheduler.job import Job - -try: - import cPickle as pickle -except ImportError: # pragma: nocover - import pickle - -try: - from kazoo.client import KazooClient -except ImportError: # pragma: nocover - raise ImportError('ZooKeeperJobStore requires Kazoo installed') - - -class ZooKeeperJobStore(BaseJobStore): - """ - Stores jobs in a ZooKeeper tree. Any leftover keyword arguments are directly passed to - kazoo's `KazooClient - `_. - - Plugin alias: ``zookeeper`` - - :param str path: path to store jobs in - :param client: a :class:`~kazoo.client.KazooClient` instance to use instead of - providing connection arguments - :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the - highest available - """ - - def __init__(self, path='/apscheduler', client=None, close_connection_on_exit=False, - pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): - super(ZooKeeperJobStore, self).__init__() - self.pickle_protocol = pickle_protocol - self.close_connection_on_exit = close_connection_on_exit - - if not path: - raise ValueError('The "path" parameter must not be empty') - - self.path = path - - if client: - self.client = maybe_ref(client) - else: - self.client = KazooClient(**connect_args) - self._ensured_path = False - - def _ensure_paths(self): - if not self._ensured_path: - self.client.ensure_path(self.path) - self._ensured_path = True - - def start(self, scheduler, alias): - super(ZooKeeperJobStore, self).start(scheduler, alias) - if not self.client.connected: - self.client.start() - - def lookup_job(self, job_id): - self._ensure_paths() - node_path = self.path + "/" + str(job_id) - try: - content, _ = self.client.get(node_path) - doc = pickle.loads(content) - job = self._reconstitute_job(doc['job_state']) - return job - except BaseException: - return None - - def get_due_jobs(self, now): - timestamp = datetime_to_utc_timestamp(now) - jobs = [job_def['job'] for job_def in self._get_jobs() - if job_def['next_run_time'] is not None and job_def['next_run_time'] <= timestamp] - return jobs - - def get_next_run_time(self): - next_runs = [job_def['next_run_time'] for job_def in self._get_jobs() - if job_def['next_run_time'] is not None] - return utc_timestamp_to_datetime(min(next_runs)) if len(next_runs) > 0 else None - - def get_all_jobs(self): - jobs = [job_def['job'] for job_def in self._get_jobs()] - self._fix_paused_jobs_sorting(jobs) - return jobs - - def add_job(self, job): - self._ensure_paths() - node_path = self.path + "/" + str(job.id) - value = { - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': job.__getstate__() - } - data = pickle.dumps(value, self.pickle_protocol) - try: - self.client.create(node_path, value=data) - except NodeExistsError: - raise ConflictingIdError(job.id) - - def update_job(self, job): - self._ensure_paths() - node_path = self.path + "/" + str(job.id) - changes = { - 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), - 'job_state': job.__getstate__() - } - data = pickle.dumps(changes, self.pickle_protocol) - try: - self.client.set(node_path, value=data) - except NoNodeError: - raise JobLookupError(job.id) - - def remove_job(self, job_id): - self._ensure_paths() - node_path = self.path + "/" + str(job_id) - try: - self.client.delete(node_path) - except NoNodeError: - raise JobLookupError(job_id) - - def remove_all_jobs(self): - try: - self.client.delete(self.path, recursive=True) - except NoNodeError: - pass - self._ensured_path = False - - def shutdown(self): - if self.close_connection_on_exit: - self.client.stop() - self.client.close() - - def _reconstitute_job(self, job_state): - job_state = job_state - job = Job.__new__(Job) - job.__setstate__(job_state) - job._scheduler = self._scheduler - job._jobstore_alias = self._alias - return job - - def _get_jobs(self): - self._ensure_paths() - jobs = [] - failed_job_ids = [] - all_ids = self.client.get_children(self.path) - for node_name in all_ids: - try: - node_path = self.path + "/" + node_name - content, _ = self.client.get(node_path) - doc = pickle.loads(content) - job_def = { - 'job_id': node_name, - 'next_run_time': doc['next_run_time'] if doc['next_run_time'] else None, - 'job_state': doc['job_state'], - 'job': self._reconstitute_job(doc['job_state']), - 'creation_time': _.ctime - } - jobs.append(job_def) - except BaseException: - self._logger.exception('Unable to restore job "%s" -- removing it' % node_name) - failed_job_ids.append(node_name) - - # Remove all the jobs we failed to restore - if failed_job_ids: - for failed_id in failed_job_ids: - self.remove_job(failed_id) - paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) - return sorted(jobs, key=lambda job_def: (job_def['job'].next_run_time or paused_sort_key, - job_def['creation_time'])) - - def __repr__(self): - self._logger.exception('<%s (client=%s)>' % (self.__class__.__name__, self.client)) - return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__init__.py b/lib/python3.12/site-packages/apscheduler/schedulers/__init__.py deleted file mode 100644 index bd8a790..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -class SchedulerAlreadyRunningError(Exception): - """Raised when attempting to start or configure the scheduler when it's already running.""" - - def __str__(self): - return 'Scheduler is already running' - - -class SchedulerNotRunningError(Exception): - """Raised when attempting to shutdown the scheduler when it's not running.""" - - def __str__(self): - return 'Scheduler is not running' diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 135707038597d947c1757086bd9228426c8aa2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmbVL&2H2%5Vn&nYzyT_LWl!MJ|Lm3)P$cC5<=>s>TM;8xa`GBWA7%AwNu-nWKSIW z43s0+6_3ITK(4$1QkDxRJn?4Rf?5fDuqQMA#xvhH`LeOGj_gv~Hzpr2Lf_$|TfL>x zJha9!^3X0~=m;^)(P!VqM!5BQ*6W}0dQ~v!C0!mkZSHn8x9xF^I2vJwMjpc>pIP)M zsQf`t-+h^+oRv9O+qvQ~tM*DEGBMdvN~+nby*SgHk;9Y=5*x#(g|R_mB+({ThDb#c zDaP5PRGgTU6WyhAn9MxTBzBpJa;d|lD{WaJg4UX#EwjP{Z#X-tie!J`=V*@WK=XX8 zArbjiM5&zeh?V=iiV7uP^Tg<=NTrd5RAwymOh!dzQYkc7Z@G%{Y=7x^5CEu0 zB2M1K6RxAUSTzx?EFDpriOf(M7FB(jQf(Bav-=m(7cOr>XBwn^kG@{tYOH~V^IqMj zRK!zGX}wPARDuZBzDnsq8RyH0eTd0~QnhA53UVlz9@U2pXlpm1L4*GYeG6z4;9lsi z!HxeIiaV>WhSHoFh}{bYA}tM*hvM8Z5Yqg^2%OXaBXA1qShxf&xAHqKfS(yTukKEX zD}d^h7_=M>6*&K-_9pmX1EN>dz5r@B9kmb~4*Ys;=Uu|>Um=ClqeY$-s_s8?@;+C$ iEUH!Oo;7~>7~_Q(;PBJa1+vHDT7Wk{RzI!nUil60(iNcq diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/asyncio.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/asyncio.cpython-312.pyc deleted file mode 100644 index b864c33a113ea6b53e77ff46b623c62c76e34a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3798 zcmb_fO>7&-6`oyk$t6XJvh13cB`fRLNz7U$<60(KBMzecxUEskXk)YhU0}K54kgM< z?sjG=SptoysDR2rQm2Qa>8Wl|pfZF4Iri9|0;CtSvLJQqpaq&9dQ&W?2zu&!vp=Rn zrAUAd$eG#Mw{P}+^Sz(_Q-6P&Kx31GGw&w}`3GKvO$jEuKY+w;%=7|+jPRryQ#7wRbQ>DrEn6JIuwh*?WGj}R4d&&Yc9PT9@gSmCX0;&EN4NhOJ&Qh~wQ3eaChOszJ zbw+Dd$yY0S+yei*1?YYPCb-evTVy?$uacT%N-OHRc!ZFfQd@eJ_~ZRs89cZoV_%fFF+D&35=$($T$>>B1mOuN?FvG7$SvPkYqQ~4M}F)yvt zdD?U>+jhJ|Rl~A$Zre@Won_Q8xlyBe#fx)l)x5aDX1JHQz97aV0_ITDi`QDsDo0%! zwB`TU#aX*Si)L$@E*2eT&(W&Oi_Wa=+6Z>dw(54#S#)RZCZ}wkvZ7U=4i?T9&V04V z>n{C@V^psjGn5zMRKhbTMl)FEi_L1?E;x%`@Fr~ON!DuW^`>u-jusW3vuv=5KVR_Q zmLU)MY3M##CLazBzkTvf{N7OMj{E1K(%O7ysI;2gRx`J=x3XL6ct;&y`~IeSZWqLX zHY|>V%nrc74noHf`ijPeVDJv~?9ILe>nW7epo9G$DCyOSA79&*Wu>$mBZ&h$INM2( z%)#X;b_j&3@Q)g9hi$hB9rB8jvSbo)2dNx0<#HVUikTM7imjx|37Rzf#8rGH74odC ziWOx=EvJ0NedNMXQ^h=n$facjozTumTNPu z3eSToZO)$N+B7(yiAtM>Tc4*|)n<0ftv4yxPE{&m8`My#&}_%81Fz2e zYZvx3ZO_#gy%6tRsR&a9w<;Aaz^KbU&9$`_r`oB&I*to2SUY3c(}vY0nHLK8zQzCH z4X3Kz0U?S_^S~htC=f7^Q=e*l*hNXv=0e_u3owQ}X%jtKbra##Rl`}EyqP1UEv*Mp z4?~S`xqO24fsmIB_~8xAP`ArZJ%zU%${0LNVD3T?hWONvR|&@eKus^D>s8C(T-Q0i zD?}RMcx)6dmJSCe5wW!(bR36!{L9dR_ibkn-hS=%*B*>LwKX=;8JpM`E3Ll##+47% z{`&)Ccj6uO^xDNu^{nrQ`(pTQP$YsfjDB+?Ij|fI?6w?`hE(_I79#l=nK&B(A>VS9 z&$e9CUTAuKI)`wnyY&X7o&bsXf>C$b7)b9$K!cT~;a&s+UC-bHm{l<3Mb;M9-23VT z1iLNuNJl-gsUGdM98Var-nF3Hn~vJjT*Mf-88j2((|UkO$N}I?gwp5b4CF;G{n*oh zJqV>2b8JWOs0*^RUbUOG`b>+_5T}H{vJX;EgO;U{9;6b>){=wnj^x(bBu^ zKU{t9+8?iNjDBbJ@QeQUyf0(DH7=Jo4Pxm78ITg=7`OIs$K z1CJn}0>j9ce10k4WBF%^z5pBW0qB;=2kPWsvSS-r?VhR$d-Kx8ymU36 z1s~L#MuX})l;nED#;*>TXLS9CEyD`#Bz4`itGez-LFA~&f1=c68eU?E^N&k-JRT7% zK?f)5=TG3XrRzXxkw}ozFZhWRbFWB4Sm1K>uuoRVM{-(GcaD&u!^@W-gD!vb<9J+| z*vXJY?h#b4BUs1gu#O#hq{_2V<_{B!bnwyO8R__2H$NsY H2sQr&O$1&a diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/background.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/background.cpython-312.pyc deleted file mode 100644 index 41dffa51bd7e62e50195cdaaff68d016d45ff6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2695 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 E4Pg(1Pyhe` diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/blocking.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/blocking.cpython-312.pyc deleted file mode 100644 index 311c8106fa929bce1bceeb04cb9751386a8859df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2246 zcma)7-ESL35Z|?Z_BruKS_*0HgqVP!M;n`u@}ZViq)I?2BrS@O;Doff+^u6fXP?cw+X>cHE>?8R>TCc4y~i zf4`ZzALH>31i}WprhX10^ox9HiqcTF$3VG+EM#FDRj`h+)B|>)64Zm99<)OhMOP|e zJ?y=Q>_|n`Rg41YO=KyH$O=tKbRjT;bd#3c)l*X6P_8D0D z3}UB9#}?897S@ASKo2dU0=9ySs;*cOPY*3d^{|Xok62+C)g|;1)}!M{Q{4k+ZO5E0 zRi|2^%*}UXKn63s8C*sb4Uu8>D$kUv@Io^MhtVnK)T@?fd-P<5isH$MPmEgYP`0J< z>?B+@d*6MtTo_DDWM)dXotcy&Xj#wIn2DPgg;}zcglGE)7{0`p&^#)Gwp%_;J$Sv` z#H#JUYC~s9(aZtVT$@LvWho*}Rj5sE9)128Li4zU<^$j2FCbUoyYc4k&fN5e(JZ=( z$FztWCRFn7hD)4qDp&}NU4_?cl(DFKT=$;b@oDXXO+Ey}y#=({ znOr%weCm4V<5!;g?$|fSHu_Jj^`BVpfB9Cb@2h8)hAxi$s>at7eOC^xsmH&!uB)f7 z6>g}fH`UlmayfZZJ+cjckQtC;LnNv4*`9zwCWV067tyis0ugjcIL7~ zf0wk=$G{8H6qbO=XG-P8y0Dy?DvQCI8w5JFAUh!S(2P+M>=3A21_;!!M`31%VVFxj z0Ii0nZh7Jf7yz(aEjV)5LhI^F5{b^`&ITF`@(@Rf}^8Qzqk+C9`*~XD?Yhm6-+${tgVlR(JnWY%_6i zrMz7Jdh|v@+l+Osj4Y3A#Cq0ZJ(oXNk3HL3>0OKUuE+W|(|sH1fwlC&PwCv!+glNo ze8fL}GokIJS4QR~`>UY*U;leppOZbv2P@!Xa|9e|*h7KK;_$EShG&dvTCdF=-g|R@ zryp#&1P6+GZ%%4BuXVU8AyuP734umNDvtcMfgU5|!@6NNb|QpWj!B3gjcg=deK6^o z$sz#8{1#_Y+a?5J^(son`npe%tXZ!ZrNW%5w{^kY|1u{39A3J)UF~Ld zQL?>^^geSH`Ja?6z*S%K;W)#N!>hat?}cG2h%vs6p8gG`e@8>N(a}5M6i!`^-$gKa G$NvN4pX#~* diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/gevent.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/gevent.cpython-312.pyc deleted file mode 100644 index bcaa1f5dfb0d0a3864262b4b694047277cc9f4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmaJ?L2nyH6rSX*ho%!ay zZ{Ggg-JK!uh|!*MN+skEoWzgTR<0jfBPp8SBbytTMylYGzr_a`EhBP;fsT2h4_qiD%K+B(vGaEjWuy2s@`@FGS{IeQ%s3H|d0_3j`A+ zS(ti(7y}K`FZ>`Gl>?@Ad!ZI&SkJ`ZHclaxu?E(XC9i4X+noJ6V(! zpP#7Pr8&FIWznwhR;swG$zlYwP+t^y&ZWM66)uG5IS4K}3Sybu?;rf4ysBRAy07>B zst?}Q2d}-?(obH0{$ zWoMe=15QRq6G&c@hTtV$AtMACWLZgY8=4Syo~5DvXgj?};Vp@&1i<;;PZw5m{{v?T z;-K47=&;ajKc?6bn{*G9sZ0pO4h=3BZF=?sFExBmn2BJhgO&x}w#z~}x>5$dmWaxL zy2N#i_IVD+h#fv{H(Z~^uP?pyw6pDxJcer`@0ZD@{?5Jpk&XOtOCJsoYi0tSv6@}w zjKKwFRS(-V=vl_jH*B}4x7B08Jo0 zg5l1T?%njlRQrn~kh{U))1u%L6t%K!RD?oQim=snwN1E^&|w*YEj;KN4?k;Xh47;L zbdy97k*R_HR+PFCQG_WHQjUXopioLT$qRpyw>QbD2dYNT&`tIDrh4o*^}xeSA2nM2 sFaAwn+v-9uhl=gkr`{LW4OW@`bZ*>FMD1kw{j!OzrY9lr~m)} diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/qt.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/schedulers/__pycache__/qt.cpython-312.pyc deleted file mode 100644 index 5df6e78573959f28bea2249b150168cdbba8af96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2622 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 I8hAziH+v~4!2kdN diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/asyncio.py b/lib/python3.12/site-packages/apscheduler/schedulers/asyncio.py deleted file mode 100644 index 8bcdfda..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/asyncio.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import absolute_import -import asyncio -from functools import wraps, partial - -from apscheduler.schedulers.base import BaseScheduler -from apscheduler.util import maybe_ref - - -def run_in_event_loop(func): - @wraps(func) - def wrapper(self, *args, **kwargs): - wrapped = partial(func, self, *args, **kwargs) - self._eventloop.call_soon_threadsafe(wrapped) - return wrapper - - -class AsyncIOScheduler(BaseScheduler): - """ - A scheduler that runs on an asyncio (:pep:`3156`) event loop. - - The default executor can run jobs based on native coroutines (``async def``). - - Extra options: - - ============== ============================================================= - ``event_loop`` AsyncIO event loop to use (defaults to the global event loop) - ============== ============================================================= - """ - - _eventloop = None - _timeout = None - - def start(self, paused=False): - if not self._eventloop: - self._eventloop = asyncio.get_event_loop() - - super(AsyncIOScheduler, self).start(paused) - - @run_in_event_loop - def shutdown(self, wait=True): - super(AsyncIOScheduler, self).shutdown(wait) - self._stop_timer() - - def _configure(self, config): - self._eventloop = maybe_ref(config.pop('event_loop', None)) - super(AsyncIOScheduler, self)._configure(config) - - def _start_timer(self, wait_seconds): - self._stop_timer() - if wait_seconds is not None: - self._timeout = self._eventloop.call_later(wait_seconds, self.wakeup) - - def _stop_timer(self): - if self._timeout: - self._timeout.cancel() - del self._timeout - - @run_in_event_loop - def wakeup(self): - self._stop_timer() - wait_seconds = self._process_jobs() - self._start_timer(wait_seconds) - - def _create_default_executor(self): - from apscheduler.executors.asyncio import AsyncIOExecutor - return AsyncIOExecutor() diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/background.py b/lib/python3.12/site-packages/apscheduler/schedulers/background.py deleted file mode 100644 index bb8f77d..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/background.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import absolute_import - -from threading import Thread, Event - -from apscheduler.schedulers.base import BaseScheduler -from apscheduler.schedulers.blocking import BlockingScheduler -from apscheduler.util import asbool - - -class BackgroundScheduler(BlockingScheduler): - """ - A scheduler that runs in the background using a separate thread - (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will return immediately). - - Extra options: - - ========== ============================================================================= - ``daemon`` Set the ``daemon`` option in the background thread (defaults to ``True``, see - `the documentation - `_ - for further details) - ========== ============================================================================= - """ - - _thread = None - - def _configure(self, config): - self._daemon = asbool(config.pop('daemon', True)) - super(BackgroundScheduler, self)._configure(config) - - def start(self, *args, **kwargs): - if self._event is None or self._event.is_set(): - self._event = Event() - - BaseScheduler.start(self, *args, **kwargs) - self._thread = Thread(target=self._main_loop, name='APScheduler') - self._thread.daemon = self._daemon - self._thread.start() - - def shutdown(self, *args, **kwargs): - super(BackgroundScheduler, self).shutdown(*args, **kwargs) - self._thread.join() - del self._thread diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/base.py b/lib/python3.12/site-packages/apscheduler/schedulers/base.py deleted file mode 100644 index f751c95..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/base.py +++ /dev/null @@ -1,1037 +0,0 @@ -from __future__ import print_function - -from abc import ABCMeta, abstractmethod -from threading import RLock -from datetime import datetime, timedelta -from logging import getLogger -import warnings -import sys - -from tzlocal import get_localzone -import six - -from apscheduler.schedulers import SchedulerAlreadyRunningError, SchedulerNotRunningError -from apscheduler.executors.base import MaxInstancesReachedError, BaseExecutor -from apscheduler.executors.pool import ThreadPoolExecutor -from apscheduler.jobstores.base import ConflictingIdError, JobLookupError, BaseJobStore -from apscheduler.jobstores.memory import MemoryJobStore -from apscheduler.job import Job -from apscheduler.triggers.base import BaseTrigger -from apscheduler.util import ( - asbool, asint, astimezone, maybe_ref, timedelta_seconds, undefined, TIMEOUT_MAX) -from apscheduler.events import ( - SchedulerEvent, JobEvent, JobSubmissionEvent, EVENT_SCHEDULER_START, EVENT_SCHEDULER_SHUTDOWN, - EVENT_JOBSTORE_ADDED, EVENT_JOBSTORE_REMOVED, EVENT_ALL, EVENT_JOB_MODIFIED, EVENT_JOB_REMOVED, - EVENT_JOB_ADDED, EVENT_EXECUTOR_ADDED, EVENT_EXECUTOR_REMOVED, EVENT_ALL_JOBS_REMOVED, - EVENT_JOB_SUBMITTED, EVENT_JOB_MAX_INSTANCES, EVENT_SCHEDULER_RESUMED, EVENT_SCHEDULER_PAUSED) - -try: - from collections.abc import MutableMapping -except ImportError: - from collections import MutableMapping - -try: - from importlib.metadata import entry_points -except ModuleNotFoundError: - from importlib_metadata import entry_points - -#: constant indicating a scheduler's stopped state -STATE_STOPPED = 0 -#: constant indicating a scheduler's running state (started and processing jobs) -STATE_RUNNING = 1 -#: constant indicating a scheduler's paused state (started but not processing jobs) -STATE_PAUSED = 2 - - -class BaseScheduler(six.with_metaclass(ABCMeta)): - """ - Abstract base class for all schedulers. - - Takes the following keyword arguments: - - :param str|logging.Logger logger: logger to use for the scheduler's logging (defaults to - apscheduler.scheduler) - :param str|datetime.tzinfo timezone: the default time zone (defaults to the local timezone) - :param int|float jobstore_retry_interval: the minimum number of seconds to wait between - retries in the scheduler's main loop if the job store raises an exception when getting - the list of due jobs - :param dict job_defaults: default values for newly added jobs - :param dict jobstores: a dictionary of job store alias -> job store instance or configuration - dict - :param dict executors: a dictionary of executor alias -> executor instance or configuration - dict - - :ivar int state: current running state of the scheduler (one of the following constants from - ``apscheduler.schedulers.base``: ``STATE_STOPPED``, ``STATE_RUNNING``, ``STATE_PAUSED``) - - .. seealso:: :ref:`scheduler-config` - """ - # The `group=...` API is only available in the backport, used in <=3.7, and in std>=3.10. - if (3, 8) <= sys.version_info < (3, 10): - _trigger_plugins = {ep.name: ep for ep in entry_points()['apscheduler.triggers']} - _executor_plugins = {ep.name: ep for ep in entry_points()['apscheduler.executors']} - _jobstore_plugins = {ep.name: ep for ep in entry_points()['apscheduler.jobstores']} - else: - _trigger_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.triggers')} - _executor_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.executors')} - _jobstore_plugins = {ep.name: ep for ep in entry_points(group='apscheduler.jobstores')} - - _trigger_classes = {} - _executor_classes = {} - _jobstore_classes = {} - - # - # Public API - # - - def __init__(self, gconfig={}, **options): - super(BaseScheduler, self).__init__() - self._executors = {} - self._executors_lock = self._create_lock() - self._jobstores = {} - self._jobstores_lock = self._create_lock() - self._listeners = [] - self._listeners_lock = self._create_lock() - self._pending_jobs = [] - self.state = STATE_STOPPED - self.configure(gconfig, **options) - - def __getstate__(self): - raise TypeError("Schedulers cannot be serialized. Ensure that you are not passing a " - "scheduler instance as an argument to a job, or scheduling an instance " - "method where the instance contains a scheduler as an attribute.") - - def configure(self, gconfig={}, prefix='apscheduler.', **options): - """ - Reconfigures the scheduler with the given options. - - Can only be done when the scheduler isn't running. - - :param dict gconfig: a "global" configuration dictionary whose values can be overridden by - keyword arguments to this method - :param str|unicode prefix: pick only those keys from ``gconfig`` that are prefixed with - this string (pass an empty string or ``None`` to use all keys) - :raises SchedulerAlreadyRunningError: if the scheduler is already running - - """ - if self.state != STATE_STOPPED: - raise SchedulerAlreadyRunningError - - # If a non-empty prefix was given, strip it from the keys in the - # global configuration dict - if prefix: - prefixlen = len(prefix) - gconfig = dict((key[prefixlen:], value) for key, value in six.iteritems(gconfig) - if key.startswith(prefix)) - - # Create a structure from the dotted options - # (e.g. "a.b.c = d" -> {'a': {'b': {'c': 'd'}}}) - config = {} - for key, value in six.iteritems(gconfig): - parts = key.split('.') - parent = config - key = parts.pop(0) - while parts: - parent = parent.setdefault(key, {}) - key = parts.pop(0) - parent[key] = value - - # Override any options with explicit keyword arguments - config.update(options) - self._configure(config) - - def start(self, paused=False): - """ - Start the configured executors and job stores and begin processing scheduled jobs. - - :param bool paused: if ``True``, don't start job processing until :meth:`resume` is called - :raises SchedulerAlreadyRunningError: if the scheduler is already running - :raises RuntimeError: if running under uWSGI with threads disabled - - """ - if self.state != STATE_STOPPED: - raise SchedulerAlreadyRunningError - - self._check_uwsgi() - - with self._executors_lock: - # Create a default executor if nothing else is configured - if 'default' not in self._executors: - self.add_executor(self._create_default_executor(), 'default') - - # Start all the executors - for alias, executor in six.iteritems(self._executors): - executor.start(self, alias) - - with self._jobstores_lock: - # Create a default job store if nothing else is configured - if 'default' not in self._jobstores: - self.add_jobstore(self._create_default_jobstore(), 'default') - - # Start all the job stores - for alias, store in six.iteritems(self._jobstores): - store.start(self, alias) - - # Schedule all pending jobs - for job, jobstore_alias, replace_existing in self._pending_jobs: - self._real_add_job(job, jobstore_alias, replace_existing) - del self._pending_jobs[:] - - self.state = STATE_PAUSED if paused else STATE_RUNNING - self._logger.info('Scheduler started') - self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_START)) - - if not paused: - self.wakeup() - - @abstractmethod - def shutdown(self, wait=True): - """ - Shuts down the scheduler, along with its executors and job stores. - - Does not interrupt any currently running jobs. - - :param bool wait: ``True`` to wait until all currently executing jobs have finished - :raises SchedulerNotRunningError: if the scheduler has not been started yet - - """ - if self.state == STATE_STOPPED: - raise SchedulerNotRunningError - - self.state = STATE_STOPPED - - # Shut down all executors - with self._executors_lock, self._jobstores_lock: - for executor in six.itervalues(self._executors): - executor.shutdown(wait) - - # Shut down all job stores - for jobstore in six.itervalues(self._jobstores): - jobstore.shutdown() - - self._logger.info('Scheduler has been shut down') - self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_SHUTDOWN)) - - def pause(self): - """ - Pause job processing in the scheduler. - - This will prevent the scheduler from waking up to do job processing until :meth:`resume` - is called. It will not however stop any already running job processing. - - """ - if self.state == STATE_STOPPED: - raise SchedulerNotRunningError - elif self.state == STATE_RUNNING: - self.state = STATE_PAUSED - self._logger.info('Paused scheduler job processing') - self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_PAUSED)) - - def resume(self): - """Resume job processing in the scheduler.""" - if self.state == STATE_STOPPED: - raise SchedulerNotRunningError - elif self.state == STATE_PAUSED: - self.state = STATE_RUNNING - self._logger.info('Resumed scheduler job processing') - self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_RESUMED)) - self.wakeup() - - @property - def running(self): - """ - Return ``True`` if the scheduler has been started. - - This is a shortcut for ``scheduler.state != STATE_STOPPED``. - - """ - return self.state != STATE_STOPPED - - def add_executor(self, executor, alias='default', **executor_opts): - """ - Adds an executor to this scheduler. - - Any extra keyword arguments will be passed to the executor plugin's constructor, assuming - that the first argument is the name of an executor plugin. - - :param str|unicode|apscheduler.executors.base.BaseExecutor executor: either an executor - instance or the name of an executor plugin - :param str|unicode alias: alias for the scheduler - :raises ValueError: if there is already an executor by the given alias - - """ - with self._executors_lock: - if alias in self._executors: - raise ValueError('This scheduler already has an executor by the alias of "%s"' % - alias) - - if isinstance(executor, BaseExecutor): - self._executors[alias] = executor - elif isinstance(executor, six.string_types): - self._executors[alias] = executor = self._create_plugin_instance( - 'executor', executor, executor_opts) - else: - raise TypeError('Expected an executor instance or a string, got %s instead' % - executor.__class__.__name__) - - # Start the executor right away if the scheduler is running - if self.state != STATE_STOPPED: - executor.start(self, alias) - - self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_ADDED, alias)) - - def remove_executor(self, alias, shutdown=True): - """ - Removes the executor by the given alias from this scheduler. - - :param str|unicode alias: alias of the executor - :param bool shutdown: ``True`` to shut down the executor after - removing it - - """ - with self._executors_lock: - executor = self._lookup_executor(alias) - del self._executors[alias] - - if shutdown: - executor.shutdown() - - self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_REMOVED, alias)) - - def add_jobstore(self, jobstore, alias='default', **jobstore_opts): - """ - Adds a job store to this scheduler. - - Any extra keyword arguments will be passed to the job store plugin's constructor, assuming - that the first argument is the name of a job store plugin. - - :param str|unicode|apscheduler.jobstores.base.BaseJobStore jobstore: job store to be added - :param str|unicode alias: alias for the job store - :raises ValueError: if there is already a job store by the given alias - - """ - with self._jobstores_lock: - if alias in self._jobstores: - raise ValueError('This scheduler already has a job store by the alias of "%s"' % - alias) - - if isinstance(jobstore, BaseJobStore): - self._jobstores[alias] = jobstore - elif isinstance(jobstore, six.string_types): - self._jobstores[alias] = jobstore = self._create_plugin_instance( - 'jobstore', jobstore, jobstore_opts) - else: - raise TypeError('Expected a job store instance or a string, got %s instead' % - jobstore.__class__.__name__) - - # Start the job store right away if the scheduler isn't stopped - if self.state != STATE_STOPPED: - jobstore.start(self, alias) - - # Notify listeners that a new job store has been added - self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_ADDED, alias)) - - # Notify the scheduler so it can scan the new job store for jobs - if self.state != STATE_STOPPED: - self.wakeup() - - def remove_jobstore(self, alias, shutdown=True): - """ - Removes the job store by the given alias from this scheduler. - - :param str|unicode alias: alias of the job store - :param bool shutdown: ``True`` to shut down the job store after removing it - - """ - with self._jobstores_lock: - jobstore = self._lookup_jobstore(alias) - del self._jobstores[alias] - - if shutdown: - jobstore.shutdown() - - self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_REMOVED, alias)) - - def add_listener(self, callback, mask=EVENT_ALL): - """ - add_listener(callback, mask=EVENT_ALL) - - Adds a listener for scheduler events. - - When a matching event occurs, ``callback`` is executed with the event object as its - sole argument. If the ``mask`` parameter is not provided, the callback will receive events - of all types. - - :param callback: any callable that takes one argument - :param int mask: bitmask that indicates which events should be - listened to - - .. seealso:: :mod:`apscheduler.events` - .. seealso:: :ref:`scheduler-events` - - """ - with self._listeners_lock: - self._listeners.append((callback, mask)) - - def remove_listener(self, callback): - """Removes a previously added event listener.""" - - with self._listeners_lock: - for i, (cb, _) in enumerate(self._listeners): - if callback == cb: - del self._listeners[i] - - def add_job(self, func, trigger=None, args=None, kwargs=None, id=None, name=None, - misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, - next_run_time=undefined, jobstore='default', executor='default', - replace_existing=False, **trigger_args): - """ - add_job(func, trigger=None, args=None, kwargs=None, id=None, \ - name=None, misfire_grace_time=undefined, coalesce=undefined, \ - max_instances=undefined, next_run_time=undefined, \ - jobstore='default', executor='default', \ - replace_existing=False, **trigger_args) - - Adds the given job to the job list and wakes up the scheduler if it's already running. - - Any option that defaults to ``undefined`` will be replaced with the corresponding default - value when the job is scheduled (which happens when the scheduler is started, or - immediately if the scheduler is already running). - - The ``func`` argument can be given either as a callable object or a textual reference in - the ``package.module:some.object`` format, where the first half (separated by ``:``) is an - importable module and the second half is a reference to the callable object, relative to - the module. - - The ``trigger`` argument can either be: - #. the alias name of the trigger (e.g. ``date``, ``interval`` or ``cron``), in which case - any extra keyword arguments to this method are passed on to the trigger's constructor - #. an instance of a trigger class - - :param func: callable (or a textual reference to one) to run at the given time - :param str|apscheduler.triggers.base.BaseTrigger trigger: trigger that determines when - ``func`` is called - :param list|tuple args: list of positional arguments to call func with - :param dict kwargs: dict of keyword arguments to call func with - :param str|unicode id: explicit identifier for the job (for modifying it later) - :param str|unicode name: textual description of the job - :param int misfire_grace_time: seconds after the designated runtime that the job is still - allowed to be run (or ``None`` to allow the job to run no matter how late it is) - :param bool coalesce: run once instead of many times if the scheduler determines that the - job should be run more than once in succession - :param int max_instances: maximum number of concurrently running instances allowed for this - job - :param datetime next_run_time: when to first run the job, regardless of the trigger (pass - ``None`` to add the job as paused) - :param str|unicode jobstore: alias of the job store to store the job in - :param str|unicode executor: alias of the executor to run the job with - :param bool replace_existing: ``True`` to replace an existing job with the same ``id`` - (but retain the number of runs from the existing one) - :rtype: Job - - """ - job_kwargs = { - 'trigger': self._create_trigger(trigger, trigger_args), - 'executor': executor, - 'func': func, - 'args': tuple(args) if args is not None else (), - 'kwargs': dict(kwargs) if kwargs is not None else {}, - 'id': id, - 'name': name, - 'misfire_grace_time': misfire_grace_time, - 'coalesce': coalesce, - 'max_instances': max_instances, - 'next_run_time': next_run_time - } - job_kwargs = dict((key, value) for key, value in six.iteritems(job_kwargs) if - value is not undefined) - job = Job(self, **job_kwargs) - - # Don't really add jobs to job stores before the scheduler is up and running - with self._jobstores_lock: - if self.state == STATE_STOPPED: - self._pending_jobs.append((job, jobstore, replace_existing)) - self._logger.info('Adding job tentatively -- it will be properly scheduled when ' - 'the scheduler starts') - else: - self._real_add_job(job, jobstore, replace_existing) - - return job - - def scheduled_job(self, trigger, args=None, kwargs=None, id=None, name=None, - misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, - next_run_time=undefined, jobstore='default', executor='default', - **trigger_args): - """ - scheduled_job(trigger, args=None, kwargs=None, id=None, \ - name=None, misfire_grace_time=undefined, \ - coalesce=undefined, max_instances=undefined, \ - next_run_time=undefined, jobstore='default', \ - executor='default',**trigger_args) - - A decorator version of :meth:`add_job`, except that ``replace_existing`` is always - ``True``. - - .. important:: The ``id`` argument must be given if scheduling a job in a persistent job - store. The scheduler cannot, however, enforce this requirement. - - """ - def inner(func): - self.add_job(func, trigger, args, kwargs, id, name, misfire_grace_time, coalesce, - max_instances, next_run_time, jobstore, executor, True, **trigger_args) - return func - return inner - - def modify_job(self, job_id, jobstore=None, **changes): - """ - Modifies the properties of a single job. - - Modifications are passed to this method as extra keyword arguments. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that contains the job - :return Job: the relevant job instance - - """ - with self._jobstores_lock: - job, jobstore = self._lookup_job(job_id, jobstore) - job._modify(**changes) - if jobstore: - self._lookup_jobstore(jobstore).update_job(job) - - self._dispatch_event(JobEvent(EVENT_JOB_MODIFIED, job_id, jobstore)) - - # Wake up the scheduler since the job's next run time may have been changed - if self.state == STATE_RUNNING: - self.wakeup() - - return job - - def reschedule_job(self, job_id, jobstore=None, trigger=None, **trigger_args): - """ - Constructs a new trigger for a job and updates its next run time. - - Extra keyword arguments are passed directly to the trigger's constructor. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that contains the job - :param trigger: alias of the trigger type or a trigger instance - :return Job: the relevant job instance - - """ - trigger = self._create_trigger(trigger, trigger_args) - now = datetime.now(self.timezone) - next_run_time = trigger.get_next_fire_time(None, now) - return self.modify_job(job_id, jobstore, trigger=trigger, next_run_time=next_run_time) - - def pause_job(self, job_id, jobstore=None): - """ - Causes the given job not to be executed until it is explicitly resumed. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that contains the job - :return Job: the relevant job instance - - """ - return self.modify_job(job_id, jobstore, next_run_time=None) - - def resume_job(self, job_id, jobstore=None): - """ - Resumes the schedule of the given job, or removes the job if its schedule is finished. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that contains the job - :return Job|None: the relevant job instance if the job was rescheduled, or ``None`` if no - next run time could be calculated and the job was removed - - """ - with self._jobstores_lock: - job, jobstore = self._lookup_job(job_id, jobstore) - now = datetime.now(self.timezone) - next_run_time = job.trigger.get_next_fire_time(None, now) - if next_run_time: - return self.modify_job(job_id, jobstore, next_run_time=next_run_time) - else: - self.remove_job(job.id, jobstore) - - def get_jobs(self, jobstore=None, pending=None): - """ - Returns a list of pending jobs (if the scheduler hasn't been started yet) and scheduled - jobs, either from a specific job store or from all of them. - - If the scheduler has not been started yet, only pending jobs can be returned because the - job stores haven't been started yet either. - - :param str|unicode jobstore: alias of the job store - :param bool pending: **DEPRECATED** - :rtype: list[Job] - - """ - if pending is not None: - warnings.warn('The "pending" option is deprecated -- get_jobs() always returns ' - 'scheduled jobs if the scheduler has been started and pending jobs ' - 'otherwise', DeprecationWarning) - - with self._jobstores_lock: - jobs = [] - if self.state == STATE_STOPPED: - for job, alias, replace_existing in self._pending_jobs: - if jobstore is None or alias == jobstore: - jobs.append(job) - else: - for alias, store in six.iteritems(self._jobstores): - if jobstore is None or alias == jobstore: - jobs.extend(store.get_all_jobs()) - - return jobs - - def get_job(self, job_id, jobstore=None): - """ - Returns the Job that matches the given ``job_id``. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that most likely contains the job - :return: the Job by the given ID, or ``None`` if it wasn't found - :rtype: Job - - """ - with self._jobstores_lock: - try: - return self._lookup_job(job_id, jobstore)[0] - except JobLookupError: - return - - def remove_job(self, job_id, jobstore=None): - """ - Removes a job, preventing it from being run any more. - - :param str|unicode job_id: the identifier of the job - :param str|unicode jobstore: alias of the job store that contains the job - :raises JobLookupError: if the job was not found - - """ - jobstore_alias = None - with self._jobstores_lock: - # Check if the job is among the pending jobs - if self.state == STATE_STOPPED: - for i, (job, alias, replace_existing) in enumerate(self._pending_jobs): - if job.id == job_id and jobstore in (None, alias): - del self._pending_jobs[i] - jobstore_alias = alias - break - else: - # Otherwise, try to remove it from each store until it succeeds or we run out of - # stores to check - for alias, store in six.iteritems(self._jobstores): - if jobstore in (None, alias): - try: - store.remove_job(job_id) - jobstore_alias = alias - break - except JobLookupError: - continue - - if jobstore_alias is None: - raise JobLookupError(job_id) - - # Notify listeners that a job has been removed - event = JobEvent(EVENT_JOB_REMOVED, job_id, jobstore_alias) - self._dispatch_event(event) - - self._logger.info('Removed job %s', job_id) - - def remove_all_jobs(self, jobstore=None): - """ - Removes all jobs from the specified job store, or all job stores if none is given. - - :param str|unicode jobstore: alias of the job store - - """ - with self._jobstores_lock: - if self.state == STATE_STOPPED: - if jobstore: - self._pending_jobs = [pending for pending in self._pending_jobs if - pending[1] != jobstore] - else: - self._pending_jobs = [] - else: - for alias, store in six.iteritems(self._jobstores): - if jobstore in (None, alias): - store.remove_all_jobs() - - self._dispatch_event(SchedulerEvent(EVENT_ALL_JOBS_REMOVED, jobstore)) - - def print_jobs(self, jobstore=None, out=None): - """ - print_jobs(jobstore=None, out=sys.stdout) - - Prints out a textual listing of all jobs currently scheduled on either all job stores or - just a specific one. - - :param str|unicode jobstore: alias of the job store, ``None`` to list jobs from all stores - :param file out: a file-like object to print to (defaults to **sys.stdout** if nothing is - given) - - """ - out = out or sys.stdout - with self._jobstores_lock: - if self.state == STATE_STOPPED: - print(u'Pending jobs:', file=out) - if self._pending_jobs: - for job, jobstore_alias, replace_existing in self._pending_jobs: - if jobstore in (None, jobstore_alias): - print(u' %s' % job, file=out) - else: - print(u' No pending jobs', file=out) - else: - for alias, store in sorted(six.iteritems(self._jobstores)): - if jobstore in (None, alias): - print(u'Jobstore %s:' % alias, file=out) - jobs = store.get_all_jobs() - if jobs: - for job in jobs: - print(u' %s' % job, file=out) - else: - print(u' No scheduled jobs', file=out) - - @abstractmethod - def wakeup(self): - """ - Notifies the scheduler that there may be jobs due for execution. - Triggers :meth:`_process_jobs` to be run in an implementation specific manner. - """ - - # - # Private API - # - - def _configure(self, config): - # Set general options - self._logger = maybe_ref(config.pop('logger', None)) or getLogger('apscheduler.scheduler') - self.timezone = astimezone(config.pop('timezone', None)) or get_localzone() - self.jobstore_retry_interval = float(config.pop('jobstore_retry_interval', 10)) - - # Set the job defaults - job_defaults = config.get('job_defaults', {}) - self._job_defaults = { - 'misfire_grace_time': asint(job_defaults.get('misfire_grace_time', 1)), - 'coalesce': asbool(job_defaults.get('coalesce', True)), - 'max_instances': asint(job_defaults.get('max_instances', 1)) - } - - # Configure executors - self._executors.clear() - for alias, value in six.iteritems(config.get('executors', {})): - if isinstance(value, BaseExecutor): - self.add_executor(value, alias) - elif isinstance(value, MutableMapping): - executor_class = value.pop('class', None) - plugin = value.pop('type', None) - if plugin: - executor = self._create_plugin_instance('executor', plugin, value) - elif executor_class: - cls = maybe_ref(executor_class) - executor = cls(**value) - else: - raise ValueError( - 'Cannot create executor "%s" -- either "type" or "class" must be defined' % - alias) - - self.add_executor(executor, alias) - else: - raise TypeError( - "Expected executor instance or dict for executors['%s'], got %s instead" % - (alias, value.__class__.__name__)) - - # Configure job stores - self._jobstores.clear() - for alias, value in six.iteritems(config.get('jobstores', {})): - if isinstance(value, BaseJobStore): - self.add_jobstore(value, alias) - elif isinstance(value, MutableMapping): - jobstore_class = value.pop('class', None) - plugin = value.pop('type', None) - if plugin: - jobstore = self._create_plugin_instance('jobstore', plugin, value) - elif jobstore_class: - cls = maybe_ref(jobstore_class) - jobstore = cls(**value) - else: - raise ValueError( - 'Cannot create job store "%s" -- either "type" or "class" must be ' - 'defined' % alias) - - self.add_jobstore(jobstore, alias) - else: - raise TypeError( - "Expected job store instance or dict for jobstores['%s'], got %s instead" % - (alias, value.__class__.__name__)) - - def _create_default_executor(self): - """Creates a default executor store, specific to the particular scheduler type.""" - return ThreadPoolExecutor() - - def _create_default_jobstore(self): - """Creates a default job store, specific to the particular scheduler type.""" - return MemoryJobStore() - - def _lookup_executor(self, alias): - """ - Returns the executor instance by the given name from the list of executors that were added - to this scheduler. - - :type alias: str - :raises KeyError: if no executor by the given alias is not found - - """ - try: - return self._executors[alias] - except KeyError: - raise KeyError('No such executor: %s' % alias) - - def _lookup_jobstore(self, alias): - """ - Returns the job store instance by the given name from the list of job stores that were - added to this scheduler. - - :type alias: str - :raises KeyError: if no job store by the given alias is not found - - """ - try: - return self._jobstores[alias] - except KeyError: - raise KeyError('No such job store: %s' % alias) - - def _lookup_job(self, job_id, jobstore_alias): - """ - Finds a job by its ID. - - :type job_id: str - :param str jobstore_alias: alias of a job store to look in - :return tuple[Job, str]: a tuple of job, jobstore alias (jobstore alias is None in case of - a pending job) - :raises JobLookupError: if no job by the given ID is found. - - """ - if self.state == STATE_STOPPED: - # Check if the job is among the pending jobs - for job, alias, replace_existing in self._pending_jobs: - if job.id == job_id: - return job, None - else: - # Look in all job stores - for alias, store in six.iteritems(self._jobstores): - if jobstore_alias in (None, alias): - job = store.lookup_job(job_id) - if job is not None: - return job, alias - - raise JobLookupError(job_id) - - def _dispatch_event(self, event): - """ - Dispatches the given event to interested listeners. - - :param SchedulerEvent event: the event to send - - """ - with self._listeners_lock: - listeners = tuple(self._listeners) - - for cb, mask in listeners: - if event.code & mask: - try: - cb(event) - except BaseException: - self._logger.exception('Error notifying listener') - - def _check_uwsgi(self): - """Check if we're running under uWSGI with threads disabled.""" - uwsgi_module = sys.modules.get('uwsgi') - if not getattr(uwsgi_module, 'has_threads', True): - raise RuntimeError('The scheduler seems to be running under uWSGI, but threads have ' - 'been disabled. You must run uWSGI with the --enable-threads ' - 'option for the scheduler to work.') - - def _real_add_job(self, job, jobstore_alias, replace_existing): - """ - :param Job job: the job to add - :param bool replace_existing: ``True`` to use update_job() in case the job already exists - in the store - - """ - # Fill in undefined values with defaults - replacements = {} - for key, value in six.iteritems(self._job_defaults): - if not hasattr(job, key): - replacements[key] = value - - # Calculate the next run time if there is none defined - if not hasattr(job, 'next_run_time'): - now = datetime.now(self.timezone) - replacements['next_run_time'] = job.trigger.get_next_fire_time(None, now) - - # Apply any replacements - job._modify(**replacements) - - # Add the job to the given job store - store = self._lookup_jobstore(jobstore_alias) - try: - store.add_job(job) - except ConflictingIdError: - if replace_existing: - store.update_job(job) - else: - raise - - # Mark the job as no longer pending - job._jobstore_alias = jobstore_alias - - # Notify listeners that a new job has been added - event = JobEvent(EVENT_JOB_ADDED, job.id, jobstore_alias) - self._dispatch_event(event) - - self._logger.info('Added job "%s" to job store "%s"', job.name, jobstore_alias) - - # Notify the scheduler about the new job - if self.state == STATE_RUNNING: - self.wakeup() - - def _create_plugin_instance(self, type_, alias, constructor_kwargs): - """Creates an instance of the given plugin type, loading the plugin first if necessary.""" - plugin_container, class_container, base_class = { - 'trigger': (self._trigger_plugins, self._trigger_classes, BaseTrigger), - 'jobstore': (self._jobstore_plugins, self._jobstore_classes, BaseJobStore), - 'executor': (self._executor_plugins, self._executor_classes, BaseExecutor) - }[type_] - - try: - plugin_cls = class_container[alias] - except KeyError: - if alias in plugin_container: - plugin_cls = class_container[alias] = plugin_container[alias].load() - if not issubclass(plugin_cls, base_class): - raise TypeError('The {0} entry point does not point to a {0} class'. - format(type_)) - else: - raise LookupError('No {0} by the name "{1}" was found'.format(type_, alias)) - - return plugin_cls(**constructor_kwargs) - - def _create_trigger(self, trigger, trigger_args): - if isinstance(trigger, BaseTrigger): - return trigger - elif trigger is None: - trigger = 'date' - elif not isinstance(trigger, six.string_types): - raise TypeError('Expected a trigger instance or string, got %s instead' % - trigger.__class__.__name__) - - # Use the scheduler's time zone if nothing else is specified - trigger_args.setdefault('timezone', self.timezone) - - # Instantiate the trigger class - return self._create_plugin_instance('trigger', trigger, trigger_args) - - def _create_lock(self): - """Creates a reentrant lock object.""" - return RLock() - - def _process_jobs(self): - """ - Iterates through jobs in every jobstore, starts jobs that are due and figures out how long - to wait for the next round. - - If the ``get_due_jobs()`` call raises an exception, a new wakeup is scheduled in at least - ``jobstore_retry_interval`` seconds. - - """ - if self.state == STATE_PAUSED: - self._logger.debug('Scheduler is paused -- not processing jobs') - return None - - self._logger.debug('Looking for jobs to run') - now = datetime.now(self.timezone) - next_wakeup_time = None - events = [] - - with self._jobstores_lock: - for jobstore_alias, jobstore in six.iteritems(self._jobstores): - try: - due_jobs = jobstore.get_due_jobs(now) - except Exception as e: - # Schedule a wakeup at least in jobstore_retry_interval seconds - self._logger.warning('Error getting due jobs from job store %r: %s', - jobstore_alias, e) - retry_wakeup_time = now + timedelta(seconds=self.jobstore_retry_interval) - if not next_wakeup_time or next_wakeup_time > retry_wakeup_time: - next_wakeup_time = retry_wakeup_time - - continue - - for job in due_jobs: - # Look up the job's executor - try: - executor = self._lookup_executor(job.executor) - except BaseException: - self._logger.error( - 'Executor lookup ("%s") failed for job "%s" -- removing it from the ' - 'job store', job.executor, job) - self.remove_job(job.id, jobstore_alias) - continue - - run_times = job._get_run_times(now) - run_times = run_times[-1:] if run_times and job.coalesce else run_times - if run_times: - try: - executor.submit_job(job, run_times) - except MaxInstancesReachedError: - self._logger.warning( - 'Execution of job "%s" skipped: maximum number of running ' - 'instances reached (%d)', job, job.max_instances) - event = JobSubmissionEvent(EVENT_JOB_MAX_INSTANCES, job.id, - jobstore_alias, run_times) - events.append(event) - except BaseException: - self._logger.exception('Error submitting job "%s" to executor "%s"', - job, job.executor) - else: - event = JobSubmissionEvent(EVENT_JOB_SUBMITTED, job.id, jobstore_alias, - run_times) - events.append(event) - - # Update the job if it has a next execution time. - # Otherwise remove it from the job store. - job_next_run = job.trigger.get_next_fire_time(run_times[-1], now) - if job_next_run: - job._modify(next_run_time=job_next_run) - jobstore.update_job(job) - else: - self.remove_job(job.id, jobstore_alias) - - # Set a new next wakeup time if there isn't one yet or - # the jobstore has an even earlier one - jobstore_next_run_time = jobstore.get_next_run_time() - if jobstore_next_run_time and (next_wakeup_time is None or - jobstore_next_run_time < next_wakeup_time): - next_wakeup_time = jobstore_next_run_time.astimezone(self.timezone) - - # Dispatch collected events - for event in events: - self._dispatch_event(event) - - # Determine the delay until this method should be called again - if self.state == STATE_PAUSED: - wait_seconds = None - self._logger.debug('Scheduler is paused; waiting until resume() is called') - elif next_wakeup_time is None: - wait_seconds = None - self._logger.debug('No jobs; waiting until a job is added') - else: - now = datetime.now(self.timezone) - wait_seconds = min(max(timedelta_seconds(next_wakeup_time - now), 0), TIMEOUT_MAX) - self._logger.debug('Next wakeup is due at %s (in %f seconds)', next_wakeup_time, - wait_seconds) - - return wait_seconds diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/blocking.py b/lib/python3.12/site-packages/apscheduler/schedulers/blocking.py deleted file mode 100644 index 4ecc9f6..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/blocking.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import absolute_import - -from threading import Event - -from apscheduler.schedulers.base import BaseScheduler, STATE_STOPPED -from apscheduler.util import TIMEOUT_MAX - - -class BlockingScheduler(BaseScheduler): - """ - A scheduler that runs in the foreground - (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will block). - """ - _event = None - - def start(self, *args, **kwargs): - if self._event is None or self._event.is_set(): - self._event = Event() - - super(BlockingScheduler, self).start(*args, **kwargs) - self._main_loop() - - def shutdown(self, wait=True): - super(BlockingScheduler, self).shutdown(wait) - self._event.set() - - def _main_loop(self): - wait_seconds = TIMEOUT_MAX - while self.state != STATE_STOPPED: - self._event.wait(wait_seconds) - self._event.clear() - wait_seconds = self._process_jobs() - - def wakeup(self): - self._event.set() diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/gevent.py b/lib/python3.12/site-packages/apscheduler/schedulers/gevent.py deleted file mode 100644 index d48ed74..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/gevent.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import absolute_import - -from apscheduler.schedulers.blocking import BlockingScheduler -from apscheduler.schedulers.base import BaseScheduler - -try: - from gevent.event import Event - from gevent.lock import RLock - import gevent -except ImportError: # pragma: nocover - raise ImportError('GeventScheduler requires gevent installed') - - -class GeventScheduler(BlockingScheduler): - """A scheduler that runs as a Gevent greenlet.""" - - _greenlet = None - - def start(self, *args, **kwargs): - self._event = Event() - BaseScheduler.start(self, *args, **kwargs) - self._greenlet = gevent.spawn(self._main_loop) - return self._greenlet - - def shutdown(self, *args, **kwargs): - super(GeventScheduler, self).shutdown(*args, **kwargs) - self._greenlet.join() - del self._greenlet - - def _create_lock(self): - return RLock() - - def _create_default_executor(self): - from apscheduler.executors.gevent import GeventExecutor - return GeventExecutor() diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/qt.py b/lib/python3.12/site-packages/apscheduler/schedulers/qt.py deleted file mode 100644 index 6762c5c..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/qt.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import absolute_import - -from importlib import import_module -from itertools import product - -from apscheduler.schedulers.base import BaseScheduler - -for version, pkgname in product(range(6, 1, -1), ("PySide", "PyQt")): - try: - qtcore = import_module(pkgname + str(version) + ".QtCore") - except ImportError: - pass - else: - QTimer = qtcore.QTimer - break -else: - raise ImportError( - "QtScheduler requires either PySide/PyQt (v6 to v2) installed" - ) - - -class QtScheduler(BaseScheduler): - """A scheduler that runs in a Qt event loop.""" - - _timer = None - - def shutdown(self, *args, **kwargs): - super(QtScheduler, self).shutdown(*args, **kwargs) - self._stop_timer() - - def _start_timer(self, wait_seconds): - self._stop_timer() - if wait_seconds is not None: - wait_time = min(int(wait_seconds * 1000), 2147483647) - self._timer = QTimer.singleShot(wait_time, self._process_jobs) - - def _stop_timer(self): - if self._timer: - if self._timer.isActive(): - self._timer.stop() - del self._timer - - def wakeup(self): - self._start_timer(0) - - def _process_jobs(self): - wait_seconds = super(QtScheduler, self)._process_jobs() - self._start_timer(wait_seconds) diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/tornado.py b/lib/python3.12/site-packages/apscheduler/schedulers/tornado.py deleted file mode 100644 index 0a9171f..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/tornado.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import absolute_import - -from datetime import timedelta -from functools import wraps - -from apscheduler.schedulers.base import BaseScheduler -from apscheduler.util import maybe_ref - -try: - from tornado.ioloop import IOLoop -except ImportError: # pragma: nocover - raise ImportError('TornadoScheduler requires tornado installed') - - -def run_in_ioloop(func): - @wraps(func) - def wrapper(self, *args, **kwargs): - self._ioloop.add_callback(func, self, *args, **kwargs) - return wrapper - - -class TornadoScheduler(BaseScheduler): - """ - A scheduler that runs on a Tornado IOLoop. - - The default executor can run jobs based on native coroutines (``async def``). - - =========== =============================================================== - ``io_loop`` Tornado IOLoop instance to use (defaults to the global IO loop) - =========== =============================================================== - """ - - _ioloop = None - _timeout = None - - @run_in_ioloop - def shutdown(self, wait=True): - super(TornadoScheduler, self).shutdown(wait) - self._stop_timer() - - def _configure(self, config): - self._ioloop = maybe_ref(config.pop('io_loop', None)) or IOLoop.current() - super(TornadoScheduler, self)._configure(config) - - def _start_timer(self, wait_seconds): - self._stop_timer() - if wait_seconds is not None: - self._timeout = self._ioloop.add_timeout(timedelta(seconds=wait_seconds), self.wakeup) - - def _stop_timer(self): - if self._timeout: - self._ioloop.remove_timeout(self._timeout) - del self._timeout - - def _create_default_executor(self): - from apscheduler.executors.tornado import TornadoExecutor - return TornadoExecutor() - - @run_in_ioloop - def wakeup(self): - self._stop_timer() - wait_seconds = self._process_jobs() - self._start_timer(wait_seconds) diff --git a/lib/python3.12/site-packages/apscheduler/schedulers/twisted.py b/lib/python3.12/site-packages/apscheduler/schedulers/twisted.py deleted file mode 100644 index 6b43a84..0000000 --- a/lib/python3.12/site-packages/apscheduler/schedulers/twisted.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import absolute_import - -from functools import wraps - -from apscheduler.schedulers.base import BaseScheduler -from apscheduler.util import maybe_ref - -try: - from twisted.internet import reactor as default_reactor -except ImportError: # pragma: nocover - raise ImportError('TwistedScheduler requires Twisted installed') - - -def run_in_reactor(func): - @wraps(func) - def wrapper(self, *args, **kwargs): - self._reactor.callFromThread(func, self, *args, **kwargs) - return wrapper - - -class TwistedScheduler(BaseScheduler): - """ - A scheduler that runs on a Twisted reactor. - - Extra options: - - =========== ======================================================== - ``reactor`` Reactor instance to use (defaults to the global reactor) - =========== ======================================================== - """ - - _reactor = None - _delayedcall = None - - def _configure(self, config): - self._reactor = maybe_ref(config.pop('reactor', default_reactor)) - super(TwistedScheduler, self)._configure(config) - - @run_in_reactor - def shutdown(self, wait=True): - super(TwistedScheduler, self).shutdown(wait) - self._stop_timer() - - def _start_timer(self, wait_seconds): - self._stop_timer() - if wait_seconds is not None: - self._delayedcall = self._reactor.callLater(wait_seconds, self.wakeup) - - def _stop_timer(self): - if self._delayedcall and self._delayedcall.active(): - self._delayedcall.cancel() - del self._delayedcall - - @run_in_reactor - def wakeup(self): - self._stop_timer() - wait_seconds = self._process_jobs() - self._start_timer(wait_seconds) - - def _create_default_executor(self): - from apscheduler.executors.twisted import TwistedExecutor - return TwistedExecutor() diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__init__.py b/lib/python3.12/site-packages/apscheduler/triggers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index decb11f074adb917e705acdb43cd0c0d0093d206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ8aK?=e!5Nxc12nE04!7l1m1V7*xLR;4~+IGVx74j0_;9LBGS6?8#c`^Y{4$SWC z?7%#-Y?cJ@ey-wv#qp0}9GqL?lZ80k6CQ5P@LU}|z?h~0@A zO<=sMsk6veWN38xGdB5Z4OTl`nxeWC3M~}IRy7{`CIlU8rI0O1sXOhY%#D9ew=Ko@ RjwhjB1llOxsStwGpuTMHIiLUl diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/base.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/base.cpython-312.pyc deleted file mode 100644 index e509a697b254734a82ce14b793da47ff1a477346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1998 zcma)7%WvF77$4jF%62y?TNDIRs|iFARp8PSGq%^8Re{!r@%NbTIlph_$7Zt* zwr{tmuD{Lf1*vbjGG$S->Quav+}26Og*V?-uQ5v2$U?N9v2L`A|PT&v8g3X z!V3r{zCb%}W}2;f&YZn1i6cOOrD0&{ShEbQTP0G)#vz#Io2-h;&#I2fW+l0B195VP zd4mCA<4-p8fUqZ}(Df1LPz;fPnDo7nD26~U6omDWOEMMNBWwgk<^l#W7tjkLp9CZn z?fbyZYs`ZKp!l;=n&(I}b<~v2sKfmGl!%yxS)7m@$iPStRWuY7_B}=*4X?qQeHc>6 zV|O^$yC{S`nKSa;*q2858f2NX!nxz@(2zJzyIzR85n?DPytIpO5hHsZjk&FY+A4!? zTKr57v!rA@W|i+Fo@R)j?>waYUFgP)$rcr{3$q}Q`Ev=k6`Byj{L+C6=ubA6)SmbA#n1OQQhX!pEz?geWTeVUKJxB4`<8cXeM*+%qa z0bnS^H1Ng*I?iGpjstrmh%olT0Ys3c8{r=EV*;-#-0ylq0^fWA^h^}a;G+9(%4Zl( zv9s^V6NyFc7NRKfJ%Za3+yxTUP|QGEz`2mLi+wqYkv79feDpkK{+fcYw;jeoAA|Rwp((gFV`CJyObR4rV|IgX_fB1K^u`TAJn8~!Z ze{G{YuB_yFOPIogyfLeJ#iqgJB@dEHcCJY^4!u5Qfmvee8Az5F>qsh@L)MT=t}v&X z!4#I0rmfCuWM@0Zubzkhg6b7zyCIjm;B*x(3swHvR@m HnkM%TlW{aj diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/combining.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/combining.cpython-312.pyc deleted file mode 100644 index 935025729ec8507d42e0781035c72ac3e59743fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5805 zcmd5=T~Hg>6~4RL6-Yq&k&z6Bcw>x>C>H*AAdVAi65DCO$pFrTRFxO)0>YA3xw{xk zh{TiegFWMpoo1${(`HJ3W@6&BPF`Blm)Lnpr+p}jl0n`{TKe3G+jfFHNMCD=K4Fc=X6*iYKC2KX7TcL7=$YhX_$RH~*gAS<# zcE${H5_gUa@)GQ4&?z}VmLyq!slEXhJFLWpBJoIk#9DQh)k`&V1FG&Ei)flmd&Aa? z8B5`U*j^SuTp?*DO+rvJOPYliW4DrImg%LX(DXZWPL-p>)CCQSC$FLnK@h%D+DDa` z+%Am|$;tKvRmSA7rnVJ5v4tm)JB!KD$~<4ZI4EVtd2c_UAx=Wh$iny zh~ZP>h^)4Y2{k+_OXE>cv|pq>Y`W%Y3O9%7CH6UEXb1xR7CdMzh}47Y z9B{!tKU;rb&bQFf zlj-Qmb{zkt?&)01zT2p}=&iqU>XlQsU3`^$iSRD>y*nIqt9Xwuw{?{}!}cwKj)JqE zf-}GX9$V>3)PN!}5_`>>C9$Wv;f?$ScS(*kBQbTL_Y+3q;LwXWZ_H^JS|vc6e~q`@ z`Z5DnoM;6uP2R!?wrm7~-AN^=(M^IqgnSQnGzD(f@Z61(W^HRzjsY2-nSQRgKT#VTfYDO|1rd|RA@`M@3YCev2rE9+TbCPHKFF98Q9TU5e6caqN()xyAuQw|kRw43!eI`Q z8*j!;RpsNrWa`evRc(Q7!03G}SO}CmaE{xt5te!R8{O+9{ko3E*||q&e1^5UCgwq7ir@ zd%K0Tu+Tfy5YNODw68rvIFh6MSH93Izz!-b(FtY${|$&-M+ z@S2h;z&XVfRWmG7KR9evI){!lQkNyDTp=!GfV@)+6-ZqiR_X$vW^heDc`0Z?GMHyg zNJ_jMnc}7#5^%+7LYXAd3cQwQ4-I! z%<>d_@dYapazG-)_EN+!ztgz*dJS+2(8L)ngn<^qK+_$uNF0QCMz06~Swxc|^MuV5 z$l{Hf1eH%mlyP(b5t7g%^<9g#e zjQ|Vv58d+bpB`C)6lu#s{oYLd-uZn;e&hM9z9;A354{yW0FnBK7ArlMQ<=&KbG}WV zS8upH`0D1j4qtV@dHj>=JRPKhBbQfB((c+<|wSu8v%9yBWK;j9Y%W*2l~`XcJU*ZcK?-Dfw2MiQBeF z2=W+XkyOq73qOXs+dv@kY+R_^oT=PA!@cc#-Iek8-;h3zeH6?3`?ErSwsK&;bihFJ z-q{k9`EVZH4gympNeKgSz%3*cBa}Xh0C~%UBN$NRrn|1M}OI}j#IeY95 z=i;|5dl~+O#Tlp@hF`we-uPEJ!*!h6l<_FI!$7ougEHXbQW_5f$OBHU3-RB?7i*ZJ zI021{r&n+a@JNITHcP1M(S$<(A6UXT)IdOpE1KNdDOl%?Tns!S$(SswK&uA(*q~RS zZ{d;hx7mG^Cafp75f*KpwLOA3F1>W& zrD^SF$sZ>(EqyooKMsBr%(nDpH}_>L`{zshO`4*Qq5U-!bQt?kbi*%CLFGU}4HgBJ z@EezF7=FN_Ak^)J|32$h{7o3J6Y;yWLDZbAp+#ZoW&fa<_96 QGr-JOZT&mJit+OQ1TJJg6951J diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/date.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/date.cpython-312.pyc deleted file mode 100644 index 85e9e8c180a3fc469ec540b7e61698b3a62069b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2783 zcmZ`*O>h)N6z-m%-N`Ns35%LYz=j|&YIY0o04czqf5sZUfy)S_xk;O z@Adwi%ViKO_FVtuTneE-#YeLAF0=9)Fz1nj9PFVwDkCg-#lv-_tVmw<)VfyIB(HgT zJylNC)8%yCC>t0l=m>K3bI3_iZC;ISmit<1)A(C_m^d;Vn^W%ADe$>T$}KOb*j_vE z#YXmdJESL=J2^?2sYdxq;Gd$5TRgB5wJ4Wx7NZRoW$aK`69y{reKA$KA1h%pX z19q3MRpN5u1T^$_a580|5>ZlOdyLvnOI{HfiA$wQx7af40!-q2Wme{%L(byWQRch+ zX&h!S;;UNoU5PVF2cOOJ1dgbKJ5aL(N*!daYP1mVOYGJpu#>O5@48dVR7xxhB4&yi z@Q-PNKszA0%Y^+%^@9%pe_BYrs@#r@Bxj)zfcpPeD^3M+t%PtvexH^Rykb($Us^0))S zqNs79(TWVqa($OuR(nGa7z@d69$X6d0hva>=QmxLTFmeGB|rAff%#`}lI=eK7coIcM;SMCeW(G9;z;MshDRe6suE@1w7n)h%vivpKFg|jb{JZgXeZyUL%m{s zB?hc6ix`R|k=w-$A6VSmCnKN|z5`?$-N-&POE10gYj$L5!_b8-pT012_C9sKg()seBqk+EeJ5A0u2mHdHaq~s1P z8)#_rh1!)tb4L3(cQ39rxKTo6H!uR%Js?4~Rgl18cO`{tLvaA_?t{b}a^4HtG9i1Cp9Nv3n-QERb@4apdWJtFs zfO&8`-Y)>ao6_?(pxP?Rz*Ki7L4vIMxej4!r3mkDuOT~=$Lhe2wz|VSXliT==&-GV zJUDm&i};~&@9d3tMeaiZfU{`H9Q}6l+~%w1vy0}lKaDONKXLW=$t%ZC{`UO43+t=} z!;-mxw3p1Ryfw;LRy`0iA3zC%(>oar(s-P1pC_T8s6=_*P2OGq=`c^e1i& zVtwCA3hU!IHYKc-%uM_wrg>ZbQj_mxG}QB46_V$wFaf{bm>51$fA4vdyI%al$}G!Q zS9&NMyX|#k?2nUikcp%U{Dq=6&=nY8L!16WTmC}3{y;~sprik!p1|XH_Q`*d_%Chz E4;dwqDF6Tf diff --git a/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/interval.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/__pycache__/interval.cpython-312.pyc deleted file mode 100644 index 97941c6ee6e816fb477f28f76b8465ed49e95814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5886 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 diff --git a/lib/python3.12/site-packages/apscheduler/triggers/base.py b/lib/python3.12/site-packages/apscheduler/triggers/base.py deleted file mode 100644 index 55d010d..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/base.py +++ /dev/null @@ -1,37 +0,0 @@ -from abc import ABCMeta, abstractmethod -from datetime import timedelta -import random - -import six - - -class BaseTrigger(six.with_metaclass(ABCMeta)): - """Abstract base class that defines the interface that every trigger must implement.""" - - __slots__ = () - - @abstractmethod - def get_next_fire_time(self, previous_fire_time, now): - """ - Returns the next datetime to fire on, If no such datetime can be calculated, returns - ``None``. - - :param datetime.datetime previous_fire_time: the previous time the trigger was fired - :param datetime.datetime now: current datetime - """ - - def _apply_jitter(self, next_fire_time, jitter, now): - """ - Randomize ``next_fire_time`` by adding a random value (the jitter). - - :param datetime.datetime|None next_fire_time: next fire time without jitter applied. If - ``None``, returns ``None``. - :param int|None jitter: maximum number of seconds to add to ``next_fire_time`` - (if ``None`` or ``0``, returns ``next_fire_time``) - :param datetime.datetime now: current datetime - :return datetime.datetime|None: next fire time with a jitter. - """ - if next_fire_time is None or not jitter: - return next_fire_time - - return next_fire_time + timedelta(seconds=random.uniform(0, jitter)) diff --git a/lib/python3.12/site-packages/apscheduler/triggers/combining.py b/lib/python3.12/site-packages/apscheduler/triggers/combining.py deleted file mode 100644 index bb90006..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/combining.py +++ /dev/null @@ -1,95 +0,0 @@ -from apscheduler.triggers.base import BaseTrigger -from apscheduler.util import obj_to_ref, ref_to_obj - - -class BaseCombiningTrigger(BaseTrigger): - __slots__ = ('triggers', 'jitter') - - def __init__(self, triggers, jitter=None): - self.triggers = triggers - self.jitter = jitter - - def __getstate__(self): - return { - 'version': 1, - 'triggers': [(obj_to_ref(trigger.__class__), trigger.__getstate__()) - for trigger in self.triggers], - 'jitter': self.jitter - } - - def __setstate__(self, state): - if state.get('version', 1) > 1: - raise ValueError( - 'Got serialized data for version %s of %s, but only versions up to 1 can be ' - 'handled' % (state['version'], self.__class__.__name__)) - - self.jitter = state['jitter'] - self.triggers = [] - for clsref, state in state['triggers']: - cls = ref_to_obj(clsref) - trigger = cls.__new__(cls) - trigger.__setstate__(state) - self.triggers.append(trigger) - - def __repr__(self): - return '<{}({}{})>'.format(self.__class__.__name__, self.triggers, - ', jitter={}'.format(self.jitter) if self.jitter else '') - - -class AndTrigger(BaseCombiningTrigger): - """ - Always returns the earliest next fire time that all the given triggers can agree on. - The trigger is considered to be finished when any of the given triggers has finished its - schedule. - - Trigger alias: ``and`` - - :param list triggers: triggers to combine - :param int|None jitter: delay the job execution by ``jitter`` seconds at most - """ - - __slots__ = () - - def get_next_fire_time(self, previous_fire_time, now): - while True: - fire_times = [trigger.get_next_fire_time(previous_fire_time, now) - for trigger in self.triggers] - if None in fire_times: - return None - elif min(fire_times) == max(fire_times): - return self._apply_jitter(fire_times[0], self.jitter, now) - else: - now = max(fire_times) - - def __str__(self): - return 'and[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) - - -class OrTrigger(BaseCombiningTrigger): - """ - Always returns the earliest next fire time produced by any of the given triggers. - The trigger is considered finished when all the given triggers have finished their schedules. - - Trigger alias: ``or`` - - :param list triggers: triggers to combine - :param int|None jitter: delay the job execution by ``jitter`` seconds at most - - .. note:: Triggers that depends on the previous fire time, such as the interval trigger, may - seem to behave strangely since they are always passed the previous fire time produced by - any of the given triggers. - """ - - __slots__ = () - - def get_next_fire_time(self, previous_fire_time, now): - fire_times = [trigger.get_next_fire_time(previous_fire_time, now) - for trigger in self.triggers] - fire_times = [fire_time for fire_time in fire_times if fire_time is not None] - if fire_times: - return self._apply_jitter(min(fire_times), self.jitter, now) - else: - return None - - def __str__(self): - return 'or[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) diff --git a/lib/python3.12/site-packages/apscheduler/triggers/cron/__init__.py b/lib/python3.12/site-packages/apscheduler/triggers/cron/__init__.py deleted file mode 100644 index b5389dd..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/cron/__init__.py +++ /dev/null @@ -1,239 +0,0 @@ -from datetime import datetime, timedelta - -from tzlocal import get_localzone -import six - -from apscheduler.triggers.base import BaseTrigger -from apscheduler.triggers.cron.fields import ( - BaseField, MonthField, WeekField, DayOfMonthField, DayOfWeekField, DEFAULT_VALUES) -from apscheduler.util import ( - datetime_ceil, convert_to_datetime, datetime_repr, astimezone, localize, normalize) - - -class CronTrigger(BaseTrigger): - """ - Triggers when current time matches all specified time constraints, - similarly to how the UNIX cron scheduler works. - - :param int|str year: 4-digit year - :param int|str month: month (1-12) - :param int|str day: day of month (1-31) - :param int|str week: ISO week (1-53) - :param int|str day_of_week: number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - :param int|str hour: hour (0-23) - :param int|str minute: minute (0-59) - :param int|str second: second (0-59) - :param datetime|str start_date: earliest possible date/time to trigger on (inclusive) - :param datetime|str end_date: latest possible date/time to trigger on (inclusive) - :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations (defaults - to scheduler timezone) - :param int|None jitter: delay the job execution by ``jitter`` seconds at most - - .. note:: The first weekday is always **monday**. - """ - - FIELD_NAMES = ('year', 'month', 'day', 'week', 'day_of_week', 'hour', 'minute', 'second') - FIELDS_MAP = { - 'year': BaseField, - 'month': MonthField, - 'week': WeekField, - 'day': DayOfMonthField, - 'day_of_week': DayOfWeekField, - 'hour': BaseField, - 'minute': BaseField, - 'second': BaseField - } - - __slots__ = 'timezone', 'start_date', 'end_date', 'fields', 'jitter' - - def __init__(self, year=None, month=None, day=None, week=None, day_of_week=None, hour=None, - minute=None, second=None, start_date=None, end_date=None, timezone=None, - jitter=None): - if timezone: - self.timezone = astimezone(timezone) - elif isinstance(start_date, datetime) and start_date.tzinfo: - self.timezone = start_date.tzinfo - elif isinstance(end_date, datetime) and end_date.tzinfo: - self.timezone = end_date.tzinfo - else: - self.timezone = get_localzone() - - self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') - self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') - - self.jitter = jitter - - values = dict((key, value) for (key, value) in six.iteritems(locals()) - if key in self.FIELD_NAMES and value is not None) - self.fields = [] - assign_defaults = False - for field_name in self.FIELD_NAMES: - if field_name in values: - exprs = values.pop(field_name) - is_default = False - assign_defaults = not values - elif assign_defaults: - exprs = DEFAULT_VALUES[field_name] - is_default = True - else: - exprs = '*' - is_default = True - - field_class = self.FIELDS_MAP[field_name] - field = field_class(field_name, exprs, is_default) - self.fields.append(field) - - @classmethod - def from_crontab(cls, expr, timezone=None): - """ - Create a :class:`~CronTrigger` from a standard crontab expression. - - See https://en.wikipedia.org/wiki/Cron for more information on the format accepted here. - - :param expr: minute, hour, day of month, month, day of week - :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations ( - defaults to scheduler timezone) - :return: a :class:`~CronTrigger` instance - - """ - values = expr.split() - if len(values) != 5: - raise ValueError('Wrong number of fields; got {}, expected 5'.format(len(values))) - - return cls(minute=values[0], hour=values[1], day=values[2], month=values[3], - day_of_week=values[4], timezone=timezone) - - def _increment_field_value(self, dateval, fieldnum): - """ - Increments the designated field and resets all less significant fields to their minimum - values. - - :type dateval: datetime - :type fieldnum: int - :return: a tuple containing the new date, and the number of the field that was actually - incremented - :rtype: tuple - """ - - values = {} - i = 0 - while i < len(self.fields): - field = self.fields[i] - if not field.REAL: - if i == fieldnum: - fieldnum -= 1 - i -= 1 - else: - i += 1 - continue - - if i < fieldnum: - values[field.name] = field.get_value(dateval) - i += 1 - elif i > fieldnum: - values[field.name] = field.get_min(dateval) - i += 1 - else: - value = field.get_value(dateval) - maxval = field.get_max(dateval) - if value == maxval: - fieldnum -= 1 - i -= 1 - else: - values[field.name] = value + 1 - i += 1 - - difference = datetime(**values) - dateval.replace(tzinfo=None) - return normalize(dateval + difference), fieldnum - - def _set_field_value(self, dateval, fieldnum, new_value): - values = {} - for i, field in enumerate(self.fields): - if field.REAL: - if i < fieldnum: - values[field.name] = field.get_value(dateval) - elif i > fieldnum: - values[field.name] = field.get_min(dateval) - else: - values[field.name] = new_value - - return localize(datetime(**values), self.timezone) - - def get_next_fire_time(self, previous_fire_time, now): - if previous_fire_time: - start_date = min(now, previous_fire_time + timedelta(microseconds=1)) - if start_date == previous_fire_time: - start_date += timedelta(microseconds=1) - else: - start_date = max(now, self.start_date) if self.start_date else now - - fieldnum = 0 - next_date = datetime_ceil(start_date).astimezone(self.timezone) - while 0 <= fieldnum < len(self.fields): - field = self.fields[fieldnum] - curr_value = field.get_value(next_date) - next_value = field.get_next_value(next_date) - - if next_value is None: - # No valid value was found - next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) - elif next_value > curr_value: - # A valid, but higher than the starting value, was found - if field.REAL: - next_date = self._set_field_value(next_date, fieldnum, next_value) - fieldnum += 1 - else: - next_date, fieldnum = self._increment_field_value(next_date, fieldnum) - else: - # A valid value was found, no changes necessary - fieldnum += 1 - - # Return if the date has rolled past the end date - if self.end_date and next_date > self.end_date: - return None - - if fieldnum >= 0: - next_date = self._apply_jitter(next_date, self.jitter, now) - return min(next_date, self.end_date) if self.end_date else next_date - - def __getstate__(self): - return { - 'version': 2, - 'timezone': self.timezone, - 'start_date': self.start_date, - 'end_date': self.end_date, - 'fields': self.fields, - 'jitter': self.jitter, - } - - def __setstate__(self, state): - # This is for compatibility with APScheduler 3.0.x - if isinstance(state, tuple): - state = state[1] - - if state.get('version', 1) > 2: - raise ValueError( - 'Got serialized data for version %s of %s, but only versions up to 2 can be ' - 'handled' % (state['version'], self.__class__.__name__)) - - self.timezone = state['timezone'] - self.start_date = state['start_date'] - self.end_date = state['end_date'] - self.fields = state['fields'] - self.jitter = state.get('jitter') - - def __str__(self): - options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] - return 'cron[%s]' % (', '.join(options)) - - def __repr__(self): - options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] - if self.start_date: - options.append("start_date=%r" % datetime_repr(self.start_date)) - if self.end_date: - options.append("end_date=%r" % datetime_repr(self.end_date)) - if self.jitter: - options.append('jitter=%s' % self.jitter) - - return "<%s (%s, timezone='%s')>" % ( - self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 586e7d715e83599ff96b24638bde70b00879047d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11314 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 diff --git a/lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/expressions.cpython-312.pyc b/lib/python3.12/site-packages/apscheduler/triggers/cron/__pycache__/expressions.cpython-312.pyc deleted file mode 100644 index 6241e854a1542fab705bf2171e268256229313af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15260 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 - {% endblock %} - - -## Donate - -The Pallets organization develops and supports Jinja and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/RECORD b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/RECORD deleted file mode 100644 index df3acaf..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/RECORD +++ /dev/null @@ -1,57 +0,0 @@ -jinja2-3.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jinja2-3.1.4.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -jinja2-3.1.4.dist-info/METADATA,sha256=R_brzpPQVBvpGcsm-WbrtgotO7suQ1D0F-qkhTzeEfY,2640 -jinja2-3.1.4.dist-info/RECORD,, -jinja2-3.1.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -jinja2-3.1.4.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 -jinja2/__init__.py,sha256=wIl45IM20KGw-kfr7jJhaBxxX5g4-kihlBYjxopX7Pw,1928 -jinja2/__pycache__/__init__.cpython-312.pyc,, -jinja2/__pycache__/_identifier.cpython-312.pyc,, -jinja2/__pycache__/async_utils.cpython-312.pyc,, -jinja2/__pycache__/bccache.cpython-312.pyc,, -jinja2/__pycache__/compiler.cpython-312.pyc,, -jinja2/__pycache__/constants.cpython-312.pyc,, -jinja2/__pycache__/debug.cpython-312.pyc,, -jinja2/__pycache__/defaults.cpython-312.pyc,, -jinja2/__pycache__/environment.cpython-312.pyc,, -jinja2/__pycache__/exceptions.cpython-312.pyc,, -jinja2/__pycache__/ext.cpython-312.pyc,, -jinja2/__pycache__/filters.cpython-312.pyc,, -jinja2/__pycache__/idtracking.cpython-312.pyc,, -jinja2/__pycache__/lexer.cpython-312.pyc,, -jinja2/__pycache__/loaders.cpython-312.pyc,, -jinja2/__pycache__/meta.cpython-312.pyc,, -jinja2/__pycache__/nativetypes.cpython-312.pyc,, -jinja2/__pycache__/nodes.cpython-312.pyc,, -jinja2/__pycache__/optimizer.cpython-312.pyc,, -jinja2/__pycache__/parser.cpython-312.pyc,, -jinja2/__pycache__/runtime.cpython-312.pyc,, -jinja2/__pycache__/sandbox.cpython-312.pyc,, -jinja2/__pycache__/tests.cpython-312.pyc,, -jinja2/__pycache__/utils.cpython-312.pyc,, -jinja2/__pycache__/visitor.cpython-312.pyc,, -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=JXKWCAXmTx0iZB4-hAsF50vgjxw_RJTjiLOlGGTBso0,2477 -jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 -jinja2/compiler.py,sha256=dpV-n6_iQUP4uSwlXwGUavJmwjvXdyxKzJ-AonFjPBk,72271 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=xhFkmxO0CESA76Ki5tz4XWq9yzGu-t0p93JCCVBVNps,61538 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=igsBH7c6C0byHaOtMbE-ugpt4GjLGgR-ywskyXtKgq8,31877 -jinja2/filters.py,sha256=bKeqjFjjz88TkHVLSyyMIEB75CzAN6b3Airgx0phJDg,54611 -jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 -jinja2/lexer.py,sha256=xnWWXhPndHFsoqzpc5VTjheDE9JuKk9MUo9DZkrM8Os,29754 -jinja2/loaders.py,sha256=ru0GIWHo5KiHJi7_MoI_LvGDoBBvP6rd0hiC1ReaTwk,23167 -jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 -jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 -jinja2/parser.py,sha256=DV1iF1FR2Rsaj_5zl8rmx7j6Bj4S8iLHoYsvJ0bfEis,39890 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=POXT3tKNKJRENx2CymwUsOOXH2JwGPjW702njB5__cQ,33435 -jinja2/sandbox.py,sha256=TJjBNS9qRJ2ZgBMWdAgRBpyDLOHea2kT-2mk4PrjYx0,14616 -jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 -jinja2/utils.py,sha256=nV7IpWLvRCMyHW1irBAK8CIPAnOFfkb2ukggDBjbBEY,23952 -jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/WHEEL b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/entry_points.txt b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/entry_points.txt deleted file mode 100644 index abc3eae..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2=jinja2.ext:babel_extract[i18n] - diff --git a/lib/python3.12/site-packages/jinja2/__init__.py b/lib/python3.12/site-packages/jinja2/__init__.py deleted file mode 100644 index 2f0b5b2..0000000 --- a/lib/python3.12/site-packages/jinja2/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Jinja is a template engine written in pure Python. It provides a -non-XML syntax that supports inline expressions and an optional -sandboxed environment. -""" - -from .bccache import BytecodeCache as BytecodeCache -from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache -from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache -from .environment import Environment as Environment -from .environment import Template as Template -from .exceptions import TemplateAssertionError as TemplateAssertionError -from .exceptions import TemplateError as TemplateError -from .exceptions import TemplateNotFound as TemplateNotFound -from .exceptions import TemplateRuntimeError as TemplateRuntimeError -from .exceptions import TemplatesNotFound as TemplatesNotFound -from .exceptions import TemplateSyntaxError as TemplateSyntaxError -from .exceptions import UndefinedError as UndefinedError -from .loaders import BaseLoader as BaseLoader -from .loaders import ChoiceLoader as ChoiceLoader -from .loaders import DictLoader as DictLoader -from .loaders import FileSystemLoader as FileSystemLoader -from .loaders import FunctionLoader as FunctionLoader -from .loaders import ModuleLoader as ModuleLoader -from .loaders import PackageLoader as PackageLoader -from .loaders import PrefixLoader as PrefixLoader -from .runtime import ChainableUndefined as ChainableUndefined -from .runtime import DebugUndefined as DebugUndefined -from .runtime import make_logging_undefined as make_logging_undefined -from .runtime import StrictUndefined as StrictUndefined -from .runtime import Undefined as Undefined -from .utils import clear_caches as clear_caches -from .utils import is_undefined as is_undefined -from .utils import pass_context as pass_context -from .utils import pass_environment as pass_environment -from .utils import pass_eval_context as pass_eval_context -from .utils import select_autoescape as select_autoescape - -__version__ = "3.1.4" diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index affe84893f8a552e193b28d990c8285fdeae25ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmZ9M*>2lL6oyBeB~knC-L##wFak@+(j`C|px(M54vabhin(Daaw5?oXNZ}RE9I)a z>l?JM&}Zoz5Fk*XR|R^}A}9*J3mX>I_w zaa(f}xPv>ITfkl1)!YW|;hyFW@G4%_-1XOjb-b>*2fTqdG_L}0;!VwKz*~4r^E&W0 z-qyU~?*t|`HE#m%;$6*KzCr3O z^n_`fk_4e|OJWi_@+dLC<(`y;njSU72`A>oOpY1tn_oyX^ zTGT1$jH{`Wp2Vmp#&agm*o3+e)K0vwCRBO>Nn#s`FP4H^iFv6HD~YYXq%L^{2jwP? zabyefjM*+x3n?FunddCp#);?1d2fAjAak#JHldE%%iJlSGk4-I#;9D_&TD(LFv=Gk z)-atXG>^x&NA00c=BtCHR8PooGFo=Jf&H3TJ{v*Jj4U{mo1H*x?NV}B=yGszxlwj} zVslHsF`>5UiT~x7Lt6;TVN{Z-g#Nm2FI5S6jT`UU_Ll-1g80OdmOYV-2*(b|o7}_x z{r;op2k%FD%W|1xSy6uI=&5-IDvf8A+3*oVkwK;o(M2nGLAgaG>PyE< zO3F$qN~$1H-q&wW@S3vfN*YRal`QL;aCOxz>u2;9EcEX;gE0%pz?}@qYyemH3JymM!ZDLfUDH?0 z_t+rRw;Qeiqz`;=cx%A9Js1d2lEd((V8q}`eKH;lEX$*ww5)zOiwaKyU0zT5Axx;Q zuAm@)W>TrtU+GLL`?rBok7D#$j80?pFh++l`aDJ-#^_0mPGa;lMn^IFSo`<2K911` iF#?8Q&`)#|azBdEy%-IWA2cEI@vqg+_a%N0ru+|MW$PmV diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc deleted file mode 100644 index 4b8a7199a1b574ada3e5c4edcf8d3745b830954b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 zcmYL~&2Qtz8OCKB?KTa9o_gz{$So-*Zqq|AMgN5U0cnF`vsSX+dRK<+ZLz27Te4-w zqP;6wwk6Y|zDSCuBvK!?C<*AbABP;)*>#$IM?Q5>zyy3K&{Lm56I8&D&ol2lnt6wm zz`wln&i6z3{OjL8_^fd+6uOavZ$C@ln7g0C6hkYam4&s?N1??~IP_@o+tB}YWzkyr z-{_;oXAAEw{ZkHp{qz@D_BX%%8s9lfnA?mpR()Pb@RG)ZL(|oEA^`m`^V1L4fb{Cjm6%$ZziM_7-=Qa zjv+c}bx4ym17g!ziP70H=?9GTGtzZNwFK2JAwJcnjOu$-S0P2JSE;U3BgUwapoUKk z%r=wM%uq8+%^U^_HH*}&Qd6hqlv+r(64dgkg`^QDBSS`(3?vPO43&%y8C^2^WFl!M z$n?oX(n^t)fozk7sHKoqB}*p@Jy|nqBil|;+ov|Nc9QH2*;%p?wH2}pWEaVYCG)WLK&NnK2Lv(&|OSE23;>K3S5rLImrY}QLq&!--u zZjxL?-7L9?x(c~3$SsgtC08d8OL__N#^m|rA>B_>AL)LU`bhT`>KCbBrM^ysI1Lgs z+@awfqv3NJ7HD_~cS^$^4P6>_Y2+~)UD5^a!^P)x*`-SqE-&bEOqV{5vy8?H`G@3} z$nTRsB>#f^Dfu&+bQw*PG)>bqLsJEVB2Dp(r#{WnJZdo>o$^?L@mPt+DiDpws*oCw zH6b>Sbs-*)#~F_+Jif={M{s4Xlo?k}`N=-xC(rpw590CiJ})2ea*vl?Uhx<|J>aKh zuH_il6kbj7YMNIKUeg$_S-jSPjCrfbcaiOJ!mJ^!Jgw_<*sHnz76+t~EbPduK`b^XsOw?>q z&oEIx5RE7kjf7~pOf;jSSr;vXiPk_E31RFCLlMT931cG6jxc*nn4U0)!W;>6D$JR% zV#2bRupD9ag*6Zkc6LnRw1s2ewkx-zD7zi)-HtSfb31ZxN8as)!fr42Zv9!1&rE`R zP7CtNfZ=i(_?(4R&Q=4~(Rd5q!_8gGP||YAAZmAU{dNO!9#mjWS%~0C_c* z1~ZsAD)Ejqmw}p;nItO7rZirlrcwaelpCmNIh)38+J(tP!L~HJftqc@WQSlHsJT-N za%Q0J$}j9Dz!>;oih_~^8IT1zSx`U`RDli}ve*W)F9luX`!FinP%DADFRKSwwcx-M z`aqtjh<=JEpd6@&GEzd}$bvaSUngal6Dv?P*{O!J${VV-c7Qxh>jI3W!2t|(XQ&t$ z$AN0@z?h{#?a1vq10c8S%mTHy57TP`LmEtZT^LUq?BL(j{EYGir+ z+1A6zlg;qPAHo~UYpb7pQ~3D@Kl^Zbb9F1s*6%;~{r%6vo6C<@pFFz%;qvcRSHe%W zRzF=0Z+x)+?DhA4`8cxjbS?a=jkmC;e8X@47?)saVPWAq^j7fQ(Az)EzPtDS_WQwN V=sSP<(cRMG+l#S#8+h%9{tM&=2P*&o diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc deleted file mode 100644 index b53f82683e3d4f39eb680d933b08dc8e40b0ce95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4087 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc deleted file mode 100644 index 6109c68a357162350bd4ad60971d0344459a1808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19334 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc deleted file mode 100644 index 0de8e256a8623392184ecb3722ec9ba5a3988df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6575 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc deleted file mode 100644 index beb0960c25ef6025a14d1cfe1123928c9aa81d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1615 zcmah}TW=dh6rS}hzQlJs7bm?Xq`_)qs|6vDS}NDwv?h*|CJvXSXuI`HoORc`W_C^S zRuvU5yf#lMQYHGzZ{fu#FROt_NC=@wJfsQ|5>K4jcu9F;cRlmXcfOf(=FA!Y5RXR@ zJb(O^Y##>@`jrp7Co%%Z_XULZ&=$f73mTFH?8AP|*Y!&Q0RawZ!EQ(zb8%1$cOz27 z#Ua2^DeB@ez%eQ2;xOQGXr#%h0eiBj=N2C;vN@*OEGI(6d;<%K<2`P^S zX#(b!PUm=tOicqM(>Qqzde9aAN0)MSX=w(hrCFSj&fqM}&W+f!_mgd0IvKPl`Po{vsb2|3Wwr>>a4EHqa}W3+$=7zkTvM3dYcIr z8{1Yj$d*arVj-6F#G`{{L5rA{N!@M6J)?WnEZDbH&7>iiN5^;*<_*7(EZ+QNU6iYL z#Og||ahs)2+{q9d(M^clWIl_q%+2~*b%mepMibf%E=`?qV&j&_(pd{AbOK$DS%F|3hKnwI0u-qA@?55=+XmqU(mGaMF}z8snlE1hy)>VQsQ_ zoyWO88qzoy!1#9O5+ zSIZ_;{u11$hf156<&LU%l&fV-ww1nSnWf%GhA87?Cx#xh@RculXj(-{#|(=U2+oHr!gm$e;Rk*yAG=jGw(0~}n0pjOiL5i8auRb+BFDdU;Z=Mr?;E1@(FB?~=VWHVmot0bnVfQ9SXg*z4W}=| n>{sc?n;=U)yRdh0_u}*HbLBhoEqPw}G4sZsC?fdiRoLr4xbxCk diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc deleted file mode 100644 index 299213322efe917f25eb7ff2b1e0fd3a123d2ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76711 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 (2_!Wd*fL)RW4*PGW3?F{<8ij!EIC{L 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 89629799cef31305d3153b9be1e818b90e29fab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7724 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 P!t3azyY~xv;m7`ez7(X? diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc deleted file mode 100644 index f09b3f94a78c73ec42d9dc5b17c26f72bab96d68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41877 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 Ij932u02fjBi~s-t diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index 8ffb9ff2a064fb5a401502701f4e55b6710c7279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72029 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc deleted file mode 100644 index 8a2b45560ee7c038e1def03d68e1bac86831cda0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32046 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc deleted file mode 100644 index 00cd25058734d437270d372154495938642bcc0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30972 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc deleted file mode 100644 index cca4a64593fa9310878bb4395737d4d83d6d3e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5479 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc deleted file mode 100644 index 2f2da95bcec9b5c6ec5d21a80c378eecd0ad12e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7028 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 LOQ;a-fzA9GUgk+b diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc deleted file mode 100644 index bdc749ed2e4e7fc606c5f3cf277b4f6e58f0a9a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58228 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc deleted file mode 100644 index 57b04bb82232aee8dbe312ef241fb6230a84d710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2698 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc deleted file mode 100644 index cb275df50c6a73dc08a57a2e2a63bf145e038bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48501 zcmd753w&GGc_(-;UIYn%APBynp!gOk>Mc>!%e3CI&DfUY#&lc|A}%FTBtc(*k_b}{ z<2W_xI2GBr5!56js?F3??XKmWPAzxZU+gq(z3u#V08?2qh_a)ZB>QVS`+!VslepcT z{eS1&dvO6?%1$!d>5+JF?s-4HbI$jD=R4o|8<#6jfcf8l>OS-J7X{%*^r4zU#j*0D zRS>QSL7`U&ib2z`*ekMMQ?H5rntLtyH4j@yY`r#-;#h`rM(n+I=C%&!j^y>`F}DqF zN3VmqbKrLNI^nhlbBA3c`Mvqfod>tO*Uj9H;eruQuZOvva2NI#GPetEZ?BiR^M{K@ zihGNh+dW(|QrcU}+y!u#^_DTW2k!FTa^^0CyP~&(xxH{#_Es`?5!_Y1Rm@!scXe;I zD3}DvGPFnSko0e`!7}(itbV0`2TbMoc(eQs6Zh*~hj@q6 z;i^lnXT9Fg+rWMsdz;XM6~oOVExj#N<0C?_@+BcyB{dB_sisN)zG3F>-t}jMVD;~c zy>0ld!Ebx8R;ms9q}l;Xu76Z{VQ!`rM4h+AnmKVq>b=@Nc~Fx23yaF2sxYfQC&PgJ`UUtu3w|% zwM$%cWLaI?r0v1>HS-)+Ym)wDt$1*r8`jKkG@Xy?`V{&3f~^Au!H$=#y`2o2HUgS9 zX;8T5F1`ck^q zs!QrtVEh501GZo{`t1NK`(c!QK{2jvI z;l3jirq*N8-6zjVK6!jJGB_gn2F6GGBZHyQurDwg^o1jVh~yg&OF`f1315F`WNdI4 z?uaxpHjI#P$KO#qdRoP#IdHlkKi2-Ufx%HYY*M&CFeZ`fv4DJTd<-soI5ZIPha>Xe z(K2^KOy&i~BO!laFe1qaR=zIa8(#${l|p(#k;9?!(IEVaRKF*AZ4b$Eh*IXC8VyPV zgQHSV^>G|J9~eFm8jVO7DKoqO@jy7-EuVqg)*l+}50I~O5aIG@V7NaNq?+c842Hvl zqZBE(Com#~#{&K2Ul2MyB=tx9k%=+MFH2)oq-P8n`X!X&M}AaHQhX{Y9_~Px^|Vr7 z$Dz^lgK}teL>i6st0PXoxyr{1&A}^zBw+IsdQG`PFefNV<{`ThuKSU!3{Xr#A!wFt zL5q|#U=LaW7WN5St38?jXec!Hq=bHu4`T?EIkMDG{hBNoMgVF}A$}U&q%|mwMb0K| zvJ@GYNBb?hLdZ!=`3iYn5hgH5JvW3_OVSdSh6m(o_{ue8)xru>Bp=Mj{*7ltBhtp; z_-Sckqm`38_56Te1Qt0j5m* zUTZGpFp44d`;&Qo|41k}K1^<>-~ZfrU|0zeBT4%)^jYBauq2lvUD6B)Ntyw%GUYGV zlhsUCBUx3dMPK1AST9lG6_xjLt+^$4i%YKb&h^fVbI+!%_)gh`+Ks6ka@mEV(iFu( z?0nCC2V6W`%CR*+>7Yg`(3|vVKranQ7{`7oX?-lv56HJs`7W}&WC5QNl8zBJ+x$bJ z!BI@Oh^)8I-PFh1-X2+6*FNseHd@I}sI zwjmz5q&xy8DLr92mMBSTZCe13sCJGVCpP5N> zP*n2>i?7y2)Y&csO=|oh>eDO}p`m1EQk*oYIjAZ6O(MG2B1GKjSZWx$-5lKyfWf*Z zjRt7_Mvn#}KE4Q}hX;J4Qoj@q2jmI1uw%`_G{pEsLRjQw3_}M^k+YEzOtPea1;soP z7?Y_@Nn2oS49iC{=WHMxh+rifjjQP*E(Y-7TtAIM}Ochoi;Dq9hdWF@@BWb>b~PB zoZTAB`<|ozj<-Cv?yFr__RsDA*7gPO!r8_8or~Vi51pN<9HF4>K4745w*Jez;}$-r zGGKse&R~Eb=Zc^kfAVD}LQP^O4GFq_7Nc8F3}W|_2(oqEhs}|CG)!GjJ10KVgVE7y zW}PJOMaFUmEI>4MmmZ?GQW#m(C1IM;Q^JoOp4aMM>yK^y>V`#!FK+R1*mmfqiClr0 zNte1MvsEr>J3SogKNn8s04CVpWH}#@!%18CY(SPUl4piPrvto{4Ih5RV2q-_ixPkYHZX(DL_)-W!GX>Fx7 zj~g~Ql8#a7f{IYcClTRU{DohFh2^bCusf$Fm))Le%lC6!%bwyH+mAiPvuA#5WWF%r zX`he4nzkY6o(+@WPH}mx>8qccKD=DvyVicS{aSS3t z3a>OG6BK*RpdT&3%fE&U7^EiiAEssENfoca zDn%V2_o@-X)T01T1vdTuGZJtJX#~AcZPW`|@D$R8+h9!z0Mjcqb2Uqzri7R538;Ojltdu|@S)xGH67q{=@z@_cTNK8#+V|p46u!?m1HP&V&rcoz-9Xl;LMQJ<| zYi5W#KFfUF6f}R+iWS1rlN9$PMPE|fM-!jWeYpjZd5=-A+z?q0>6UE*3?d2E0t_DZ z64Hh@z@q*rd~I9I^3|>-Z&SkC6fbO^e{P}Zt(qG(ORaknt$X4v`)@rLcX!9_-Kryt8b^pAXX8ryJ@h$5OD^>yP{*+y`J}k!S?+f(H^P+5$ z4q7GsBN9;jV8)KCjbRMYUdAY*J`o2Z?`nY{PhZtKjmyz+I5Vm;h1vxMlX7C`NL9(Q!KLCuc3{F&qY9SMYh*hOe zndt@Db&$spWtyTLfQ6FpSo2@@f5AWd%pzdLBwE{MkEH+;ZQrVUz43Y@fk)elS+K2R zVfV4OxGwLQ+3{N4?5RaZW!zH9D%y{{G^6egD}Cth%$)>eu`g&2(oSL-(gsjVDM&W> ztLf9;g2HX1&;p&e;*@N(k_K}gkSFaWStckjJ|7K0mf`tj@cHa(lx!I)$x4jR2e*Ri zI*=F41;OtO+Q0zFL*Bo1{eljpCd4tz1f8rLThN7_I3K;9kCNPoYtXwa4+DR2s|rv{ zH%q%lIcwzTQF_l3EJXPQS`J2~Sb|=}@vvI_!Y~0`qX?-Bf9cf4NbQx1f+cH=0&(e$ zYR$Ouj8|_E8Z0+Xwbp2@5nJs=@b6!;s0&hWF-EfzDU4>qFEOjw+;Id2U~p9!?Gl_< zluBhoMAu~*bt&vESK<)um1VRz6-t~PSrPE5#i?ZQ?~tlcb~VPK`V-)!261Z8hc=9Q zE!?%>de*W1H1PL8F9^v5PQw_QM79xX?>ieB4uZNv5D2G1VhDwOp#fh&i`n7x9gBc; z4#@~nxfdL-_YrH5xTGPLftELsg&?-LFJXkd04-d)NX)V@=X)Grnvk8Fd`a!I>WR?%=Uo*2N6Cz z9J+vR7?49FzBAG&u^p7AYi%O#t}iq?Jb~JrR0n!sa2Pxa&gJIRu#WXjJTzn)2(t=x z(Pl~&2E$irWFN|ku$~KmTYf&>cxC7@6a#}Ynx(S8SVjy0bd?5x1p0|9!*Wvl4+9_E zz^a?>TU}c?d@2AC_EBusI3J-6z7SAWrK?-|P{+P@R&pQ6&TwD5ua840xfnsKIM7-i zOnjS+D6$fb=b|G3C?%(yz{m^x{e7+I-R@v;kj9w-8v&|BKpXIN5n|ZYhp7@8J}>pL z%s8%ymIEk*At^lC9PteV28VqY0OCl~_lPvXxcPm))8i4elbF>sUMzJNqrJQOG!|x` zk2C2RO|S6r({q>4sUA+L)4nG^K^CF(oMwLnu6{jjpb=;|{Uibn^hBDT1g}HzYuF#7 zH8oOA#|Jc|K)^Fp;vx^iESZToRF}G7BUG!;q#0itr(@DOmA5+nsLpTF`i4?Fq_e9z zPg;fui_J1>c?X5dw#zyF=0Ty~^ei}*j0a;Qe$8ag8S$&8R~;6iAN-$7Hsq;oxD$vi zD*hJ~T-U)nm$5+(p){E|mPtE5D~Vhr&TJ&<;;Wq$^wVT!Baw6}Y$-p1qx>04N(_}& zJ4eo0UIycq6wf8a^I>WyEqP=(f%7zcq6G)|lCBZy{~EsG7hr*-QXrI8Pg`DfEVr!3 zPww*i?bDXq_Od%=_45ap8nz`Gw%rUamhDEE>rQL?8^sh_v0PNfA~&|r`@eDE8;Ab1 z{??g)*G@s@;ODn(eyjaP`{%-vO_A&eZDvN7!$KYrh)yKmPo#wjD|A8eYCY< zu}+E|Nh_8`Nd}Ql6T8*MnH<(Z9DQA6XDT>`WJ?NL2a>rsROF|ItixNaI_}2=GT^6N>hESab}LlbgR>Tz=)5xo75!62(nm!4*|pd35g4`O?Lr z)`jjw(T3?m%V1M)f90|Jc|t)AF+&!bZZca|Utca|Kn6@gySnwL3^D3I`HQeJ8DeH^uu+E!2Ke}Z zqBOz+5agS4D=~aA^W3huv+8Ge+@&80B6(H3(vvd7^>LVv;$F1m2roN|&98~YW65H+oKUX81=IEtH4gzC(>JwzPGG3P6)^>R zknyJ+VIX#^_GE2*mA!e*&etLy8}Lnp#)0QzMiY7z#7PR!Lm+pjrL%$agCQAUg>x1e z=b2ifO!UGZlKlz-03?MV3&)IMAICR3G*BWWm>_6;Ov{HcO_=NhFlvsO@Km~NLZi~J z1fw#o5#TNsD#(zow)_;A?Q$S=pLX&C7%cx9n5YiqI z5ICG-pk?eAUp)bD3}s^&79ol%r;-3re->d8rFE_~ z;h^>K%C5Oxu@iIq;?BCej(mi)&9x;Q)fBROZg(tqvSL4uEP=)r5<_?`kmG;_#I^{Ct?80@f}^ryYZ+m3+33t%O>z$q(6meAIv zBCgto6z)JzjiW}a|I}W)K%GGFtR9~@G3I_XakNP7KE3ZxDNP3~oQSt>SZdwIob3#b--HlVS6Jo=IDmpc$IUW6XTyO-SO$0R^vP1Z+U*X7rq-GTE z;AsEwcn|^$ESlP%+DuWggfPg_!$3enV-RZ_j4CuSsO2!pw(%Wd@XT4pcu;Wzg|?*W z1F{}+K`4A|!Uv8GF+RX;E$Uae`^F^&I` zA}Lb^m|)T6iB~3+xe#~OEW5pzpMT|fW!eCZxa0QD9=!6%+#?D1hWTx;@4CJVj<|gT zTd|WazXDW#KQ`Qsq=iHjlD2af=r`l|kzj)m#g%^r2qm;HC|u$&yh|W^40F;b>IdY+B=mGS;cRNs#E2}@=%I{O7%+d)3J>aNz@F9R zvMwVREN|HcxfCE5gOGGCXkl@7I`ow_sBtEM>Kn(g=;P$#91M#qmRc_P!AJ(}U;`vW z4I>f_>M}(1W|j%s)Sk;CGIFAScYtqrGzo`?iLc0KA*~ZCgN<|YKrCDc$>7{6QfFxj z15%0Sfipsm70e{a7h=C;3rH6K4l9OEwuV@$jE|Q`YXTWHW0j84Dg@ampCO|#Bx{NF z;kr`#(yPcxCTG|K8AV_eV~jPDbodz^%s!$=7b$>f1x>HcL zR8W^FsGDzmz2kbvV!`Hk!QQ(?3@8qGiuw`QBOEvb&fCZ@BGlNe5p_wCr6h z--qC$irHPU2(X!%gUhbsZxN)j_O)&&+)$?rmJKB)sif@Pfg!MpZ+CI+{6zTvjLd0F||GhcMu-juS~a`V6MEsHh8y{+>QC}@p4 zTS07AeI!_jeNevSZA^F@m%JO16%J!PIF>aN!@x`o14Q{aO!M=*)j0L>SzEMiCP$o$yf=CE{|kzA*S9 z+8U#s6fnj*l>;UhiEok&t`_TL&ni@LE84$8f_0C86G-UdvpC~sOkfeipclQ-IEVwL zuZdSgQFyh)0#WflG+z+qb;tl56wB~nI0AuUQ^zKm5MlWutV{wncMl!cTpW}4Mc1kG zTIs5^#Df-xCVIFQnfxtDAH=I4N$fm+BeL+^&AQlg-)fkD?)RF%F$}MtGgSD+iYgII z}c0pc+XCnG(Rm z^VTdo3znQ!31?L-cx~|N;6mZT$+tdt<8yEP`mK}iZTp~P#ccBCP3K@;sq$Uhdv))0 z4*1N=cK7A{nfxVtbprpZAGsNM=lQpvU)p&zvGeHdoyQleAGvLRWI0U>0a?=wx!H6i z?D0V)IYcyZ2W~AY=sb9^eAG;7@((QN2IR{6Et7`PANizd7`^Xdb)+Eb1Z*{OWnyk3 z?)H7?-U%M(!M7f{@kqR3XWYJXHIso_!&*e>Gb31#RknEmv&*3)K{Qs@i$G8qaWS?w zAB$rXeSOb7+Xn{0#AqaNkuxu86ZHkOS<{z3lY&5^o{?$DNHjA-nR9i%gm$P<_9Wa% z3p-e&=3<}Y#}&VhkEmCj3p$3tG3wIw2*p-s2a&MkZc4bD=EIBbwrR^Ne8?2<|AkI{|Jlz@kwtt2pPl4g2{eXgr zDmO+*);<3*e(3!e4zNKUGGV-=_0%ZPE%^n?lW;2e6|#tfB7cP})@a&-*J38iw$Cr=;w z_|@YJx%1E8?0)C?+sAK(-~LRz`9PxTV7&BTqTo=>u3&YOXEq_?FN@=cYw zt%b3zDFHw8n_u5~edogFx3=HdezPs!wl`6~Z-oL<>k6!;^Zh9SKMR4kq#H;JXR5(u z-5U#B8@M_!e`2BTt;QRT^Sz0hO(YMwH)YSYcEmi_O0Jg7n|ayud5QA26#@RK62VrO zGHtNt-$gePE?FOY?%Md(@!0x=yD?=&0HK+l%i}ZSsT}&U3*MqDjdP8uT>8or@*LFE zSWtD4a;YOq?*UV;iXFUm?CP;aN7K~7@4Fy~d+prSbBnI^Q-{Bgu#?w%ul6oF zTc!@BAP3qx?hunWB9V{02?QMEk5mbRLprB&(4aRnP(h(N3o9L>%L*o$wBc4JipMXz8<=qv%If$>NY5|*QMIsTshif* z_>7ij%8_eF?a$B(?L!P~T=_zAIXgBltEJ=g<&sMLIM~lu_;w`|t0V(2)%Gk!2*Z$l z$j`CU>?G_&7G#uV-cUN|+~?4c?Z&&65vgIw3?j0`09aR_af2<;PNMAcEqEl&!_uhy4h8)&S%=7a zku0_!GkJs{KK1-e+R~y$StHNR!q3pKPaqh>4$FpztKP6@OsxE)!aL`cgfohGI+_mBjMe_&bQy$_4clt8z2K;(EULUopJAEXWS4)cjZHpm`=+X zf?f1h^^NLVmTx=Wb-Z`-ubz4TnfQs5@B0_sr{eZgtI;1js`EwsVI5ORoHPXsKGrWl z!_qooJZvhEZDB_cXK6bYWuz7z9U*iu`F-Z?)ZMOVsQD33Tc0 zOSfwdEjbS_IuFM@uRIZV9{yRvdHCnIorgh1<>yVCuu%f4_Rj2Ga?~XpbxV%+4;}5w z#lX0;njK>PJiG}7y|}r1pZIS~-B$a*wRD^F-W9vW{68_n^=B6Ny)TMzzHb)EZRtYP zjOB-xI$Aqde5f}gNbr$uj7~F+CNJa5(t?&{)cpfXg(f<~;L%`Q0d)q;jslNa`O>Ef zPwFoY!wi=YqdnGWcLiK|)nd|w7@g{>L}Xri{lG2IFduvQ&yXk^*a*(#KP8I*U8Oh~ zY|-we?k`Pn8|*K{0rdNyCwLk}44jua+#De22HTQj!-tLySYWvD%%T^p!A5{vyr`WY zpUhiccU*TQirPV>KYQcZ#iHGdu03=-u4J+%RI!Dn)niC9bf6*%-S8;bAM%^@{fA_2 zAd7ZNusCHB(ZoIMx5$r?1q}OVT||wQ>&a>+tC1|W_LB8kYV5mk&@G+zlqJtvbvNIW zvf>x3Y++?8hg_f!J(thVoSzL`8JZiKZ=J6ME<1E%=$7|JC|OwDD>dH|oo|)qTdMP|X1+Bj zxlHFH63I3i(v&@@WWGOCGeu zgWjh52#wH-WLyuoRD(D^#AymP1xaU8GwXrJKXpr#dr#<}bx7SRt^Y*mXhVt6ucVDy zJ4$Rr`Ua%mfcv=3@6I02Eo!G6fu;0r7?I=c$DbFSLp zDE#OKLTEIPsD=P^qwteAip3;gSY8x?^QZsrzryt3P9sp#Go+`)9~eMsM6GZsSp=Py zkgJsR`f&pr_posj;S7@`hOD2We1KGVFa(ywXqh&YaT&Tts_4tch@4G~&dMOOXtSrk zm9wx`ky(PFJgtVbfzV2mT_i3}IWfaXGK=;_BpIO=%uI+7vwH|jJL?_lAw_aW?cpxm zGg0~)rwY{nX*RwRRXYjnGLXUZF{wN{k)R_&8ZL0%A=xs@FNjcyWX5C((shuDL%Ac$ z9Tf6cihz6(^&gk1RORF-Q;02tAp@ZFLsk_ul0+*FiKMZ9q4Lal}DGgV(t zr~L=2YgtBJbzSo&)t8V;D4PJg{^*xqh})}I*My*#%?!Hqx)v%7VGl#}@&xw7PfMR; zZlEY`*2)dC=o)bZF@r%!u4||>(ikAlYHu+FSR;+pa!B}9jiH~Lx;pE^jrL{YT%hEF zbdIVkLf9QM<4oRO-@d0QjT)@`)k(#R(cgKLEraS!Efv6ZqJEH>rGr8>gkQN)?m}U@ z(|?4^7w9m9ZrZTJ3JBBck2b=CQ3z}gLNp@mlW;Rk#%(b=^T&B4W*_D`}5&L=ajFUwGC{K~~mt+wIp`!Z?R(0q;6q2ykMho@u z%KdH=c zSk>grWZYi)v-=LApqwP@5wElojL@E|J&UDn(?^%9>z1lJ64f0G7ZGyYgT9qF;)@=^7)zPV^7R{K5no1)!Ve; z07oeJ)FBK+on^yV*$u0I1N!6GeUeS9S}=uLX10Ju{2R1D{vkD)Xu1qo(8gdJLe_!> zED;)7foO_}Vv%FVnsU$h$Z2fAI8o!f9a;gQCAtntivo7%%r?P88IVo7CFDuzxpBx4 zzDWnejlx@7l4GMDfOpad5;MT_;Lsd>iG zjVL>HNVuEh_U36xp~B-|}=d&>hl$%o?Bf~BB% zu7$ykDZ1&`&f-oc!`zrK3WFAYXH|nEJ>+yS?J@FyG-`~MrOSkU=5?2vLF>JK_68E} z+PJ-TbrURz$d;tn9?*oeDCoE-uZeHyBmoT1rPH~nVy^mqd97U;*A5(LkxojPq0-VY z!%|6tN52m<5rQtrm;}1C`v-X{wyH=E==W^t;#o-XVY}_{eFm46ePfbz4i~g>l7v_z zzQ9@B^lirk?I)#qT1HeNCNA!EQTfW0Wn@twL-q;jC()wu)6j=E4rJQbe^!EOFm@3} z%Y|}fcXg2!HhP9_YZnu!k+|SXr~$FvP(dvn&hNE7J!zqce9I4F1a&wlkZx*?pCUv{ z^vgop|0e`1J2IvPL~W***^KFtzIkzgWHI@bZf$shKm~&5=^8(qy+)7Pq&p zp3pRz*@PxZthLr8CiP6QvJ8}0DdWZNBGBTHWf)%4OYLV9M45hiLY7~Jhw4deNK8Gf zFE~!R4r!ihFr2mMrTZvaj%YHQ7If#7)@GGJ#(Bu!qBe4ZtPjY_?n5wo5g!vbbAeZV z|B?EV_`B%KJc9PFSGow$q17;6zi-jIKknS0#xEbxwRAfBNx)5aVDtdax?JNxAOpo@ zbU9tgFa>f^&+Hy%iyi}Q#3&l0n(LUx?HOv zn`gkyfw%+Yx3N!6^bhlyhPCX>S>NdZ3ArjvK-vY-mAKl;uDz?<7RMWbX=;F@aGxm4 zF6@d><01P-!1?1PV^M^hEefLBa;zBLgR*M*P1A5OSs$P z_I5Ul)cg#E}OFm<$T3g2Cu%UEPwtSjDz~B^7lZ4HaJ{Nkw?;>hWPYtvNur$wjJK zFjkZiEexzm>9IO_7*yf^gx0I$Kz)=k4mk>oH43x@4Z=H{^~ZeMQI8cG zNhbMfB!j7Ki2qqB&WQV?Td764%orEN^(g`yX7m6tTCAJBhM4ag%BD)3u#2LRKmmw; zaLD@gBKC$nHIz%e#_K>}sqH8Pqyvz;C7qLYgtz9Tu|)ar;lYu_yX5*Sve*v#9$XoN zj_#%fa&>oe-;Ffvr;rHUjdNSbm~eCv`X(#qDyJX5Q&9&l%_F2CHF#xoZgkPpIQ{Tl zyYsT+702vz347UB9LuGZS1!$60w(EPE~~(g3(8ezw@qK1c5_(KIvK@K^BAm5!Limn zopPj^h8c^kp|(J_1S7X>gF&}s`{5A}ldAL|%dk26U0|rADmDt7hOWhfw@(y=kEo7z zJ#U_|{|sJxr$VLkk8njn$(T-GycSL;Ucy zojl}aSbC6R_nWdOFD-O_|89b&y@-!RBwvv(i938)*Ov=Uk??*#6F{Q#^`gs{W-i4( zJ0E%d()CNX4u1RiyT_+5ExM1y?MGIxFti>ps5uMAe;Xa9&~CbxxHWD(t`fISiW^tU zT2G-ihRj7KPn_LFT;BQ^b=du}$JN+Gs%$Qm~AQuCkDRTXYtpAOy|Bjv z(Ai%S?wL#w+QuUR1yhIb*49rQnSSDO?@VvZ4E)eizg$!~b$Gh_@}ZeSi^OE3kr4r3#t(^@+*^RYUi3S(yMhPAeWVN=$AfsS440ND=ftq^SQTulnL*Mx%;|=(WRGHTRj_TdUA$Vk)|4ygZQFck5 z(Bv$WB}5E_@M~5QBHjs1lsGyNBX(tq5MP1_F;GWGRz~X04^FNR^Mb=-EMcY15y#{hKd1L~@Fu@zR z3VbW2ojh8)3V`@Y)>8yJHxPpfA(P1GuXd2U+`8ednm?#nD($>o+Bx6-J7S`=^XDIy zc1|CSmv;WQI9L9s@S~{hi{%IG;x{U~O~M~L;dzZw|7wEWIS=1xwz8oWyAGP za6D+Z(j0;Zos=;xlG=)ZEEV&hOZplhm{maVtI5`sXaPVJLvBY~=ODL(mow9K)N?UD zSuREcEy!$Xivrt{AnFA&fw2veg`}8*4Z$%mXc*nF3JU)VY96gzHBRYssbLx^BHkDn zW^fv`gQ=9ooV#w>*YJA&_53AYXTsOH=<8al=z<){Bb;KyAveS@Qn^Cq?w{Xr*O4l~ zbqa%m*!)Ux4t)P9ybFcBSlhiv{N3vAQsLWTcd_MtAs5c~bDi*gzgQ%9X;Jqs^ZRWs z^63=Gy~_-@@zg$!EHzjGL}eQlNzq1Dnd0g3p<^+OVV>6W^8bNMR&^(lMbY9_-APQp z3)GP{2-oJbf6l*H+=ScAZ#Ku>o8xxe&23V&A{Nz)UlZ#rR~+>s*NUjGG_Cb)3Pj-e zWt#QN9*Cd=YN-QS!Pxo;Wy>pMy$36U%Rt1S!Q5B5{m)ZJ5DvvVf}i>9kj!8#n+iRja_L&VMoE* zP#|iy(LvHL&edFJ%ng6bl@p%`_%@^igSSsC^DBZYNx_Qa7`4`}S0@ez*aEZ1TyX_B~ z#P{>WhXu>~jva9KsC*oP;@0wPK295alP=xD8|?ZZnMU zI~0Z8oMDWaAJHf6s+|AA*fER=!&onP!I`P3#e0b4s;78q)(Rt7$a;)=uN^VI1mzS3 zbb!roWaB>eqNVY!)sr%rtqsfIh&0bNgJ@oVb^ZJkS2y5db?uGXTOM4fj#unX6z+kp zU26l~M6aExjd>Eel^m6CEYD&iMGTJQq(P4)GbObHr&k-U(dOo!=LY2cpiEX z629GZl}BYJkgGst5rF(Jy&KsFRLXm06#bc| z^XbwKuD^iJT>HTmdcZ-U!E-?6(=#dgTE3b?d7vd1mtFGk=fIy6G1YRlc;FPUYe0Bj z*oEsbxZ^E3@g#)t11I#DNrf({;tUp`MmGIL7dV4O zCthUeKkMhZ0r8|A`-1XBI%>rexg_T!Ckqu-%6@uAf?o&iCyHG)W;p0?1)APyv!PQU zH4HQ-zTnS|?p#V!%7<`D&CG-DNK9H0llC(nlN8YBXkR(_(y+>)IB7W#9MrGXa?(E4 z6)DzYi$+W#^-N4Ihq6KvP0TVu?IPtR`=lMY6UD*I1lnwrXGE|~BT3xuBpi};q zw6aHe*)cR&-0A?~Wd*yPsLH05ptmhBe(MdfsoUncxNu&Af^;zwb{}ozOzlH#u zoRkRFEld$U)Su%xE$>e4y7^sSe}TNJRJHl#{7yub60sVZ_erTf-GP8WS8emcu6Qjj zNg%~tM|IrM2+i3s$5L5GqO9Y#d*gEBrlrQ+iN@Wx4lXu!$DygjE;Q_zwtUa-OId}c z%{&nPck7|cAHIC`nx!_+k>!Jxfh6a_gE&bmO(25^h~<{_&2VVKWa{+O=!+^aC>N_? zMrU>OVl3V-6Dq)}86`1A4SZ3OVlJ6=*B0>pGh$I)vP?x9_$<0x-P$C&1ig)TlL1r2 zC^eHBIEpZX_0=dhsxjW+#No-M9FT^lAx~Cy@Hv@&&C@=a6SR;_sSLg-YGE;&K9hEJ zfN_d=(tkq2G!$}&U5NXRllyrTVP zjyj%rZPd8-x#`*?Z(mj>_>>FRNU14G6NS-7Cr$G4pk>koP1og-dNr3ImXjfxm01R= zByzv0y)OKs_^DFlMF{0#Ceo_9(yTqT9bY$nQ-dCe0SQJ|L*?2v+C=dUpp@W7%^$5j zqJu3>h{!nQxr6Azji0K0daVYA5Uth#C#24ATGcPsMnWXB40NMt8c&(-QVp{Ja{_#q zNRgW0lKp96R($n>_E?3BKc>l~8xFG-`DE1717Re#Z_;B2^cX$U^&YkH%{ls6rnPf$ z^n8fk7UE~^7ecBelPYHu9>crsq4;YP zB7t)d5rxE4wgOaNv{(y_aM39!1|0Q8oti4smT+rpX)*?titzb}zR>{xjpS#=bJ_Bc}fs@$Lhk4HI>@1-bzPu6X+Xe+}-7Tz7W zNJMiWtsaz@P9-JHp@D&~(xsJV6PlG^2NP`9Z(7QBi05{eMIoRShi2Y&GGC z|Fz?>$b9$J3vW7Z7j45Gy;$IC=~8(c)Hh8Zhrm!wjG1OTXAa(_+k2Z6<(sFE-?u@D zO{^$hvu)n8rg?RJM#j?&>3y2L*!*bQSYfz*$A6cwwpFITRy{IhK`JuOdxxRV! z(dB~jr2=1~z&Bs~y@KX@ZlQb^&I+r1OO+cFl^drYrDC97<(1u6Czp#W*>m&ug@(oA zjd*gzT|E7QcJpwld|RS?TYUS`4=%>bw=I@`7Ai`e#frkhrywB(KKPQO>O)7B&ii}L zhVMg12ln3`33uI{l3HxixT^8=)u&^R;aGS50TFib0h|z;OAAwi*;9zK7;n{bVOgx` zTKU!Tm@D4+(07Zz8~k9$pARo~pNK#7RJ`EVbix#*9A?Q;{UP+fYn3@U->`)9$#py8 z>pJ7ryT0e_y5lOCE&B4)v7#ktNG;#+p=$$4Wuyy1C7O!v6qUv-)WwTM&7?Zji8nSp zJ5Vzc+#qGAOuII&fyIu^M;F~&;`S{+yAQ>BWj>Hko`ySB^kJK5~B%e=7vqocF;Lci=1AOp3pWsER5Wl_O!smY@?CNsMvA{*B8pG6}3p~J7vhWEO^(r`<-qVBz zFnJEnO7K=g!F<EB}e0j?5+Y=xH~_1vtrSU zTZwz_x=N={GNFy~xT~Ibs;4w&`f3HZG3nPfP>N=#4_FUQ!Le2kPT_gy(IVXup5awe zbq~A*Y*a^rX?wL1UdrT)MA#PgDzdc)bmM4fbYcY3?{Xii#I!i7GDQUZNef8`=~OxX zYj|d`wIq0?2?s7uR7~C2g#dJ8%{tQQ6tCGh^ZXy3yw&jS)^}U~jepu={8%#dFbCr9 zO>z4sj@+|REzIUZ4IpPOL-Z!OI>>sTEXFz_@}9{AanYO-`aDBc6Il!_XylnVlw41K zX?7CP-i!c$jdm0-qLE6LI#55Gw%zkqT6ZwriulE9t}0NB^~cH*`OvFK-q5R9n93zr zo+@ioKes#OARnhtTA6Z@D_Cw zv~E>}K*+uD+*{)}#!~{hZ-LiDzr-dgC95!Hq3_gZq3oq_;fc4Ny73hBI39ZY(2ZwP z#3K5@!hYgUoLr&LQ~~t2fJIbty@d0VNJ<1=w+^zO_f8O3sxVbzvf`z)`;eO1%=?SF zsvm!vaVV~pSI~EvTqCaP1&_s>!Ha?Pg_L6`^O4IqELMbS_?ebF>HB+7svLyUP-hv5 zJ$s7>>q(^wJ+VuA|LjsOWHIt|vKVfu09+{Ja-D1V+k-CfmGX7Dc#sQeCA1r-K+D~_ z*oBhkqS))jUlIO_drR1NDcoiFEAOpf-<7>p?6s`lw>w6p6ZzKGg z@Ymei!oFMKUf3Pdcf|YJqVywiv9>Dy z#Kqdi+CP*v5co8%0gX9wgc6zF9W3SOFPIXFW_ml3vIDt5y-e>exM_Szg-jPzoK&!5 zrodTDW|Bx%xFn~cE7cY zMf3SOI=C1wyH2yELwi~v+@W2!V%6{RvHB71qV*fg;)VqbFU<>&0E|ZPYCzfp4-#ZV zptdH9bP=>7dy*EG+Dva4unozKFwW|s%~Um5a`?tdVr38JSAGgLn(}4fq))Pc)8 z$)fV*PPoEUG!2R(mBN^3g<9um475$O4>lk!6Fv4daBf*m9sO1=*FsYWanBl>iJeu) zmemaYl?5r0gRnwnu7xeEeN`6N6m?6MNx!y*7e(kzF9ZG+cogC{A?B~cw+!P&G=71~ zYY8{#_ydOJzk#-p0Tu!_vT^C(1V;C%^Lc=ZYRU)N{6G8f_#oao1~VNm@_uPwCE2Je1NNf@csZF7>*~efXrbyuPa_ZFg%Zh! zykX(lIJ=GZV|RJ1VX2}cQPJ^7 z=G*RVKlZZMQ+FmBb}o85Zf zmTin7UxmCEMZ8EQJ;_zTudy)mi_*F`m+77pWX-|M8Bt!Lrs)s85_B~}>wFGH=}QnG z?zYpo?uMmGwrPzFQ(M$EBw697HuNmt}8t_VF$rc;8cPYO) zk>9*vS!&szXxYD*|4`ii5MN{Ts{+-5{#K5{qJ=XE<$M*Gn~e9XyI`1Bq{FywlqSol z=W29^rRVRckfh1)Z#5(SZIQ{34Ep_?Ul2jr|4({x1A%Jk%9JbI!nt~BS2H8AN9 z3sm4CX&Fvzii|3{p{mN{rYnB8z<)*zy3^I zr~kolgou7w6XG>qtW#IPBh=A{4Qe)uM|m=9Mm}RyGeW&Vws8rl*f?p}bT`KBjjOjO z+5`yCnOBrU4AU1XHmn9EtUJxqzM-w1@)fi zwT9WqSJ$th*$R<({VZ@?5lA0fk4*T1Tu)YZvCzE({0gOd^drW+&Qqb(Ty%`vv$`h` zl35bF5@T45OxI8{i(ndmCiF!VtS$nxcI*3I))&fx#D>0Yo ziXJ5}uEoa)$?RS(EHp{ga3N6P92H-7z2Z{XLbd{NTFkf1;5TDQCSWzg%BUKSnsAZ} z=7jKv7UeCOTeUZ}BFpr7svhl`ta?B2c&EF6==9t( z3x!3>12Oqol|$Ujp#cyaHtZ9EJ9>d38}7K@7pY_w1Ptz*8kNHc55uw;^C7eUIp^dz z^u=)HPOZC*_#Y$<86FNr!s>OYeAGa9v5H|5jO}5j&ZZ&dOp))9i}oYV9${P3E_jWMqmNiD?t)iv@Vw&1U0BN_phNhF6ZvI)4d8a6%)?v= z(|uCzA+-+N1+TFXT1oXAmChhOy7{1Ra-)HC>NkDqQfzCoH z0dk^h`~}L3Ji=J$0vyz4=Hfggws6wpEL=?KQF76X$!zxW+hsI^@YcT`K!w6u}vKVce)^Cy4>D%4_bR$?&iC-w>h8$ zxCP86_~5=5DFSXG9+U3v4)Vb@GWX@DW}b={wIp1vr1_UFf^p5iEsEw}uQhM}z()dp zR=8LaT&eZ!0+7wxEiMw>%uTJUn$6*7Q@bW(Q*D6+e{r z@bqA;Eu8_qc+nbTkDvevwYJU&>GD}?$|hQy(%wznyNSGOV)YaS*Vshd-C}pu3d!x^ zZV$OjR5>zwnIuusMhQw%HWTBg)n2c~-MHenixYLE<{m6GyNIh?4HT)EQdbf?4L=-K z2uz?OFLVYP`l9*t3mpp`kFsyP3PYVEhaR2))X5MMJr0dXVEY{7QCKkN>o7fQVD)ge4-Eri z4d4t`&4y}$!uefl=v|No0;Hu$sUJf43vud`_lGV9=*8PEh1sLjg)-U8(ohM&eEC?n zV3h+m1b8zmjUrP3;%M6;l8xY07!OG@|1`DGq9sX}v6t7XJtK&~X|I-_7SzhQQ5_vV zFtftw2J8Y-u&c|rrK6JvDOx*to?Tq)10NM!;U?upN>4@5cl=e(c8pDC2WiDoB^9IZ zGxAc(p?dOC$d%T2OOMAZt=B~30>gum38!Xop3`jn@IPr~ki@x6 zSl2Z}h$LYjD|9OU+al(iNLo{~4P@1fSswsqGK8i94T)BtlmHlDB!X;|2l?x#0eKW- z-Q{ZxgK)~h`@Zza=|?<8O`D7ii(^YuY=?o=8TvwF3bY%;M*8JFeeB=Id<&Dn&d-3^ z;`vEDSr;$eam%{Y`FNu9@$cE6;D{)zwPLC4qLugH@!O`CfmusJFYvrxtUaXF9b%Xo zTPU3ntbb#FOVB!Cn--=`Y!z_!LUc#U88E>|gip>(&R#owjDO`p_Xk7i9jzQJo$JcAN>4+bRzDW(OQB$HMqSvS#3%xQ9R z28yD;0$`dH@oJ`tUdbkqsHgK!0U5cirl~U9b;#;b(LHF=a)_$Bb_LqT4Hc)xF#NyG1+9e{9{Islyee@d>^Oj^8$2 z!I|_7xRh_8S!5tN#2v6_Fv-7yQBHF`I9tHPyOXfR8_HeA7vPpJ!U|LVT4zy|Xy-59 zS)5G$x4NnOeJA8HZaZu4c+2K?&h5vIlen|Nn1*D_*RR|72> zXwnKzUkr9elknIsf9d1@&o(g(es!D3JNnDCiPMdLhBnDBA`ez|JR=5?N&5pLIE|CA=bFg0`(I;>fHSpqdl3?s1WkM#Q>Ms*{ zkZ~&+fC*UaN4%fEBrF$|Oy{O7Ik{!aiE*?o5B5RTs-2yR3M%PXVll%r{lf$^=apvia%!O2-Jl3Dd;xNMd;mc z9BqR4O*+JIx=F{JKva;DAzp@uor;Q~^kL`fia+Sov*UC?ex~_!Alm%wssm7*bLxWs zxsN?{se+ExO4~L z5v?&STVv#ZAH}CH81~?zLe}~>fTH*!$W}dSk4zc!Cs6C@GcBI;n-oCScd1oGG7~Sw z1zt*x;PHZ&f~i=}3HNd$v5R6SXjT@*8+Q@e4UH*y&iMXM5S}0ASHm(-T^4fA{AeXT*0b|k(u#>CWSH+o`0Un z4_vzRFIOgDjVYipGUBY$fdOmdk#@)hjHF6?Xs)jd--K$6(L=@rSH@Yl3vpE9MN3aC z>d_`h(4{2{jY&6*Eg2?3XP6Ir5ZMZbw{?;v>}>4pIj1LD&S*&z8dr{(l|k?FMLiJf z4v+Vr^(n{2UB0CFOj3L{YQ}g*&Av;Qu+?or$=PSc#i$9678~%B%u!B*Go~gX57ClL zFv60+4m18QnmZSf6eJ&s2D4+~vduRembM&DY&jg?d?a3SbmquimuJc4OSqr~IN@s3 zPKRfXfdA-ixZSYr=E4sKCq&E)^XScoFcJh~fZgEj>GZNe z1GjqFz-GsEg!46mc4So{AiX;q_FVw>N56z+O3JPqfr>!z!Vr~2dd@-VDzuCb_=w#N z{z4ef2M~V-Pa&{<8|wOk(7iel8fRio!4SP3qG=#!w-_J*!6k9HYH`}&2kA9}W_l!o zt6d&v+deIBeTr9~kLs~%P0MQbCogIz<$o@5CBjHDMX3HcOaAX9qs69HPpf`q^oVfds6L!o3hb88c_2ZGj;jm1cE!n|RXfkSHnN|#b#74aCq;)hDl)~(?4OodR zT>-_Q8+ZKFji_*$PTFN!%4HH0l=Q*Fqfm^?#)gc~MZC!c=&kpIBZLkAu? z)^mhWJxLF5q8}JTNOr7>xLTnkIj1px;=>LGvWX@xFEspy4Bn1*bfxT^?#OoJl@Iod?H5zXI z#N|eE?I4SZS2M6O6KD{X!q7Rkq%%n2s9+`>CGC4~6gWOC?UVliDezwi{|JjFwir?T zzR>+6q2LEX-VcPr9}1QD{}ZA5hxEVpCqn%X>3_=)h4vo`O+OTBScGx}{ZOd*p-{y_ z8}3?MQ{68g`@*s5{x9}SiOcCvXjQDZS}}isU!9*no+#gV+p=j&ylb|+y#K}hKd==3 z$g=JymX`Y#8_t3XuT@^HybqD;l8=hqPSceABcG+vG?kyqw}`G;T&SU+zzY4O^6g^j z>=W!(kNCRvx;0VUloH^#uyuugAZ;zy&DL?{jn__HJ(Vb|hmumUZo!PBB(V->hV7e{ zy=BXtdzK-X?yeAR%buE)8NYY&&OBZ9=%3r4vf>*kuPguZ;hDp;TVvw2ysLTh$L4q6 z6p4Jjwe@XxyncV8?4h{#p@g$Ll|%9Eg2Q=v{mgn)@2R<`Vh11^UVObcc05tsoXBfQ z?aJHnF&(6+w z&cA*B)?i}iQRZ>iYJ2&qFFZAUEMYBKu_Dd=h*&1p#LDjr__@EMT5Otq`o4gl`wxkw lV(0AOeE~lZ^ta|ii|4YXByRC7TMFaQ>uK>OEd05){||!8i--UK diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc deleted file mode 100644 index 6cdcc8560aa333a3b380319d56a3ffedf781cb43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17899 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc deleted file mode 100644 index d9d700dc8a5773f77a702f74490ed06de173d399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9059 zcmcgwYiu0Jah}-+ce%@#C{f~D!}sg7JnD5i>TwT>x|1*A#U^Rw=-A|NrztMAyF>NN zN+Kl#my3~5u#ux+B%}-jl8qcJ;eO^+U^RakJP*`K~x z^D59s)3uqpxjN8Svw9=O8kRyv{0E`ABPHz`v>Qdc)}yI1>d8ApE*`p}zfu6ZB!SP8bJ!u(B`zqJC*anQ6?pg94W_6ju3 zpy{YU(*l~#3N)>tISCrM8zG|&ZLOr;j&@gtIXXboU4f<(G(8n)PJ*Vl0*wZmzOpo3 zhuBD!(T%bFWyeZ;>;cU{1)5&a43?$o0}tQwt+QAk%vlQvJUi^itivhA7+^okK19k57T43lK>*rt3rPB7PR93TDW;Lzb41i@@TFzpIb|+;oYxXkJ z78X+0!h&Y5GOpVuPkcd(Obw|{P+v@uCSzSjjk@6wz+C@d&x|v%+b{~d)drdjNfK_G@V-XI?g1qv6d0TyOB_C?pL7(z94FxG%M#dfEuA zpPE=^$(y7HT`Sdsk-D9-Qlyf_HJ~sttR+$8Y$zbK!ke&^MayWKiIbq2McQ%g-o4_$ z?-!{tB}-du{{%(T&ziR8u~}GzhGh*fgM~%sG{cF<2_Ij|Ws~Czpx1M0dqG=*TVPyU zGCA~RrQjQwc1K^+Y*VwCt>yd!E++9Mvl62DEa1eT?yP0&*(BpQu=`D~Mk-cr18)OK zCw_}e@LlDP?Mg%IcHcj>Jg*Hg zq=sWt?<*^S_I|geJ+{CeOHP)j8+JEEo*E}At7lk3o3+?dE-eqAN0NcY7MW0rxoW4( zte#He0N&P9X>yQ>g7uQ!o?1+s$(!Y@cOawln}&HOJ3wyLn}3h_3R{IQ*Y0aRwN}|? z3#0as?y^&yFt}ffL@*3yfXg$97lmL5ClSex^(???Kc$B+bt7@1Hc7?FV9w&Vj-q&1 zaXXcoBbyUjZ#{e~A3vE7os_obc?6Is3c45BIJpDrQFZ0BIuWDQD6`DKD!2{%{vDV^z};A^p$aCJ_n_1?{i;= znnjr8w|Ez{w=1Z~ut!MV2i!Hnd$!OoZQ=UE>-l&`KGd<_?-Xo-uD&uQ$VQyYE>fyP z2B2$;rkQ4XRtBGy$t6uGKKjinuCvk-4yXnxsuQK8I(~}|Es_M7)Nw@H>F4pTPvTQg*hgpc z{VxIf)#Sf6w;2ZvIZye=W>R9qDv3q&Cg#2?N9Jq(%Sr!GyV8GkG}IfK9mm)9kK&oS!II< zNLzYV3in%IX|#R&IG0M3H(~xdD1J_imtG^j{XE{A5A`0xGQ93!wf>PO@4XTL z!Jbc5)&f0>T~KMS!h@>vjd}H!Qu}`D5zlpYd5^Zs#N=?K6{4t``G<~V4;ili#A9I7K|0EKt z_fE7bKdJ5yexUXTov^t49ehFaGm-nMNT<~G|0>?ZvYK~PS4{*di!R4>m$q;n(=se$ za@@7>_`@uqmJt_qT*-0E6k8)lex3J&CDTmkHv9putRi=(b#&atC~?`F!xJAEpcMyj zCN6(S`3SclQl)vDL)-AP0>Xb0#l}EGyW!RI$4$fK;!uy!3qBc5Wge} zFL^pfNng3-i7ZfrEt!v$vtnVb1v@^_TE_|+N!bIIwrX1PtqJN7c8A?Ek%3_QJ$)r$ zfB`2&NT+&cZIw-OZt^ll=bJ8{0>l48(ou#EqYDMe=xR1*e-y7^Yw-A}LQk6G4;AO6seK$xd{Be%a2X=jZ7*ysTTK_I>h5XX%aM z&;`lzNar4~v@bh?IKGY|C4#GUURq0U37mD@q0)GYG@TQFMhxqw1d4Jz!U(>`; zseMJn!B1uREHHV(mL}#C8<+B-6CSsCXLUmKnCZkz9t@p`_Xg%v7oKgLD)|)PglKjr zME5Qy;$2;wusBe_A;m^kAahxM8f!aYk<~b1kqkIhGUPfDFa9`H(w#d|-%&YH-+G*A z6335RAcl$4;zT@6IDu4lJ#hK56JWQ{c`K)1r zdzcfV-4xH>;%Qkt+d9G5vTNe4PrRGSWTqR`;uJz-{T9S?k5*bS!}9nVlGw+gzbTEMDQ%xAt^c8Pex~$%9t{26 zEAPGXS!mF$3aG7{6Rv`4`|1u=Zj8F7W!Frht9@HgwLeJ`rv0fwn07Z-r@pYQJ`O($ zy9&T3y*pI7-2ruQyX$e^qduY@d?KbE#05Lh=mzRkZS%WCu01^?s*lcoNv)lrk9NBS z)TnlDUUn5!PmhY~qhnuE%OeEj4hPhh&2MhaKAfe6TDEOstHq6l)e)a9fW#Imw;>GC z^ey&~xoEdO2~l?|br&W9NRyy)8^h|`YH^mgRXNSuDq(ty^YqGjdfkQqBoq6iZ5zah zMw@v+SNG~!M<*C^rIjhk*Q!F5VFj=}W=H%Ryh!Hsh4QG$;t;hK#( zw~656lI8@#&61{t;8sb~MsT}?I|%NS@JWI-xo#K1-D2z?dI;{7{e1-YE8+UhT6cip zK?x5LJWO!Z9U=GyNq>sqgydnA;1`u}^~QiZM(}BZ2j3rgFyfw}_Ss_l9JSBWxV!J) zdvMQviP{&6_?M|YUTj~a_9Z18-DrNl?LnJ+nc7#1_*ba?s*0W8ys≶YIf~m3m%B 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 diff --git a/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc b/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc deleted file mode 100644 index 1f6ab5332c975be06b25dd2c1027c78d6f66ea1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5362 zcmb_gUu+!38K1q|y*r=JTpS+>i5(b2oN#esL*ljxlp-fK5UAX=Hneq1@7A|-_B!j` z%j}+=bI+2gB4MPcxP8f?w&G|b;gD9Ks#3!fL{&u)51d1S-6ao^3J*wqaO6}-ed_nk z-kr~9yW*iE-R#`VH{X8WH{YM%>_<&aVFK-6Uqwg1Xd>jF_@~m8@?doy1{a7%hKVL= zK0_MzX?{&M{1fu9ED`1#7d$H4yeHo!XamDRA927Oqk@=6vzS=@)uWoup}tQ-`aQjN7_7N}VxAdk2T8X=%*vq9-RZ z2Ag1}!!$aQ6RRm}BBL9OQ`OYM6U&^+)Fw_x) zxiYHe$|@hV-N5N7@5z~y>ExS0?9%5{VS(l1NPNSf^N5Wggs+*yww+q;zU< z6$WGg%mDjLb%G@lZa9&cu(Yg!<47WLCaW6W3P&wm$#MO?W{#t)ab(7uu|r$%K&6Yo z!0v$V99a$x7GtH*;DY)#yTo8{<;;88ce60K*8K6kAKrT-H0W`_&6|6|HCUW$sM2|XRL$swFYUfNxJqw}77)BDsGo|HYrs=FHg2@))$-ql;Ve~F^U6{(6S{J25 z5ULwDOsF~Pc{80+cqf8U67S1mxNtgN94MkB!9V_vgI*g>~JvoUp2hg_CYP547oW2!moDQJQDxUNBV z6KpWUB}bW)DC?7~z6*GrOoI>`tV-Eg-FCdgP=%C&)5EoPrpW=zWXZVD5cr#n>nZOY z$tpt-G;4!Yx@kL11w-SZdZ`3U!1OMs>w6i@qN?$e7izQCi|bMo<{nJ?tIt4pfjF3I zMax5had5@^CtWVDjALNewcn86`7~dpBn*0jrC{AjVHy@i#DKvCk|*QUvx13o%U927M$XGG zMSLVL=cQ38@B6*N! z6|ry#D-Oc|tSD_}#mlgUt&hBTA0adHme!K%Eh~}pyJeD-;=bu)2oo?sg;TS$8ADI$ zPBnfjdAZiT%k~|J``m3%x_KfsrW;xUjc)UH5NHbhPmm)`seb*yL7M}Vfa^#Mmv>p~_ z9f*fTeDD_7&STKI!9+r{Qi+5p{=!H2y|}moJCt9DQx62d#DrsqD8W7p-8pi{*Pw(} zb|}gTsVJ`ye3s&Ut75QnPf$5l*t__v_jdcU$6cxUo1kN`Lb1$qd@8{8-!{18`78|v!>G~Q&dFs zP!vU21+W5Tu(&>oh{Y2|H_HG^lr+;4Y|2)^ixYL!(*TZyRch;fwO(+n{Oi&kmUofv z{tO5IHPYSR2>B_Lg&BE9sVV-7Q!V`n0k2QMF587} zmMqh~OZ1UN`pBpBFjV=u{`q6KqPq(5i$gb}2bT9dFdzPG&%XKoTRYo}9e<47*x9vA z4;1A$!*7HazEPsb-|4wdk6-!bB0XMEmRo7ziRHGvx7s@w`v1~%qy6Y|+rFi?LyK*P z7TArp9#~qA-M79++=>RkBKO=kH}vZ8E5il3 z)YMgQt~YfRCl{N#=6s)n4?Xx>?MC#W<=Bq-p1J34N1Nvwwty=fzd3lZvxZX8ja~V> z7**fG<+_g+`*9At!|=0J=n$)f0IS4eN(^xZJSsQ?h83Iv!)tq2adG8fgR;HgtPprC z^uFDHsb37QeE+@Y-+f*T-#_!g&o4^%RU@KP<0qK2i zX&U;%d_hWChW7~u;f_$LPFFYdZST|0 zcleV)f?3t>hi=6$NzxskPm)(dL~8kh?7Z!lUw-lzPktspcvqH`A*tYdz45iiy9CEy Zg&vT4?hxqi_DKh%?enMqP2eGv`Y)4zF1P>y diff --git a/lib/python3.12/site-packages/jinja2/_identifier.py b/lib/python3.12/site-packages/jinja2/_identifier.py deleted file mode 100644 index 928c150..0000000 --- a/lib/python3.12/site-packages/jinja2/_identifier.py +++ /dev/null @@ -1,6 +0,0 @@ -import re - -# generated by scripts/generate_identifier_pattern.py -pattern = re.compile( - r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 -) diff --git a/lib/python3.12/site-packages/jinja2/async_utils.py b/lib/python3.12/site-packages/jinja2/async_utils.py deleted file mode 100644 index e65219e..0000000 --- a/lib/python3.12/site-packages/jinja2/async_utils.py +++ /dev/null @@ -1,84 +0,0 @@ -import inspect -import typing as t -from functools import WRAPPER_ASSIGNMENTS -from functools import wraps - -from .utils import _PassArg -from .utils import pass_eval_context - -V = t.TypeVar("V") - - -def async_variant(normal_func): # type: ignore - def decorator(async_func): # type: ignore - pass_arg = _PassArg.from_obj(normal_func) - need_eval_context = pass_arg is None - - if pass_arg is _PassArg.environment: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].is_async) - - else: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].environment.is_async) - - # Take the doc and annotations from the sync function, but the - # name from the async function. Pallets-Sphinx-Themes - # build_function_directive expects __wrapped__ to point to the - # sync function. - async_func_attrs = ("__module__", "__name__", "__qualname__") - normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) - - @wraps(normal_func, assigned=normal_func_attrs) - @wraps(async_func, assigned=async_func_attrs, updated=()) - def wrapper(*args, **kwargs): # type: ignore - b = is_async(args) - - if need_eval_context: - args = args[1:] - - if b: - return async_func(*args, **kwargs) - - return normal_func(*args, **kwargs) - - if need_eval_context: - wrapper = pass_eval_context(wrapper) - - wrapper.jinja_async_variant = True # type: ignore[attr-defined] - return wrapper - - return decorator - - -_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} - - -async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": - # Avoid a costly call to isawaitable - if type(value) in _common_primitives: - return t.cast("V", value) - - if inspect.isawaitable(value): - return await t.cast("t.Awaitable[V]", value) - - return t.cast("V", value) - - -async def auto_aiter( - iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> "t.AsyncIterator[V]": - if hasattr(iterable, "__aiter__"): - async for item in t.cast("t.AsyncIterable[V]", iterable): - yield item - else: - for item in iterable: - yield item - - -async def auto_to_list( - value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> t.List["V"]: - return [x async for x in auto_aiter(value)] diff --git a/lib/python3.12/site-packages/jinja2/bccache.py b/lib/python3.12/site-packages/jinja2/bccache.py deleted file mode 100644 index ada8b09..0000000 --- a/lib/python3.12/site-packages/jinja2/bccache.py +++ /dev/null @@ -1,408 +0,0 @@ -"""The optional bytecode cache system. This is useful if you have very -complex template situations and the compilation of all those templates -slows down your application too much. - -Situations where this is useful are often forking web applications that -are initialized on the first request. -""" - -import errno -import fnmatch -import marshal -import os -import pickle -import stat -import sys -import tempfile -import typing as t -from hashlib import sha1 -from io import BytesIO -from types import CodeType - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - - class _MemcachedClient(te.Protocol): - def get(self, key: str) -> bytes: ... - - def set( - self, key: str, value: bytes, timeout: t.Optional[int] = None - ) -> None: ... - - -bc_version = 5 -# Magic bytes to identify Jinja bytecode cache files. Contains the -# Python major and minor version to avoid loading incompatible bytecode -# if a project upgrades its Python version. -bc_magic = ( - b"j2" - + pickle.dumps(bc_version, 2) - + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) -) - - -class Bucket: - """Buckets are used to store the bytecode for one template. It's created - and initialized by the bytecode cache and passed to the loading functions. - - The buckets get an internal checksum from the cache assigned and use this - to automatically reject outdated cache material. Individual bytecode - cache subclasses don't have to care about cache invalidation. - """ - - def __init__(self, environment: "Environment", key: str, checksum: str) -> None: - self.environment = environment - self.key = key - self.checksum = checksum - self.reset() - - def reset(self) -> None: - """Resets the bucket (unloads the bytecode).""" - self.code: t.Optional[CodeType] = None - - def load_bytecode(self, f: t.BinaryIO) -> None: - """Loads bytecode from a file or file like object.""" - # make sure the magic header is correct - magic = f.read(len(bc_magic)) - if magic != bc_magic: - self.reset() - return - # the source code of the file changed, we need to reload - checksum = pickle.load(f) - if self.checksum != checksum: - self.reset() - return - # if marshal_load fails then we need to reload - try: - self.code = marshal.load(f) - except (EOFError, ValueError, TypeError): - self.reset() - return - - def write_bytecode(self, f: t.IO[bytes]) -> None: - """Dump the bytecode into the file or file like object passed.""" - if self.code is None: - raise TypeError("can't write empty bucket") - f.write(bc_magic) - pickle.dump(self.checksum, f, 2) - marshal.dump(self.code, f) - - def bytecode_from_string(self, string: bytes) -> None: - """Load bytecode from bytes.""" - self.load_bytecode(BytesIO(string)) - - def bytecode_to_string(self) -> bytes: - """Return the bytecode as bytes.""" - out = BytesIO() - self.write_bytecode(out) - return out.getvalue() - - -class BytecodeCache: - """To implement your own bytecode cache you have to subclass this class - and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of - these methods are passed a :class:`~jinja2.bccache.Bucket`. - - A very basic bytecode cache that saves the bytecode on the file system:: - - from os import path - - class MyCache(BytecodeCache): - - def __init__(self, directory): - self.directory = directory - - def load_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - if path.exists(filename): - with open(filename, 'rb') as f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - with open(filename, 'wb') as f: - bucket.write_bytecode(f) - - A more advanced version of a filesystem based bytecode cache is part of - Jinja. - """ - - def load_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to load bytecode into a - bucket. If they are not able to find code in the cache for the - bucket, it must not do anything. - """ - raise NotImplementedError() - - def dump_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to write the bytecode - from a bucket back to the cache. If it unable to do so it must not - fail silently but raise an exception. - """ - raise NotImplementedError() - - def clear(self) -> None: - """Clears the cache. This method is not used by Jinja but should be - implemented to allow applications to clear the bytecode cache used - by a particular environment. - """ - - def get_cache_key( - self, name: str, filename: t.Optional[t.Union[str]] = None - ) -> str: - """Returns the unique hash key for this template name.""" - hash = sha1(name.encode("utf-8")) - - if filename is not None: - hash.update(f"|{filename}".encode()) - - return hash.hexdigest() - - def get_source_checksum(self, source: str) -> str: - """Returns a checksum for the source.""" - return sha1(source.encode("utf-8")).hexdigest() - - def get_bucket( - self, - environment: "Environment", - name: str, - filename: t.Optional[str], - source: str, - ) -> Bucket: - """Return a cache bucket for the given template. All arguments are - mandatory but filename may be `None`. - """ - key = self.get_cache_key(name, filename) - checksum = self.get_source_checksum(source) - bucket = Bucket(environment, key, checksum) - self.load_bytecode(bucket) - return bucket - - def set_bucket(self, bucket: Bucket) -> None: - """Put the bucket into the cache.""" - self.dump_bytecode(bucket) - - -class FileSystemBytecodeCache(BytecodeCache): - """A bytecode cache that stores bytecode on the filesystem. It accepts - two arguments: The directory where the cache items are stored and a - pattern string that is used to build the filename. - - If no directory is specified a default cache directory is selected. On - Windows the user's temp directory is used, on UNIX systems a directory - is created for the user in the system temp directory. - - The pattern can be used to have multiple separate caches operate on the - same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` - is replaced with the cache key. - - >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') - - This bytecode cache supports clearing of the cache using the clear method. - """ - - def __init__( - self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" - ) -> None: - if directory is None: - directory = self._get_default_cache_dir() - self.directory = directory - self.pattern = pattern - - def _get_default_cache_dir(self) -> str: - def _unsafe_dir() -> "te.NoReturn": - raise RuntimeError( - "Cannot determine safe temp directory. You " - "need to explicitly provide one." - ) - - tmpdir = tempfile.gettempdir() - - # On windows the temporary directory is used specific unless - # explicitly forced otherwise. We can just use that. - if os.name == "nt": - return tmpdir - if not hasattr(os, "getuid"): - _unsafe_dir() - - dirname = f"_jinja2-cache-{os.getuid()}" - actual_dir = os.path.join(tmpdir, dirname) - - try: - os.mkdir(actual_dir, stat.S_IRWXU) - except OSError as e: - if e.errno != errno.EEXIST: - raise - try: - os.chmod(actual_dir, stat.S_IRWXU) - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - except OSError as e: - if e.errno != errno.EEXIST: - raise - - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - - return actual_dir - - def _get_cache_filename(self, bucket: Bucket) -> str: - return os.path.join(self.directory, self.pattern % (bucket.key,)) - - def load_bytecode(self, bucket: Bucket) -> None: - filename = self._get_cache_filename(bucket) - - # Don't test for existence before opening the file, since the - # file could disappear after the test before the open. - try: - f = open(filename, "rb") - except (FileNotFoundError, IsADirectoryError, PermissionError): - # PermissionError can occur on Windows when an operation is - # in progress, such as calling clear(). - return - - with f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket: Bucket) -> None: - # Write to a temporary file, then rename to the real name after - # writing. This avoids another process reading the file before - # it is fully written. - name = self._get_cache_filename(bucket) - f = tempfile.NamedTemporaryFile( - mode="wb", - dir=os.path.dirname(name), - prefix=os.path.basename(name), - suffix=".tmp", - delete=False, - ) - - def remove_silent() -> None: - try: - os.remove(f.name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - pass - - try: - with f: - bucket.write_bytecode(f) - except BaseException: - remove_silent() - raise - - try: - os.replace(f.name, name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - remove_silent() - except BaseException: - remove_silent() - raise - - def clear(self) -> None: - # imported lazily here because google app-engine doesn't support - # write access on the file system and the function does not exist - # normally. - from os import remove - - files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) - for filename in files: - try: - remove(os.path.join(self.directory, filename)) - except OSError: - pass - - -class MemcachedBytecodeCache(BytecodeCache): - """This class implements a bytecode cache that uses a memcache cache for - storing the information. It does not enforce a specific memcache library - (tummy's memcache or cmemcache) but will accept any class that provides - the minimal interface required. - - Libraries compatible with this class: - - - `cachelib `_ - - `python-memcached `_ - - (Unfortunately the django cache interface is not compatible because it - does not support storing binary data, only text. You can however pass - the underlying cache client to the bytecode cache which is available - as `django.core.cache.cache._client`.) - - The minimal interface for the client passed to the constructor is this: - - .. class:: MinimalClientInterface - - .. method:: set(key, value[, timeout]) - - Stores the bytecode in the cache. `value` is a string and - `timeout` the timeout of the key. If timeout is not provided - a default timeout or no timeout should be assumed, if it's - provided it's an integer with the number of seconds the cache - item should exist. - - .. method:: get(key) - - Returns the value for the cache key. If the item does not - exist in the cache the return value must be `None`. - - The other arguments to the constructor are the prefix for all keys that - is added before the actual cache key and the timeout for the bytecode in - the cache system. We recommend a high (or no) timeout. - - This bytecode cache does not support clearing of used items in the cache. - The clear method is a no-operation function. - - .. versionadded:: 2.7 - Added support for ignoring memcache errors through the - `ignore_memcache_errors` parameter. - """ - - def __init__( - self, - client: "_MemcachedClient", - prefix: str = "jinja2/bytecode/", - timeout: t.Optional[int] = None, - ignore_memcache_errors: bool = True, - ): - self.client = client - self.prefix = prefix - self.timeout = timeout - self.ignore_memcache_errors = ignore_memcache_errors - - def load_bytecode(self, bucket: Bucket) -> None: - try: - code = self.client.get(self.prefix + bucket.key) - except Exception: - if not self.ignore_memcache_errors: - raise - else: - bucket.bytecode_from_string(code) - - def dump_bytecode(self, bucket: Bucket) -> None: - key = self.prefix + bucket.key - value = bucket.bytecode_to_string() - - try: - if self.timeout is not None: - self.client.set(key, value, self.timeout) - else: - self.client.set(key, value) - except Exception: - if not self.ignore_memcache_errors: - raise diff --git a/lib/python3.12/site-packages/jinja2/compiler.py b/lib/python3.12/site-packages/jinja2/compiler.py deleted file mode 100644 index 2740717..0000000 --- a/lib/python3.12/site-packages/jinja2/compiler.py +++ /dev/null @@ -1,1960 +0,0 @@ -"""Compiles nodes from the parser into Python code.""" - -import typing as t -from contextlib import contextmanager -from functools import update_wrapper -from io import StringIO -from itertools import chain -from keyword import iskeyword as is_python_keyword - -from markupsafe import escape -from markupsafe import Markup - -from . import nodes -from .exceptions import TemplateAssertionError -from .idtracking import Symbols -from .idtracking import VAR_LOAD_ALIAS -from .idtracking import VAR_LOAD_PARAMETER -from .idtracking import VAR_LOAD_RESOLVE -from .idtracking import VAR_LOAD_UNDEFINED -from .nodes import EvalContext -from .optimizer import Optimizer -from .utils import _PassArg -from .utils import concat -from .visitor import NodeVisitor - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -operators = { - "eq": "==", - "ne": "!=", - "gt": ">", - "gteq": ">=", - "lt": "<", - "lteq": "<=", - "in": "in", - "notin": "not in", -} - - -def optimizeconst(f: F) -> F: - def new_func( - self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any - ) -> t.Any: - # Only optimize if the frame is not volatile - if self.optimizer is not None and not frame.eval_ctx.volatile: - new_node = self.optimizer.visit(node, frame.eval_ctx) - - if new_node != node: - return self.visit(new_node, frame) - - return f(self, node, frame, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - -def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore - ): - self.write(f"environment.call_binop(context, {op!r}, ") - self.visit(node.left, frame) - self.write(", ") - self.visit(node.right, frame) - else: - self.write("(") - self.visit(node.left, frame) - self.write(f" {op} ") - self.visit(node.right, frame) - - self.write(")") - - return visitor - - -def _make_unop( - op: str, -) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore - ): - self.write(f"environment.call_unop(context, {op!r}, ") - self.visit(node.node, frame) - else: - self.write("(" + op) - self.visit(node.node, frame) - - self.write(")") - - return visitor - - -def generate( - node: nodes.Template, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, -) -> t.Optional[str]: - """Generate the python source for a node tree.""" - if not isinstance(node, nodes.Template): - raise TypeError("Can't compile non template nodes") - - generator = environment.code_generator_class( - environment, name, filename, stream, defer_init, optimized - ) - generator.visit(node) - - if stream is None: - return generator.stream.getvalue() # type: ignore - - return None - - -def has_safe_repr(value: t.Any) -> bool: - """Does the node have a safe representation?""" - if value is None or value is NotImplemented or value is Ellipsis: - return True - - if type(value) in {bool, int, float, complex, range, str, Markup}: - return True - - if type(value) in {tuple, list, set, frozenset}: - return all(has_safe_repr(v) for v in value) - - if type(value) is dict: # noqa E721 - return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) - - return False - - -def find_undeclared( - nodes: t.Iterable[nodes.Node], names: t.Iterable[str] -) -> t.Set[str]: - """Check if the names passed are accessed undeclared. The return value - is a set of all the undeclared names from the sequence of names found. - """ - visitor = UndeclaredNameVisitor(names) - try: - for node in nodes: - visitor.visit(node) - except VisitorExit: - pass - return visitor.undeclared - - -class MacroRef: - def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: - self.node = node - self.accesses_caller = False - self.accesses_kwargs = False - self.accesses_varargs = False - - -class Frame: - """Holds compile time information for us.""" - - def __init__( - self, - eval_ctx: EvalContext, - parent: t.Optional["Frame"] = None, - level: t.Optional[int] = None, - ) -> None: - self.eval_ctx = eval_ctx - - # the parent of this frame - self.parent = parent - - if parent is None: - self.symbols = Symbols(level=level) - - # in some dynamic inheritance situations the compiler needs to add - # write tests around output statements. - self.require_output_check = False - - # inside some tags we are using a buffer rather than yield statements. - # this for example affects {% filter %} or {% macro %}. If a frame - # is buffered this variable points to the name of the list used as - # buffer. - self.buffer: t.Optional[str] = None - - # the name of the block we're in, otherwise None. - self.block: t.Optional[str] = None - - else: - self.symbols = Symbols(parent.symbols, level=level) - self.require_output_check = parent.require_output_check - self.buffer = parent.buffer - self.block = parent.block - - # a toplevel frame is the root + soft frames such as if conditions. - self.toplevel = False - - # the root frame is basically just the outermost frame, so no if - # conditions. This information is used to optimize inheritance - # situations. - self.rootlevel = False - - # variables set inside of loops and blocks should not affect outer frames, - # but they still needs to be kept track of as part of the active context. - self.loop_frame = False - self.block_frame = False - - # track whether the frame is being used in an if-statement or conditional - # expression as it determines which errors should be raised during runtime - # or compile time. - self.soft_frame = False - - def copy(self) -> "Frame": - """Create a copy of the current one.""" - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.symbols = self.symbols.copy() - return rv - - def inner(self, isolated: bool = False) -> "Frame": - """Return an inner frame.""" - if isolated: - return Frame(self.eval_ctx, level=self.symbols.level + 1) - return Frame(self.eval_ctx, self) - - def soft(self) -> "Frame": - """Return a soft frame. A soft frame may not be modified as - standalone thing as it shares the resources with the frame it - was created of, but it's not a rootlevel frame any longer. - - This is only used to implement if-statements and conditional - expressions. - """ - rv = self.copy() - rv.rootlevel = False - rv.soft_frame = True - return rv - - __copy__ = copy - - -class VisitorExit(RuntimeError): - """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" - - -class DependencyFinderVisitor(NodeVisitor): - """A visitor that collects filter and test calls.""" - - def __init__(self) -> None: - self.filters: t.Set[str] = set() - self.tests: t.Set[str] = set() - - def visit_Filter(self, node: nodes.Filter) -> None: - self.generic_visit(node) - self.filters.add(node.name) - - def visit_Test(self, node: nodes.Test) -> None: - self.generic_visit(node) - self.tests.add(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting at blocks.""" - - -class UndeclaredNameVisitor(NodeVisitor): - """A visitor that checks if a name is accessed without being - declared. This is different from the frame visitor as it will - not stop at closure frames. - """ - - def __init__(self, names: t.Iterable[str]) -> None: - self.names = set(names) - self.undeclared: t.Set[str] = set() - - def visit_Name(self, node: nodes.Name) -> None: - if node.ctx == "load" and node.name in self.names: - self.undeclared.add(node.name) - if self.undeclared == self.names: - raise VisitorExit() - else: - self.names.discard(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting a blocks.""" - - -class CompilerExit(Exception): - """Raised if the compiler encountered a situation where it just - doesn't make sense to further process the code. Any block that - raises such an exception is not further processed. - """ - - -class CodeGenerator(NodeVisitor): - def __init__( - self, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, - ) -> None: - if stream is None: - stream = StringIO() - self.environment = environment - self.name = name - self.filename = filename - self.stream = stream - self.created_block_context = False - self.defer_init = defer_init - self.optimizer: t.Optional[Optimizer] = None - - if optimized: - self.optimizer = Optimizer(environment) - - # aliases for imports - self.import_aliases: t.Dict[str, str] = {} - - # a registry for all blocks. Because blocks are moved out - # into the global python scope they are registered here - self.blocks: t.Dict[str, nodes.Block] = {} - - # the number of extends statements so far - self.extends_so_far = 0 - - # some templates have a rootlevel extends. In this case we - # can safely assume that we're a child template and do some - # more optimizations. - self.has_known_extends = False - - # the current line number - self.code_lineno = 1 - - # registry of all filters and tests (global, not block local) - self.tests: t.Dict[str, str] = {} - self.filters: t.Dict[str, str] = {} - - # the debug information - self.debug_info: t.List[t.Tuple[int, int]] = [] - self._write_debug_info: t.Optional[int] = None - - # the number of new lines before the next write() - self._new_lines = 0 - - # the line number of the last written statement - self._last_line = 0 - - # true if nothing was written so far. - self._first_write = True - - # used by the `temporary_identifier` method to get new - # unique, temporary identifier - self._last_identifier = 0 - - # the current indentation - self._indentation = 0 - - # Tracks toplevel assignments - self._assign_stack: t.List[t.Set[str]] = [] - - # Tracks parameter definition blocks - self._param_def_block: t.List[t.Set[str]] = [] - - # Tracks the current context. - self._context_reference_stack = ["context"] - - @property - def optimized(self) -> bool: - return self.optimizer is not None - - # -- Various compilation helpers - - def fail(self, msg: str, lineno: int) -> "te.NoReturn": - """Fail with a :exc:`TemplateAssertionError`.""" - raise TemplateAssertionError(msg, lineno, self.name, self.filename) - - def temporary_identifier(self) -> str: - """Get a new unique identifier.""" - self._last_identifier += 1 - return f"t_{self._last_identifier}" - - def buffer(self, frame: Frame) -> None: - """Enable buffering for the frame from that point onwards.""" - frame.buffer = self.temporary_identifier() - self.writeline(f"{frame.buffer} = []") - - def return_buffer_contents( - self, frame: Frame, force_unescaped: bool = False - ) -> None: - """Return the buffer contents of the frame.""" - if not force_unescaped: - if frame.eval_ctx.volatile: - self.writeline("if context.eval_ctx.autoescape:") - self.indent() - self.writeline(f"return Markup(concat({frame.buffer}))") - self.outdent() - self.writeline("else:") - self.indent() - self.writeline(f"return concat({frame.buffer})") - self.outdent() - return - elif frame.eval_ctx.autoescape: - self.writeline(f"return Markup(concat({frame.buffer}))") - return - self.writeline(f"return concat({frame.buffer})") - - def indent(self) -> None: - """Indent by one.""" - self._indentation += 1 - - def outdent(self, step: int = 1) -> None: - """Outdent by step.""" - self._indentation -= step - - def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: - """Yield or write into the frame buffer.""" - if frame.buffer is None: - self.writeline("yield ", node) - else: - self.writeline(f"{frame.buffer}.append(", node) - - def end_write(self, frame: Frame) -> None: - """End the writing process started by `start_write`.""" - if frame.buffer is not None: - self.write(")") - - def simple_write( - self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None - ) -> None: - """Simple shortcut for start_write + write + end_write.""" - self.start_write(frame, node) - self.write(s) - self.end_write(frame) - - def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: - """Visit a list of nodes as block in a frame. If the current frame - is no buffer a dummy ``if 0: yield None`` is written automatically. - """ - try: - self.writeline("pass") - for node in nodes: - self.visit(node, frame) - except CompilerExit: - pass - - def write(self, x: str) -> None: - """Write a string into the output stream.""" - if self._new_lines: - if not self._first_write: - self.stream.write("\n" * self._new_lines) - self.code_lineno += self._new_lines - if self._write_debug_info is not None: - self.debug_info.append((self._write_debug_info, self.code_lineno)) - self._write_debug_info = None - self._first_write = False - self.stream.write(" " * self._indentation) - self._new_lines = 0 - self.stream.write(x) - - def writeline( - self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 - ) -> None: - """Combination of newline and write.""" - self.newline(node, extra) - self.write(x) - - def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: - """Add one or more newlines before the next write.""" - self._new_lines = max(self._new_lines, 1 + extra) - if node is not None and node.lineno != self._last_line: - self._write_debug_info = node.lineno - self._last_line = node.lineno - - def signature( - self, - node: t.Union[nodes.Call, nodes.Filter, nodes.Test], - frame: Frame, - extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - ) -> None: - """Writes a function call to the stream for the current node. - A leading comma is added automatically. The extra keyword - arguments may not include python keywords otherwise a syntax - error could occur. The extra keyword arguments should be given - as python dict. - """ - # if any of the given keyword arguments is a python keyword - # we have to make sure that no invalid call is created. - kwarg_workaround = any( - is_python_keyword(t.cast(str, k)) - for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) - ) - - for arg in node.args: - self.write(", ") - self.visit(arg, frame) - - if not kwarg_workaround: - for kwarg in node.kwargs: - self.write(", ") - self.visit(kwarg, frame) - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f", {key}={value}") - if node.dyn_args: - self.write(", *") - self.visit(node.dyn_args, frame) - - if kwarg_workaround: - if node.dyn_kwargs is not None: - self.write(", **dict({") - else: - self.write(", **{") - for kwarg in node.kwargs: - self.write(f"{kwarg.key!r}: ") - self.visit(kwarg.value, frame) - self.write(", ") - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f"{key!r}: {value}, ") - if node.dyn_kwargs is not None: - self.write("}, **") - self.visit(node.dyn_kwargs, frame) - self.write(")") - else: - self.write("}") - - elif node.dyn_kwargs is not None: - self.write(", **") - self.visit(node.dyn_kwargs, frame) - - def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: - """Find all filter and test names used in the template and - assign them to variables in the compiled namespace. Checking - that the names are registered with the environment is done when - compiling the Filter and Test nodes. If the node is in an If or - CondExpr node, the check is done at runtime instead. - - .. versionchanged:: 3.0 - Filters and tests in If and CondExpr nodes are checked at - runtime instead of compile time. - """ - visitor = DependencyFinderVisitor() - - for node in nodes: - visitor.visit(node) - - for id_map, names, dependency in ( - (self.filters, visitor.filters, "filters"), - ( - self.tests, - visitor.tests, - "tests", - ), - ): - for name in sorted(names): - if name not in id_map: - id_map[name] = self.temporary_identifier() - - # add check during runtime that dependencies used inside of executed - # blocks are defined, as this step may be skipped during compile time - self.writeline("try:") - self.indent() - self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") - self.outdent() - self.writeline("except KeyError:") - self.indent() - self.writeline("@internalcode") - self.writeline(f"def {id_map[name]}(*unused):") - self.indent() - self.writeline( - f'raise TemplateRuntimeError("No {dependency[:-1]}' - f' named {name!r} found.")' - ) - self.outdent() - self.outdent() - - def enter_frame(self, frame: Frame) -> None: - undefs = [] - for target, (action, param) in frame.symbols.loads.items(): - if action == VAR_LOAD_PARAMETER: - pass - elif action == VAR_LOAD_RESOLVE: - self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") - elif action == VAR_LOAD_ALIAS: - self.writeline(f"{target} = {param}") - elif action == VAR_LOAD_UNDEFINED: - undefs.append(target) - else: - raise NotImplementedError("unknown load instruction") - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: - if not with_python_scope: - undefs = [] - for target in frame.symbols.loads: - undefs.append(target) - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: - return async_value if self.environment.is_async else sync_value - - def func(self, name: str) -> str: - return f"{self.choose_async()}def {name}" - - def macro_body( - self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame - ) -> t.Tuple[Frame, MacroRef]: - """Dump the function def of a macro or call block.""" - frame = frame.inner() - frame.symbols.analyze_node(node) - macro_ref = MacroRef(node) - - explicit_caller = None - skip_special_params = set() - args = [] - - for idx, arg in enumerate(node.args): - if arg.name == "caller": - explicit_caller = idx - if arg.name in ("kwargs", "varargs"): - skip_special_params.add(arg.name) - args.append(frame.symbols.ref(arg.name)) - - undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) - - if "caller" in undeclared: - # In older Jinja versions there was a bug that allowed caller - # to retain the special behavior even if it was mentioned in - # the argument list. However thankfully this was only really - # working if it was the last argument. So we are explicitly - # checking this now and error out if it is anywhere else in - # the argument list. - if explicit_caller is not None: - try: - node.defaults[explicit_caller - len(node.args)] - except IndexError: - self.fail( - "When defining macros or call blocks the " - 'special "caller" argument must be omitted ' - "or be given a default.", - node.lineno, - ) - else: - args.append(frame.symbols.declare_parameter("caller")) - macro_ref.accesses_caller = True - if "kwargs" in undeclared and "kwargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("kwargs")) - macro_ref.accesses_kwargs = True - if "varargs" in undeclared and "varargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("varargs")) - macro_ref.accesses_varargs = True - - # macros are delayed, they never require output checks - frame.require_output_check = False - frame.symbols.analyze_node(node) - self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) - self.indent() - - self.buffer(frame) - self.enter_frame(frame) - - self.push_parameter_definitions(frame) - for idx, arg in enumerate(node.args): - ref = frame.symbols.ref(arg.name) - self.writeline(f"if {ref} is missing:") - self.indent() - try: - default = node.defaults[idx - len(node.args)] - except IndexError: - self.writeline( - f'{ref} = undefined("parameter {arg.name!r} was not provided",' - f" name={arg.name!r})" - ) - else: - self.writeline(f"{ref} = ") - self.visit(default, frame) - self.mark_parameter_stored(ref) - self.outdent() - self.pop_parameter_definitions() - - self.blockvisit(node.body, frame) - self.return_buffer_contents(frame, force_unescaped=True) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - return frame, macro_ref - - def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: - """Dump the macro definition for the def created by macro_body.""" - arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) - name = getattr(macro_ref.node, "name", None) - if len(macro_ref.node.args) == 1: - arg_tuple += "," - self.write( - f"Macro(environment, macro, {name!r}, ({arg_tuple})," - f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," - f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" - ) - - def position(self, node: nodes.Node) -> str: - """Return a human readable position for the node.""" - rv = f"line {node.lineno}" - if self.name is not None: - rv = f"{rv} in {self.name!r}" - return rv - - def dump_local_context(self, frame: Frame) -> str: - items_kv = ", ".join( - f"{name!r}: {target}" - for name, target in frame.symbols.dump_stores().items() - ) - return f"{{{items_kv}}}" - - def write_commons(self) -> None: - """Writes a common preamble that is used by root and block functions. - Primarily this sets up common local helpers and enforces a generator - through a dead branch. - """ - self.writeline("resolve = context.resolve_or_missing") - self.writeline("undefined = environment.undefined") - self.writeline("concat = environment.concat") - # always use the standard Undefined class for the implicit else of - # conditional expressions - self.writeline("cond_expr_undefined = Undefined") - self.writeline("if 0: yield None") - - def push_parameter_definitions(self, frame: Frame) -> None: - """Pushes all parameter targets from the given frame into a local - stack that permits tracking of yet to be assigned parameters. In - particular this enables the optimization from `visit_Name` to skip - undefined expressions for parameters in macros as macros can reference - otherwise unbound parameters. - """ - self._param_def_block.append(frame.symbols.dump_param_targets()) - - def pop_parameter_definitions(self) -> None: - """Pops the current parameter definitions set.""" - self._param_def_block.pop() - - def mark_parameter_stored(self, target: str) -> None: - """Marks a parameter in the current parameter definitions as stored. - This will skip the enforced undefined checks. - """ - if self._param_def_block: - self._param_def_block[-1].discard(target) - - def push_context_reference(self, target: str) -> None: - self._context_reference_stack.append(target) - - def pop_context_reference(self) -> None: - self._context_reference_stack.pop() - - def get_context_ref(self) -> str: - return self._context_reference_stack[-1] - - def get_resolve_func(self) -> str: - target = self._context_reference_stack[-1] - if target == "context": - return "resolve" - return f"{target}.resolve" - - def derive_context(self, frame: Frame) -> str: - return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" - - def parameter_is_undeclared(self, target: str) -> bool: - """Checks if a given target is an undeclared parameter.""" - if not self._param_def_block: - return False - return target in self._param_def_block[-1] - - def push_assign_tracking(self) -> None: - """Pushes a new layer for assignment tracking.""" - self._assign_stack.append(set()) - - def pop_assign_tracking(self, frame: Frame) -> None: - """Pops the topmost level for assignment tracking and updates the - context variables if necessary. - """ - vars = self._assign_stack.pop() - if ( - not frame.block_frame - and not frame.loop_frame - and not frame.toplevel - or not vars - ): - return - public_names = [x for x in vars if x[:1] != "_"] - if len(vars) == 1: - name = next(iter(vars)) - ref = frame.symbols.ref(name) - if frame.loop_frame: - self.writeline(f"_loop_vars[{name!r}] = {ref}") - return - if frame.block_frame: - self.writeline(f"_block_vars[{name!r}] = {ref}") - return - self.writeline(f"context.vars[{name!r}] = {ref}") - else: - if frame.loop_frame: - self.writeline("_loop_vars.update({") - elif frame.block_frame: - self.writeline("_block_vars.update({") - else: - self.writeline("context.vars.update({") - for idx, name in enumerate(vars): - if idx: - self.write(", ") - ref = frame.symbols.ref(name) - self.write(f"{name!r}: {ref}") - self.write("})") - if not frame.block_frame and not frame.loop_frame and public_names: - if len(public_names) == 1: - self.writeline(f"context.exported_vars.add({public_names[0]!r})") - else: - names_str = ", ".join(map(repr, public_names)) - self.writeline(f"context.exported_vars.update(({names_str}))") - - # -- Statement Visitors - - def visit_Template( - self, node: nodes.Template, frame: t.Optional[Frame] = None - ) -> None: - assert frame is None, "no root frame allowed" - eval_ctx = EvalContext(self.environment, self.name) - - from .runtime import async_exported - from .runtime import exported - - if self.environment.is_async: - exported_names = sorted(exported + async_exported) - else: - exported_names = sorted(exported) - - self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) - - # if we want a deferred initialization we cannot move the - # environment into a local name - envenv = "" if self.defer_init else ", environment=environment" - - # do we have an extends tag at all? If not, we can save some - # overhead by just not processing any inheritance code. - have_extends = node.find(nodes.Extends) is not None - - # find all blocks - for block in node.find_all(nodes.Block): - if block.name in self.blocks: - self.fail(f"block {block.name!r} defined twice", block.lineno) - self.blocks[block.name] = block - - # find all imports and import them - for import_ in node.find_all(nodes.ImportedName): - if import_.importname not in self.import_aliases: - imp = import_.importname - self.import_aliases[imp] = alias = self.temporary_identifier() - if "." in imp: - module, obj = imp.rsplit(".", 1) - self.writeline(f"from {module} import {obj} as {alias}") - else: - self.writeline(f"import {imp} as {alias}") - - # add the load name - self.writeline(f"name = {self.name!r}") - - # generate the root render function. - self.writeline( - f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 - ) - self.indent() - self.write_commons() - - # process the root - frame = Frame(eval_ctx) - if "self" in find_undeclared(node.body, ("self",)): - ref = frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - frame.symbols.analyze_node(node) - frame.toplevel = frame.rootlevel = True - frame.require_output_check = have_extends and not self.has_known_extends - if have_extends: - self.writeline("parent_template = None") - self.enter_frame(frame) - self.pull_dependencies(node.body) - self.blockvisit(node.body, frame) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - # make sure that the parent root is called. - if have_extends: - if not self.has_known_extends: - self.indent() - self.writeline("if parent_template is not None:") - self.indent() - if not self.environment.is_async: - self.writeline("yield from parent_template.root_render_func(context)") - else: - self.writeline( - "async for event in parent_template.root_render_func(context):" - ) - self.indent() - self.writeline("yield event") - self.outdent() - self.outdent(1 + (not self.has_known_extends)) - - # at this point we now have the blocks collected and can visit them too. - for name, block in self.blocks.items(): - self.writeline( - f"{self.func('block_' + name)}(context, missing=missing{envenv}):", - block, - 1, - ) - self.indent() - self.write_commons() - # It's important that we do not make this frame a child of the - # toplevel template. This would cause a variety of - # interesting issues with identifier tracking. - block_frame = Frame(eval_ctx) - block_frame.block_frame = True - undeclared = find_undeclared(block.body, ("self", "super")) - if "self" in undeclared: - ref = block_frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - if "super" in undeclared: - ref = block_frame.symbols.declare_parameter("super") - self.writeline(f"{ref} = context.super({name!r}, block_{name})") - block_frame.symbols.analyze_node(block) - block_frame.block = name - self.writeline("_block_vars = {}") - self.enter_frame(block_frame) - self.pull_dependencies(block.body) - self.blockvisit(block.body, block_frame) - self.leave_frame(block_frame, with_python_scope=True) - self.outdent() - - blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) - self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) - debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) - self.writeline(f"debug_info = {debug_kv_str!r}") - - def visit_Block(self, node: nodes.Block, frame: Frame) -> None: - """Call a block and register it for the template.""" - level = 0 - if frame.toplevel: - # if we know that we are a child template, there is no need to - # check if we are one - if self.has_known_extends: - return - if self.extends_so_far > 0: - self.writeline("if parent_template is None:") - self.indent() - level += 1 - - if node.scoped: - context = self.derive_context(frame) - else: - context = self.get_context_ref() - - if node.required: - self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) - self.indent() - self.writeline( - f'raise TemplateRuntimeError("Required block {node.name!r} not found")', - node, - ) - self.outdent() - - if not self.environment.is_async and frame.buffer is None: - self.writeline( - f"yield from context.blocks[{node.name!r}][0]({context})", node - ) - else: - self.writeline( - f"{self.choose_async()}for event in" - f" context.blocks[{node.name!r}][0]({context}):", - node, - ) - self.indent() - self.simple_write("event", frame) - self.outdent() - - self.outdent(level) - - def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: - """Calls the extender.""" - if not frame.toplevel: - self.fail("cannot use extend from a non top-level scope", node.lineno) - - # if the number of extends statements in general is zero so - # far, we don't have to add a check if something extended - # the template before this one. - if self.extends_so_far > 0: - # if we have a known extends we just add a template runtime - # error into the generated code. We could catch that at compile - # time too, but i welcome it not to confuse users by throwing the - # same error at different times just "because we can". - if not self.has_known_extends: - self.writeline("if parent_template is not None:") - self.indent() - self.writeline('raise TemplateRuntimeError("extended multiple times")') - - # if we have a known extends already we don't need that code here - # as we know that the template execution will end here. - if self.has_known_extends: - raise CompilerExit() - else: - self.outdent() - - self.writeline("parent_template = environment.get_template(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - self.writeline("for name, parent_block in parent_template.blocks.items():") - self.indent() - self.writeline("context.blocks.setdefault(name, []).append(parent_block)") - self.outdent() - - # if this extends statement was in the root level we can take - # advantage of that information and simplify the generated code - # in the top level from this point onwards - if frame.rootlevel: - self.has_known_extends = True - - # and now we have one more - self.extends_so_far += 1 - - def visit_Include(self, node: nodes.Include, frame: Frame) -> None: - """Handles includes.""" - if node.ignore_missing: - self.writeline("try:") - self.indent() - - func_name = "get_or_select_template" - if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, str): - func_name = "get_template" - elif isinstance(node.template.value, (tuple, list)): - func_name = "select_template" - elif isinstance(node.template, (nodes.Tuple, nodes.List)): - func_name = "select_template" - - self.writeline(f"template = environment.{func_name}(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - if node.ignore_missing: - self.outdent() - self.writeline("except TemplateNotFound:") - self.indent() - self.writeline("pass") - self.outdent() - self.writeline("else:") - self.indent() - - skip_event_yield = False - if node.with_context: - self.writeline( - f"{self.choose_async()}for event in template.root_render_func(" - "template.new_context(context.get_all(), True," - f" {self.dump_local_context(frame)})):" - ) - elif self.environment.is_async: - self.writeline( - "for event in (await template._get_default_module_async())" - "._body_stream:" - ) - else: - self.writeline("yield from template._get_default_module()._body_stream") - skip_event_yield = True - - if not skip_event_yield: - self.indent() - self.simple_write("event", frame) - self.outdent() - - if node.ignore_missing: - self.outdent() - - def _import_common( - self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame - ) -> None: - self.write(f"{self.choose_async('await ')}environment.get_template(") - self.visit(node.template, frame) - self.write(f", {self.name!r}).") - - if node.with_context: - f_name = f"make_module{self.choose_async('_async')}" - self.write( - f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" - ) - else: - self.write(f"_get_default_module{self.choose_async('_async')}(context)") - - def visit_Import(self, node: nodes.Import, frame: Frame) -> None: - """Visit regular imports.""" - self.writeline(f"{frame.symbols.ref(node.target)} = ", node) - if frame.toplevel: - self.write(f"context.vars[{node.target!r}] = ") - - self._import_common(node, frame) - - if frame.toplevel and not node.target.startswith("_"): - self.writeline(f"context.exported_vars.discard({node.target!r})") - - def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: - """Visit named imports.""" - self.newline(node) - self.write("included_template = ") - self._import_common(node, frame) - var_names = [] - discarded_names = [] - for name in node.names: - if isinstance(name, tuple): - name, alias = name - else: - alias = name - self.writeline( - f"{frame.symbols.ref(alias)} =" - f" getattr(included_template, {name!r}, missing)" - ) - self.writeline(f"if {frame.symbols.ref(alias)} is missing:") - self.indent() - message = ( - "the template {included_template.__name__!r}" - f" (imported on {self.position(node)})" - f" does not export the requested name {name!r}" - ) - self.writeline( - f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" - ) - self.outdent() - if frame.toplevel: - var_names.append(alias) - if not alias.startswith("_"): - discarded_names.append(alias) - - if var_names: - if len(var_names) == 1: - name = var_names[0] - self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") - else: - names_kv = ", ".join( - f"{name!r}: {frame.symbols.ref(name)}" for name in var_names - ) - self.writeline(f"context.vars.update({{{names_kv}}})") - if discarded_names: - if len(discarded_names) == 1: - self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") - else: - names_str = ", ".join(map(repr, discarded_names)) - self.writeline( - f"context.exported_vars.difference_update(({names_str}))" - ) - - def visit_For(self, node: nodes.For, frame: Frame) -> None: - loop_frame = frame.inner() - loop_frame.loop_frame = True - test_frame = frame.inner() - else_frame = frame.inner() - - # try to figure out if we have an extended loop. An extended loop - # is necessary if the loop is in recursive mode if the special loop - # variable is accessed in the body if the body is a scoped block. - extended_loop = ( - node.recursive - or "loop" - in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) - or any(block.scoped for block in node.find_all(nodes.Block)) - ) - - loop_ref = None - if extended_loop: - loop_ref = loop_frame.symbols.declare_parameter("loop") - - loop_frame.symbols.analyze_node(node, for_branch="body") - if node.else_: - else_frame.symbols.analyze_node(node, for_branch="else") - - if node.test: - loop_filter_func = self.temporary_identifier() - test_frame.symbols.analyze_node(node, for_branch="test") - self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) - self.indent() - self.enter_frame(test_frame) - self.writeline(self.choose_async("async for ", "for ")) - self.visit(node.target, loop_frame) - self.write(" in ") - self.write(self.choose_async("auto_aiter(fiter)", "fiter")) - self.write(":") - self.indent() - self.writeline("if ", node.test) - self.visit(node.test, test_frame) - self.write(":") - self.indent() - self.writeline("yield ") - self.visit(node.target, loop_frame) - self.outdent(3) - self.leave_frame(test_frame, with_python_scope=True) - - # if we don't have an recursive loop we have to find the shadowed - # variables at that point. Because loops can be nested but the loop - # variable is a special one we have to enforce aliasing for it. - if node.recursive: - self.writeline( - f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node - ) - self.indent() - self.buffer(loop_frame) - - # Use the same buffer for the else frame - else_frame.buffer = loop_frame.buffer - - # make sure the loop variable is a special one and raise a template - # assertion error if a loop tries to write to loop - if extended_loop: - self.writeline(f"{loop_ref} = missing") - - for name in node.find_all(nodes.Name): - if name.ctx == "store" and name.name == "loop": - self.fail( - "Can't assign to special loop variable in for-loop target", - name.lineno, - ) - - if node.else_: - iteration_indicator = self.temporary_identifier() - self.writeline(f"{iteration_indicator} = 1") - - self.writeline(self.choose_async("async for ", "for "), node) - self.visit(node.target, loop_frame) - if extended_loop: - self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") - else: - self.write(" in ") - - if node.test: - self.write(f"{loop_filter_func}(") - if node.recursive: - self.write("reciter") - else: - if self.environment.is_async and not extended_loop: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async and not extended_loop: - self.write(")") - if node.test: - self.write(")") - - if node.recursive: - self.write(", undefined, loop_render_func, depth):") - else: - self.write(", undefined):" if extended_loop else ":") - - self.indent() - self.enter_frame(loop_frame) - - self.writeline("_loop_vars = {}") - self.blockvisit(node.body, loop_frame) - if node.else_: - self.writeline(f"{iteration_indicator} = 0") - self.outdent() - self.leave_frame( - loop_frame, with_python_scope=node.recursive and not node.else_ - ) - - if node.else_: - self.writeline(f"if {iteration_indicator}:") - self.indent() - self.enter_frame(else_frame) - self.blockvisit(node.else_, else_frame) - self.leave_frame(else_frame) - self.outdent() - - # if the node was recursive we have to return the buffer contents - # and start the iteration code - if node.recursive: - self.return_buffer_contents(loop_frame) - self.outdent() - self.start_write(frame, node) - self.write(f"{self.choose_async('await ')}loop(") - if self.environment.is_async: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async: - self.write(")") - self.write(", loop)") - self.end_write(frame) - - # at the end of the iteration, clear any assignments made in the - # loop from the top level - if self._assign_stack: - self._assign_stack[-1].difference_update(loop_frame.symbols.stores) - - def visit_If(self, node: nodes.If, frame: Frame) -> None: - if_frame = frame.soft() - self.writeline("if ", node) - self.visit(node.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(node.body, if_frame) - self.outdent() - for elif_ in node.elif_: - self.writeline("elif ", elif_) - self.visit(elif_.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(elif_.body, if_frame) - self.outdent() - if node.else_: - self.writeline("else:") - self.indent() - self.blockvisit(node.else_, if_frame) - self.outdent() - - def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: - macro_frame, macro_ref = self.macro_body(node, frame) - self.newline() - if frame.toplevel: - if not node.name.startswith("_"): - self.write(f"context.exported_vars.add({node.name!r})") - self.writeline(f"context.vars[{node.name!r}] = ") - self.write(f"{frame.symbols.ref(node.name)} = ") - self.macro_def(macro_ref, macro_frame) - - def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: - call_frame, macro_ref = self.macro_body(node, frame) - self.writeline("caller = ") - self.macro_def(macro_ref, call_frame) - self.start_write(frame, node) - self.visit_Call(node.call, frame, forward_caller=True) - self.end_write(frame) - - def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: - filter_frame = frame.inner() - filter_frame.symbols.analyze_node(node) - self.enter_frame(filter_frame) - self.buffer(filter_frame) - self.blockvisit(node.body, filter_frame) - self.start_write(frame, node) - self.visit_Filter(node.filter, filter_frame) - self.end_write(frame) - self.leave_frame(filter_frame) - - def visit_With(self, node: nodes.With, frame: Frame) -> None: - with_frame = frame.inner() - with_frame.symbols.analyze_node(node) - self.enter_frame(with_frame) - for target, expr in zip(node.targets, node.values): - self.newline() - self.visit(target, with_frame) - self.write(" = ") - self.visit(expr, frame) - self.blockvisit(node.body, with_frame) - self.leave_frame(with_frame) - - def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: - self.newline(node) - self.visit(node.node, frame) - - class _FinalizeInfo(t.NamedTuple): - const: t.Optional[t.Callable[..., str]] - src: t.Optional[str] - - @staticmethod - def _default_finalize(value: t.Any) -> t.Any: - """The default finalize function if the environment isn't - configured with one. Or, if the environment has one, this is - called on that function's output for constants. - """ - return str(value) - - _finalize: t.Optional[_FinalizeInfo] = None - - def _make_finalize(self) -> _FinalizeInfo: - """Build the finalize function to be used on constants and at - runtime. Cached so it's only created once for all output nodes. - - Returns a ``namedtuple`` with the following attributes: - - ``const`` - A function to finalize constant data at compile time. - - ``src`` - Source code to output around nodes to be evaluated at - runtime. - """ - if self._finalize is not None: - return self._finalize - - finalize: t.Optional[t.Callable[..., t.Any]] - finalize = default = self._default_finalize - src = None - - if self.environment.finalize: - src = "environment.finalize(" - env_finalize = self.environment.finalize - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(env_finalize) # type: ignore - ) - finalize = None - - if pass_arg is None: - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(value)) - - else: - src = f"{src}{pass_arg}, " - - if pass_arg == "environment": - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(self.environment, value)) - - self._finalize = self._FinalizeInfo(finalize, src) - return self._finalize - - def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: - """Given a group of constant values converted from ``Output`` - child nodes, produce a string to write to the template module - source. - """ - return repr(concat(group)) - - def _output_child_to_const( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> str: - """Try to optimize a child of an ``Output`` node by trying to - convert it to constant, finalized data at compile time. - - If :exc:`Impossible` is raised, the node is not constant and - will be evaluated at runtime. Any other exception will also be - evaluated at runtime for easier debugging. - """ - const = node.as_const(frame.eval_ctx) - - if frame.eval_ctx.autoescape: - const = escape(const) - - # Template data doesn't go through finalize. - if isinstance(node, nodes.TemplateData): - return str(const) - - return finalize.const(const) # type: ignore - - def _output_child_pre( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code before visiting a child of an - ``Output`` node. - """ - if frame.eval_ctx.volatile: - self.write("(escape if context.eval_ctx.autoescape else str)(") - elif frame.eval_ctx.autoescape: - self.write("escape(") - else: - self.write("str(") - - if finalize.src is not None: - self.write(finalize.src) - - def _output_child_post( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code after visiting a child of an - ``Output`` node. - """ - self.write(")") - - if finalize.src is not None: - self.write(")") - - def visit_Output(self, node: nodes.Output, frame: Frame) -> None: - # If an extends is active, don't render outside a block. - if frame.require_output_check: - # A top-level extends is known to exist at compile time. - if self.has_known_extends: - return - - self.writeline("if parent_template is None:") - self.indent() - - finalize = self._make_finalize() - body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] - - # Evaluate constants at compile time if possible. Each item in - # body will be either a list of static data or a node to be - # evaluated at runtime. - for child in node.nodes: - try: - if not ( - # If the finalize function requires runtime context, - # constants can't be evaluated at compile time. - finalize.const - # Unless it's basic template data that won't be - # finalized anyway. - or isinstance(child, nodes.TemplateData) - ): - raise nodes.Impossible() - - const = self._output_child_to_const(child, frame, finalize) - except (nodes.Impossible, Exception): - # The node was not constant and needs to be evaluated at - # runtime. Or another error was raised, which is easier - # to debug at runtime. - body.append(child) - continue - - if body and isinstance(body[-1], list): - body[-1].append(const) - else: - body.append([const]) - - if frame.buffer is not None: - if len(body) == 1: - self.writeline(f"{frame.buffer}.append(") - else: - self.writeline(f"{frame.buffer}.extend((") - - self.indent() - - for item in body: - if isinstance(item, list): - # A group of constant data to join and output. - val = self._output_const_repr(item) - - if frame.buffer is None: - self.writeline("yield " + val) - else: - self.writeline(val + ",") - else: - if frame.buffer is None: - self.writeline("yield ", item) - else: - self.newline(item) - - # A node to be evaluated at runtime. - self._output_child_pre(item, frame, finalize) - self.visit(item, frame) - self._output_child_post(item, frame, finalize) - - if frame.buffer is not None: - self.write(",") - - if frame.buffer is not None: - self.outdent() - self.writeline(")" if len(body) == 1 else "))") - - if frame.require_output_check: - self.outdent() - - def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: - self.push_assign_tracking() - self.newline(node) - self.visit(node.target, frame) - self.write(" = ") - self.visit(node.node, frame) - self.pop_assign_tracking(frame) - - def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: - self.push_assign_tracking() - block_frame = frame.inner() - # This is a special case. Since a set block always captures we - # will disable output checks. This way one can use set blocks - # toplevel even in extended templates. - block_frame.require_output_check = False - block_frame.symbols.analyze_node(node) - self.enter_frame(block_frame) - self.buffer(block_frame) - self.blockvisit(node.body, block_frame) - self.newline(node) - self.visit(node.target, frame) - self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") - if node.filter is not None: - self.visit_Filter(node.filter, block_frame) - else: - self.write(f"concat({block_frame.buffer})") - self.write(")") - self.pop_assign_tracking(frame) - self.leave_frame(block_frame) - - # -- Expression Visitors - - def visit_Name(self, node: nodes.Name, frame: Frame) -> None: - if node.ctx == "store" and ( - frame.toplevel or frame.loop_frame or frame.block_frame - ): - if self._assign_stack: - self._assign_stack[-1].add(node.name) - ref = frame.symbols.ref(node.name) - - # If we are looking up a variable we might have to deal with the - # case where it's undefined. We can skip that case if the load - # instruction indicates a parameter which are always defined. - if node.ctx == "load": - load = frame.symbols.find_load(ref) - if not ( - load is not None - and load[0] == VAR_LOAD_PARAMETER - and not self.parameter_is_undeclared(ref) - ): - self.write( - f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" - ) - return - - self.write(ref) - - def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: - # NSRefs can only be used to store values; since they use the normal - # `foo.bar` notation they will be parsed as a normal attribute access - # when used anywhere but in a `set` context - ref = frame.symbols.ref(node.name) - self.writeline(f"if not isinstance({ref}, Namespace):") - self.indent() - self.writeline( - "raise TemplateRuntimeError" - '("cannot assign attribute on non-namespace object")' - ) - self.outdent() - self.writeline(f"{ref}[{node.attr!r}]") - - def visit_Const(self, node: nodes.Const, frame: Frame) -> None: - val = node.as_const(frame.eval_ctx) - if isinstance(val, float): - self.write(str(val)) - else: - self.write(repr(val)) - - def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: - try: - self.write(repr(node.as_const(frame.eval_ctx))) - except nodes.Impossible: - self.write( - f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" - ) - - def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: - self.write("(") - idx = -1 - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write(",)" if idx == 0 else ")") - - def visit_List(self, node: nodes.List, frame: Frame) -> None: - self.write("[") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write("]") - - def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: - self.write("{") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item.key, frame) - self.write(": ") - self.visit(item.value, frame) - self.write("}") - - visit_Add = _make_binop("+") - visit_Sub = _make_binop("-") - visit_Mul = _make_binop("*") - visit_Div = _make_binop("/") - visit_FloorDiv = _make_binop("//") - visit_Pow = _make_binop("**") - visit_Mod = _make_binop("%") - visit_And = _make_binop("and") - visit_Or = _make_binop("or") - visit_Pos = _make_unop("+") - visit_Neg = _make_unop("-") - visit_Not = _make_unop("not ") - - @optimizeconst - def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: - if frame.eval_ctx.volatile: - func_name = "(markup_join if context.eval_ctx.volatile else str_join)" - elif frame.eval_ctx.autoescape: - func_name = "markup_join" - else: - func_name = "str_join" - self.write(f"{func_name}((") - for arg in node.nodes: - self.visit(arg, frame) - self.write(", ") - self.write("))") - - @optimizeconst - def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: - self.write("(") - self.visit(node.expr, frame) - for op in node.ops: - self.visit(op, frame) - self.write(")") - - def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: - self.write(f" {operators[node.op]} ") - self.visit(node.expr, frame) - - @optimizeconst - def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getattr(") - self.visit(node.node, frame) - self.write(f", {node.attr!r})") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: - # slices bypass the environment getitem method. - if isinstance(node.arg, nodes.Slice): - self.visit(node.node, frame) - self.write("[") - self.visit(node.arg, frame) - self.write("]") - else: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getitem(") - self.visit(node.node, frame) - self.write(", ") - self.visit(node.arg, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: - if node.start is not None: - self.visit(node.start, frame) - self.write(":") - if node.stop is not None: - self.visit(node.stop, frame) - if node.step is not None: - self.write(":") - self.visit(node.step, frame) - - @contextmanager - def _filter_test_common( - self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool - ) -> t.Iterator[None]: - if self.environment.is_async: - self.write("(await auto_await(") - - if is_filter: - self.write(f"{self.filters[node.name]}(") - func = self.environment.filters.get(node.name) - else: - self.write(f"{self.tests[node.name]}(") - func = self.environment.tests.get(node.name) - - # When inside an If or CondExpr frame, allow the filter to be - # undefined at compile time and only raise an error if it's - # actually called at runtime. See pull_dependencies. - if func is None and not frame.soft_frame: - type_name = "filter" if is_filter else "test" - self.fail(f"No {type_name} named {node.name!r}.", node.lineno) - - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(func) # type: ignore - ) - - if pass_arg is not None: - self.write(f"{pass_arg}, ") - - # Back to the visitor function to handle visiting the target of - # the filter or test. - yield - - self.signature(node, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: - with self._filter_test_common(node, frame, True): - # if the filter node is None we are inside a filter block - # and want to write to the current buffer - if node.node is not None: - self.visit(node.node, frame) - elif frame.eval_ctx.volatile: - self.write( - f"(Markup(concat({frame.buffer}))" - f" if context.eval_ctx.autoescape else concat({frame.buffer}))" - ) - elif frame.eval_ctx.autoescape: - self.write(f"Markup(concat({frame.buffer}))") - else: - self.write(f"concat({frame.buffer})") - - @optimizeconst - def visit_Test(self, node: nodes.Test, frame: Frame) -> None: - with self._filter_test_common(node, frame, False): - self.visit(node.node, frame) - - @optimizeconst - def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: - frame = frame.soft() - - def write_expr2() -> None: - if node.expr2 is not None: - self.visit(node.expr2, frame) - return - - self.write( - f'cond_expr_undefined("the inline if-expression on' - f" {self.position(node)} evaluated to false and no else" - f' section was defined.")' - ) - - self.write("(") - self.visit(node.expr1, frame) - self.write(" if ") - self.visit(node.test, frame) - self.write(" else ") - write_expr2() - self.write(")") - - @optimizeconst - def visit_Call( - self, node: nodes.Call, frame: Frame, forward_caller: bool = False - ) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - if self.environment.sandboxed: - self.write("environment.call(context, ") - else: - self.write("context.call(") - self.visit(node.node, frame) - extra_kwargs = {"caller": "caller"} if forward_caller else None - loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} - block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} - if extra_kwargs: - extra_kwargs.update(loop_kwargs, **block_kwargs) - elif loop_kwargs or block_kwargs: - extra_kwargs = dict(loop_kwargs, **block_kwargs) - self.signature(node, frame, extra_kwargs) - self.write(")") - if self.environment.is_async: - self.write("))") - - def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: - self.write(node.key + "=") - self.visit(node.value, frame) - - # -- Unused nodes for extensions - - def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: - self.write("Markup(") - self.visit(node.expr, frame) - self.write(")") - - def visit_MarkSafeIfAutoescape( - self, node: nodes.MarkSafeIfAutoescape, frame: Frame - ) -> None: - self.write("(Markup if context.eval_ctx.autoescape else identity)(") - self.visit(node.expr, frame) - self.write(")") - - def visit_EnvironmentAttribute( - self, node: nodes.EnvironmentAttribute, frame: Frame - ) -> None: - self.write("environment." + node.name) - - def visit_ExtensionAttribute( - self, node: nodes.ExtensionAttribute, frame: Frame - ) -> None: - self.write(f"environment.extensions[{node.identifier!r}].{node.name}") - - def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: - self.write(self.import_aliases[node.importname]) - - def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: - self.write(node.name) - - def visit_ContextReference( - self, node: nodes.ContextReference, frame: Frame - ) -> None: - self.write("context") - - def visit_DerivedContextReference( - self, node: nodes.DerivedContextReference, frame: Frame - ) -> None: - self.write(self.derive_context(frame)) - - def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: - self.writeline("continue", node) - - def visit_Break(self, node: nodes.Break, frame: Frame) -> None: - self.writeline("break", node) - - def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: - scope_frame = frame.inner() - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - - def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: - ctx = self.temporary_identifier() - self.writeline(f"{ctx} = {self.derive_context(frame)}") - self.writeline(f"{ctx}.vars = ") - self.visit(node.context, frame) - self.push_context_reference(ctx) - - scope_frame = frame.inner(isolated=True) - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - self.pop_context_reference() - - def visit_EvalContextModifier( - self, node: nodes.EvalContextModifier, frame: Frame - ) -> None: - for keyword in node.options: - self.writeline(f"context.eval_ctx.{keyword.key} = ") - self.visit(keyword.value, frame) - try: - val = keyword.value.as_const(frame.eval_ctx) - except nodes.Impossible: - frame.eval_ctx.volatile = True - else: - setattr(frame.eval_ctx, keyword.key, val) - - def visit_ScopedEvalContextModifier( - self, node: nodes.ScopedEvalContextModifier, frame: Frame - ) -> None: - old_ctx_name = self.temporary_identifier() - saved_ctx = frame.eval_ctx.save() - self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") - self.visit_EvalContextModifier(node, frame) - for child in node.body: - self.visit(child, frame) - frame.eval_ctx.revert(saved_ctx) - self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/lib/python3.12/site-packages/jinja2/constants.py b/lib/python3.12/site-packages/jinja2/constants.py deleted file mode 100644 index 41a1c23..0000000 --- a/lib/python3.12/site-packages/jinja2/constants.py +++ /dev/null @@ -1,20 +0,0 @@ -#: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = """\ -a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at -auctor augue bibendum blandit class commodo condimentum congue consectetuer -consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus -diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend -elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames -faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac -hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum -justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem -luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie -mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non -nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque -penatibus per pharetra phasellus placerat platea porta porttitor posuere -potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus -ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit -sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor -tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices -ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus -viverra volutpat vulputate""" diff --git a/lib/python3.12/site-packages/jinja2/debug.py b/lib/python3.12/site-packages/jinja2/debug.py deleted file mode 100644 index 7ed7e92..0000000 --- a/lib/python3.12/site-packages/jinja2/debug.py +++ /dev/null @@ -1,191 +0,0 @@ -import sys -import typing as t -from types import CodeType -from types import TracebackType - -from .exceptions import TemplateSyntaxError -from .utils import internal_code -from .utils import missing - -if t.TYPE_CHECKING: - from .runtime import Context - - -def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: - """Rewrite the current exception to replace any tracebacks from - within compiled template code with tracebacks that look like they - came from the template source. - - This must be called within an ``except`` block. - - :param source: For ``TemplateSyntaxError``, the original source if - known. - :return: The original exception with the rewritten traceback. - """ - _, exc_value, tb = sys.exc_info() - exc_value = t.cast(BaseException, exc_value) - tb = t.cast(TracebackType, tb) - - if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: - exc_value.translated = True - exc_value.source = source - # Remove the old traceback, otherwise the frames from the - # compiler still show up. - exc_value.with_traceback(None) - # Outside of runtime, so the frame isn't executing template - # code, but it still needs to point at the template. - tb = fake_traceback( - exc_value, None, exc_value.filename or "", exc_value.lineno - ) - else: - # Skip the frame for the render function. - tb = tb.tb_next - - stack = [] - - # Build the stack of traceback object, replacing any in template - # code with the source file and line information. - while tb is not None: - # Skip frames decorated with @internalcode. These are internal - # calls that aren't useful in template debugging output. - if tb.tb_frame.f_code in internal_code: - tb = tb.tb_next - continue - - template = tb.tb_frame.f_globals.get("__jinja_template__") - - if template is not None: - lineno = template.get_corresponding_lineno(tb.tb_lineno) - fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) - stack.append(fake_tb) - else: - stack.append(tb) - - tb = tb.tb_next - - tb_next = None - - # Assign tb_next in reverse to avoid circular references. - for tb in reversed(stack): - tb.tb_next = tb_next - tb_next = tb - - return exc_value.with_traceback(tb_next) - - -def fake_traceback( # type: ignore - exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int -) -> TracebackType: - """Produce a new traceback object that looks like it came from the - template source instead of the compiled code. The filename, line - number, and location name will point to the template, and the local - variables will be the current template context. - - :param exc_value: The original exception to be re-raised to create - the new traceback. - :param tb: The original traceback to get the local variables and - code info from. - :param filename: The template filename. - :param lineno: The line number in the template source. - """ - if tb is not None: - # Replace the real locals with the context that would be - # available at that point in the template. - locals = get_template_locals(tb.tb_frame.f_locals) - locals.pop("__jinja_exception__", None) - else: - locals = {} - - globals = { - "__name__": filename, - "__file__": filename, - "__jinja_exception__": exc_value, - } - # Raise an exception at the correct line number. - code: CodeType = compile( - "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" - ) - - # Build a new code object that points to the template file and - # replaces the location with a block name. - location = "template" - - if tb is not None: - function = tb.tb_frame.f_code.co_name - - if function == "root": - location = "top-level template code" - elif function.startswith("block_"): - location = f"block {function[6:]!r}" - - if sys.version_info >= (3, 8): - code = code.replace(co_name=location) - else: - code = CodeType( - code.co_argcount, - code.co_kwonlyargcount, - code.co_nlocals, - code.co_stacksize, - code.co_flags, - code.co_code, - code.co_consts, - code.co_names, - code.co_varnames, - code.co_filename, - location, - code.co_firstlineno, - code.co_lnotab, - code.co_freevars, - code.co_cellvars, - ) - - # Execute the new code, which is guaranteed to raise, and return - # the new traceback without this frame. - try: - exec(code, globals, locals) - except BaseException: - return sys.exc_info()[2].tb_next # type: ignore - - -def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: - """Based on the runtime locals, get the context that would be - available at that point in the template. - """ - # Start with the current template context. - ctx: "t.Optional[Context]" = real_locals.get("context") - - if ctx is not None: - data: t.Dict[str, t.Any] = ctx.get_all().copy() - else: - data = {} - - # Might be in a derived context that only sets local variables - # rather than pushing a context. Local variables follow the scheme - # l_depth_name. Find the highest-depth local that has a value for - # each name. - local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} - - for name, value in real_locals.items(): - if not name.startswith("l_") or value is missing: - # Not a template variable, or no longer relevant. - continue - - try: - _, depth_str, name = name.split("_", 2) - depth = int(depth_str) - except ValueError: - continue - - cur_depth = local_overrides.get(name, (-1,))[0] - - if cur_depth < depth: - local_overrides[name] = (depth, value) - - # Modify the context with any derived context. - for name, (_, value) in local_overrides.items(): - if value is missing: - data.pop(name, None) - else: - data[name] = value - - return data diff --git a/lib/python3.12/site-packages/jinja2/defaults.py b/lib/python3.12/site-packages/jinja2/defaults.py deleted file mode 100644 index 638cad3..0000000 --- a/lib/python3.12/site-packages/jinja2/defaults.py +++ /dev/null @@ -1,48 +0,0 @@ -import typing as t - -from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 -from .tests import TESTS as DEFAULT_TESTS # noqa: F401 -from .utils import Cycler -from .utils import generate_lorem_ipsum -from .utils import Joiner -from .utils import Namespace - -if t.TYPE_CHECKING: - import typing_extensions as te - -# defaults for the parser / lexer -BLOCK_START_STRING = "{%" -BLOCK_END_STRING = "%}" -VARIABLE_START_STRING = "{{" -VARIABLE_END_STRING = "}}" -COMMENT_START_STRING = "{#" -COMMENT_END_STRING = "#}" -LINE_STATEMENT_PREFIX: t.Optional[str] = None -LINE_COMMENT_PREFIX: t.Optional[str] = None -TRIM_BLOCKS = False -LSTRIP_BLOCKS = False -NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" -KEEP_TRAILING_NEWLINE = False - -# default filters, tests and namespace - -DEFAULT_NAMESPACE = { - "range": range, - "dict": dict, - "lipsum": generate_lorem_ipsum, - "cycler": Cycler, - "joiner": Joiner, - "namespace": Namespace, -} - -# default policies -DEFAULT_POLICIES: t.Dict[str, t.Any] = { - "compiler.ascii_str": True, - "urlize.rel": "noopener", - "urlize.target": None, - "urlize.extra_schemes": None, - "truncate.leeway": 5, - "json.dumps_function": None, - "json.dumps_kwargs": {"sort_keys": True}, - "ext.i18n.trimmed": False, -} diff --git a/lib/python3.12/site-packages/jinja2/environment.py b/lib/python3.12/site-packages/jinja2/environment.py deleted file mode 100644 index 1d3be0b..0000000 --- a/lib/python3.12/site-packages/jinja2/environment.py +++ /dev/null @@ -1,1675 +0,0 @@ -"""Classes for managing templates and their runtime and compile time -options. -""" - -import os -import typing -import typing as t -import weakref -from collections import ChainMap -from functools import lru_cache -from functools import partial -from functools import reduce -from types import CodeType - -from markupsafe import Markup - -from . import nodes -from .compiler import CodeGenerator -from .compiler import generate -from .defaults import BLOCK_END_STRING -from .defaults import BLOCK_START_STRING -from .defaults import COMMENT_END_STRING -from .defaults import COMMENT_START_STRING -from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] -from .defaults import DEFAULT_NAMESPACE -from .defaults import DEFAULT_POLICIES -from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] -from .defaults import KEEP_TRAILING_NEWLINE -from .defaults import LINE_COMMENT_PREFIX -from .defaults import LINE_STATEMENT_PREFIX -from .defaults import LSTRIP_BLOCKS -from .defaults import NEWLINE_SEQUENCE -from .defaults import TRIM_BLOCKS -from .defaults import VARIABLE_END_STRING -from .defaults import VARIABLE_START_STRING -from .exceptions import TemplateNotFound -from .exceptions import TemplateRuntimeError -from .exceptions import TemplatesNotFound -from .exceptions import TemplateSyntaxError -from .exceptions import UndefinedError -from .lexer import get_lexer -from .lexer import Lexer -from .lexer import TokenStream -from .nodes import EvalContext -from .parser import Parser -from .runtime import Context -from .runtime import new_context -from .runtime import Undefined -from .utils import _PassArg -from .utils import concat -from .utils import consume -from .utils import import_string -from .utils import internalcode -from .utils import LRUCache -from .utils import missing - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .bccache import BytecodeCache - from .ext import Extension - from .loaders import BaseLoader - -_env_bound = t.TypeVar("_env_bound", bound="Environment") - - -# for direct template usage we have up to ten living environments -@lru_cache(maxsize=10) -def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: - """Return a new spontaneous environment. A spontaneous environment - is used for templates created directly rather than through an - existing environment. - - :param cls: Environment class to create. - :param args: Positional arguments passed to environment. - """ - env = cls(*args) - env.shared = True - return env - - -def create_cache( - size: int, -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Return the cache class for the given size.""" - if size == 0: - return None - - if size < 0: - return {} - - return LRUCache(size) # type: ignore - - -def copy_cache( - cache: t.Optional[t.MutableMapping[t.Any, t.Any]], -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Create an empty copy of the given cache.""" - if cache is None: - return None - - if type(cache) is dict: # noqa E721 - return {} - - return LRUCache(cache.capacity) # type: ignore - - -def load_extensions( - environment: "Environment", - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], -) -> t.Dict[str, "Extension"]: - """Load the extensions from the list and bind it to the environment. - Returns a dict of instantiated extensions. - """ - result = {} - - for extension in extensions: - if isinstance(extension, str): - extension = t.cast(t.Type["Extension"], import_string(extension)) - - result[extension.identifier] = extension(environment) - - return result - - -def _environment_config_check(environment: "Environment") -> "Environment": - """Perform a sanity check on the environment.""" - assert issubclass( - environment.undefined, Undefined - ), "'undefined' must be a subclass of 'jinja2.Undefined'." - assert ( - environment.block_start_string - != environment.variable_start_string - != environment.comment_start_string - ), "block, variable and comment start strings must be different." - assert environment.newline_sequence in { - "\r", - "\r\n", - "\n", - }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." - return environment - - -class Environment: - r"""The core component of Jinja is the `Environment`. It contains - important shared variables like configuration, filters, tests, - globals and others. Instances of this class may be modified if - they are not shared and if no template was loaded so far. - Modifications on environments after the first template was loaded - will lead to surprising effects and undefined behavior. - - Here are the possible initialization parameters: - - `block_start_string` - The string marking the beginning of a block. Defaults to ``'{%'``. - - `block_end_string` - The string marking the end of a block. Defaults to ``'%}'``. - - `variable_start_string` - The string marking the beginning of a print statement. - Defaults to ``'{{'``. - - `variable_end_string` - The string marking the end of a print statement. Defaults to - ``'}}'``. - - `comment_start_string` - The string marking the beginning of a comment. Defaults to ``'{#'``. - - `comment_end_string` - The string marking the end of a comment. Defaults to ``'#}'``. - - `line_statement_prefix` - If given and a string, this will be used as prefix for line based - statements. See also :ref:`line-statements`. - - `line_comment_prefix` - If given and a string, this will be used as prefix for line based - comments. See also :ref:`line-statements`. - - .. versionadded:: 2.2 - - `trim_blocks` - If this is set to ``True`` the first newline after a block is - removed (block, not variable tag!). Defaults to `False`. - - `lstrip_blocks` - If this is set to ``True`` leading spaces and tabs are stripped - from the start of a line to a block. Defaults to `False`. - - `newline_sequence` - The sequence that starts a newline. Must be one of ``'\r'``, - ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a - useful default for Linux and OS X systems as well as web - applications. - - `keep_trailing_newline` - Preserve the trailing newline when rendering templates. - The default is ``False``, which causes a single newline, - if present, to be stripped from the end of the template. - - .. versionadded:: 2.7 - - `extensions` - List of Jinja extensions to use. This can either be import paths - as strings or extension classes. For more information have a - look at :ref:`the extensions documentation `. - - `optimized` - should the optimizer be enabled? Default is ``True``. - - `undefined` - :class:`Undefined` or a subclass of it that is used to represent - undefined values in the template. - - `finalize` - A callable that can be used to process the result of a variable - expression before it is output. For example one can convert - ``None`` implicitly into an empty string here. - - `autoescape` - If set to ``True`` the XML/HTML autoescaping feature is enabled by - default. For more details about autoescaping see - :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also - be a callable that is passed the template name and has to - return ``True`` or ``False`` depending on autoescape should be - enabled by default. - - .. versionchanged:: 2.4 - `autoescape` can now be a function - - `loader` - The template loader for this environment. - - `cache_size` - The size of the cache. Per default this is ``400`` which means - that if more than 400 templates are loaded the loader will clean - out the least recently used template. If the cache size is set to - ``0`` templates are recompiled all the time, if the cache size is - ``-1`` the cache will not be cleaned. - - .. versionchanged:: 2.8 - The cache size was increased to 400 from a low 50. - - `auto_reload` - Some loaders load templates from locations where the template - sources may change (ie: file system or database). If - ``auto_reload`` is set to ``True`` (default) every time a template is - requested the loader checks if the source changed and if yes, it - will reload the template. For higher performance it's possible to - disable that. - - `bytecode_cache` - If set to a bytecode cache object, this object will provide a - cache for the internal Jinja bytecode so that templates don't - have to be parsed if they were not changed. - - See :ref:`bytecode-cache` for more information. - - `enable_async` - If set to true this enables async template execution which - allows using async functions and generators. - """ - - #: if this environment is sandboxed. Modifying this variable won't make - #: the environment sandboxed though. For a real sandboxed environment - #: have a look at jinja2.sandbox. This flag alone controls the code - #: generation by the compiler. - sandboxed = False - - #: True if the environment is just an overlay - overlayed = False - - #: the environment this environment is linked to if it is an overlay - linked_to: t.Optional["Environment"] = None - - #: shared environments have this set to `True`. A shared environment - #: must not be modified - shared = False - - #: the class that is used for code generation. See - #: :class:`~jinja2.compiler.CodeGenerator` for more information. - code_generator_class: t.Type["CodeGenerator"] = CodeGenerator - - concat = "".join - - #: the context class that is used for templates. See - #: :class:`~jinja2.runtime.Context` for more information. - context_class: t.Type[Context] = Context - - template_class: t.Type["Template"] - - def __init__( - self, - block_start_string: str = BLOCK_START_STRING, - block_end_string: str = BLOCK_END_STRING, - variable_start_string: str = VARIABLE_START_STRING, - variable_end_string: str = VARIABLE_END_STRING, - comment_start_string: str = COMMENT_START_STRING, - comment_end_string: str = COMMENT_END_STRING, - line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, - line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, - trim_blocks: bool = TRIM_BLOCKS, - lstrip_blocks: bool = LSTRIP_BLOCKS, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, - keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), - optimized: bool = True, - undefined: t.Type[Undefined] = Undefined, - finalize: t.Optional[t.Callable[..., t.Any]] = None, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, - loader: t.Optional["BaseLoader"] = None, - cache_size: int = 400, - auto_reload: bool = True, - bytecode_cache: t.Optional["BytecodeCache"] = None, - enable_async: bool = False, - ): - # !!Important notice!! - # The constructor accepts quite a few arguments that should be - # passed by keyword rather than position. However it's important to - # not change the order of arguments because it's used at least - # internally in those cases: - # - spontaneous environments (i18n extension and Template) - # - unittests - # If parameter changes are required only add parameters at the end - # and don't change the arguments (or the defaults!) of the arguments - # existing already. - - # lexer / parser information - self.block_start_string = block_start_string - self.block_end_string = block_end_string - self.variable_start_string = variable_start_string - self.variable_end_string = variable_end_string - self.comment_start_string = comment_start_string - self.comment_end_string = comment_end_string - self.line_statement_prefix = line_statement_prefix - self.line_comment_prefix = line_comment_prefix - self.trim_blocks = trim_blocks - self.lstrip_blocks = lstrip_blocks - self.newline_sequence = newline_sequence - self.keep_trailing_newline = keep_trailing_newline - - # runtime information - self.undefined: t.Type[Undefined] = undefined - self.optimized = optimized - self.finalize = finalize - self.autoescape = autoescape - - # defaults - self.filters = DEFAULT_FILTERS.copy() - self.tests = DEFAULT_TESTS.copy() - self.globals = DEFAULT_NAMESPACE.copy() - - # set the loader provided - self.loader = loader - self.cache = create_cache(cache_size) - self.bytecode_cache = bytecode_cache - self.auto_reload = auto_reload - - # configurable policies - self.policies = DEFAULT_POLICIES.copy() - - # load extensions - self.extensions = load_extensions(self, extensions) - - self.is_async = enable_async - _environment_config_check(self) - - def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: - """Adds an extension after the environment was created. - - .. versionadded:: 2.5 - """ - self.extensions.update(load_extensions(self, [extension])) - - def extend(self, **attributes: t.Any) -> None: - """Add the items to the instance of the environment if they do not exist - yet. This is used by :ref:`extensions ` to register - callbacks and configuration values without breaking inheritance. - """ - for key, value in attributes.items(): - if not hasattr(self, key): - setattr(self, key, value) - - def overlay( - self, - block_start_string: str = missing, - block_end_string: str = missing, - variable_start_string: str = missing, - variable_end_string: str = missing, - comment_start_string: str = missing, - comment_end_string: str = missing, - line_statement_prefix: t.Optional[str] = missing, - line_comment_prefix: t.Optional[str] = missing, - trim_blocks: bool = missing, - lstrip_blocks: bool = missing, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, - keep_trailing_newline: bool = missing, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, - optimized: bool = missing, - undefined: t.Type[Undefined] = missing, - finalize: t.Optional[t.Callable[..., t.Any]] = missing, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, - loader: t.Optional["BaseLoader"] = missing, - cache_size: int = missing, - auto_reload: bool = missing, - bytecode_cache: t.Optional["BytecodeCache"] = missing, - enable_async: bool = False, - ) -> "Environment": - """Create a new overlay environment that shares all the data with the - current environment except for cache and the overridden attributes. - Extensions cannot be removed for an overlayed environment. An overlayed - environment automatically gets all the extensions of the environment it - is linked to plus optional extra extensions. - - Creating overlays should happen after the initial environment was set - up completely. Not all attributes are truly linked, some are just - copied over so modifications on the original environment may not shine - through. - - .. versionchanged:: 3.1.2 - Added the ``newline_sequence``,, ``keep_trailing_newline``, - and ``enable_async`` parameters to match ``__init__``. - """ - args = dict(locals()) - del args["self"], args["cache_size"], args["extensions"], args["enable_async"] - - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.overlayed = True - rv.linked_to = self - - for key, value in args.items(): - if value is not missing: - setattr(rv, key, value) - - if cache_size is not missing: - rv.cache = create_cache(cache_size) - else: - rv.cache = copy_cache(self.cache) - - rv.extensions = {} - for key, value in self.extensions.items(): - rv.extensions[key] = value.bind(rv) - if extensions is not missing: - rv.extensions.update(load_extensions(rv, extensions)) - - if enable_async is not missing: - rv.is_async = enable_async - - return _environment_config_check(rv) - - @property - def lexer(self) -> Lexer: - """The lexer for this environment.""" - return get_lexer(self) - - def iter_extensions(self) -> t.Iterator["Extension"]: - """Iterates over the extensions by priority.""" - return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) - - def getitem( - self, obj: t.Any, argument: t.Union[str, t.Any] - ) -> t.Union[t.Any, Undefined]: - """Get an item or attribute of an object but prefer the item.""" - try: - return obj[argument] - except (AttributeError, TypeError, LookupError): - if isinstance(argument, str): - try: - attr = str(argument) - except Exception: - pass - else: - try: - return getattr(obj, attr) - except AttributeError: - pass - return self.undefined(obj=obj, name=argument) - - def getattr(self, obj: t.Any, attribute: str) -> t.Any: - """Get an item or attribute of an object but prefer the attribute. - Unlike :meth:`getitem` the attribute *must* be a string. - """ - try: - return getattr(obj, attribute) - except AttributeError: - pass - try: - return obj[attribute] - except (TypeError, LookupError, AttributeError): - return self.undefined(obj=obj, name=attribute) - - def _filter_test_common( - self, - name: t.Union[str, Undefined], - value: t.Any, - args: t.Optional[t.Sequence[t.Any]], - kwargs: t.Optional[t.Mapping[str, t.Any]], - context: t.Optional[Context], - eval_ctx: t.Optional[EvalContext], - is_filter: bool, - ) -> t.Any: - if is_filter: - env_map = self.filters - type_name = "filter" - else: - env_map = self.tests - type_name = "test" - - func = env_map.get(name) # type: ignore - - if func is None: - msg = f"No {type_name} named {name!r}." - - if isinstance(name, Undefined): - try: - name._fail_with_undefined_error() - except Exception as e: - msg = f"{msg} ({e}; did you forget to quote the callable name?)" - - raise TemplateRuntimeError(msg) - - args = [value, *(args if args is not None else ())] - kwargs = kwargs if kwargs is not None else {} - pass_arg = _PassArg.from_obj(func) - - if pass_arg is _PassArg.context: - if context is None: - raise TemplateRuntimeError( - f"Attempted to invoke a context {type_name} without context." - ) - - args.insert(0, context) - elif pass_arg is _PassArg.eval_context: - if eval_ctx is None: - if context is not None: - eval_ctx = context.eval_ctx - else: - eval_ctx = EvalContext(self) - - args.insert(0, eval_ctx) - elif pass_arg is _PassArg.environment: - args.insert(0, self) - - return func(*args, **kwargs) - - def call_filter( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a filter on a value the same way the compiler does. - - This might return a coroutine if the filter is running from an - environment in async mode and the filter supports async - execution. It's your responsibility to await this if needed. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, True - ) - - def call_test( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a test on a value the same way the compiler does. - - This might return a coroutine if the test is running from an - environment in async mode and the test supports async execution. - It's your responsibility to await this if needed. - - .. versionchanged:: 3.0 - Tests support ``@pass_context``, etc. decorators. Added - the ``context`` and ``eval_ctx`` parameters. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, False - ) - - @internalcode - def parse( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> nodes.Template: - """Parse the sourcecode and return the abstract syntax tree. This - tree of nodes is used by the compiler to convert the template into - executable source- or bytecode. This is useful for debugging or to - extract information from templates. - - If you are :ref:`developing Jinja extensions ` - this gives you a good overview of the node tree generated. - """ - try: - return self._parse(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def _parse( - self, source: str, name: t.Optional[str], filename: t.Optional[str] - ) -> nodes.Template: - """Internal parsing function used by `parse` and `compile`.""" - return Parser(self, source, name, filename).parse() - - def lex( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> t.Iterator[t.Tuple[int, str, str]]: - """Lex the given sourcecode and return a generator that yields - tokens as tuples in the form ``(lineno, token_type, value)``. - This can be useful for :ref:`extension development ` - and debugging templates. - - This does not perform preprocessing. If you want the preprocessing - of the extensions to be applied you have to filter source through - the :meth:`preprocess` method. - """ - source = str(source) - try: - return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def preprocess( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> str: - """Preprocesses the source with all extensions. This is automatically - called for all parsing and compiling methods but *not* for :meth:`lex` - because there you usually only want the actual source tokenized. - """ - return reduce( - lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), - str(source), - ) - - def _tokenize( - self, - source: str, - name: t.Optional[str], - filename: t.Optional[str] = None, - state: t.Optional[str] = None, - ) -> TokenStream: - """Called by the parser to do the preprocessing and filtering - for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. - """ - source = self.preprocess(source, name, filename) - stream = self.lexer.tokenize(source, name, filename, state) - - for ext in self.iter_extensions(): - stream = ext.filter_stream(stream) # type: ignore - - if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) - - return stream - - def _generate( - self, - source: nodes.Template, - name: t.Optional[str], - filename: t.Optional[str], - defer_init: bool = False, - ) -> str: - """Internal hook that can be overridden to hook a different generate - method in. - - .. versionadded:: 2.5 - """ - return generate( # type: ignore - source, - self, - name, - filename, - defer_init=defer_init, - optimized=self.optimized, - ) - - def _compile(self, source: str, filename: str) -> CodeType: - """Internal hook that can be overridden to hook a different compile - method in. - - .. versionadded:: 2.5 - """ - return compile(source, filename, "exec") - - @typing.overload - def compile( # type: ignore - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[False]" = False, - defer_init: bool = False, - ) -> CodeType: ... - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[True]" = ..., - defer_init: bool = False, - ) -> str: ... - - @internalcode - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: bool = False, - defer_init: bool = False, - ) -> t.Union[str, CodeType]: - """Compile a node or template source code. The `name` parameter is - the load name of the template after it was joined using - :meth:`join_path` if necessary, not the filename on the file system. - the `filename` parameter is the estimated filename of the template on - the file system. If the template came from a database or memory this - can be omitted. - - The return value of this method is a python code object. If the `raw` - parameter is `True` the return value will be a string with python - code equivalent to the bytecode returned otherwise. This method is - mainly used internally. - - `defer_init` is use internally to aid the module code generator. This - causes the generated code to be able to import without the global - environment variable to be set. - - .. versionadded:: 2.4 - `defer_init` parameter added. - """ - source_hint = None - try: - if isinstance(source, str): - source_hint = source - source = self._parse(source, name, filename) - source = self._generate(source, name, filename, defer_init=defer_init) - if raw: - return source - if filename is None: - filename = "

    1p5K#bZbWRZr$$P8i7`& zn9A7V(}3I{DhX0B0Fy$4W>rwdQB%+Y>T0@1gI2|SjRYk{0BBQ0fOf?Kuuic8bSM%) zP;r1x#STzb>HxYX9RVi;lOyLMLglN3pt|C3@i2fJBuld-RO!x|p;cCMLb7CBtaMe7 ztjRD0N+!uIIv6nPLLwYjb$e6`De6f0N-V9fk0j%%XiN>M6+O}df-Y!kY=rq>Fe!AQq(6z)5%nlrALynXtF0YnH~deSJ{gy z>xo4#mI;q^?|Qfg6jI%h3P&!5M^&vSoYEp=s&XX;1Jfm2(Rw0aI6Y+pNKNWeC=^XZ z)1gpiT}6|+4cbGvI|S2Y!QC<=T(>Q>`k;~*Bu7#5<|Xf3;}?>D5k`=RAyRB0&e_}r z$PJQ48ZW@q+Hqy72kNtgbwCv`F?5-nNw-W4^o!_LwA>fNF%74By)3|qqiQ+?>X>P$ z?z>FFbru@{Op~u<&)dG6fp-FV*_V@iY#UJje><&%)%Z@?4#3vfUU*{F_QDfeaMn%) zt9FB$!1>k<2=J|{jG(A%aqgosH!IxJt-yqEI?W!iFB|d*czH$5tY6MJPDIvf>j5C^ znr5%g2_M?tw-w~AIce+a?V^3~?T+*9DrCw8+XQ@N=_k*(5i(`Yn#Xbcih@>X9Arw! znqIYKg=u=dH4FG9IG{$ad$Yon>3WAivZm@$>uRh^cjCbk>O}c;0g>wtLq_V777xc_ zs+QIToT7{TtQu|~?XILzY%er3Ez6lwU2r?}YEJ+FTUg&bBY{B_-M-J=zL|cG`txr8 zy!E!b;NCMcupl?*EZA7ESABEe*^C5KZapR=dD}xg-;G3al4^hRRUkKiWlRQh0)rLGN?%ut;4_o6Hk5`neP@RRbOdx5Dm%J#Z zEd4bkplg2(dW82xWA(^E@e-5_L&7{IzARp!EY(-(RWe~7CRb^|GMMoVFqULqF!LzHj%Z@kTXhxQm)h7= zulJ>?jOToUK^`-jh-Or!c0_xozTGkFo35B<(~F=@C{S6Hq9{>c#Gbklw5DXsPkL% zRa%NXlsyi!118xifgJKscV!e`06pWs z$&b?{*Ss&^wRdjUyXLq1Zdw5SkA{1Gt+AQvbUR3g2R>8BG|Xa^S~881E9J+On-! zLr4aZ)nun-(rMgw8-Qu@W%E8z;jX=(b?q%Q@0)Qf$m`yiczxn+M?vn)Nu8@@g?B41 zt8;)nC{(Sbzu>YlgTw=^D9{5*8#?>`%w;rgQR% zoOFVpcQ8PY1{zox2J7}vD4xXoODLo}LZQo7!m-jObYWD1d8Zp-!IeUubw}PR_Y@P9Iwo z%wpGlI~6nx88Tk;&b$VI~9ZUzQrVNS(K=Fl9oP!(KQ0UNn zS!@EZ{1OaTUlJ7H?L%Nr=sdd2d!c{gT2Q)Of!{G!f)1k?wyMz5?dq0kkYRj<_l~-# zhNb{9Cd^jdTsYe@>nl$M-IWW&1(>bjRzZkzQ&Dcu%k2f(H+Lp4`*V`NEIpBnj^RO> zfu=Q;diJfU>&Ru=-$b%b~pM zP>IiNB|hVnWhPMJGhRune14D#lzA*nQiz*&{@lpl1mUUk!3u+S$CchOg){_k5h^)? zWooiNx8*?Ib>P)wrETNDK#LB6P)SC>e@hjQg9f3Sn95Ed(pmFL)or{|b>k~lcQt3% zYFvF)mpQ9(r}!1P;6nt$yAi8Hfc`|c8fo)EY*~^Q@kOoV=DGLbnvV?T=UQ=KT{=*T zK8M%@3_%~O-34&ZOey`6T=*B+{7+*0hS+})O!VO&2!MNbTDNoBdQT$F8|Kc;U%u1! zX\d+))?$') - - def __init__(self, step=None): - self.step = asint(step) - if self.step == 0: - raise ValueError('Increment must be higher than 0') - - def validate_range(self, field_name): - from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES - - value_range = MAX_VALUES[field_name] - MIN_VALUES[field_name] - if self.step and self.step > value_range: - raise ValueError('the step value ({}) is higher than the total range of the ' - 'expression ({})'.format(self.step, value_range)) - - def get_next_value(self, date, field): - start = field.get_value(date) - minval = field.get_min(date) - maxval = field.get_max(date) - start = max(start, minval) - - if not self.step: - next = start - else: - distance_to_next = (self.step - (start - minval)) % self.step - next = start + distance_to_next - - if next <= maxval: - return next - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.step == other.step - - def __str__(self): - if self.step: - return '*/%d' % self.step - return '*' - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, self.step) - - -class RangeExpression(AllExpression): - value_re = re.compile( - r'(?P\d+)(?:-(?P\d+))?(?:/(?P\d+))?$') - - def __init__(self, first, last=None, step=None): - super(RangeExpression, self).__init__(step) - first = asint(first) - last = asint(last) - if last is None and step is None: - last = first - if last is not None and first > last: - raise ValueError('The minimum value in a range must not be higher than the maximum') - self.first = first - self.last = last - - def validate_range(self, field_name): - from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES - - super(RangeExpression, self).validate_range(field_name) - if self.first < MIN_VALUES[field_name]: - raise ValueError('the first value ({}) is lower than the minimum value ({})' - .format(self.first, MIN_VALUES[field_name])) - if self.last is not None and self.last > MAX_VALUES[field_name]: - raise ValueError('the last value ({}) is higher than the maximum value ({})' - .format(self.last, MAX_VALUES[field_name])) - value_range = (self.last or MAX_VALUES[field_name]) - self.first - if self.step and self.step > value_range: - raise ValueError('the step value ({}) is higher than the total range of the ' - 'expression ({})'.format(self.step, value_range)) - - def get_next_value(self, date, field): - startval = field.get_value(date) - minval = field.get_min(date) - maxval = field.get_max(date) - - # Apply range limits - minval = max(minval, self.first) - maxval = min(maxval, self.last) if self.last is not None else maxval - nextval = max(minval, startval) - - # Apply the step if defined - if self.step: - distance_to_next = (self.step - (nextval - minval)) % self.step - nextval += distance_to_next - - return nextval if nextval <= maxval else None - - def __eq__(self, other): - return (isinstance(other, self.__class__) and self.first == other.first and - self.last == other.last) - - def __str__(self): - if self.last != self.first and self.last is not None: - range = '%d-%d' % (self.first, self.last) - else: - range = str(self.first) - - if self.step: - return '%s/%d' % (range, self.step) - return range - - def __repr__(self): - args = [str(self.first)] - if self.last != self.first and self.last is not None or self.step: - args.append(str(self.last)) - if self.step: - args.append(str(self.step)) - return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) - - -class MonthRangeExpression(RangeExpression): - value_re = re.compile(r'(?P[a-z]+)(?:-(?P[a-z]+))?', re.IGNORECASE) - - def __init__(self, first, last=None): - try: - first_num = MONTHS.index(first.lower()) + 1 - except ValueError: - raise ValueError('Invalid month name "%s"' % first) - - if last: - try: - last_num = MONTHS.index(last.lower()) + 1 - except ValueError: - raise ValueError('Invalid month name "%s"' % last) - else: - last_num = None - - super(MonthRangeExpression, self).__init__(first_num, last_num) - - def __str__(self): - if self.last != self.first and self.last is not None: - return '%s-%s' % (MONTHS[self.first - 1], MONTHS[self.last - 1]) - return MONTHS[self.first - 1] - - def __repr__(self): - args = ["'%s'" % MONTHS[self.first]] - if self.last != self.first and self.last is not None: - args.append("'%s'" % MONTHS[self.last - 1]) - return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) - - -class WeekdayRangeExpression(RangeExpression): - value_re = re.compile(r'(?P[a-z]+)(?:-(?P[a-z]+))?', re.IGNORECASE) - - def __init__(self, first, last=None): - try: - first_num = WEEKDAYS.index(first.lower()) - except ValueError: - raise ValueError('Invalid weekday name "%s"' % first) - - if last: - try: - last_num = WEEKDAYS.index(last.lower()) - except ValueError: - raise ValueError('Invalid weekday name "%s"' % last) - else: - last_num = None - - super(WeekdayRangeExpression, self).__init__(first_num, last_num) - - def __str__(self): - if self.last != self.first and self.last is not None: - return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last]) - return WEEKDAYS[self.first] - - def __repr__(self): - args = ["'%s'" % WEEKDAYS[self.first]] - if self.last != self.first and self.last is not None: - args.append("'%s'" % WEEKDAYS[self.last]) - return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) - - -class WeekdayPositionExpression(AllExpression): - options = ['1st', '2nd', '3rd', '4th', '5th', 'last'] - value_re = re.compile(r'(?P%s) +(?P(?:\d+|\w+))' % - '|'.join(options), re.IGNORECASE) - - def __init__(self, option_name, weekday_name): - super(WeekdayPositionExpression, self).__init__(None) - try: - self.option_num = self.options.index(option_name.lower()) - except ValueError: - raise ValueError('Invalid weekday position "%s"' % option_name) - - try: - self.weekday = WEEKDAYS.index(weekday_name.lower()) - except ValueError: - raise ValueError('Invalid weekday name "%s"' % weekday_name) - - def get_next_value(self, date, field): - # Figure out the weekday of the month's first day and the number of days in that month - first_day_wday, last_day = monthrange(date.year, date.month) - - # Calculate which day of the month is the first of the target weekdays - first_hit_day = self.weekday - first_day_wday + 1 - if first_hit_day <= 0: - first_hit_day += 7 - - # Calculate what day of the month the target weekday would be - if self.option_num < 5: - target_day = first_hit_day + self.option_num * 7 - else: - target_day = first_hit_day + ((last_day - first_hit_day) // 7) * 7 - - if target_day <= last_day and target_day >= date.day: - return target_day - - def __eq__(self, other): - return (super(WeekdayPositionExpression, self).__eq__(other) and - self.option_num == other.option_num and self.weekday == other.weekday) - - def __str__(self): - return '%s %s' % (self.options[self.option_num], WEEKDAYS[self.weekday]) - - def __repr__(self): - return "%s('%s', '%s')" % (self.__class__.__name__, self.options[self.option_num], - WEEKDAYS[self.weekday]) - - -class LastDayOfMonthExpression(AllExpression): - value_re = re.compile(r'last', re.IGNORECASE) - - def __init__(self): - super(LastDayOfMonthExpression, self).__init__(None) - - def get_next_value(self, date, field): - return monthrange(date.year, date.month)[1] - - def __str__(self): - return 'last' - - def __repr__(self): - return "%s()" % self.__class__.__name__ diff --git a/lib/python3.12/site-packages/apscheduler/triggers/cron/fields.py b/lib/python3.12/site-packages/apscheduler/triggers/cron/fields.py deleted file mode 100644 index 86d620c..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/cron/fields.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Fields represent CronTrigger options which map to :class:`~datetime.datetime` fields.""" - -from calendar import monthrange -import re - -import six - -from apscheduler.triggers.cron.expressions import ( - AllExpression, RangeExpression, WeekdayPositionExpression, LastDayOfMonthExpression, - WeekdayRangeExpression, MonthRangeExpression) - - -__all__ = ('MIN_VALUES', 'MAX_VALUES', 'DEFAULT_VALUES', 'BaseField', 'WeekField', - 'DayOfMonthField', 'DayOfWeekField') - - -MIN_VALUES = {'year': 1970, 'month': 1, 'day': 1, 'week': 1, 'day_of_week': 0, 'hour': 0, - 'minute': 0, 'second': 0} -MAX_VALUES = {'year': 9999, 'month': 12, 'day': 31, 'week': 53, 'day_of_week': 6, 'hour': 23, - 'minute': 59, 'second': 59} -DEFAULT_VALUES = {'year': '*', 'month': 1, 'day': 1, 'week': '*', 'day_of_week': '*', 'hour': 0, - 'minute': 0, 'second': 0} -SEPARATOR = re.compile(' *, *') - - -class BaseField(object): - REAL = True - COMPILERS = [AllExpression, RangeExpression] - - def __init__(self, name, exprs, is_default=False): - self.name = name - self.is_default = is_default - self.compile_expressions(exprs) - - def get_min(self, dateval): - return MIN_VALUES[self.name] - - def get_max(self, dateval): - return MAX_VALUES[self.name] - - def get_value(self, dateval): - return getattr(dateval, self.name) - - def get_next_value(self, dateval): - smallest = None - for expr in self.expressions: - value = expr.get_next_value(dateval, self) - if smallest is None or (value is not None and value < smallest): - smallest = value - - return smallest - - def compile_expressions(self, exprs): - self.expressions = [] - - # Split a comma-separated expression list, if any - for expr in SEPARATOR.split(str(exprs).strip()): - self.compile_expression(expr) - - def compile_expression(self, expr): - for compiler in self.COMPILERS: - match = compiler.value_re.match(expr) - if match: - compiled_expr = compiler(**match.groupdict()) - - try: - compiled_expr.validate_range(self.name) - except ValueError as e: - exc = ValueError('Error validating expression {!r}: {}'.format(expr, e)) - six.raise_from(exc, None) - - self.expressions.append(compiled_expr) - return - - raise ValueError('Unrecognized expression "%s" for field "%s"' % (expr, self.name)) - - def __eq__(self, other): - return isinstance(self, self.__class__) and self.expressions == other.expressions - - def __str__(self): - expr_strings = (str(e) for e in self.expressions) - return ','.join(expr_strings) - - def __repr__(self): - return "%s('%s', '%s')" % (self.__class__.__name__, self.name, self) - - -class WeekField(BaseField): - REAL = False - - def get_value(self, dateval): - return dateval.isocalendar()[1] - - -class DayOfMonthField(BaseField): - COMPILERS = BaseField.COMPILERS + [WeekdayPositionExpression, LastDayOfMonthExpression] - - def get_max(self, dateval): - return monthrange(dateval.year, dateval.month)[1] - - -class DayOfWeekField(BaseField): - REAL = False - COMPILERS = BaseField.COMPILERS + [WeekdayRangeExpression] - - def get_value(self, dateval): - return dateval.weekday() - - -class MonthField(BaseField): - COMPILERS = BaseField.COMPILERS + [MonthRangeExpression] diff --git a/lib/python3.12/site-packages/apscheduler/triggers/date.py b/lib/python3.12/site-packages/apscheduler/triggers/date.py deleted file mode 100644 index 0768100..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/date.py +++ /dev/null @@ -1,51 +0,0 @@ -from datetime import datetime - -from tzlocal import get_localzone - -from apscheduler.triggers.base import BaseTrigger -from apscheduler.util import convert_to_datetime, datetime_repr, astimezone - - -class DateTrigger(BaseTrigger): - """ - Triggers once on the given datetime. If ``run_date`` is left empty, current time is used. - - :param datetime|str run_date: the date/time to run the job at - :param datetime.tzinfo|str timezone: time zone for ``run_date`` if it doesn't have one already - """ - - __slots__ = 'run_date' - - def __init__(self, run_date=None, timezone=None): - timezone = astimezone(timezone) or get_localzone() - if run_date is not None: - self.run_date = convert_to_datetime(run_date, timezone, 'run_date') - else: - self.run_date = datetime.now(timezone) - - def get_next_fire_time(self, previous_fire_time, now): - return self.run_date if previous_fire_time is None else None - - def __getstate__(self): - return { - 'version': 1, - 'run_date': self.run_date - } - - def __setstate__(self, state): - # This is for compatibility with APScheduler 3.0.x - if isinstance(state, tuple): - state = state[1] - - if state.get('version', 1) > 1: - raise ValueError( - 'Got serialized data for version %s of %s, but only version 1 can be handled' % - (state['version'], self.__class__.__name__)) - - self.run_date = state['run_date'] - - def __str__(self): - return 'date[%s]' % datetime_repr(self.run_date) - - def __repr__(self): - return "<%s (run_date='%s')>" % (self.__class__.__name__, datetime_repr(self.run_date)) diff --git a/lib/python3.12/site-packages/apscheduler/triggers/interval.py b/lib/python3.12/site-packages/apscheduler/triggers/interval.py deleted file mode 100644 index b0e2dbd..0000000 --- a/lib/python3.12/site-packages/apscheduler/triggers/interval.py +++ /dev/null @@ -1,108 +0,0 @@ -from datetime import timedelta, datetime -from math import ceil - -from tzlocal import get_localzone - -from apscheduler.triggers.base import BaseTrigger -from apscheduler.util import ( - convert_to_datetime, normalize, timedelta_seconds, datetime_repr, - astimezone) - - -class IntervalTrigger(BaseTrigger): - """ - Triggers on specified intervals, starting on ``start_date`` if specified, ``datetime.now()`` + - interval otherwise. - - :param int weeks: number of weeks to wait - :param int days: number of days to wait - :param int hours: number of hours to wait - :param int minutes: number of minutes to wait - :param int seconds: number of seconds to wait - :param datetime|str start_date: starting point for the interval calculation - :param datetime|str end_date: latest possible date/time to trigger on - :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations - :param int|None jitter: delay the job execution by ``jitter`` seconds at most - """ - - __slots__ = 'timezone', 'start_date', 'end_date', 'interval', 'interval_length', 'jitter' - - def __init__(self, weeks=0, days=0, hours=0, minutes=0, seconds=0, start_date=None, - end_date=None, timezone=None, jitter=None): - self.interval = timedelta(weeks=weeks, days=days, hours=hours, minutes=minutes, - seconds=seconds) - self.interval_length = timedelta_seconds(self.interval) - if self.interval_length == 0: - self.interval = timedelta(seconds=1) - self.interval_length = 1 - - if timezone: - self.timezone = astimezone(timezone) - elif isinstance(start_date, datetime) and start_date.tzinfo: - self.timezone = start_date.tzinfo - elif isinstance(end_date, datetime) and end_date.tzinfo: - self.timezone = end_date.tzinfo - else: - self.timezone = get_localzone() - - start_date = start_date or (datetime.now(self.timezone) + self.interval) - self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') - self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') - - self.jitter = jitter - - def get_next_fire_time(self, previous_fire_time, now): - if previous_fire_time: - next_fire_time = previous_fire_time + self.interval - elif self.start_date > now: - next_fire_time = self.start_date - else: - timediff_seconds = timedelta_seconds(now - self.start_date) - next_interval_num = int(ceil(timediff_seconds / self.interval_length)) - next_fire_time = self.start_date + self.interval * next_interval_num - - if self.jitter is not None: - next_fire_time = self._apply_jitter(next_fire_time, self.jitter, now) - - if not self.end_date or next_fire_time <= self.end_date: - return normalize(next_fire_time) - - def __getstate__(self): - return { - 'version': 2, - 'timezone': self.timezone, - 'start_date': self.start_date, - 'end_date': self.end_date, - 'interval': self.interval, - 'jitter': self.jitter, - } - - def __setstate__(self, state): - # This is for compatibility with APScheduler 3.0.x - if isinstance(state, tuple): - state = state[1] - - if state.get('version', 1) > 2: - raise ValueError( - 'Got serialized data for version %s of %s, but only versions up to 2 can be ' - 'handled' % (state['version'], self.__class__.__name__)) - - self.timezone = state['timezone'] - self.start_date = state['start_date'] - self.end_date = state['end_date'] - self.interval = state['interval'] - self.interval_length = timedelta_seconds(self.interval) - self.jitter = state.get('jitter') - - def __str__(self): - return 'interval[%s]' % str(self.interval) - - def __repr__(self): - options = ['interval=%r' % self.interval, 'start_date=%r' % datetime_repr(self.start_date)] - if self.end_date: - options.append("end_date=%r" % datetime_repr(self.end_date)) - if self.jitter: - options.append('jitter=%s' % self.jitter) - - return "<%s (%s, timezone='%s')>" % ( - self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/lib/python3.12/site-packages/apscheduler/util.py b/lib/python3.12/site-packages/apscheduler/util.py deleted file mode 100644 index 003b30f..0000000 --- a/lib/python3.12/site-packages/apscheduler/util.py +++ /dev/null @@ -1,411 +0,0 @@ -"""This module contains several handy functions primarily meant for internal use.""" - -from __future__ import division - -from asyncio import iscoroutinefunction -from datetime import date, datetime, time, timedelta, tzinfo -from calendar import timegm -from functools import partial -from inspect import isbuiltin, isclass, isfunction, ismethod -import re -import sys - -from pytz import timezone, utc, FixedOffset -import six - -try: - from inspect import signature -except ImportError: # pragma: nocover - from funcsigs import signature - -try: - from threading import TIMEOUT_MAX -except ImportError: - TIMEOUT_MAX = 4294967 # Maximum value accepted by Event.wait() on Windows - -__all__ = ('asint', 'asbool', 'astimezone', 'convert_to_datetime', 'datetime_to_utc_timestamp', - 'utc_timestamp_to_datetime', 'timedelta_seconds', 'datetime_ceil', 'get_callable_name', - 'obj_to_ref', 'ref_to_obj', 'maybe_ref', 'repr_escape', 'check_callable_args', - 'normalize', 'localize', 'TIMEOUT_MAX') - - -class _Undefined(object): - def __nonzero__(self): - return False - - def __bool__(self): - return False - - def __repr__(self): - return '' - - -undefined = _Undefined() #: a unique object that only signifies that no value is defined - - -def asint(text): - """ - Safely converts a string to an integer, returning ``None`` if the string is ``None``. - - :type text: str - :rtype: int - - """ - if text is not None: - return int(text) - - -def asbool(obj): - """ - Interprets an object as a boolean value. - - :rtype: bool - - """ - if isinstance(obj, str): - obj = obj.strip().lower() - if obj in ('true', 'yes', 'on', 'y', 't', '1'): - return True - if obj in ('false', 'no', 'off', 'n', 'f', '0'): - return False - raise ValueError('Unable to interpret value "%s" as boolean' % obj) - return bool(obj) - - -def astimezone(obj): - """ - Interprets an object as a timezone. - - :rtype: tzinfo - - """ - if isinstance(obj, six.string_types): - return timezone(obj) - if isinstance(obj, tzinfo): - if obj.tzname(None) == 'local': - raise ValueError( - 'Unable to determine the name of the local timezone -- you must explicitly ' - 'specify the name of the local timezone. Please refrain from using timezones like ' - 'EST to prevent problems with daylight saving time. Instead, use a locale based ' - 'timezone name (such as Europe/Helsinki).') - return obj - if obj is not None: - raise TypeError('Expected tzinfo, got %s instead' % obj.__class__.__name__) - - -_DATE_REGEX = re.compile( - r'(?P\d{4})-(?P\d{1,2})-(?P\d{1,2})' - r'(?:[ T](?P\d{1,2}):(?P\d{1,2}):(?P\d{1,2})' - r'(?:\.(?P\d{1,6}))?' - r'(?PZ|[+-]\d\d:\d\d)?)?$') - - -def convert_to_datetime(input, tz, arg_name): - """ - Converts the given object to a timezone aware datetime object. - - If a timezone aware datetime object is passed, it is returned unmodified. - If a native datetime object is passed, it is given the specified timezone. - If the input is a string, it is parsed as a datetime with the given timezone. - - Date strings are accepted in three different forms: date only (Y-m-d), date with time - (Y-m-d H:M:S) or with date+time with microseconds (Y-m-d H:M:S.micro). Additionally you can - override the time zone by giving a specific offset in the format specified by ISO 8601: - Z (UTC), +HH:MM or -HH:MM. - - :param str|datetime input: the datetime or string to convert to a timezone aware datetime - :param datetime.tzinfo tz: timezone to interpret ``input`` in - :param str arg_name: the name of the argument (used in an error message) - :rtype: datetime - - """ - if input is None: - return - elif isinstance(input, datetime): - datetime_ = input - elif isinstance(input, date): - datetime_ = datetime.combine(input, time()) - elif isinstance(input, six.string_types): - m = _DATE_REGEX.match(input) - if not m: - raise ValueError('Invalid date string') - - values = m.groupdict() - tzname = values.pop('timezone') - if tzname == 'Z': - tz = utc - elif tzname: - hours, minutes = (int(x) for x in tzname[1:].split(':')) - sign = 1 if tzname[0] == '+' else -1 - tz = FixedOffset(sign * (hours * 60 + minutes)) - - values = {k: int(v or 0) for k, v in values.items()} - datetime_ = datetime(**values) - else: - raise TypeError('Unsupported type for %s: %s' % (arg_name, input.__class__.__name__)) - - if datetime_.tzinfo is not None: - return datetime_ - if tz is None: - raise ValueError( - 'The "tz" argument must be specified if %s has no timezone information' % arg_name) - if isinstance(tz, six.string_types): - tz = timezone(tz) - - return localize(datetime_, tz) - - -def datetime_to_utc_timestamp(timeval): - """ - Converts a datetime instance to a timestamp. - - :type timeval: datetime - :rtype: float - - """ - if timeval is not None: - return timegm(timeval.utctimetuple()) + timeval.microsecond / 1000000 - - -def utc_timestamp_to_datetime(timestamp): - """ - Converts the given timestamp to a datetime instance. - - :type timestamp: float - :rtype: datetime - - """ - if timestamp is not None: - return datetime.fromtimestamp(timestamp, utc) - - -def timedelta_seconds(delta): - """ - Converts the given timedelta to seconds. - - :type delta: timedelta - :rtype: float - - """ - return delta.days * 24 * 60 * 60 + delta.seconds + \ - delta.microseconds / 1000000.0 - - -def datetime_ceil(dateval): - """ - Rounds the given datetime object upwards. - - :type dateval: datetime - - """ - if dateval.microsecond > 0: - return dateval + timedelta(seconds=1, microseconds=-dateval.microsecond) - return dateval - - -def datetime_repr(dateval): - return dateval.strftime('%Y-%m-%d %H:%M:%S %Z') if dateval else 'None' - - -def get_callable_name(func): - """ - Returns the best available display name for the given function/callable. - - :rtype: str - - """ - if ismethod(func): - self = func.__self__ - cls = self if isclass(self) else type(self) - return f"{cls.__qualname__}.{func.__name__}" - elif isclass(func) or isfunction(func) or isbuiltin(func): - return func.__qualname__ - elif hasattr(func, '__call__') and callable(func.__call__): - # instance of a class with a __call__ method - return type(func).__qualname__ - - raise TypeError('Unable to determine a name for %r -- maybe it is not a callable?' % func) - - -def obj_to_ref(obj): - """ - Returns the path to the given callable. - - :rtype: str - :raises TypeError: if the given object is not callable - :raises ValueError: if the given object is a :class:`~functools.partial`, lambda or a nested - function - - """ - if isinstance(obj, partial): - raise ValueError('Cannot create a reference to a partial()') - - name = get_callable_name(obj) - if '' in name: - raise ValueError('Cannot create a reference to a lambda') - if '' in name: - raise ValueError('Cannot create a reference to a nested function') - - if ismethod(obj): - module = obj.__self__.__module__ - else: - module = obj.__module__ - - return '%s:%s' % (module, name) - - -def ref_to_obj(ref): - """ - Returns the object pointed to by ``ref``. - - :type ref: str - - """ - if not isinstance(ref, six.string_types): - raise TypeError('References must be strings') - if ':' not in ref: - raise ValueError('Invalid reference') - - modulename, rest = ref.split(':', 1) - try: - obj = __import__(modulename, fromlist=[rest]) - except ImportError: - raise LookupError('Error resolving reference %s: could not import module' % ref) - - try: - for name in rest.split('.'): - obj = getattr(obj, name) - return obj - except Exception: - raise LookupError('Error resolving reference %s: error looking up object' % ref) - - -def maybe_ref(ref): - """ - Returns the object that the given reference points to, if it is indeed a reference. - If it is not a reference, the object is returned as-is. - - """ - if not isinstance(ref, str): - return ref - return ref_to_obj(ref) - - -if six.PY2: - def repr_escape(string): - if isinstance(string, six.text_type): - return string.encode('ascii', 'backslashreplace') - return string -else: - def repr_escape(string): - return string - - -def check_callable_args(func, args, kwargs): - """ - Ensures that the given callable can be called with the given arguments. - - :type args: tuple - :type kwargs: dict - - """ - pos_kwargs_conflicts = [] # parameters that have a match in both args and kwargs - positional_only_kwargs = [] # positional-only parameters that have a match in kwargs - unsatisfied_args = [] # parameters in signature that don't have a match in args or kwargs - unsatisfied_kwargs = [] # keyword-only arguments that don't have a match in kwargs - unmatched_args = list(args) # args that didn't match any of the parameters in the signature - # kwargs that didn't match any of the parameters in the signature - unmatched_kwargs = list(kwargs) - # indicates if the signature defines *args and **kwargs respectively - has_varargs = has_var_kwargs = False - - try: - if sys.version_info >= (3, 5): - sig = signature(func, follow_wrapped=False) - else: - sig = signature(func) - except ValueError: - # signature() doesn't work against every kind of callable - return - - for param in six.itervalues(sig.parameters): - if param.kind == param.POSITIONAL_OR_KEYWORD: - if param.name in unmatched_kwargs and unmatched_args: - pos_kwargs_conflicts.append(param.name) - elif unmatched_args: - del unmatched_args[0] - elif param.name in unmatched_kwargs: - unmatched_kwargs.remove(param.name) - elif param.default is param.empty: - unsatisfied_args.append(param.name) - elif param.kind == param.POSITIONAL_ONLY: - if unmatched_args: - del unmatched_args[0] - elif param.name in unmatched_kwargs: - unmatched_kwargs.remove(param.name) - positional_only_kwargs.append(param.name) - elif param.default is param.empty: - unsatisfied_args.append(param.name) - elif param.kind == param.KEYWORD_ONLY: - if param.name in unmatched_kwargs: - unmatched_kwargs.remove(param.name) - elif param.default is param.empty: - unsatisfied_kwargs.append(param.name) - elif param.kind == param.VAR_POSITIONAL: - has_varargs = True - elif param.kind == param.VAR_KEYWORD: - has_var_kwargs = True - - # Make sure there are no conflicts between args and kwargs - if pos_kwargs_conflicts: - raise ValueError('The following arguments are supplied in both args and kwargs: %s' % - ', '.join(pos_kwargs_conflicts)) - - # Check if keyword arguments are being fed to positional-only parameters - if positional_only_kwargs: - raise ValueError('The following arguments cannot be given as keyword arguments: %s' % - ', '.join(positional_only_kwargs)) - - # Check that the number of positional arguments minus the number of matched kwargs matches the - # argspec - if unsatisfied_args: - raise ValueError('The following arguments have not been supplied: %s' % - ', '.join(unsatisfied_args)) - - # Check that all keyword-only arguments have been supplied - if unsatisfied_kwargs: - raise ValueError( - 'The following keyword-only arguments have not been supplied in kwargs: %s' % - ', '.join(unsatisfied_kwargs)) - - # Check that the callable can accept the given number of positional arguments - if not has_varargs and unmatched_args: - raise ValueError( - 'The list of positional arguments is longer than the target callable can handle ' - '(allowed: %d, given in args: %d)' % (len(args) - len(unmatched_args), len(args))) - - # Check that the callable can accept the given keyword arguments - if not has_var_kwargs and unmatched_kwargs: - raise ValueError( - 'The target callable does not accept the following keyword arguments: %s' % - ', '.join(unmatched_kwargs)) - - -def iscoroutinefunction_partial(f): - while isinstance(f, partial): - f = f.func - - # The asyncio version of iscoroutinefunction includes testing for @coroutine - # decorations vs. the inspect version which does not. - return iscoroutinefunction(f) - - -def normalize(dt): - return datetime.fromtimestamp(dt.timestamp(), dt.tzinfo) - - -def localize(dt, tzinfo): - if hasattr(tzinfo, 'localize'): - return tzinfo.localize(dt) - - return normalize(dt.replace(tzinfo=tzinfo)) diff --git a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/INSTALLER b/lib/python3.12/site-packages/blinker-1.8.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/LICENSE.txt b/lib/python3.12/site-packages/blinker-1.8.2.dist-info/LICENSE.txt deleted file mode 100644 index 79c9825..0000000 --- a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2010 Jason Kirtland - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/METADATA b/lib/python3.12/site-packages/blinker-1.8.2.dist-info/METADATA deleted file mode 100644 index efa45f5..0000000 --- a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: blinker -Version: 1.8.2 -Summary: Fast, simple object-to-object and broadcast signaling -Author: Jason Kirtland -Maintainer-email: Pallets Ecosystem -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://blinker.readthedocs.io -Project-URL: Source, https://github.com/pallets-eco/blinker/ - -# Blinker - -Blinker provides a fast dispatching system that allows any number of -interested parties to subscribe to events, or "signals". - - -## Pallets Community Ecosystem - -> [!IMPORTANT]\ -> This project is part of the Pallets Community Ecosystem. Pallets is the open -> source organization that maintains Flask; Pallets-Eco enables community -> maintenance of related projects. If you are interested in helping maintain -> this project, please reach out on [the Pallets Discord server][discord]. -> -> [discord]: https://discord.gg/pallets - - -## Example - -Signal receivers can subscribe to specific senders or receive signals -sent by any sender. - -```pycon ->>> from blinker import signal ->>> started = signal('round-started') ->>> def each(round): -... print(f"Round {round}") -... ->>> started.connect(each) - ->>> def round_two(round): -... print("This is round two.") -... ->>> started.connect(round_two, sender=2) - ->>> for round in range(1, 4): -... started.send(round) -... -Round 1! -Round 2! -This is round two. -Round 3! -``` - diff --git a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/RECORD b/lib/python3.12/site-packages/blinker-1.8.2.dist-info/RECORD deleted file mode 100644 index 46b35c6..0000000 --- a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -blinker-1.8.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.8.2.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.8.2.dist-info/METADATA,sha256=3tEx40hm9IEofyFqDPJsDPE9MAIEhtifapoSp7FqzuA,1633 -blinker-1.8.2.dist-info/RECORD,, -blinker-1.8.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -blinker/__init__.py,sha256=ymyJY_PoTgBzaPgdr4dq-RRsGh7D-sYQIGMNp8Rx4qc,1577 -blinker/__pycache__/__init__.cpython-312.pyc,, -blinker/__pycache__/_utilities.cpython-312.pyc,, -blinker/__pycache__/base.cpython-312.pyc,, -blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 -blinker/base.py,sha256=nIZJEtXQ8LLZZJrwVp2wQcdfCzDixvAHR9VpSWiyVcQ,22574 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/WHEEL b/lib/python3.12/site-packages/blinker-1.8.2.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/lib/python3.12/site-packages/blinker-1.8.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/lib/python3.12/site-packages/blinker/__init__.py b/lib/python3.12/site-packages/blinker/__init__.py deleted file mode 100644 index c93527e..0000000 --- a/lib/python3.12/site-packages/blinker/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .base import ANY -from .base import default_namespace -from .base import NamedSignal -from .base import Namespace -from .base import Signal -from .base import signal - -__all__ = [ - "ANY", - "default_namespace", - "NamedSignal", - "Namespace", - "Signal", - "signal", -] - - -def __getattr__(name: str) -> t.Any: - import warnings - - if name == "__version__": - import importlib.metadata - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Blinker 1.9.0. Use feature detection or" - " 'importlib.metadata.version(\"blinker\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("blinker") - - if name == "receiver_connected": - from .base import _receiver_connected - - warnings.warn( - "The global 'receiver_connected' signal is deprecated and will be" - " removed in Blinker 1.9. Use 'Signal.receiver_connected' and" - " 'Signal.receiver_disconnected' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _receiver_connected - - if name == "WeakNamespace": - from .base import _WeakNamespace - - warnings.warn( - "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." - " Use 'Namespace' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _WeakNamespace - - raise AttributeError(name) diff --git a/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 18bce890802d0889ea45f4c022e30e28cc003322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1811 zcmb7E&2Jk;6rb^~ch_rgoF<_JXq`auSA*57r%_X3Uy{yKbiL>!~*P0!t zaukaSaexy?;EFha%8~zqOPU^vwz5>Io1TeL6H)U=>=kK=7Qa%xQZMIN2a?{wX^})xEQko= zC|NteL!+{~_Br^jP_{w3q3|QpW=V%Mm<(8h30)7G5eZ>hkkheGo0zp^xIp81faI`w z#C16sawy0_9!*0Mjzz9i5W+_{!3rmWDGE^^@4{)cRv_SRX2Jd3F5Z%B&j?k7q{)P; zzvdqSmK2P3b6b-3jBFLp7+^}ZN283^5%B66uT2eF2(`A}R{-l`Zu3%ZB||DskV=4L z^wmp|tV@y9btGoTIq#xzre9)bYK_ZwN{ha~&3FQ}^!=S5KHX$?^^~P*6Crp|?+RuI ziA`CDvj!22+9aa(gCGp;Idrl$E&_FhtSup&@kT##|gP(rp5!pqabP~>CE|BrK#SGn@OTT#ozyy;v4~|uZNy;^*E&7136B%wkU=}0e zVz0csuP+abTcV!Z diff --git a/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc b/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc deleted file mode 100644 index 1a783af52919cb5ab44b683943015699f9fc5407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2733 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 Ub5q!rbvQ-Ws=rcfVqo}x0hqpl7ytkO diff --git a/lib/python3.12/site-packages/blinker/_utilities.py b/lib/python3.12/site-packages/blinker/_utilities.py deleted file mode 100644 index 000c902..0000000 --- a/lib/python3.12/site-packages/blinker/_utilities.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import inspect -import typing as t -from weakref import ref -from weakref import WeakMethod - -T = t.TypeVar("T") - - -class Symbol: - """A constant symbol, nicer than ``object()``. Repeated calls return the - same instance. - - >>> Symbol('foo') is Symbol('foo') - True - >>> Symbol('foo') - foo - """ - - symbols: t.ClassVar[dict[str, Symbol]] = {} - - def __new__(cls, name: str) -> Symbol: - if name in cls.symbols: - return cls.symbols[name] - - obj = super().__new__(cls) - cls.symbols[name] = obj - return obj - - def __init__(self, name: str) -> None: - self.name = name - - def __repr__(self) -> str: - return self.name - - def __getnewargs__(self) -> tuple[t.Any, ...]: - return (self.name,) - - -def make_id(obj: object) -> c.Hashable: - """Get a stable identifier for a receiver or sender, to be used as a dict - key or in a set. - """ - if inspect.ismethod(obj): - # The id of a bound method is not stable, but the id of the unbound - # function and instance are. - return id(obj.__func__), id(obj.__self__) - - if isinstance(obj, (str, int)): - # Instances with the same value always compare equal and have the same - # hash, even if the id may change. - return obj - - # Assume other types are not hashable but will always be the same instance. - return id(obj) - - -def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: - if inspect.ismethod(obj): - return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] - - return ref(obj, callback) diff --git a/lib/python3.12/site-packages/blinker/base.py b/lib/python3.12/site-packages/blinker/base.py deleted file mode 100644 index ec494b1..0000000 --- a/lib/python3.12/site-packages/blinker/base.py +++ /dev/null @@ -1,621 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import typing as t -import warnings -import weakref -from collections import defaultdict -from contextlib import AbstractContextManager -from contextlib import contextmanager -from functools import cached_property -from inspect import iscoroutinefunction -from weakref import WeakValueDictionary - -from ._utilities import make_id -from ._utilities import make_ref -from ._utilities import Symbol - -if t.TYPE_CHECKING: - F = t.TypeVar("F", bound=c.Callable[..., t.Any]) - -ANY = Symbol("ANY") -"""Symbol for "any sender".""" - -ANY_ID = 0 - - -class Signal: - """A notification emitter. - - :param doc: The docstring for the signal. - """ - - ANY = ANY - """An alias for the :data:`~blinker.ANY` sender symbol.""" - - set_class: type[set[t.Any]] = set - """The set class to use for tracking connected receivers and senders. - Python's ``set`` is unordered. If receivers must be dispatched in the order - they were connected, an ordered set implementation can be used. - - .. versionadded:: 1.7 - """ - - @cached_property - def receiver_connected(self) -> Signal: - """Emitted at the end of each :meth:`connect` call. - - The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: ``receiver``, ``sender``, and ``weak``. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver connects.") - - @cached_property - def receiver_disconnected(self) -> Signal: - """Emitted at the end of each :meth:`disconnect` call. - - The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: ``receiver`` and ``sender``. - - This signal is emitted **only** when :meth:`disconnect` is called - explicitly. This signal cannot be emitted by an automatic disconnect - when a weakly referenced receiver or sender goes out of scope, as the - instance is no longer be available to be used as the sender for this - signal. - - An alternative approach is available by subscribing to - :attr:`receiver_connected` and setting up a custom weakref cleanup - callback on weak receivers and senders. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver disconnects.") - - def __init__(self, doc: str | None = None) -> None: - if doc: - self.__doc__ = doc - - self.receivers: dict[ - t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] - ] = {} - """The map of connected receivers. Useful to quickly check if any - receivers are connected to the signal: ``if s.receivers:``. The - structure and data is not part of the public API, but checking its - boolean value is. - """ - - self.is_muted: bool = False - self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} - - def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: - """Connect ``receiver`` to be called when the signal is sent by - ``sender``. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends. - """ - receiver_id = make_id(receiver) - sender_id = ANY_ID if sender is ANY else make_id(sender) - - if weak: - self.receivers[receiver_id] = make_ref( - receiver, self._make_cleanup_receiver(receiver_id) - ) - else: - self.receivers[receiver_id] = receiver - - self._by_sender[sender_id].add(receiver_id) - self._by_receiver[receiver_id].add(sender_id) - - if sender is not ANY and sender_id not in self._weak_senders: - # store a cleanup for weakref-able senders - try: - self._weak_senders[sender_id] = make_ref( - sender, self._make_cleanup_sender(sender_id) - ) - except TypeError: - pass - - if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: - try: - self.receiver_connected.send( - self, receiver=receiver, sender=sender, weak=weak - ) - except TypeError: - # TODO no explanation or test for this - self.disconnect(receiver, sender) - raise - - if _receiver_connected.receivers and self is not _receiver_connected: - try: - _receiver_connected.send( - self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak - ) - except TypeError: - self.disconnect(receiver, sender) - raise - - return receiver - - def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: - """Connect the decorated function to be called when the signal is sent - by ``sender``. - - The decorated function will be called when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument along - with any extra keyword arguments. - - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends.= - - .. versionadded:: 1.1 - """ - - def decorator(fn: F) -> F: - self.connect(fn, sender, weak) - return fn - - return decorator - - @contextmanager - def connected_to( - self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY - ) -> c.Generator[None, None, None]: - """A context manager that temporarily connects ``receiver`` to the - signal while a ``with`` block executes. When the block exits, the - receiver is disconnected. Useful for tests. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. - - .. versionadded:: 1.1 - """ - self.connect(receiver, sender=sender, weak=False) - - try: - yield None - finally: - self.disconnect(receiver) - - @contextmanager - def muted(self) -> c.Generator[None, None, None]: - """A context manager that temporarily disables the signal. No receivers - will be called if the signal is sent, until the ``with`` block exits. - Useful for tests. - """ - self.is_muted = True - - try: - yield None - finally: - self.is_muted = False - - def temporarily_connected_to( - self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY - ) -> AbstractContextManager[None]: - """Deprecated alias for :meth:`connected_to`. - - .. deprecated:: 1.1 - Renamed to ``connected_to``. Will be removed in Blinker 1.9. - - .. versionadded:: 0.9 - """ - warnings.warn( - "'temporarily_connected_to' is renamed to 'connected_to'. The old name is" - " deprecated and will be removed in Blinker 1.9.", - DeprecationWarning, - stacklevel=2, - ) - return self.connected_to(receiver, sender) - - def send( - self, - sender: t.Any | None = None, - /, - *, - _async_wrapper: c.Callable[ - [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Call all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _async_wrapper: Will be called on any receivers that are async - coroutines to turn them into sync callables. For example, could run - the receiver with an event loop. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionchanged:: 1.7 - Added the ``_async_wrapper`` argument. - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if iscoroutinefunction(receiver): - if _async_wrapper is None: - raise RuntimeError("Cannot send to a coroutine function.") - - result = _async_wrapper(receiver)(sender, **kwargs) - else: - result = receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - async def send_async( - self, - sender: t.Any | None = None, - /, - *, - _sync_wrapper: c.Callable[ - [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Await all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _sync_wrapper: Will be called on any receivers that are sync - callables to turn them into async coroutines. For example, - could call the receiver in a thread. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionadded:: 1.7 - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if not iscoroutinefunction(receiver): - if _sync_wrapper is None: - raise RuntimeError("Cannot send to a non-coroutine function.") - - result = await _sync_wrapper(receiver)(sender, **kwargs) - else: - result = await receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - def has_receivers_for(self, sender: t.Any) -> bool: - """Check if there is at least one receiver that will be called with the - given ``sender``. A receiver connected to :data:`ANY` will always be - called, regardless of sender. Does not check if weakly referenced - receivers are still live. See :meth:`receivers_for` for a stronger - search. - - :param sender: Check for receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - if not self.receivers: - return False - - if self._by_sender[ANY_ID]: - return True - - if sender is ANY: - return False - - return make_id(sender) in self._by_sender - - def receivers_for( - self, sender: t.Any - ) -> c.Generator[c.Callable[..., t.Any], None, None]: - """Yield each receiver to be called for ``sender``, in addition to those - to be called for :data:`ANY`. Weakly referenced receivers that are not - live will be disconnected and skipped. - - :param sender: Yield receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - # TODO: test receivers_for(ANY) - if not self.receivers: - return - - sender_id = make_id(sender) - - if sender_id in self._by_sender: - ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] - else: - ids = self._by_sender[ANY_ID].copy() - - for receiver_id in ids: - receiver = self.receivers.get(receiver_id) - - if receiver is None: - continue - - if isinstance(receiver, weakref.ref): - strong = receiver() - - if strong is None: - self._disconnect(receiver_id, ANY_ID) - continue - - yield strong - else: - yield receiver - - def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: - """Disconnect ``receiver`` from being called when the signal is sent by - ``sender``. - - :param receiver: A connected receiver callable. - :param sender: Disconnect from only this sender. By default, disconnect - from all senders. - """ - sender_id: c.Hashable - - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = make_id(sender) - - receiver_id = make_id(receiver) - self._disconnect(receiver_id, sender_id) - - if ( - "receiver_disconnected" in self.__dict__ - and self.receiver_disconnected.receivers - ): - self.receiver_disconnected.send(self, receiver=receiver, sender=sender) - - def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: - if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, None) is not None: - for bucket in self._by_sender.values(): - bucket.discard(receiver_id) - - self.receivers.pop(receiver_id, None) - else: - self._by_sender[sender_id].discard(receiver_id) - self._by_receiver[receiver_id].discard(sender_id) - - def _make_cleanup_receiver( - self, receiver_id: c.Hashable - ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: - """Create a callback function to disconnect a weakly referenced - receiver when it is garbage collected. - """ - - def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: - self._disconnect(receiver_id, ANY_ID) - - return cleanup - - def _make_cleanup_sender( - self, sender_id: c.Hashable - ) -> c.Callable[[weakref.ref[t.Any]], None]: - """Create a callback function to disconnect all receivers for a weakly - referenced sender when it is garbage collected. - """ - assert sender_id != ANY_ID - - def cleanup(ref: weakref.ref[t.Any]) -> None: - self._weak_senders.pop(sender_id, None) - - for receiver_id in self._by_sender.pop(sender_id, ()): - self._by_receiver[receiver_id].discard(sender_id) - - return cleanup - - def _cleanup_bookkeeping(self) -> None: - """Prune unused sender/receiver bookkeeping. Not threadsafe. - - Connecting & disconnecting leaves behind a small amount of bookkeeping - data. Typical workloads using Blinker, for example in most web apps, - Flask, CLI scripts, etc., are not adversely affected by this - bookkeeping. - - With a long-running process performing dynamic signal routing with high - volume, e.g. connecting to function closures, senders are all unique - object instances. Doing all of this over and over may cause memory usage - to grow due to extraneous bookkeeping. (An empty ``set`` for each stale - sender/receiver pair.) - - This method will prune that bookkeeping away, with the caveat that such - pruning is not threadsafe. The risk is that cleanup of a fully - disconnected receiver/sender pair occurs while another thread is - connecting that same pair. If you are in the highly dynamic, unique - receiver/sender situation that has lead you to this method, that failure - mode is perhaps not a big deal for you. - """ - for mapping in (self._by_sender, self._by_receiver): - for ident, bucket in list(mapping.items()): - if not bucket: - mapping.pop(ident, None) - - def _clear_state(self) -> None: - """Disconnect all receivers and senders. Useful for tests.""" - self._weak_senders.clear() - self.receivers.clear() - self._by_sender.clear() - self._by_receiver.clear() - - -_receiver_connected = Signal( - """\ -Sent by a :class:`Signal` after a receiver connects. - -:argument: the Signal that was connected to -:keyword receiver_arg: the connected receiver -:keyword sender_arg: the sender to connect to -:keyword weak_arg: true if the connection to receiver_arg is a weak reference - -.. deprecated:: 1.2 - Individual signals have their own :attr:`~Signal.receiver_connected` and - :attr:`~Signal.receiver_disconnected` signals with a slightly simplified - call signature. This global signal will be removed in Blinker 1.9. -""" -) - - -class NamedSignal(Signal): - """A named generic notification emitter. The name is not used by the signal - itself, but matches the key in the :class:`Namespace` that it belongs to. - - :param name: The name of the signal within the namespace. - :param doc: The docstring for the signal. - """ - - def __init__(self, name: str, doc: str | None = None) -> None: - super().__init__(doc) - - #: The name of this signal. - self.name: str = name - - def __repr__(self) -> str: - base = super().__repr__() - return f"{base[:-1]}; {self.name!r}>" # noqa: E702 - - -if t.TYPE_CHECKING: - - class PNamespaceSignal(t.Protocol): - def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... - - # Python < 3.9 - _NamespaceBase = dict[str, NamedSignal] # type: ignore[misc] -else: - _NamespaceBase = dict - - -class Namespace(_NamespaceBase): - """A dict mapping names to signals.""" - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` for the given ``name``, creating it - if required. Repeated calls with the same name return the same signal. - - :param name: The name of the signal. - :param doc: The docstring of the signal. - """ - if name not in self: - self[name] = NamedSignal(name, doc) - - return self[name] - - -class _WeakNamespace(WeakValueDictionary): # type: ignore[type-arg] - """A weak mapping of names to signals. - - Automatically cleans up unused signals when the last reference goes out - of scope. This namespace implementation provides similar behavior to Blinker - <= 1.2. - - .. deprecated:: 1.3 - Will be removed in Blinker 1.9. - - .. versionadded:: 1.3 - """ - - def __init__(self) -> None: - warnings.warn( - "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." - " Use 'Namespace' instead.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__() - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` for the given ``name``, creating it - if required. Repeated calls with the same name return the same signal. - - :param name: The name of the signal. - :param doc: The docstring of the signal. - """ - if name not in self: - self[name] = NamedSignal(name, doc) - - return self[name] # type: ignore[no-any-return] - - -default_namespace: Namespace = Namespace() -"""A default :class:`Namespace` for creating named signals. :func:`signal` -creates a :class:`NamedSignal` in this namespace. -""" - -signal: PNamespaceSignal = default_namespace.signal -"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given -``name``, creating it if required. Repeated calls with the same name return the -same signal. -""" - - -def __getattr__(name: str) -> t.Any: - if name == "receiver_connected": - warnings.warn( - "The global 'receiver_connected' signal is deprecated and will be" - " removed in Blinker 1.9. Use 'Signal.receiver_connected' and" - " 'Signal.receiver_disconnected' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _receiver_connected - - if name == "WeakNamespace": - warnings.warn( - "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." - " Use 'Namespace' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _WeakNamespace - - raise AttributeError(name) diff --git a/lib/python3.12/site-packages/blinker/py.typed b/lib/python3.12/site-packages/blinker/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/INSTALLER b/lib/python3.12/site-packages/click-8.1.7.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/LICENSE.rst b/lib/python3.12/site-packages/click-8.1.7.dist-info/LICENSE.rst deleted file mode 100644 index d12a849..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/METADATA b/lib/python3.12/site-packages/click-8.1.7.dist-info/METADATA deleted file mode 100644 index 7a6bbb2..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/METADATA +++ /dev/null @@ -1,103 +0,0 @@ -Metadata-Version: 2.1 -Name: click -Version: 8.1.7 -Summary: Composable command line interface toolkit -Home-page: https://palletsprojects.com/p/click/ -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Changes, https://click.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/click/ -Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ -Project-URL: Chat, https://discord.gg/pallets -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst -Requires-Dist: colorama ; platform_system == "Windows" -Requires-Dist: importlib-metadata ; python_version < "3.8" - -\$ click\_ -========== - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U click - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -.. code-block:: python - - import click - - @click.command() - @click.option("--count", default=1, help="Number of greetings.") - @click.option("--name", prompt="Your name", help="The person to greet.") - def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - - if __name__ == '__main__': - hello() - -.. code-block:: text - - $ python hello.py --count=3 - Your name: Click - Hello, Click! - Hello, Click! - Hello, Click! - - -Donate ------- - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, `please -donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://click.palletsprojects.com/ -- Changes: https://click.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/click/ -- Source Code: https://github.com/pallets/click -- Issue Tracker: https://github.com/pallets/click/issues -- Chat: https://discord.gg/pallets diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/RECORD b/lib/python3.12/site-packages/click-8.1.7.dist-info/RECORD deleted file mode 100644 index 497ee45..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/RECORD +++ /dev/null @@ -1,39 +0,0 @@ -click-8.1.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.1.7.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-8.1.7.dist-info/METADATA,sha256=qIMevCxGA9yEmJOM_4WHuUJCwWpsIEVbCPOhs45YPN4,3014 -click-8.1.7.dist-info/RECORD,, -click-8.1.7.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92 -click-8.1.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=YDDbjm406dTOA0V8bTtdGnhN7zj5j-_dFRewZF_pLvw,3138 -click/__pycache__/__init__.cpython-312.pyc,, -click/__pycache__/_compat.cpython-312.pyc,, -click/__pycache__/_termui_impl.cpython-312.pyc,, -click/__pycache__/_textwrap.cpython-312.pyc,, -click/__pycache__/_winconsole.cpython-312.pyc,, -click/__pycache__/core.cpython-312.pyc,, -click/__pycache__/decorators.cpython-312.pyc,, -click/__pycache__/exceptions.cpython-312.pyc,, -click/__pycache__/formatting.cpython-312.pyc,, -click/__pycache__/globals.cpython-312.pyc,, -click/__pycache__/parser.cpython-312.pyc,, -click/__pycache__/shell_completion.cpython-312.pyc,, -click/__pycache__/termui.cpython-312.pyc,, -click/__pycache__/testing.cpython-312.pyc,, -click/__pycache__/types.cpython-312.pyc,, -click/__pycache__/utils.cpython-312.pyc,, -click/_compat.py,sha256=5318agQpbt4kroKsbqDOYpTSWzL_YCZVUQiTT04yXmc,18744 -click/_termui_impl.py,sha256=3dFYv4445Nw-rFvZOTBMBPYwB1bxnmNk9Du6Dm_oBSU,24069 -click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 -click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 -click/core.py,sha256=j6oEWtGgGna8JarD6WxhXmNnxLnfRjwXglbBc-8jr7U,114086 -click/decorators.py,sha256=-ZlbGYgV-oI8jr_oH4RpuL1PFS-5QmeuEAsLDAYgxtw,18719 -click/exceptions.py,sha256=fyROO-47HWFDjt2qupo7A3J32VlpM-ovJnfowu92K3s,9273 -click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 -click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 -click/parser.py,sha256=LKyYQE9ZLj5KgIDXkrcTHQRXIggfoivX14_UVIn56YA,19067 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=Ty3VM_ts0sQhj6u7eFTiLwHPoTgcXTGEAUg2OpLqYKw,18460 -click/termui.py,sha256=H7Q8FpmPelhJ2ovOhfCRhjMtCpNyjFXryAMLZODqsdc,28324 -click/testing.py,sha256=1Qd4kS5bucn1hsNIRryd0WtTMuCpkA93grkWxT8POsU,16084 -click/types.py,sha256=TZvz3hKvBztf-Hpa2enOmP4eznSPLzijjig5b_0XMxE,36391 -click/utils.py,sha256=1476UduUNY6UePGU4m18uzVHLt1sKM2PP3yWsQhbItM,20298 diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/WHEEL b/lib/python3.12/site-packages/click-8.1.7.dist-info/WHEEL deleted file mode 100644 index 2c08da0..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/lib/python3.12/site-packages/click-8.1.7.dist-info/top_level.txt b/lib/python3.12/site-packages/click-8.1.7.dist-info/top_level.txt deleted file mode 100644 index dca9a90..0000000 --- a/lib/python3.12/site-packages/click-8.1.7.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/lib/python3.12/site-packages/click/__init__.py b/lib/python3.12/site-packages/click/__init__.py deleted file mode 100644 index 9a1dab0..0000000 --- a/lib/python3.12/site-packages/click/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" -from .core import Argument as Argument -from .core import BaseCommand as BaseCommand -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import MultiCommand as MultiCommand -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .parser import OptionParser as OptionParser -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - -__version__ = "8.1.7" diff --git a/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 01a469761c7bd516124b5b88d3438631082aa35d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2711 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 Q-O=k@y1QTsIwptyALTS3DF6Tf diff --git a/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc deleted file mode 100644 index 2a8dafc59ccad1d9b323db0c39f9ed70d1915eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30534 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 C95yfj diff --git a/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc deleted file mode 100644 index 1153fc87b91e90b49a7f855096ef9dd617155efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11991 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 diff --git a/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc deleted file mode 100644 index 2d5b515b708e1ae1ce7ada07f17f45ce9e97f890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23984 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 E0bT}dr2qf` diff --git a/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc deleted file mode 100644 index 9f6a6fd19f018abb70213460d9faa9b30606d1d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14066 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 diff --git a/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc deleted file mode 100644 index 00af9a34e134a1117be6ed1a642ddadf872f2de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22768 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 diff --git a/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc deleted file mode 100644 index a94767b70dd559aa643d37cc6b329a1a7bd58d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32801 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 aO_im0`?d0%f}aaL{PltUIsIZy=!VE=FAVAN6 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 G`+oz6-H|^4 diff --git a/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 8d914ab952162afcb59c43318efb4d590794bba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49453 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 DRWpJ*a^-#M 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 diff --git a/lib/python3.12/site-packages/click/_compat.py b/lib/python3.12/site-packages/click/_compat.py deleted file mode 100644 index 23f8866..0000000 --- a/lib/python3.12/site-packages/click/_compat.py +++ /dev/null @@ -1,623 +0,0 @@ -import codecs -import io -import os -import re -import sys -import typing as t -from weakref import WeakKeyDictionary - -CYGWIN = sys.platform.startswith("cygwin") -WIN = sys.platform.startswith("win") -auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None -_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO[t.Any]) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write("") # type: ignore - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - is_binary: t.Callable[[t.IO[t.Any], bool], bool], - find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: t.Union[str, "os.PathLike[str]", int], - mode: str, - encoding: t.Optional[str], - errors: t.Optional[str], -) -> t.IO[t.Any]: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: "t.Union[str, os.PathLike[str]]", - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, -) -> t.Tuple[t.IO[t.Any], bool]: - binary = "b" in mode - filename = os.fspath(filename) - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: t.Optional[int] = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO[t.Any], af), True - - -class _AtomicFile: - def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> "_AtomicFile": - return self - - def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi( # noqa: F811 - stream: t.TextIO, color: t.Optional[bool] = None - ) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s): - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] - ) -> t.Optional[t.TextIO]: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO[t.Any]) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.Optional[t.TextIO]], - wrapper_func: t.Callable[[], t.TextIO], -) -> t.Callable[[], t.Optional[t.TextIO]]: - cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.Optional[t.TextIO]: - stream = src_func() - - if stream is None: - return None - - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: t.Mapping[ - str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] -] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/lib/python3.12/site-packages/click/_termui_impl.py b/lib/python3.12/site-packages/click/_termui_impl.py deleted file mode 100644 index f744657..0000000 --- a/lib/python3.12/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,739 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" -import contextlib -import math -import os -import sys -import time -import typing as t -from gettext import gettext as _ -from io import StringIO -from types import TracebackType - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: t.Optional[t.Iterable[V]], - length: t.Optional[int] = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - label: t.Optional[str] = None, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label: str = label or "" - - if file is None: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - file = StringIO() - - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width: int = width - self.autowidth: bool = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast(t.Iterable[V], range(length)) - self.iter: t.Iterable[V] = iter(iterable) - self.length = length - self.pos = 0 - self.avg: t.List[float] = [] - self.last_eta: float - self.start: float - self.start = self.last_eta = time.time() - self.eta_known: bool = False - self.finished: bool = False - self.max_width: t.Optional[int] = None - self.entered: bool = False - self.current_item: t.Optional[V] = None - self.is_hidden: bool = not isatty(self.file) - self._last_line: t.Optional[str] = None - - def __enter__(self) -> "ProgressBar[V]": - self.entered = True - self.render_progress() - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self.render_finish() - - def __iter__(self) -> t.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.is_hidden: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - import shutil - - if self.is_hidden: - # Only output the label as it changes if the output is not a - # TTY. Use file=stderr if you expect to be piping stdout. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) # type: ignore - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> t.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if self.is_hidden: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if stdout is None: - stdout = StringIO() - - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - pager_cmd = (os.environ.get("PAGER", None) or "").strip() - if pager_cmd: - if WIN: - return _tempfilepager(generator, pager_cmd, color) - return _pipepager(generator, pager_cmd, color) - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if WIN or sys.platform.startswith("os2"): - return _tempfilepager(generator, "more <", color) - if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: - return _pipepager(generator, "less", color) - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: - return _pipepager(generator, "more", color) - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - """ - import subprocess - - env = dict(os.environ) - - # If we're piping to less we might support colors under the - # condition that - cmd_detail = cmd.rsplit("/", 1)[-1].split() - if color is None and cmd_detail[0] == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) - stdin = t.cast(t.BinaryIO, c.stdin) - encoding = get_best_encoding(stdin) - try: - for text in generator: - if not color: - text = strip_ansi(text) - - stdin.write(text.encode(encoding, "replace")) - except (OSError, KeyboardInterrupt): - pass - else: - stdin.close() - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - -def _tempfilepager( - generator: t.Iterable[str], cmd: str, color: t.Optional[bool] -) -> None: - """Page through text by invoking a program on a temporary file.""" - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - os.system(f'{cmd} "{filename}"') - finally: - os.close(fd) - os.unlink(filename) - - -def _nullpager( - stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - for editor in "sensible-editor", "vim", "nano": - if os.system(f"which {editor} >/dev/null 2>&1") == 0: - return editor - return "vi" - - def edit_file(self, filename: str) -> None: - import subprocess - - editor = self.get_editor() - environ: t.Optional[t.Dict[str, str]] = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - try: - c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: - import tempfile - - if not text: - data = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_file(name) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url.replace('"', "")) - args = f'explorer /select,"{url}"' - else: - url = url.replace('"', "") - wait_str = "/WAIT" if wait else "" - args = f'start {wait_str} "" "{url}"' - return os.system(args) - elif CYGWIN: - if locate: - url = os.path.dirname(_unquote_file(url).replace('"', "")) - args = f'cygstart "{url}"' - else: - url = url.replace('"', "") - wait_str = "-w" if wait else "" - args = f'cygstart {wait_str} "{url}"' - return os.system(args) - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if WIN: - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - func: t.Callable[[], str] - - if echo: - func = msvcrt.getwche # type: ignore - else: - func = msvcrt.getwch # type: ignore - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import tty - import termios - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - f: t.Optional[t.TextIO] - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/lib/python3.12/site-packages/click/_textwrap.py b/lib/python3.12/site-packages/click/_textwrap.py deleted file mode 100644 index b47dcbd..0000000 --- a/lib/python3.12/site-packages/click/_textwrap.py +++ /dev/null @@ -1,49 +0,0 @@ -import textwrap -import typing as t -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: t.List[str], - cur_line: t.List[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> t.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/lib/python3.12/site-packages/click/_winconsole.py b/lib/python3.12/site-packages/click/_winconsole.py deleted file mode 100644 index 6b20df3..0000000 --- a/lib/python3.12/site-packages/click/_winconsole.py +++ /dev/null @@ -1,279 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -import io -import sys -import time -import typing as t -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj, writable=False): - buf = Py_buffer() - flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - return buffer_type.from_address(buf.buf) - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle): - self.handle = handle - - def isatty(self): - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self): - return True - - def readinto(self, b): - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self): - return True - - @staticmethod - def _get_error_message(errno): - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b): - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self): - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> t.Optional[t.TextIO]: - if ( - get_buffer is not None - and encoding in {"utf-16-le", None} - and errors in {"strict", None} - and _is_console(f) - ): - func = _stream_factories.get(f.fileno()) - if func is not None: - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/lib/python3.12/site-packages/click/core.py b/lib/python3.12/site-packages/click/core.py deleted file mode 100644 index cc65e89..0000000 --- a/lib/python3.12/site-packages/click/core.py +++ /dev/null @@ -1,3042 +0,0 @@ -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from contextlib import contextmanager -from contextlib import ExitStack -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat -from types import TracebackType - -from . import types -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _flag_needs_value -from .parser import OptionParser -from .parser import split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - import typing_extensions as te - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: "Context", incomplete: str -) -> t.Iterator[t.Tuple[str, "Command"]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(MultiCommand, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_multicommand( - base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, MultiCommand): - return - if register: - hint = ( - "It is not possible to add multi commands as children to" - " another multi command that is in chain mode." - ) - else: - hint = ( - "Found a multi command as subcommand to a multi command" - " that is in chain mode. This is not supported." - ) - raise RuntimeError( - f"{hint}. Command {base_command.name!r} is set to chain and" - f" {cmd_name!r} was added as a subcommand but it in itself is a" - f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" - f" within a chained {type(base_command).__name__} named" - f" {base_command.name!r})." - ) - - -def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size))) - - -@contextmanager -def augment_usage_errors( - ctx: "Context", param: t.Optional["Parameter"] = None -) -> t.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: t.Sequence["Parameter"], - declaration_order: t.Sequence["Parameter"], -) -> t.List["Parameter"]: - """Given a sequence of parameters in the order as should be considered - for processing and an iterable of parameters that exist, this returns - a list in the correct order as they should be processed. - """ - - def sort_key(item: "Parameter") -> t.Tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: t.Type["HelpFormatter"] = HelpFormatter - - def __init__( - self, - command: "Command", - parent: t.Optional["Context"] = None, - info_name: t.Optional[str] = None, - obj: t.Optional[t.Any] = None, - auto_envvar_prefix: t.Optional[str] = None, - default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, - terminal_width: t.Optional[int] = None, - max_content_width: t.Optional[int] = None, - resilient_parsing: bool = False, - allow_extra_args: t.Optional[bool] = None, - allow_interspersed_args: t.Optional[bool] = None, - ignore_unknown_options: t.Optional[bool] = None, - help_option_names: t.Optional[t.List[str]] = None, - token_normalize_func: t.Optional[t.Callable[[str], str]] = None, - color: t.Optional[bool] = None, - show_default: t.Optional[bool] = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: t.Dict[str, t.Any] = {} - #: the leftover arguments. - self.args: t.List[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self.protected_args: t.List[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: t.Optional[str] = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: t.Optional[int] = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: t.Optional[int] = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: t.List[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Optional[ - t.Callable[[str], str] - ] = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: t.Optional[bool] = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: t.Optional[bool] = show_default - - self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: t.Dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> "Context": - self._depth += 1 - push_context(self) - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> t.Dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: t.ContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._exit_stack.close() - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> "Context": - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: - """Finds the closest object of a given type.""" - node: t.Optional["Context"] = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: t.Type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[False]" = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> "te.NoReturn": - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> "te.NoReturn": - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> "te.NoReturn": - """Exits the application with a given exit code.""" - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: "Command") -> "Context": - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - @t.overload - def invoke( - __self, # noqa: B902 - __callback: "t.Callable[..., V]", - *args: t.Any, - **kwargs: t.Any, - ) -> V: - ... - - @t.overload - def invoke( - __self, # noqa: B902 - __callback: "Command", - *args: t.Any, - **kwargs: t.Any, - ) -> t.Any: - ... - - def invoke( - __self, # noqa: B902 - __callback: t.Union["Command", "t.Callable[..., V]"], - *args: t.Any, - **kwargs: t.Any, - ) -> t.Union[t.Any, V]: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - Note that before Click 3.2 keyword arguments were not properly filled - in against the intention of this code and no context was created. For - more information about this change and why it was done in a bugfix - release see :ref:`upgrade-to-3.2`. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - """ - if isinstance(__callback, Command): - other_cmd = __callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - __callback = t.cast("t.Callable[..., V]", other_cmd.callback) - - ctx = __self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, param.get_default(ctx) - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = __self - - with augment_usage_errors(__self): - with ctx: - return __callback(*args, **kwargs) - - def forward( - __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 - ) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(__cmd, Command): - raise TypeError("Callback is not a command.") - - for param in __self.params: - if param not in kwargs: - kwargs[param] = __self.params[param] - - return __self.invoke(__cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class BaseCommand: - """The base command implements the minimal API contract of commands. - Most code will never use this as it does not implement a lot of useful - functionality but it can act as the direct subclass of alternative - parsing methods that do not depend on the Click parser. - - For instance, this can be used to bridge Click and other systems like - argparse or docopt. - - Because base commands do not implement a lot of the API that other - parts of Click take for granted, they are not supported for all - operations. For instance, they cannot be used with the decorators - usually and they have no built-in callback system. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: t.Type[Context] = Context - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: t.MutableMapping[str, t.Any] = context_settings - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire structure - below this command. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - :param ctx: A :class:`Context` representing this command. - - .. versionadded:: 8.0 - """ - return {"name": self.name} - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get usage") - - def get_help(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get help") - - def make_context( - self, - info_name: t.Optional[str], - args: t.List[str], - parent: t.Optional[Context] = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class( - self, info_name=info_name, parent=parent, **extra # type: ignore - ) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - """Given a context and a list of arguments this creates the parser - and parses the arguments, then modifies the context as necessary. - This is automatically invoked by :meth:`make_context`. - """ - raise NotImplementedError("Base commands do not know how to parse arguments.") - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the command. The default - implementation is raising a not implemented error. - """ - raise NotImplementedError("Base commands are not invocable by default") - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. Other - command classes will return more completions. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, MultiCommand) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx.protected_args - ) - - return results - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: "te.Literal[True]" = True, - **extra: t.Any, - ) -> "te.NoReturn": - ... - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: - ... - - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt) as e: - echo(file=sys.stderr) - raise Abort() from e - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: t.Optional[str] = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - - .. versionchanged:: 8.2.0 - Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). - """ - if complete_var is None: - complete_name = prog_name.replace("-", "_").replace(".", "_") - complete_var = f"_{complete_name}_COMPLETE".upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class Command(BaseCommand): - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - - :param deprecated: issues a message indicating that - the command is deprecated. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, - callback: t.Optional[t.Callable[..., t.Any]] = None, - params: t.Optional[t.List["Parameter"]] = None, - help: t.Optional[str] = None, - epilog: t.Optional[str] = None, - short_help: t.Optional[str] = None, - options_metavar: t.Optional[str] = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool = False, - ) -> None: - super().__init__(name, context_settings) - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: t.List["Parameter"] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - info_dict.update( - params=[param.to_info_dict() for param in self.get_params(ctx)], - help=self.help, - epilog=self.epilog, - short_help=self.short_help, - hidden=self.hidden, - deprecated=self.deprecated, - ) - return info_dict - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> t.List["Parameter"]: - rv = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - rv = [*rv, help_option] - - return rv - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> t.List[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> t.Optional["Option"]: - """Returns the help option object.""" - help_options = self.get_help_option_names(ctx) - - if not help_options or not self.add_help_option: - return None - - def show_help(ctx: Context, param: "Parameter", value: str) -> None: - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - return Option( - help_options, - is_flag=True, - is_eager=True, - expose_value=False, - callback=show_help, - help=_("Show this message and exit."), - ) - - def make_parser(self, ctx: Context) -> OptionParser: - """Creates the underlying option parser for this command.""" - parser = OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - if self.help is not None: - # truncate the help text to the first form feed - text = inspect.cleandoc(self.help).partition("\f")[0] - else: - text = "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - value, args = param.handle_parse_result(ctx, opts, args) - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - message = _( - "DeprecationWarning: The command {name!r} is deprecated." - ).format(name=self.name) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class MultiCommand(Command): - """A multi command is the basic implementation of a command that - dispatches to subcommands. The most common version is the - :class:`Group`. - - :param invoke_without_command: this controls how the multi command itself - is invoked. By default it's only invoked - if a subcommand is provided. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is enabled by default if - `invoke_without_command` is disabled or disabled - if it's enabled. If enabled this will add - ``--help`` as argument if no arguments are - passed. - :param subcommand_metavar: the string that is used in the documentation - to indicate the subcommand place. - :param chain: if this is set to `True` chaining of multiple subcommands - is enabled. This restricts the form of commands in that - they cannot have optional arguments but it allows - multiple commands to be chained together. - :param result_callback: The result callback to attach to this multi - command. This can be set or changed later with the - :meth:`result_callback` decorator. - :param attrs: Other command arguments described in :class:`Command`. - """ - - allow_extra_args = True - allow_interspersed_args = False - - def __init__( - self, - name: t.Optional[str] = None, - invoke_without_command: bool = False, - no_args_is_help: t.Optional[bool] = None, - subcommand_metavar: t.Optional[str] = None, - chain: bool = False, - result_callback: t.Optional[t.Callable[..., t.Any]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "Multi commands in chain mode cannot have" - " optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(__value, *args, **kwargs): # type: ignore - inner = old_callback(__value, *args, **kwargs) - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv - - return decorator - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx.protected_args = rest - ctx.args = [] - elif rest: - ctx.protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx.protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx.protected_args, *ctx.args] - ctx.args = [] - ctx.protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: t.List[str] - ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if split_opt(cmd_name)[0]: - self.parse_args(ctx, ctx.args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - """Given a context and a command name, this returns a - :class:`Command` object if it exists or returns `None`. - """ - raise NotImplementedError - - def list_commands(self, ctx: Context) -> t.List[str]: - """Returns a list of subcommand names in the order they should - appear. - """ - return [] - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class Group(MultiCommand): - """A group allows a command to have subcommands attached. This is - the most common way to implement nesting in Click. - - :param name: The name of the group command. - :param commands: A dict mapping names to :class:`Command` objects. - Can also be a list of :class:`Command`, which will use - :attr:`Command.name` to create the dict. - :param attrs: Other command arguments described in - :class:`MultiCommand`, :class:`Command`, and - :class:`BaseCommand`. - - .. versionchanged:: 8.0 - The ``commands`` argument can be a list of command objects. - """ - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: t.Optional[t.Type[Command]] = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: t.Optional[str] = None, - commands: t.Optional[ - t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] - ] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: t.MutableMapping[str, Command] = commands - - def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_multicommand(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: - ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: - ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - func: t.Optional[t.Callable[..., t.Any]] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'command(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> "Group": - ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: - ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Optional[t.Callable[..., t.Any]] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'group(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> "Group": - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> t.List[str]: - return sorted(self.commands) - - -class CommandCollection(MultiCommand): - """A command collection is a multi command that merges multiple multi - commands together into one. This is a straightforward implementation - that accepts a list of different multi commands as sources and - provides all the commands for each of them. - - See :class:`MultiCommand` and :class:`Command` for the description of - ``name`` and ``attrs``. - """ - - def __init__( - self, - name: t.Optional[str] = None, - sources: t.Optional[t.List[MultiCommand]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - #: The list of registered multi commands. - self.sources: t.List[MultiCommand] = sources or [] - - def add_source(self, multi_cmd: MultiCommand) -> None: - """Adds a new multi command to the chain dispatcher.""" - self.sources.append(multi_cmd) - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_multicommand(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> t.List[str]: - rv: t.Set[str] = set() - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> t.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The latter is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: a string or list of strings that are environment variables - that should be checked. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - required: bool = False, - default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, - callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, - nargs: t.Optional[int] = None, - multiple: bool = False, - metavar: t.Optional[str] = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, - shell_complete: t.Optional[ - t.Callable[ - [Context, "Parameter", str], - t.Union[t.List["CompletionItem"], t.List[str]], - ] - ] = None, - ) -> None: - self.name: t.Optional[str] - self.opts: t.List[str] - self.secondary_opts: t.List[str] - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type: types.ParamType = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - # Skip no default or callable default. - check_default = default if not callable(default) else None - - if check_default is not None: - if multiple: - try: - # Only check the first value against nargs. - check_default = next(_check_iter(check_default), None) - except TypeError: - raise ValueError( - "'default' must be a list when 'multiple' is true." - ) from None - - # Can be None for multiple with empty default. - if nargs != 1 and check_default is not None: - try: - _check_iter(check_default) - except TypeError: - if multiple: - message = ( - "'default' must be a list of lists when 'multiple' is" - " true and 'nargs' != 1." - ) - else: - message = "'default' must be a list when 'nargs' != 1." - - raise ValueError(message) from None - - if nargs > 1 and len(check_default) != nargs: - subject = "item length" if multiple else "length" - raise ValueError( - f"'default' {subject} must match nargs={nargs}." - ) - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - "default": self.default, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(self) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is None: - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, t.Any] - ) -> t.Tuple[t.Any, ParameterSource]: - value = opts.get(self.name) # type: ignore - source = ParameterSource.COMMANDLINE - - if value is None: - value = self.value_from_envvar(ctx) - source = ParameterSource.ENVIRONMENT - - if value is None: - value = ctx.lookup_default(self.name) # type: ignore - source = ParameterSource.DEFAULT_MAP - - if value is None: - value = self.get_default(ctx) - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the option's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - return () if self.multiple or self.nargs == -1 else None - - def check_iter(value: t.Any) -> t.Iterator[t.Any]: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - if self.nargs == 1 or self.type.is_composite: - - def convert(value: t.Any) -> t.Any: - return self.type(value, param=self, ctx=ctx) - - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - if value is None: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - if self.envvar is None: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - rv = self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] - ) -> t.Tuple[t.Any, t.List[str]]: - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - ctx.set_parameter_source(self.name, source) # type: ignore - - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - - value = None - - if self.expose_value: - ctx.params[self.name] = value # type: ignore - - return value, args - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - pass - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast(t.List["CompletionItem"], results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page. Normally, environment variables are not - shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - :param attrs: Other command arguments described in :class:`Parameter`. - - .. versionchanged:: 8.1.0 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1.0 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1.0 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - show_default: t.Union[bool, str, None] = None, - prompt: t.Union[bool, str] = False, - confirmation_prompt: t.Union[bool, str] = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: t.Optional[bool] = None, - flag_value: t.Optional[t.Any] = None, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - help: t.Optional[str] = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - default_is_missing = "default" not in attrs - super().__init__(param_decls, type=type, multiple=multiple, **attrs) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # If prompt is enabled but not required, then the option can be - # used as a flag to indicate using prompt or flag_value. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - if is_flag is None: - if flag_value is not None: - # Implicitly a flag because flag_value was set. - is_flag = True - elif self._flag_needs_value: - # Not a flag, but when used as a flag it shows a prompt. - is_flag = False - else: - # Implicitly a flag because flag options were given. - is_flag = bool(self.secondary_opts) - elif is_flag is False and not self._flag_needs_value: - # Not a flag, and prompt is not enabled, can be used as a - # flag if flag_value is set. - self._flag_needs_value = flag_value is not None - - self.default: t.Union[t.Any, t.Callable[[], t.Any]] - - if is_flag and default_is_missing and not self.required: - if multiple: - self.default = () - else: - self.default = False - - if flag_value is None: - flag_value = not self.default - - self.type: types.ParamType - if is_flag and type is None: - # Re-guess the type from the flag value instead of the - # default. - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = is_flag - self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) - self.flag_value: t.Any = flag_value - - # Counting - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("'prompt' is not valid for non-boolean flag.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - flag_value=self.flag_value, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError("Could not determine name for option") - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: t.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar()}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - extra = [] - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - var_str = ( - envvar - if isinstance(envvar, str) - else ", ".join(str(d) for d in envvar) - ) - extra.append(_("env var: {var}").format(var=var_str)) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or (show_default and (default_value is not None)): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = split_opt( - (self.opts if self.default else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - else: - default_string = str(default_value) - - if default_string: - extra.append(_("default: {default}").format(default=default_string)) - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra.append(range_str) - - if self.required: - extra.append(_("required")) - - if extra: - extra_str = "; ".join(extra) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - # If we're a non boolean flag our default is more complex because - # we need to look at all flags in the same group to figure out - # if we're the default one in which case we return the flag - # value as default. - if self.is_flag and not self.is_bool_flag: - for param in ctx.command.params: - if param.name == self.name and param.default: - return t.cast(Option, param).flag_value - - return None - - return super().get_default(ctx, call=call) - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to be stable. - default = self.get_default(ctx) - - # If this is a prompt for a flag we need to handle this - # differently. - if self.is_bool_flag: - return confirm(self.prompt, default) - - return prompt( - self.prompt, - default=default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - ) - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is None: - return None - - value_depth = (self.nargs != 1) + bool(self.multiple) - - if value_depth > 0: - rv = self.type.split_envvar_value(rv) - - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - - return rv - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, "Parameter"] - ) -> t.Tuple[t.Any, ParameterSource]: - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option can be - # given as a flag without a value. This is different from None - # to distinguish from the flag not being given at all. - if value is _flag_needs_value: - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - elif ( - self.multiple - and value is not None - and any(v is _flag_needs_value for v in value) - ): - value = [self.flag_value if v is _flag_needs_value else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt if - # prompting is enabled. - elif ( - source in {None, ParameterSource.DEFAULT} - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the constructor of :class:`Parameter`. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: t.Sequence[str], - required: t.Optional[bool] = None, - **attrs: t.Any, - ) -> None: - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - if __debug__: - if self.default is not None and self.nargs == -1: - raise TypeError("'default' is not supported for nargs=-1.") - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(self) - if not var: - var = self.name.upper() # type: ignore - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Could not determine name for argument") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [self.make_metavar()] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar()}'" - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/lib/python3.12/site-packages/click/decorators.py b/lib/python3.12/site-packages/click/decorators.py deleted file mode 100644 index d9bba95..0000000 --- a/lib/python3.12/site-packages/click/decorators.py +++ /dev/null @@ -1,561 +0,0 @@ -import inspect -import types -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") -T = t.TypeVar("T") -_AnyCallable = t.Callable[..., t.Any] -FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) - - -def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator( - object_type: t.Type[T], ensure: bool = False -) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - ctx = get_current_context() - - obj: t.Optional[T] - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator # type: ignore[return-value] - - -def pass_meta_key( - key: str, *, doc_description: t.Optional[str] = None -) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator # type: ignore[return-value] - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@t.overload -def command(name: _AnyCallable) -> Command: - ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@t.overload -def command( - name: t.Optional[str], - cls: t.Type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: - ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@t.overload -def command( - name: None = None, - *, - cls: t.Type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: - ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def command( - name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Command]: - ... - - -def command( - name: t.Union[t.Optional[str], _AnyCallable] = None, - cls: t.Optional[t.Type[CmdType]] = None, - **attrs: t.Any, -) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function with - underscores replaced by dashes. If you want to change that, you can - pass the intended name as the first argument. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: the name of the command. This defaults to the function - name with underscores replaced by dashes. - :param cls: the command class to instantiate. This defaults to - :class:`Command`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = t.cast(t.Type[CmdType], Command) - - def decorator(f: _AnyCallable) -> CmdType: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - if t.TYPE_CHECKING: - assert cls is not None - assert not callable(name) - - cmd = cls( - name=name or f.__name__.lower().replace("_", "-"), - callback=f, - params=params, - **attrs, - ) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -GrpType = t.TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@t.overload -def group(name: _AnyCallable) -> Group: - ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@t.overload -def group( - name: t.Optional[str], - cls: t.Type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: - ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@t.overload -def group( - name: None = None, - *, - cls: t.Type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: - ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def group( - name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Group]: - ... - - -def group( - name: t.Union[str, _AnyCallable, None] = None, - cls: t.Optional[t.Type[GrpType]] = None, - **attrs: t.Any, -) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if cls is None: - cls = t.cast(t.Type[GrpType], Group) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument( - *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default argument class, refer to :class:`Argument` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Argument - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def option( - *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default option class, refer to :class:`Option` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Option - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: t.Optional[str] = None, - *param_decls: str, - package_name: t.Optional[str] = None, - prog_name: t.Optional[str] = None, - message: t.Optional[str] = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. On Python < 3.8, the ``importlib_metadata`` - backport must be installed. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - metadata: t.Optional[types.ModuleType] - - try: - from importlib import metadata # type: ignore - except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore - - try: - version = metadata.version(package_name) # type: ignore - except metadata.PackageNotFoundError: # type: ignore - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - message % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--help`` option which immediately prints the help page - and exits the program. - - This is usually unnecessary, as the ``--help`` option is added to - each command automatically unless ``add_help_option=False`` is - passed. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) diff --git a/lib/python3.12/site-packages/click/exceptions.py b/lib/python3.12/site-packages/click/exceptions.py deleted file mode 100644 index fe68a36..0000000 --- a/lib/python3.12/site-packages/click/exceptions.py +++ /dev/null @@ -1,288 +0,0 @@ -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .utils import echo -from .utils import format_filename - -if t.TYPE_CHECKING: - from .core import Command - from .core import Context - from .core import Parameter - - -def _join_param_hints( - param_hint: t.Optional[t.Union[t.Sequence[str], str]] -) -> t.Optional[str]: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: - if file is None: - file = get_text_stderr() - - echo(_("Error: {message}").format(message=self.format_message()), file=file) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd: t.Optional["Command"] = self.ctx.command if self.ctx else None - - def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: t.Optional[str] = None, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - param_type: t.Optional[str] = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: t.Optional[str] = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message(self.param) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: t.Optional[str] = None, - possibilities: t.Optional[t.Sequence[str]] = None, - ctx: t.Optional["Context"] = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: t.Optional["Context"] = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename: str = format_filename(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code: int = code diff --git a/lib/python3.12/site-packages/click/formatting.py b/lib/python3.12/site-packages/click/formatting.py deleted file mode 100644 index ddd2a2f..0000000 --- a/lib/python3.12/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -import typing as t -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: t.Optional[int] = None - - -def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: - widths: t.Dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: t.Iterable[t.Tuple[str, str]], col_count: int -) -> t.Iterator[t.Tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: t.List[t.Tuple[int, bool, str]] = [] - buf: t.List[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: t.Optional[int] = None, - max_width: t.Optional[int] = None, - ) -> None: - import shutil - - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent = 0 - self.buffer: t.List[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage( - self, prog: str, args: str = "", prefix: t.Optional[str] = None - ) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: t.Sequence[t.Tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> t.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> t.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/lib/python3.12/site-packages/click/globals.py b/lib/python3.12/site-packages/click/globals.py deleted file mode 100644 index 480058f..0000000 --- a/lib/python3.12/site-packages/click/globals.py +++ /dev/null @@ -1,68 +0,0 @@ -import typing as t -from threading import local - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: "te.Literal[False]" = False) -> "Context": - ... - - -@t.overload -def get_current_context(silent: bool = ...) -> t.Optional["Context"]: - ... - - -def get_current_context(silent: bool = False) -> t.Optional["Context"]: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: "Context") -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/lib/python3.12/site-packages/click/parser.py b/lib/python3.12/site-packages/click/parser.py deleted file mode 100644 index 5fa7adf..0000000 --- a/lib/python3.12/site-packages/click/parser.py +++ /dev/null @@ -1,529 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - -# Sentinel value that indicates an option was passed as a flag without a -# value but is not a flag option. Option.consume_value uses this to -# prompt or use the flag_value. -_flag_needs_value = object() - - -def _unpack_args( - args: t.Sequence[str], nargs_spec: t.Sequence[int] -) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with `None`. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] - spos: t.Optional[int] = None - - def _fetch(c: "te.Deque[V]") -> t.Optional[V]: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return None - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(None) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def split_opt(opt: str) -> t.Tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -def split_arg_string(string: str) -> t.List[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -class Option: - def __init__( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes: t.Set[str] = set() - - for opt in opts: - prefix, value = split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: t.Any, state: "ParsingState") -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class Argument: - def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], - state: "ParsingState", - ) -> None: - if self.nargs > 1: - assert value is not None - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - if self.nargs == -1 and self.obj.envvar is not None and value == (): - # Replace empty tuple with None so that a value from the - # environment may be tried. - value = None - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class ParsingState: - def __init__(self, rargs: t.List[str]) -> None: - self.opts: t.Dict[str, t.Any] = {} - self.largs: t.List[str] = [] - self.rargs = rargs - self.order: t.List["CoreParameter"] = [] - - -class OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - """ - - def __init__(self, ctx: t.Optional["Context"] = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args: bool = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options: bool = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: t.Dict[str, Option] = {} - self._long_opt: t.Dict[str, Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: t.List[Argument] = [] - - def add_option( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [normalize_opt(opt, self.ctx) for opt in opts] - option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument( - self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 - ) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: t.List[str] - ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: t.Optional[str], state: ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = None - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we recombine the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: Option, state: ParsingState - ) -> t.Any: - nargs = option.nargs - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = _flag_needs_value - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = _flag_needs_value - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) diff --git a/lib/python3.12/site-packages/click/py.typed b/lib/python3.12/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/click/shell_completion.py b/lib/python3.12/site-packages/click/shell_completion.py deleted file mode 100644 index dc9e00b..0000000 --- a/lib/python3.12/site-packages/click/shell_completion.py +++ /dev/null @@ -1,596 +0,0 @@ -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import BaseCommand -from .core import Context -from .core import MultiCommand -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .parser import split_arg_string -from .utils import echo - - -def shell_complete( - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: t.Optional[str] = None, - **kwargs: t.Any, - ) -> None: - self.value: t.Any = value - self.type: str = type - self.help: t.Optional[str] = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - %(complete_func)s "$@" -else - # eval/source/. command, register function for later - compdef %(complete_func)s %(prog_name)s -fi -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> t.Dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions( - self, args: t.List[str], incomplete: str - ) -> t.List[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - @staticmethod - def _check_version() -> None: - import subprocess - - output = subprocess.run( - ["bash", "-c", 'echo "${BASH_VERSION}"'], stdout=subprocess.PIPE - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - echo( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ), - err=True, - ) - else: - echo( - _("Couldn't detect Bash version, shell completion is not supported."), - err=True, - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) - - -_available_shells: t.Dict[str, t.Type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: ShellCompleteType, name: t.Optional[str] = None -) -> ShellCompleteType: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - return cls - - -def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - # Will be None if expose_value is False. - value = ctx.params.get(param.name) - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - args: t.List[str], -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - ctx = cli.make_context(prog_name, args.copy(), **ctx_args) - args = ctx.protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, MultiCommand): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - sub_ctx = ctx - - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - sub_ctx = cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx.protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: t.List[str], incomplete: str -) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/lib/python3.12/site-packages/click/termui.py b/lib/python3.12/site-packages/click/termui.py deleted file mode 100644 index db7a4b2..0000000 --- a/lib/python3.12/site-packages/click/termui.py +++ /dev/null @@ -1,784 +0,0 @@ -import inspect -import io -import itertools -import sys -import typing as t -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Optional[t.Any] = None, - show_choices: bool = True, - type: t.Optional[ParamType] = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text: str, - default: t.Optional[t.Any] = None, - hide_input: bool = False, - confirmation_prompt: t.Union[bool, str] = False, - type: t.Optional[t.Union[ParamType, t.Any]] = None, - value_proc: t.Optional[t.Callable[[str], t.Any]] = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(" ") - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: t.Optional[bool] = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(" ").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], - color: t.Optional[bool] = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast(t.Iterable[str], text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -def progressbar( - iterable: t.Optional[t.Iterable[V]] = None, - length: t.Optional[int] = None, - label: t.Optional[str] = None, - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, -) -> "ProgressBar[V]": - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - Added the ``update_min_steps`` parameter. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. Added the ``update`` method to - the object. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - - # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor - echo("\033[2J\033[1;1H", nl=False) - - -def _interpret_color( - color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 -) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bold: t.Optional[bool] = None, - dim: t.Optional[bool] = None, - underline: t.Optional[bool] = None, - overline: t.Optional[bool] = None, - italic: t.Optional[bool] = None, - blink: t.Optional[bool] = None, - reverse: t.Optional[bool] = None, - strikethrough: t.Optional[bool] = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.AnyStr]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -def edit( - text: t.Optional[t.AnyStr] = None, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - filename: t.Optional[str] = None, -) -> t.Optional[t.AnyStr]: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - ed.edit_file(filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Optional[t.Callable[[bool], str]] = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> t.ContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: t.Optional[str] = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/lib/python3.12/site-packages/click/testing.py b/lib/python3.12/site-packages/click/testing.py deleted file mode 100644 index e0df0d2..0000000 --- a/lib/python3.12/site-packages/click/testing.py +++ /dev/null @@ -1,479 +0,0 @@ -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from .core import BaseCommand - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> t.List[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> t.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast(t.IO[t.Any], input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(input) - - -class Result: - """Holds the captured result of an invoked CLI script.""" - - def __init__( - self, - runner: "CliRunner", - stdout_bytes: bytes, - stderr_bytes: t.Optional[bytes], - return_value: t.Any, - exit_code: int, - exception: t.Optional[BaseException], - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ] = None, - ): - #: The runner that created the result - self.runner = runner - #: The standard output as bytes. - self.stdout_bytes = stdout_bytes - #: The standard error as bytes, or None if not available - self.stderr_bytes = stderr_bytes - #: The value returned from the invoked command. - #: - #: .. versionadded:: 8.0 - self.return_value = return_value - #: The exit code as integer. - self.exit_code = exit_code - #: The exception that happened if one did. - self.exception = exception - #: The traceback - self.exc_info = exc_info - - @property - def output(self) -> str: - """The (standard) output as unicode string.""" - return self.stdout - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string.""" - if self.stderr_bytes is None: - raise ValueError("stderr not separately captured") - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from stdin writes - to stdout. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param mix_stderr: if this is set to `False`, then stdout and stderr are - preserved as independent streams. This is useful for - Unix-philosophy apps that have predictable stdout and - noisy stderr, such that each may be measured - independently - """ - - def __init__( - self, - charset: str = "utf-8", - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - echo_stdin: bool = False, - mix_stderr: bool = True, - ) -> None: - self.charset = charset - self.env: t.Mapping[str, t.Optional[str]] = env or {} - self.echo_stdin = echo_stdin - self.mix_stderr = mix_stderr - - def get_default_prog_name(self, cli: "BaseCommand") -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None - ) -> t.Mapping[str, t.Optional[str]]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - color: bool = False, - ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up stdin with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into sys.stdin. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - ``stderr`` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - bytes_output = io.BytesIO() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, bytes_output) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - bytes_output, encoding=self.charset, name="", mode="w" - ) - - bytes_error = None - if self.mix_stderr: - sys.stderr = sys.stdout - else: - bytes_error = io.BytesIO() - sys.stderr = _NamedTextIOWrapper( - bytes_error, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(prompt or "") - val = text_input.readline().rstrip("\r\n") - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - return text_input.readline().rstrip("\r\n") - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (bytes_output, bytes_error) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: "BaseCommand", - args: t.Optional[t.Union[str, t.Sequence[str]]] = None, - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - catch_exceptions: bool = True, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: t.Optional[BaseException] = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - stdout = outstreams[0].getvalue() - if self.mix_stderr: - stderr = None - else: - stderr = outstreams[1].getvalue() # type: ignore - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None - ) -> t.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) - os.chdir(dt) - - try: - yield dt - finally: - os.chdir(cwd) - - if temp_dir is None: - try: - shutil.rmtree(dt) - except OSError: # noqa: B014 - pass diff --git a/lib/python3.12/site-packages/click/types.py b/lib/python3.12/site-packages/click/types.py deleted file mode 100644 index 2b1d179..0000000 --- a/lib/python3.12/site-packages/click/types.py +++ /dev/null @@ -1,1089 +0,0 @@ -import os -import stat -import sys -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import format_filename -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[t.Optional[str]] = None - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: "Parameter") -> t.Optional[str]: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: "Parameter") -> t.Optional[str]: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> t.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> "t.NoReturn": - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name: str = func.__name__ - self.func = func - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = sys.getfilesystemencoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType): - """The choice type allows a value to be checked against a fixed set - of supported values. All of these values have to be strings. - - You should only pass a list or tuple of choices. Other iterables - (like generators) may lead to surprising results. - - The resulting value will always be one of the originally passed choices - regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` - being specified. - - See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - """ - - name = "choice" - - def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: - self.choices = choices - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - choices_str = "|".join(self.choices) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: "Parameter") -> str: - return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - # Match through normalization and case sensitivity - # first do token_normalize_func, then lowercase - # preserve original `value` to produce an accurate message in - # `self.fail` - normed_value = value - normed_choices = {choice: choice for choice in self.choices} - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(value) - normed_choices = { - ctx.token_normalize_func(normed_choice): original - for normed_choice, original in normed_choices.items() - } - - if not self.case_sensitive: - normed_value = normed_value.casefold() - normed_choices = { - normed_choice.casefold(): original - for normed_choice, original in normed_choices.items() - } - - if normed_value in normed_choices: - return normed_choices[normed_value] - - choices_str = ", ".join(map(repr, self.choices)) - self.fail( - ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: t.Optional[t.Sequence[str]] = None): - self.formats: t.Sequence[str] = formats or [ - "%Y-%m-%d", - "%Y-%m-%dT%H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[t.Type[t.Any]] - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: "te.Literal[1, -1]", open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - if not open: - return bound - - # Could use Python 3.9's math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if value in {False, True}: - return bool(value) - - norm = value.strip().lower() - - if norm in {"1", "true", "t", "yes", "y", "on"}: - return True - - if norm in {"0", "false", "f", "no", "n", "off"}: - return False - - self.fail( - _("{value!r} is not a valid boolean.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Starting with Click 2.0, files can also be opened atomically in which - case all writes go into a separate file in the same folder and upon - completion the file will be moved over to the original location. This - is useful if a file regularly read by other users is modified. - - See :ref:`file-args` for more information. - """ - - name = "filename" - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: t.Optional[bool] = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: - if self.lazy is not None: - return self.lazy - if os.fspath(value) == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, - value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], - param: t.Optional["Parameter"], - ctx: t.Optional["Context"], - ) -> t.IO[t.Any]: - if _is_file_like(value): - return value - - value = t.cast("t.Union[str, os.PathLike[str]]", value) - - try: - lazy = self.resolve_lazy_flag(value) - - if lazy: - lf = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - if ctx is not None: - ctx.call_on_close(lf.close_intelligently) - - return t.cast(t.IO[t.Any], lf) - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: # noqa: B014 - self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": - return hasattr(value, "read") or hasattr(value, "write") - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``path_type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: t.Optional[t.Type[t.Any]] = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name: str = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result( - self, value: "t.Union[str, os.PathLike[str]]" - ) -> "t.Union[str, bytes, os.PathLike[str]]": - if self.type is not None and not isinstance(value, self.type): - if self.type is str: - return os.fsdecode(value) - elif self.type is bytes: - return os.fsencode(value) - else: - return t.cast("os.PathLike[str]", self.type(value)) - - return value - - def convert( - self, - value: "t.Union[str, os.PathLike[str]]", - param: t.Optional["Parameter"], - ctx: t.Optional["Context"], - ) -> "t.Union[str, bytes, os.PathLike[str]]": - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - # os.path.realpath doesn't resolve symlinks on Windows - # until Python 3.8. Use pathlib for now. - import pathlib - - rv = os.fsdecode(pathlib.Path(rv).resolve()) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} '{filename}' is a directory.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: - self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) - - -def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() diff --git a/lib/python3.12/site-packages/click/utils.py b/lib/python3.12/site-packages/click/utils.py deleted file mode 100644 index d536434..0000000 --- a/lib/python3.12/site-packages/click/utils.py +++ /dev/null @@ -1,624 +0,0 @@ -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType -from types import TracebackType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: - try: - return func(*args, **kwargs) - except Exception: - pass - return None - - return update_wrapper(wrapper, func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(sys.getfilesystemencoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: t.Union[str, "os.PathLike[str]"], - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, - ): - self.name: str = os.fspath(filename) - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.Optional[t.IO[t.Any]] - self.should_close: bool - - if self.name == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO[t.Any]: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: # noqa: E402 - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> "LazyFile": - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self.close_intelligently() - - def __iter__(self) -> t.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO[t.Any]) -> None: - self._file: t.IO[t.Any] = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> "KeepOpenFile": - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> t.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.Any]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - return - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: t.Optional[t.Union[str, bytes]] = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: "te.Literal['stdin', 'stdout', 'stderr']", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO[t.Any]: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast( - t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) - ) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast(t.IO[t.Any], KeepOpenFile(f)) - - return f - - -def format_filename( - filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", - shorten: bool = False, -) -> str: - """Format a filename as a string for display. Ensures the filename can be - displayed by replacing any invalid bytes or surrogate escapes in the name - with the replacement character ``�``. - - Invalid bytes or surrogate escapes will raise an error when written to a - stream with ``errors="strict". This will typically happen with ``stdout`` - when the locale is something like ``en_GB.UTF-8``. - - Many scenarios *are* safe to write surrogates though, due to PEP 538 and - PEP 540, including: - - - Writing to ``stderr``, which uses ``errors="backslashreplace"``. - - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens - stdout and stderr with ``errors="surrogateescape"``. - - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. - - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. - Python opens stdout and stderr with ``errors="surrogateescape"``. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - else: - filename = os.fspath(filename) - - if isinstance(filename, bytes): - filename = filename.decode(sys.getfilesystemencoding(), "replace") - else: - filename = filename.encode("utf-8", "surrogateescape").decode( - "utf-8", "replace" - ) - - return filename - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no effect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO[t.Any]) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - # It is set to "" inside a Shiv or PEX zipapp. - if getattr(_main, "__package__", None) in {None, ""} or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: t.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> t.List[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/DESCRIPTION.rst b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/DESCRIPTION.rst deleted file mode 100644 index 8eeb33c..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,14 +0,0 @@ -Color Thief ------------ - -A module for grabbing the color palette from an image. - -Links -````` - -* `github `_ -* `development version - `_ - - - diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/INSTALLER b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/METADATA b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/METADATA deleted file mode 100644 index e8ca52a..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/METADATA +++ /dev/null @@ -1,31 +0,0 @@ -Metadata-Version: 2.0 -Name: colorthief -Version: 0.2.1 -Summary: A module for grabbing the color palette from an image. -Home-page: https://github.com/fengsp/color-thief-py -Author: Shipeng Feng -Author-email: fsp261@gmail.com -License: BSD -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Requires-Dist: Pillow - -Color Thief ------------ - -A module for grabbing the color palette from an image. - -Links -````` - -* `github `_ -* `development version - `_ - - - diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/RECORD b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/RECORD deleted file mode 100644 index 22162b4..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -__pycache__/colorthief.cpython-312.pyc,, -colorthief-0.2.1.dist-info/DESCRIPTION.rst,sha256=VsNyZ2WyIA_gT5WcQshqFOrUN39mra_8RsKFjWILMXM,259 -colorthief-0.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -colorthief-0.2.1.dist-info/METADATA,sha256=IJGLuaia9W0i8Fh0ugICUXdyxmDQK4ioG8QeC6QBKRI,816 -colorthief-0.2.1.dist-info/RECORD,, -colorthief-0.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -colorthief-0.2.1.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 -colorthief-0.2.1.dist-info/metadata.json,sha256=mERdl9lzZiTw5JAVKHuC5pNX8Rn_tueubWhVGYva6sg,742 -colorthief-0.2.1.dist-info/top_level.txt,sha256=v_E4izuHH44StguBgouI_84PSwkOH9RuHV5A0lTEqwI,11 -colorthief.py,sha256=hLDAjfRZkPAIQriGrR4pFoPoWbpM_VcTP7kRPSPA6KY,13520 diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/REQUESTED b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/WHEEL b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/WHEEL deleted file mode 100644 index 9dff69d..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.24.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/metadata.json b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/metadata.json deleted file mode 100644 index b5c7db8..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"license": "BSD", "name": "colorthief", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "A module for grabbing the color palette from an image.", "run_requires": [{"requires": ["Pillow"]}], "version": "0.2.1", "extensions": {"python.details": {"project_urls": {"Home": "https://github.com/fengsp/color-thief-py"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "fsp261@gmail.com", "name": "Shipeng Feng"}]}}, "classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7"], "extras": []} \ No newline at end of file diff --git a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/top_level.txt b/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/top_level.txt deleted file mode 100644 index 40b1b86..0000000 --- a/lib/python3.12/site-packages/colorthief-0.2.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -colorthief diff --git a/lib/python3.12/site-packages/colorthief.py b/lib/python3.12/site-packages/colorthief.py deleted file mode 100644 index 0cd7ada..0000000 --- a/lib/python3.12/site-packages/colorthief.py +++ /dev/null @@ -1,422 +0,0 @@ -# -*- coding: utf-8 -*- -""" - colorthief - ~~~~~~~~~~ - - Grabbing the color palette from an image. - - :copyright: (c) 2015 by Shipeng Feng. - :license: BSD, see LICENSE for more details. -""" -__version__ = '0.2.1' - -import math - -from PIL import Image - - -class cached_property(object): - """Decorator that creates converts a method with a single - self argument into a property cached on the instance. - """ - def __init__(self, func): - self.func = func - - def __get__(self, instance, type): - res = instance.__dict__[self.func.__name__] = self.func(instance) - return res - - -class ColorThief(object): - """Color thief main class.""" - def __init__(self, file): - """Create one color thief for one image. - - :param file: A filename (string) or a file object. The file object - must implement `read()`, `seek()`, and `tell()` methods, - and be opened in binary mode. - """ - self.image = Image.open(file) - - def get_color(self, quality=10): - """Get the dominant color. - - :param quality: quality settings, 1 is the highest quality, the bigger - the number, the faster a color will be returned but - the greater the likelihood that it will not be the - visually most dominant color - :return tuple: (r, g, b) - """ - palette = self.get_palette(5, quality) - return palette[0] - - def get_palette(self, color_count=10, quality=10): - """Build a color palette. We are using the median cut algorithm to - cluster similar colors. - - :param color_count: the size of the palette, max number of colors - :param quality: quality settings, 1 is the highest quality, the bigger - the number, the faster the palette generation, but the - greater the likelihood that colors will be missed. - :return list: a list of tuple in the form (r, g, b) - """ - image = self.image.convert('RGBA') - width, height = image.size - pixels = image.getdata() - pixel_count = width * height - valid_pixels = [] - for i in range(0, pixel_count, quality): - r, g, b, a = pixels[i] - # If pixel is mostly opaque and not white - if a >= 125: - if not (r > 250 and g > 250 and b > 250): - valid_pixels.append((r, g, b)) - - # Send array to quantize function which clusters values - # using median cut algorithm - cmap = MMCQ.quantize(valid_pixels, color_count) - return cmap.palette - - -class MMCQ(object): - """Basic Python port of the MMCQ (modified median cut quantization) - algorithm from the Leptonica library (http://www.leptonica.com/). - """ - - SIGBITS = 5 - RSHIFT = 8 - SIGBITS - MAX_ITERATION = 1000 - FRACT_BY_POPULATIONS = 0.75 - - @staticmethod - def get_color_index(r, g, b): - return (r << (2 * MMCQ.SIGBITS)) + (g << MMCQ.SIGBITS) + b - - @staticmethod - def get_histo(pixels): - """histo (1-d array, giving the number of pixels in each quantized - region of color space) - """ - histo = dict() - for pixel in pixels: - rval = pixel[0] >> MMCQ.RSHIFT - gval = pixel[1] >> MMCQ.RSHIFT - bval = pixel[2] >> MMCQ.RSHIFT - index = MMCQ.get_color_index(rval, gval, bval) - histo[index] = histo.setdefault(index, 0) + 1 - return histo - - @staticmethod - def vbox_from_pixels(pixels, histo): - rmin = 1000000 - rmax = 0 - gmin = 1000000 - gmax = 0 - bmin = 1000000 - bmax = 0 - for pixel in pixels: - rval = pixel[0] >> MMCQ.RSHIFT - gval = pixel[1] >> MMCQ.RSHIFT - bval = pixel[2] >> MMCQ.RSHIFT - rmin = min(rval, rmin) - rmax = max(rval, rmax) - gmin = min(gval, gmin) - gmax = max(gval, gmax) - bmin = min(bval, bmin) - bmax = max(bval, bmax) - return VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo) - - @staticmethod - def median_cut_apply(histo, vbox): - if not vbox.count: - return (None, None) - - rw = vbox.r2 - vbox.r1 + 1 - gw = vbox.g2 - vbox.g1 + 1 - bw = vbox.b2 - vbox.b1 + 1 - maxw = max([rw, gw, bw]) - # only one pixel, no split - if vbox.count == 1: - return (vbox.copy, None) - # Find the partial sum arrays along the selected axis. - total = 0 - sum_ = 0 - partialsum = {} - lookaheadsum = {} - do_cut_color = None - if maxw == rw: - do_cut_color = 'r' - for i in range(vbox.r1, vbox.r2+1): - sum_ = 0 - for j in range(vbox.g1, vbox.g2+1): - for k in range(vbox.b1, vbox.b2+1): - index = MMCQ.get_color_index(i, j, k) - sum_ += histo.get(index, 0) - total += sum_ - partialsum[i] = total - elif maxw == gw: - do_cut_color = 'g' - for i in range(vbox.g1, vbox.g2+1): - sum_ = 0 - for j in range(vbox.r1, vbox.r2+1): - for k in range(vbox.b1, vbox.b2+1): - index = MMCQ.get_color_index(j, i, k) - sum_ += histo.get(index, 0) - total += sum_ - partialsum[i] = total - else: # maxw == bw - do_cut_color = 'b' - for i in range(vbox.b1, vbox.b2+1): - sum_ = 0 - for j in range(vbox.r1, vbox.r2+1): - for k in range(vbox.g1, vbox.g2+1): - index = MMCQ.get_color_index(j, k, i) - sum_ += histo.get(index, 0) - total += sum_ - partialsum[i] = total - for i, d in partialsum.items(): - lookaheadsum[i] = total - d - - # determine the cut planes - dim1 = do_cut_color + '1' - dim2 = do_cut_color + '2' - dim1_val = getattr(vbox, dim1) - dim2_val = getattr(vbox, dim2) - for i in range(dim1_val, dim2_val+1): - if partialsum[i] > (total / 2): - vbox1 = vbox.copy - vbox2 = vbox.copy - left = i - dim1_val - right = dim2_val - i - if left <= right: - d2 = min([dim2_val - 1, int(i + right / 2)]) - else: - d2 = max([dim1_val, int(i - 1 - left / 2)]) - # avoid 0-count boxes - while not partialsum.get(d2, False): - d2 += 1 - count2 = lookaheadsum.get(d2) - while not count2 and partialsum.get(d2-1, False): - d2 -= 1 - count2 = lookaheadsum.get(d2) - # set dimensions - setattr(vbox1, dim2, d2) - setattr(vbox2, dim1, getattr(vbox1, dim2) + 1) - return (vbox1, vbox2) - return (None, None) - - @staticmethod - def quantize(pixels, max_color): - """Quantize. - - :param pixels: a list of pixel in the form (r, g, b) - :param max_color: max number of colors - """ - if not pixels: - raise Exception('Empty pixels when quantize.') - if max_color < 2 or max_color > 256: - raise Exception('Wrong number of max colors when quantize.') - - histo = MMCQ.get_histo(pixels) - - # check that we aren't below maxcolors already - if len(histo) <= max_color: - # generate the new colors from the histo and return - pass - - # get the beginning vbox from the colors - vbox = MMCQ.vbox_from_pixels(pixels, histo) - pq = PQueue(lambda x: x.count) - pq.push(vbox) - - # inner function to do the iteration - def iter_(lh, target): - n_color = 1 - n_iter = 0 - while n_iter < MMCQ.MAX_ITERATION: - vbox = lh.pop() - if not vbox.count: # just put it back - lh.push(vbox) - n_iter += 1 - continue - # do the cut - vbox1, vbox2 = MMCQ.median_cut_apply(histo, vbox) - if not vbox1: - raise Exception("vbox1 not defined; shouldn't happen!") - lh.push(vbox1) - if vbox2: # vbox2 can be null - lh.push(vbox2) - n_color += 1 - if n_color >= target: - return - if n_iter > MMCQ.MAX_ITERATION: - return - n_iter += 1 - - # first set of colors, sorted by population - iter_(pq, MMCQ.FRACT_BY_POPULATIONS * max_color) - - # Re-sort by the product of pixel occupancy times the size in - # color space. - pq2 = PQueue(lambda x: x.count * x.volume) - while pq.size(): - pq2.push(pq.pop()) - - # next set - generate the median cuts using the (npix * vol) sorting. - iter_(pq2, max_color - pq2.size()) - - # calculate the actual colors - cmap = CMap() - while pq2.size(): - cmap.push(pq2.pop()) - return cmap - - -class VBox(object): - """3d color space box""" - def __init__(self, r1, r2, g1, g2, b1, b2, histo): - self.r1 = r1 - self.r2 = r2 - self.g1 = g1 - self.g2 = g2 - self.b1 = b1 - self.b2 = b2 - self.histo = histo - - @cached_property - def volume(self): - sub_r = self.r2 - self.r1 - sub_g = self.g2 - self.g1 - sub_b = self.b2 - self.b1 - return (sub_r + 1) * (sub_g + 1) * (sub_b + 1) - - @property - def copy(self): - return VBox(self.r1, self.r2, self.g1, self.g2, - self.b1, self.b2, self.histo) - - @cached_property - def avg(self): - ntot = 0 - mult = 1 << (8 - MMCQ.SIGBITS) - r_sum = 0 - g_sum = 0 - b_sum = 0 - for i in range(self.r1, self.r2 + 1): - for j in range(self.g1, self.g2 + 1): - for k in range(self.b1, self.b2 + 1): - histoindex = MMCQ.get_color_index(i, j, k) - hval = self.histo.get(histoindex, 0) - ntot += hval - r_sum += hval * (i + 0.5) * mult - g_sum += hval * (j + 0.5) * mult - b_sum += hval * (k + 0.5) * mult - - if ntot: - r_avg = int(r_sum / ntot) - g_avg = int(g_sum / ntot) - b_avg = int(b_sum / ntot) - else: - r_avg = int(mult * (self.r1 + self.r2 + 1) / 2) - g_avg = int(mult * (self.g1 + self.g2 + 1) / 2) - b_avg = int(mult * (self.b1 + self.b2 + 1) / 2) - - return r_avg, g_avg, b_avg - - def contains(self, pixel): - rval = pixel[0] >> MMCQ.RSHIFT - gval = pixel[1] >> MMCQ.RSHIFT - bval = pixel[2] >> MMCQ.RSHIFT - return all([ - rval >= self.r1, - rval <= self.r2, - gval >= self.g1, - gval <= self.g2, - bval >= self.b1, - bval <= self.b2, - ]) - - @cached_property - def count(self): - npix = 0 - for i in range(self.r1, self.r2 + 1): - for j in range(self.g1, self.g2 + 1): - for k in range(self.b1, self.b2 + 1): - index = MMCQ.get_color_index(i, j, k) - npix += self.histo.get(index, 0) - return npix - - -class CMap(object): - """Color map""" - def __init__(self): - self.vboxes = PQueue(lambda x: x['vbox'].count * x['vbox'].volume) - - @property - def palette(self): - return self.vboxes.map(lambda x: x['color']) - - def push(self, vbox): - self.vboxes.push({ - 'vbox': vbox, - 'color': vbox.avg, - }) - - def size(self): - return self.vboxes.size() - - def nearest(self, color): - d1 = None - p_color = None - for i in range(self.vboxes.size()): - vbox = self.vboxes.peek(i) - d2 = math.sqrt( - math.pow(color[0] - vbox['color'][0], 2) + - math.pow(color[1] - vbox['color'][1], 2) + - math.pow(color[2] - vbox['color'][2], 2) - ) - if d1 is None or d2 < d1: - d1 = d2 - p_color = vbox['color'] - return p_color - - def map(self, color): - for i in range(self.vboxes.size()): - vbox = self.vboxes.peek(i) - if vbox['vbox'].contains(color): - return vbox['color'] - return self.nearest(color) - - -class PQueue(object): - """Simple priority queue.""" - def __init__(self, sort_key): - self.sort_key = sort_key - self.contents = [] - self._sorted = False - - def sort(self): - self.contents.sort(key=self.sort_key) - self._sorted = True - - def push(self, o): - self.contents.append(o) - self._sorted = False - - def peek(self, index=None): - if not self._sorted: - self.sort() - if index is None: - index = len(self.contents) - 1 - return self.contents[index] - - def pop(self): - if not self._sorted: - self.sort() - return self.contents.pop() - - def size(self): - return len(self.contents) - - def map(self, f): - return list(map(f, self.contents)) diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER b/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt b/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt deleted file mode 100644 index 9d227a0..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA b/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA deleted file mode 100644 index 5a02107..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/METADATA +++ /dev/null @@ -1,101 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask -Version: 3.0.3 -Summary: A simple framework for building complex web applications. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Typing :: Typed -Requires-Dist: Werkzeug>=3.0.0 -Requires-Dist: Jinja2>=3.1.2 -Requires-Dist: itsdangerous>=2.1.2 -Requires-Dist: click>=8.1.3 -Requires-Dist: blinker>=1.6.2 -Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' -Requires-Dist: asgiref>=3.2 ; extra == "async" -Requires-Dist: python-dotenv ; extra == "dotenv" -Project-URL: Changes, https://flask.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/flask/ -Provides-Extra: async -Provides-Extra: dotenv - -# Flask - -Flask is a lightweight [WSGI][] web application framework. It is designed -to make getting started quick and easy, with the ability to scale up to -complex applications. It began as a simple wrapper around [Werkzeug][] -and [Jinja][], and has become one of the most popular Python web -application frameworks. - -Flask offers suggestions, but doesn't enforce any dependencies or -project layout. It is up to the developer to choose the tools and -libraries they want to use. There are many extensions provided by the -community that make adding new functionality easy. - -[WSGI]: https://wsgi.readthedocs.io/ -[Werkzeug]: https://werkzeug.palletsprojects.com/ -[Jinja]: https://jinja.palletsprojects.com/ - - -## Installing - -Install and update from [PyPI][] using an installer such as [pip][]: - -``` -$ pip install -U Flask -``` - -[PyPI]: https://pypi.org/project/Flask/ -[pip]: https://pip.pypa.io/en/stable/getting-started/ - - -## A Simple Example - -```python -# save this as app.py -from flask import Flask - -app = Flask(__name__) - -@app.route("/") -def hello(): - return "Hello, World!" -``` - -``` -$ flask run - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) -``` - - -## Contributing - -For guidance on setting up a development environment and how to make a -contribution to Flask, see the [contributing guidelines][]. - -[contributing guidelines]: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst - - -## Donate - -The Pallets organization develops and supports Flask and the libraries -it uses. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD b/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD deleted file mode 100644 index 0643e14..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -../../../bin/flask,sha256=SkKaNNLMPknm4x9eNwjkGpUKejMrHm8uuu9pgURBQYY,252 -flask-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask-3.0.3.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask-3.0.3.dist-info/METADATA,sha256=exPahy4aahjV-mYqd9qb5HNP8haB_IxTuaotoSvCtag,3177 -flask-3.0.3.dist-info/RECORD,, -flask-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask-3.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask-3.0.3.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 -flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 -flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/__pycache__/__init__.cpython-312.pyc,, -flask/__pycache__/__main__.cpython-312.pyc,, -flask/__pycache__/app.cpython-312.pyc,, -flask/__pycache__/blueprints.cpython-312.pyc,, -flask/__pycache__/cli.cpython-312.pyc,, -flask/__pycache__/config.cpython-312.pyc,, -flask/__pycache__/ctx.cpython-312.pyc,, -flask/__pycache__/debughelpers.cpython-312.pyc,, -flask/__pycache__/globals.cpython-312.pyc,, -flask/__pycache__/helpers.cpython-312.pyc,, -flask/__pycache__/logging.cpython-312.pyc,, -flask/__pycache__/sessions.cpython-312.pyc,, -flask/__pycache__/signals.cpython-312.pyc,, -flask/__pycache__/templating.cpython-312.pyc,, -flask/__pycache__/testing.cpython-312.pyc,, -flask/__pycache__/typing.cpython-312.pyc,, -flask/__pycache__/views.cpython-312.pyc,, -flask/__pycache__/wrappers.cpython-312.pyc,, -flask/app.py,sha256=7-lh6cIj27riTE1Q18Ok1p5nOZ8qYiMux4Btc6o6mNc,60143 -flask/blueprints.py,sha256=7INXPwTkUxfOQXOOv1yu52NpHPmPGI5fMTMFZ-BG9yY,4430 -flask/cli.py,sha256=OOaf_Efqih1i2in58j-5ZZZmQnPpaSfiUFbEjlL9bzw,35825 -flask/config.py,sha256=bLzLVAj-cq-Xotu9erqOFte0xSFaVXyfz0AkP4GbwmY,13312 -flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 -flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 -flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 -flask/helpers.py,sha256=tYrcQ_73GuSZVEgwFr-eMmV69UriFQDBmt8wZJIAqvg,23084 -flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 -flask/json/__pycache__/__init__.cpython-312.pyc,, -flask/json/__pycache__/provider.cpython-312.pyc,, -flask/json/__pycache__/tag.cpython-312.pyc,, -flask/json/provider.py,sha256=q6iB83lSiopy80DZPrU-9mGcWwrD0mvLjiv9fHrRZgc,7646 -flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 -flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 -flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 -flask/sansio/__pycache__/app.cpython-312.pyc,, -flask/sansio/__pycache__/blueprints.cpython-312.pyc,, -flask/sansio/__pycache__/scaffold.cpython-312.pyc,, -flask/sansio/app.py,sha256=YG5Gf7JVf1c0yccWDZ86q5VSfJUidOVp27HFxFNxC7U,38053 -flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 -flask/sansio/scaffold.py,sha256=WLV9TRQMMhGlXz-1OKtQ3lv6mtIBQZxdW2HezYrGxoI,30633 -flask/sessions.py,sha256=RU4lzm9MQW9CtH8rVLRTDm8USMJyT4LbvYe7sxM2__k,14807 -flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 -flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 -flask/testing.py,sha256=3BFXb3bP7R5r-XLBuobhczbxDu8-1LWRzYuhbr-lwaE,10163 -flask/typing.py,sha256=ZavK-wV28Yv8CQB7u73qZp_jLalpbWdrXS37QR1ftN0,3190 -flask/views.py,sha256=B66bTvYBBcHMYk4dA1ScZD0oTRTBl0I5smp1lRm9riI,6939 -flask/wrappers.py,sha256=m1j5tIJxIu8_sPPgTAB_G4TTh52Q-HoDuw_qHV5J59g,5831 diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED b/lib/python3.12/site-packages/flask-3.0.3.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL b/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt b/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt deleted file mode 100644 index eec6733..0000000 --- a/lib/python3.12/site-packages/flask-3.0.3.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask=flask.cli:main - diff --git a/lib/python3.12/site-packages/flask/__init__.py b/lib/python3.12/site-packages/flask/__init__.py deleted file mode 100644 index e86eb43..0000000 --- a/lib/python3.12/site-packages/flask/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import json as json -from .app import Flask as Flask -from .blueprints import Blueprint as Blueprint -from .config import Config as Config -from .ctx import after_this_request as after_this_request -from .ctx import copy_current_request_context as copy_current_request_context -from .ctx import has_app_context as has_app_context -from .ctx import has_request_context as has_request_context -from .globals import current_app as current_app -from .globals import g as g -from .globals import request as request -from .globals import session as session -from .helpers import abort as abort -from .helpers import flash as flash -from .helpers import get_flashed_messages as get_flashed_messages -from .helpers import get_template_attribute as get_template_attribute -from .helpers import make_response as make_response -from .helpers import redirect as redirect -from .helpers import send_file as send_file -from .helpers import send_from_directory as send_from_directory -from .helpers import stream_with_context as stream_with_context -from .helpers import url_for as url_for -from .json import jsonify as jsonify -from .signals import appcontext_popped as appcontext_popped -from .signals import appcontext_pushed as appcontext_pushed -from .signals import appcontext_tearing_down as appcontext_tearing_down -from .signals import before_render_template as before_render_template -from .signals import got_request_exception as got_request_exception -from .signals import message_flashed as message_flashed -from .signals import request_finished as request_finished -from .signals import request_started as request_started -from .signals import request_tearing_down as request_tearing_down -from .signals import template_rendered as template_rendered -from .templating import render_template as render_template -from .templating import render_template_string as render_template_string -from .templating import stream_template as stream_template -from .templating import stream_template_string as stream_template_string -from .wrappers import Request as Request -from .wrappers import Response as Response - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask 3.1. Use feature detection or" - " 'importlib.metadata.version(\"flask\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask") - - raise AttributeError(name) diff --git a/lib/python3.12/site-packages/flask/__main__.py b/lib/python3.12/site-packages/flask/__main__.py deleted file mode 100644 index 4e28416..0000000 --- a/lib/python3.12/site-packages/flask/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import main - -main() diff --git a/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 53d8a84a4466be74303d7b888c6124c735208f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2485 zcmZXW%WoS+9LHz{=Rav6AvPDvgGo~F~1$AD+(jO20PSvo7Z0z60OBu@a( z(|O60zzcLi@)WQ}HObR<+F7KFl4tBCXPGWbo&{c^E0X7cSLv$cdEhm=CV2t4N~@AJ z;B~q#c@elqYm%3MH|U1sW#CP^DR~9>EIliE)jsFcX!ND~I%i+?Sb+7jEzj@ktsdvh6|t|kJXf$g zSYPTIfo}Nz32PLsK@TVFLfi?oh7T1SQ++d#8n7UMz`;!$O^;*e={AJi1sLlvq00g@ zbq5+69TtFJL0>S(w++E`LkMm)dxAkt(J}TIL=pI~7HDKSGcC?q*l#XiuBo>z8!JYS z3*2+`;|3n@OIvVeIQqUNx+i9#_PDLLJq|5YTv)4(jYnWkgEi58&-a;m+Ux~gX-=GI zDVPDf(9unAAE#YuGUynCc1_%f!L*=eyyLxDdv>SAeB5HFC=J#kUK_B64(r4 zJ_KKOnLDjZ#x@gauu{%{XSTu5-MT@BZ|8mub}# zc2#?wp_&zFCLBW6g2Xj7!!@;i%eJ*9(>Qay+u&KQCQq!kUB6J*z6hAsW`^i-1|JH@ zV;D*ExK_0sA5M#HHR}!&hG__+J_uxe36IR)QmqP|1+dX({Ut^QJCcV?XzkhTHnWdU z*guA_;IiG)?Cw+HSDTz}Y}%P?vkhrb2#HF>5MzQ6aoI{Q4k z_&huDM|Swf;t$2cM56eia+D#(g=Z6!hXsg;jr=FG;AD0%NmTHenwV$g` zN?VVzTYu&!AB;W8&p%4dzk+T_Eydr3pD+o@A7(g%t#j|DMSaKZ*WM2Ey58>LZbCS? z2w_I_eOTvE5h3B2$zc+%3Xa(u=9}@29dK1PhRX(SZH^fnCR^eT&jE4#lfW^9`5CNG zJGR#}?0{p^@*$KG%CM~LGTVoQ(m596-k?RrJj>zSRG$Jw+ zk*a)`BLeSEM6Su&T0}M@@_~Gz0elGU;r&!LxEhgnWLKc@3HX;H@>#6w5!pD(3@HmT G%>MvHjLJR$ diff --git a/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index f56fbff144af64f32d19c0398ccde5d0ff565cd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 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 diff --git a/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc deleted file mode 100644 index eea7aadb300a14a4ab5a6d289e9157da5004a2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42261 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 DBHtkO diff --git a/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc deleted file mode 100644 index a6564633446806c2703b20145553869196d05b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16223 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 UNk~2$l80<^^*>9L^4t8s0jZf^V*mgE diff --git a/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc deleted file mode 100644 index 160f64d45f3ecbab158c771736a5853a412b2e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9137 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 diff --git a/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc deleted file mode 100644 index 9f6891e4abbc3cb0b8ab63f33583d2886db3324c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 zcmb`H&u<$=6vub{YaMTF=ZE9ePMS=UQW{Ea0qU(kgrd?!g(@Nmh^^Yy#xu6J+1*)Y zXA|2eiwhAaZg9-8s9g9vxJ1gOT@-{=aj3*0RVpFDg*UtF+Ld}_C6C{}&zpH~zHfGZ z&F6CxJb(RNZ2gjvr03#g@T4O{KKo9Vq#vYh2}@YEBwN;GS=b3Hp(WuzX{GG6mJWR> zD`P8~B15wO5 zK8s7hXGVDW4So*K0xt`W&uNt~cja~NDy{;Zdp)~KDkHh)@I27-Ly8wdKFB?f7lAK~ zaP$U0k1qg6f_D=uOD{ypD{`P3jzhV@P3m~};61lW9Zov@3xkQbPie!jHW=-6UkHi7 zmHxysyj?H~`p2%j$~$)~x?@WhEW4)jO z_lJ5u2o$}sr$ZXht>`;D)OWCMgPulPLKqHDZ-`3I~4N*xy7>J?EUr@ zv02or!M^@ap@nkL0}ym=Yik3=nQ92O>G>9ai%ir(9L|k64$zBy{sebHcJ zkDAbFaUxtscPwJpdXtfuaTdJ+f>uWajSpPxc@U^V)Hs-lTP#pVrUuFYjfVnz(eY&} zysaz*IbCo1+-F4BnfMBWj5wH1E08%TA062}gLy0^U}2xI-5&8xb2;xmwgG6j>C@Pl{nm@Nfp~Fq|CuRQuq=x@U57)ioNsa8|u~*r9qWx;1KUH^^SM zDfTULlU;&z;+pYZ!f=|DW%+k$>A5s@A}#$Xz4J#h_3f>1Zk?p6C#mI=)M7YZI!RqP z&18zHzWTBtEnj`CA1~eLD@S9C$I^{wW%M+q{&@dYGBKOzD+kpxDIq6bW~9)6uzh$J zNIB7054HznW)Wr_Y#v?#GLz`b{hJ{<%??srxps7I?fAX*zIv2@_gGqgws84rs(3gD m@rz=mhl7<$3*i60@>t|3iR`ljQdu67iXii^L|yD6?D{|LcP%{t diff --git a/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 0f5698d0d0d4d024d18b619af6b6653390e4b8dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24814 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 diff --git a/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc deleted file mode 100644 index 0e42207111904e31bff93138a92f5055441b9f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 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 diff --git a/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc deleted file mode 100644 index 800497f8d4a3c9d75060bcd779bea98d6de81546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13685 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 diff --git a/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index eb0c231eb65eb2928111b41f618f3cacad75e803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4282 zcmbVNO-vi<8J_Wsu`xErV2p9HV3Lr8pWqrWBoIP?Bm~%OQXm`EQiTTlv#~RHoS88M zE{%H$IR&3=pD-tkS_$^F>8Vn$z04==!5S%2q&=`08p@6Yo* z@6Y$~Pm9Gw!1J$vTf-Y>g7{haQGV)+ALOt9FcL(X2ogb(CDutlNh;quR_CV>6$Rhf zhi?Wy#p>7V{B>$9%^KE?exv%WXY1EZeiKPRuH$SbK?LiN8Ck%0^}G+P9p|m>U;>Z( zya$jpGeWvj&NZ!^3w##E7cwYse=}ff=vO(lw3|z~H?=r}hN7krrDEH)v4h5%b=oU6 z^=jZ#QB77<%2KN;GCQ=Hky5P|Ml*6$n6>?F|H}^uDtE9xq*tqV>Xdm7p06Wl3fBF# z;V-(P$M1ruk@HbV?X>@DjY_EKm`08(Od?lBX{`tjLaY8eP8dESE5^1E$uQ)U2Y0 z+8c_}FnRGzF3tt-|2MDh%ji|R{u?_3JeQl}rFqWH_og;y&;WLgTf8*ETfZsmcFnAw z5^k?{gnC(o)vOY2ZKwW_5bv|MKUHKqW!ptIPqnssSs zX>L3^b(56laOW}_VOK6xqwbQ%Nz>pR*wXcwe^IWL9#U>#Vlhr+#0VD?zJuS^S4*>V zQ}H+(38+Re8J;30h!<(n!C0oj#8I}>0Q2i>Ghy{B*vT0={ zln@gdC}@I8E;}n;fr$wbZU8)0g|hx-3@Vc;NCQP%A`)c!+lU~_)KqLs zHauhEsubg#hGDiRarmU15! z5vYt6J%(i{>wAXh4NCpS=W(Uo3@h89(a-s5Ad2&lynwc3;|#;H%qno!Pi-<0QT?<} zg+Sk;LMw=s0M|4MaXfkw;RW%mueInqYo;GX0;2rQ(i&pf87?NGx8e()3m`$@_zJFN zni0_Bw*jQel$(|j!w0#|SS7%{jMn2UBchrRj&j742n)(9nHBpi%dIkO#ZIqs94p() zS<9!(Y<{`;?IRRo5^S~ft6)=G`+|qooh`urnCChEDH98_r?@SPTmmGQ+IvX+3bP>o z^GDAbw~jo)#46hI08|tOM8OkZ<3ujb@nVQ$Bb+C`C9bJkzkzrU8(A$Gh6cQY9w8#4 zJ8>rPnh7Jp6N2r3?I|w!Kpe(-f1L{^SoDBb?l}_vggH1bClpDNpNVTf6U|>J`u*ge zCqL5zpJ~r$+Ivz**qYOZl%YU37HD|a7ij(aC&?!}-jBWyzT~qn@N+IXw-ea)rhO^j zP88GaO2~Y2en&_?FMlR5-Fjj*=-a+h^)}r*%ZZDyHhm0#2=4|m-o26RNbY)eJWn1O z4h_fD@zSvo-@Yd~?%~FajCHb)1764H%h>+kXex0ZeiDyJqkYp}n79)moX35-- z={p6GUr#IY>)Lb@(Q@J-Y_450U7xDYc#d5^HQj$_`C@NP&!^@yLh89h*a|?nnF7sf zFLo_Ef67@T>m5uFoHmgM4f_rGXV^U^S;sIv4x`Xde5EKSkl0U*L`Ub|tL&>%#ty$b zyz>^*&P>-{Z?-qLn718WIlOYbjC;nU?lJ5dm+0}Yl&%AkUC_05*PbB@Gb>JmhY5|P z#-t7}ZW)xUgP0yV?HW&wXWr~>XSb!^3EcSrw@gabNlZUf6it&LsU1*TK~mSX1Jk}K zKbU`Wv~jp`9Qfq@yYFwl<0$q_Nqtk;JuMO66k6=*(bQNM^Yo1>!3Z6O=Nm; zOSfe0#`MkewQXcKa)G?}$am<=MR8}f4GM=3C~g3S8z@{?_FP$4ZU)-hdf1wq$L$`8 za1@}OT4tE@c4|9!JtyXRa9cmjt&LZ@44c|l+I-k@x4bqKK?7S;k?_&C%QaNl) yY28efvtByClKqxsEguo}MDI?e7g7t7dkEWyCF?MzeG0@VK-hFi3qK53%6|dg4tgm7 diff --git a/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc b/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc deleted file mode 100644 index ccc06c8a942e21d98a597fe49c8677cb0ef309e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7007 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 diff --git a/lib/python3.12/site-packages/flask/app.py b/lib/python3.12/site-packages/flask/app.py deleted file mode 100644 index 7622b5e..0000000 --- a/lib/python3.12/site-packages/flask/app.py +++ /dev/null @@ -1,1498 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import sys -import typing as t -import weakref -from datetime import timedelta -from inspect import iscoroutinefunction -from itertools import chain -from types import TracebackType -from urllib.parse import quote as _url_quote - -import click -from werkzeug.datastructures import Headers -from werkzeug.datastructures import ImmutableDict -from werkzeug.exceptions import BadRequestKeyError -from werkzeug.exceptions import HTTPException -from werkzeug.exceptions import InternalServerError -from werkzeug.routing import BuildError -from werkzeug.routing import MapAdapter -from werkzeug.routing import RequestRedirect -from werkzeug.routing import RoutingException -from werkzeug.routing import Rule -from werkzeug.serving import is_running_from_reloader -from werkzeug.wrappers import Response as BaseResponse - -from . import cli -from . import typing as ft -from .ctx import AppContext -from .ctx import RequestContext -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import g -from .globals import request -from .globals import request_ctx -from .globals import session -from .helpers import get_debug_flag -from .helpers import get_flashed_messages -from .helpers import get_load_dotenv -from .helpers import send_from_directory -from .sansio.app import App -from .sansio.scaffold import _sentinel -from .sessions import SecureCookieSessionInterface -from .sessions import SessionInterface -from .signals import appcontext_tearing_down -from .signals import got_request_exception -from .signals import request_finished -from .signals import request_started -from .signals import request_tearing_down -from .templating import Environment -from .wrappers import Request -from .wrappers import Response - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIEnvironment - - from .testing import FlaskClient - from .testing import FlaskCliRunner - -T_shell_context_processor = t.TypeVar( - "T_shell_context_processor", bound=ft.ShellContextProcessorCallable -) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) - - -def _make_timedelta(value: timedelta | int | None) -> timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class Flask(App): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - default_config = ImmutableDict( - { - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "SECRET_KEY": None, - "PERMANENT_SESSION_LIFETIME": timedelta(days=31), - "USE_X_SENDFILE": False, - "SERVER_NAME": None, - "APPLICATION_ROOT": "/", - "SESSION_COOKIE_NAME": "session", - "SESSION_COOKIE_DOMAIN": None, - "SESSION_COOKIE_PATH": None, - "SESSION_COOKIE_HTTPONLY": True, - "SESSION_COOKIE_SECURE": False, - "SESSION_COOKIE_SAMESITE": None, - "SESSION_REFRESH_EACH_REQUEST": True, - "MAX_CONTENT_LENGTH": None, - "SEND_FILE_MAX_AGE_DEFAULT": None, - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "TEMPLATES_AUTO_RELOAD": None, - "MAX_COOKIE_SIZE": 4093, - } - ) - - #: The class that is used for request objects. See :class:`~flask.Request` - #: for more information. - request_class: type[Request] = Request - - #: The class that is used for response objects. See - #: :class:`~flask.Response` for more information. - response_class: type[Response] = Response - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface: SessionInterface = SecureCookieSessionInterface() - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ): - super().__init__( - import_name=import_name, - static_url_path=static_url_path, - static_folder=static_folder, - static_host=static_host, - host_matching=host_matching, - subdomain_matching=subdomain_matching, - template_folder=template_folder, - instance_path=instance_path, - instance_relative_config=instance_relative_config, - root_path=root_path, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = cli.AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - # Add a static route using the provided static_url_path, static_host, - # and static_folder if there is a configured static_folder. - # Note we do this without checking if static_folder exists. - # For one, it might be created while the server is running (e.g. during - # development). Also, Google App Engine stores static files somewhere - if self.has_static_folder: - assert ( - bool(static_host) == host_matching - ), "Invalid static_host/host_matching combination" - # Use a weakref to avoid creating a reference cycle between the app - # and the view function (see #3761). - self_ref = weakref.ref(self) - self.add_url_rule( - f"{self.static_url_path}/", - endpoint="static", - host=static_host, - view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 - ) - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for - reading. - - For example, if the file ``schema.sql`` is next to the file - ``app.py`` where the ``Flask`` app is defined, it can be opened - with: - - .. code-block:: python - - with app.open_resource("schema.sql") as f: - conn.executescript(f.read()) - - :param resource: Path to the resource relative to - :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is - supported, valid values are "r" (or "rt") and "rb". - - Note this is a duplicate of the same method in the Flask - class. - - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - return open(os.path.join(self.root_path, resource), mode) - - def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Opens a resource from the application's instance folder - (:attr:`instance_path`). Otherwise works like - :meth:`open_resource`. Instance resources can also be opened for - writing. - - :param resource: the name of the resource. To access resources within - subfolders use forward slashes as separator. - :param mode: resource file opening mode, default is 'rb'. - """ - return open(os.path.join(self.instance_path, resource), mode) - - def create_jinja_environment(self) -> Environment: - """Create the Jinja environment based on :attr:`jinja_options` - and the various Jinja-related methods of the app. Changing - :attr:`jinja_options` after this will have no effect. Also adds - Flask-related globals and filters to the environment. - - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - - .. versionadded:: 0.5 - """ - options = dict(self.jinja_options) - - if "autoescape" not in options: - options["autoescape"] = self.select_jinja_autoescape - - if "auto_reload" not in options: - auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] - - if auto_reload is None: - auto_reload = self.debug - - options["auto_reload"] = auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=self.url_for, - get_flashed_messages=get_flashed_messages, - config=self.config, - # request, session and g are normally added with the - # context processor for efficiency reasons but for imported - # templates we also want the proxies in there. - request=request, - session=session, - g=g, - ) - rv.policies["json.dumps_function"] = self.json.dumps - return rv - - def create_url_adapter(self, request: Request | None) -> MapAdapter | None: - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set - up so the request is passed explicitly. - - .. versionadded:: 0.6 - - .. versionchanged:: 0.9 - This can now also be called without a request object when the - URL adapter is created for the application context. - - .. versionchanged:: 1.0 - :data:`SERVER_NAME` no longer implicitly enables subdomain - matching. Use :attr:`subdomain_matching` instead. - """ - if request is not None: - # If subdomain matching is disabled (the default), use the - # default subdomain in all cases. This should be the default - # in Werkzeug but it currently does not have that feature. - if not self.subdomain_matching: - subdomain = self.url_map.default_subdomain or None - else: - subdomain = None - - return self.url_map.bind_to_environ( - request.environ, - server_name=self.config["SERVER_NAME"], - subdomain=subdomain, - ) - # We need at the very least the server name to be set for this - # to work. - if self.config["SERVER_NAME"] is not None: - return self.url_map.bind( - self.config["SERVER_NAME"], - script_name=self.config["APPLICATION_ROOT"], - url_scheme=self.config["PREFERRED_URL_SCHEME"], - ) - - return None - - def raise_routing_exception(self, request: Request) -> t.NoReturn: - """Intercept routing exceptions and possibly do something else. - - In debug mode, intercept a routing redirect and replace it with - an error if the body will be discarded. - - With modern Werkzeug this shouldn't occur, since it now uses a - 308 status which tells the browser to resend the method and - body. - - .. versionchanged:: 2.1 - Don't intercept 307 and 308 redirects. - - :meta private: - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.routing_exception.code in {307, 308} - or request.method in {"GET", "HEAD", "OPTIONS"} - ): - raise request.routing_exception # type: ignore[misc] - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def update_template_context(self, context: dict[str, t.Any]) -> None: - """Update the template context with some commonly used variables. - This injects request, session, config and g into the template - context as well as everything template context processors want - to inject. Note that the as of Flask 0.6, the original values - in the context will not be overridden if a context processor - decides to return a value with the same key. - - :param context: the context as a dictionary that is updated in place - to add extra variables. - """ - names: t.Iterable[str | None] = (None,) - - # A template may be rendered outside a request context. - if request: - names = chain(names, reversed(request.blueprints)) - - # The values passed to render_template take precedence. Keep a - # copy to re-apply after all context functions. - orig_ctx = context.copy() - - for name in names: - if name in self.template_context_processors: - for func in self.template_context_processors[name]: - context.update(self.ensure_sync(func)()) - - context.update(orig_ctx) - - def make_shell_context(self) -> dict[str, t.Any]: - """Returns the shell context for an interactive shell for this - application. This runs all the registered shell context - processors. - - .. versionadded:: 0.11 - """ - rv = {"app": self, "g": g} - for processor in self.shell_context_processors: - rv.update(processor()) - return rv - - def run( - self, - host: str | None = None, - port: int | None = None, - debug: bool | None = None, - load_dotenv: bool = True, - **options: t.Any, - ) -> None: - """Runs the application on a local development server. - - Do not use ``run()`` in a production setting. It is not intended to - meet security and performance requirements for a production server. - Instead, see :doc:`/deploying/index` for WSGI server recommendations. - - If the :attr:`debug` flag is set the server will automatically reload - for code changes and show a debugger in case an exception happened. - - If you want to run the application in debug mode, but disable the - code execution on the interactive debugger, you can pass - ``use_evalex=False`` as parameter. This will keep the debugger's - traceback screen active, but disable code execution. - - It is not recommended to use this function for development with - automatic reloading as this is badly supported. Instead you should - be using the :command:`flask` command line script's ``run`` support. - - .. admonition:: Keep in Mind - - Flask will suppress any server error with a generic error page - unless it is in debug mode. As such to enable just the - interactive debugger without the code reloading, you have to - invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. - Setting ``use_debugger`` to ``True`` without being in debug mode - won't catch any exceptions because there won't be any to - catch. - - :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to - have the server available externally as well. Defaults to - ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable - if present. - :param port: the port of the webserver. Defaults to ``5000`` or the - port defined in the ``SERVER_NAME`` config variable if present. - :param debug: if given, enable or disable debug mode. See - :attr:`debug`. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param options: the options to be forwarded to the underlying Werkzeug - server. See :func:`werkzeug.serving.run_simple` for more - information. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment - variables from :file:`.env` and :file:`.flaskenv` files. - - The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Ignore this call so that it doesn't start another server if - # the 'flask run' command is used. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - if not is_running_from_reloader(): - click.secho( - " * Ignoring a call to 'app.run()' that would block" - " the current 'flask' CLI command.\n" - " Only call 'app.run()' in an 'if __name__ ==" - ' "__main__"\' guard.', - fg="red", - ) - - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, env var overrides existing value - if "FLASK_DEBUG" in os.environ: - self.debug = get_debug_flag() - - # debug passed to method overrides all other sources - if debug is not None: - self.debug = bool(debug) - - server_name = self.config.get("SERVER_NAME") - sn_host = sn_port = None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - if not host: - if sn_host: - host = sn_host - else: - host = "127.0.0.1" - - if port or port == 0: - port = int(port) - elif sn_port: - port = int(sn_port) - else: - port = 5000 - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.debug, self.name) - - from werkzeug.serving import run_simple - - try: - run_simple(t.cast(str, host), port, self, **options) - finally: - # reset the first request information if the development server - # reset normally. This makes it possible to restart the server - # without reloader and that stuff from an interactive shell. - self._got_first_request = False - - def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: - """Creates a test client for this application. For information - about unit testing head over to :doc:`/testing`. - - Note that if you are testing for assertions or exceptions in your - application code, you must set ``app.testing = True`` in order for the - exceptions to propagate to the test client. Otherwise, the exception - will be handled by the application (not visible to the test client) and - the only indication of an AssertionError or other exception will be a - 500 status code response to the test client. See the :attr:`testing` - attribute. For example:: - - app.testing = True - client = app.test_client() - - The test client can be used in a ``with`` block to defer the closing down - of the context until the end of the ``with`` block. This is useful if - you want to access the context locals for testing:: - - with app.test_client() as c: - rv = c.get('/?vodka=42') - assert request.args['vodka'] == '42' - - Additionally, you may pass optional keyword arguments that will then - be passed to the application's :attr:`test_client_class` constructor. - For example:: - - from flask.testing import FlaskClient - - class CustomClient(FlaskClient): - def __init__(self, *args, **kwargs): - self._authentication = kwargs.pop("authentication") - super(CustomClient,self).__init__( *args, **kwargs) - - app.test_client_class = CustomClient - client = app.test_client(authentication='Basic ....') - - See :class:`~flask.testing.FlaskClient` for more information. - - .. versionchanged:: 0.4 - added support for ``with`` block usage for the client. - - .. versionadded:: 0.7 - The `use_cookies` parameter was added as well as the ability - to override the client to be used by setting the - :attr:`test_client_class` attribute. - - .. versionchanged:: 0.11 - Added `**kwargs` to support passing additional keyword arguments to - the constructor of :attr:`test_client_class`. - """ - cls = self.test_client_class - if cls is None: - from .testing import FlaskClient as cls - return cls( # type: ignore - self, self.response_class, use_cookies=use_cookies, **kwargs - ) - - def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: - """Create a CLI runner for testing CLI commands. - See :ref:`testing-cli`. - - Returns an instance of :attr:`test_cli_runner_class`, by default - :class:`~flask.testing.FlaskCliRunner`. The Flask app object is - passed as the first argument. - - .. versionadded:: 1.0 - """ - cls = self.test_cli_runner_class - - if cls is None: - from .testing import FlaskCliRunner as cls - - return cls(self, **kwargs) # type: ignore - - def handle_http_exception( - self, e: HTTPException - ) -> HTTPException | ft.ResponseReturnValue: - """Handles an HTTP exception. By default this will invoke the - registered error handlers and fall back to returning the - exception as response. - - .. versionchanged:: 1.0.3 - ``RoutingException``, used internally for actions such as - slash redirects during routing, is not passed to error - handlers. - - .. versionchanged:: 1.0 - Exceptions are looked up by code *and* by MRO, so - ``HTTPException`` subclasses can be handled with a catch-all - handler for the base ``HTTPException``. - - .. versionadded:: 0.3 - """ - # Proxy exceptions don't have error codes. We want to always return - # those unchanged as errors - if e.code is None: - return e - - # RoutingExceptions are used internally to trigger routing - # actions, such as slash redirects raising RequestRedirect. They - # are not raised or handled in user code. - if isinstance(e, RoutingException): - return e - - handler = self._find_error_handler(e, request.blueprints) - if handler is None: - return e - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_user_exception( - self, e: Exception - ) -> HTTPException | ft.ResponseReturnValue: - """This method is called whenever an exception occurs that - should be handled. A special case is :class:`~werkzeug - .exceptions.HTTPException` which is forwarded to the - :meth:`handle_http_exception` method. This function will either - return a response value or reraise the exception with the same - traceback. - - .. versionchanged:: 1.0 - Key errors raised from request data like ``form`` show the - bad key in debug mode rather than a generic bad request - message. - - .. versionadded:: 0.7 - """ - if isinstance(e, BadRequestKeyError) and ( - self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] - ): - e.show_exception = True - - if isinstance(e, HTTPException) and not self.trap_http_exception(e): - return self.handle_http_exception(e) - - handler = self._find_error_handler(e, request.blueprints) - - if handler is None: - raise - - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_exception(self, e: Exception) -> Response: - """Handle an exception that did not have an error handler - associated with it, or that was raised from an error handler. - This always causes a 500 ``InternalServerError``. - - Always sends the :data:`got_request_exception` signal. - - If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug - mode, the error will be re-raised so that the debugger can - display it. Otherwise, the original exception is logged, and - an :exc:`~werkzeug.exceptions.InternalServerError` is returned. - - If an error handler is registered for ``InternalServerError`` or - ``500``, it will be used. For consistency, the handler will - always receive the ``InternalServerError``. The original - unhandled exception is available as ``e.original_exception``. - - .. versionchanged:: 1.1.0 - Always passes the ``InternalServerError`` instance to the - handler, setting ``original_exception`` to the unhandled - error. - - .. versionchanged:: 1.1.0 - ``after_request`` functions and other finalization is done - even for the default 500 response when there is no handler. - - .. versionadded:: 0.3 - """ - exc_info = sys.exc_info() - got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) - propagate = self.config["PROPAGATE_EXCEPTIONS"] - - if propagate is None: - propagate = self.testing or self.debug - - if propagate: - # Re-raise if called with an active exception, otherwise - # raise the passed in exception. - if exc_info[1] is e: - raise - - raise e - - self.log_exception(exc_info) - server_error: InternalServerError | ft.ResponseReturnValue - server_error = InternalServerError(original_exception=e) - handler = self._find_error_handler(server_error, request.blueprints) - - if handler is not None: - server_error = self.ensure_sync(handler)(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception( - self, - exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), - ) -> None: - """Logs an exception. This is called by :meth:`handle_exception` - if debugging is disabled and right before the handler is called. - The default implementation logs the exception as error on the - :attr:`logger`. - - .. versionadded:: 0.8 - """ - self.logger.error( - f"Exception on {request.path} [{request.method}]", exc_info=exc_info - ) - - def dispatch_request(self) -> ft.ResponseReturnValue: - """Does the request dispatching. Matches the URL and returns the - return value of the view or error handler. This does not have to - be a response object. In order to convert the return value to a - proper response object, call :func:`make_response`. - - .. versionchanged:: 0.7 - This no longer does the exception handling, this code was - moved to the new :meth:`full_dispatch_request`. - """ - req = request_ctx.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule: Rule = req.url_rule # type: ignore[assignment] - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically - if ( - getattr(rule, "provide_automatic_options", False) - and req.method == "OPTIONS" - ): - return self.make_default_options_response() - # otherwise dispatch to the handler for that endpoint - view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - - def full_dispatch_request(self) -> Response: - """Dispatches the request and on top of that performs request - pre and postprocessing as well as HTTP exception catching and - error handling. - - .. versionadded:: 0.7 - """ - self._got_first_request = True - - try: - request_started.send(self, _async_wrapper=self.ensure_sync) - rv = self.preprocess_request() - if rv is None: - rv = self.dispatch_request() - except Exception as e: - rv = self.handle_user_exception(e) - return self.finalize_request(rv) - - def finalize_request( - self, - rv: ft.ResponseReturnValue | HTTPException, - from_error_handler: bool = False, - ) -> Response: - """Given the return value from a view function this finalizes - the request by converting it into a response and invoking the - postprocessing functions. This is invoked for both normal - request dispatching as well as error handlers. - - Because this means that it might be called as a result of a - failure a special safe mode is available which can be enabled - with the `from_error_handler` flag. If enabled, failures in - response processing will be logged and otherwise ignored. - - :internal: - """ - response = self.make_response(rv) - try: - response = self.process_response(response) - request_finished.send( - self, _async_wrapper=self.ensure_sync, response=response - ) - except Exception: - if not from_error_handler: - raise - self.logger.exception( - "Request finalizing failed with an error while handling an error" - ) - return response - - def make_default_options_response(self) -> Response: - """This method is called to create the default ``OPTIONS`` response. - This can be changed through subclassing to change the default - behavior of ``OPTIONS`` responses. - - .. versionadded:: 0.7 - """ - adapter = request_ctx.url_adapter - methods = adapter.allowed_methods() # type: ignore[union-attr] - rv = self.response_class() - rv.allow.update(methods) - return rv - - def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Ensure that the function is synchronous for WSGI workers. - Plain ``def`` functions are returned as-is. ``async def`` - functions are wrapped to run and wait for the response. - - Override this method to change how the app runs async views. - - .. versionadded:: 2.0 - """ - if iscoroutinefunction(func): - return self.async_to_sync(func) - - return func - - def async_to_sync( - self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] - ) -> t.Callable[..., t.Any]: - """Return a sync function that will run the coroutine function. - - .. code-block:: python - - result = app.async_to_sync(func)(*args, **kwargs) - - Override this method to change how the app converts async code - to be synchronously callable. - - .. versionadded:: 2.0 - """ - try: - from asgiref.sync import async_to_sync as asgiref_async_to_sync - except ImportError: - raise RuntimeError( - "Install Flask with the 'async' extra in order to use async views." - ) from None - - return asgiref_async_to_sync(func) - - def url_for( - self, - /, - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, - ) -> str: - """Generate a URL to the given endpoint with the given values. - - This is called by :func:`flask.url_for`, and can be called - directly as well. - - An *endpoint* is the name of a URL rule, usually added with - :meth:`@app.route() `, and usually the same name as the - view function. A route defined in a :class:`~flask.Blueprint` - will prepend the blueprint's name separated by a ``.`` to the - endpoint. - - In some cases, such as email messages, you want URLs to include - the scheme and domain, like ``https://example.com/hello``. When - not in an active request, URLs will be external by default, but - this requires setting :data:`SERVER_NAME` so Flask knows what - domain to use. :data:`APPLICATION_ROOT` and - :data:`PREFERRED_URL_SCHEME` should also be configured as - needed. This config is only used when not in an active request. - - Functions can be decorated with :meth:`url_defaults` to modify - keyword arguments before the URL is built. - - If building fails for some reason, such as an unknown endpoint - or incorrect values, the app's :meth:`handle_url_build_error` - method is called. If that returns a string, that is returned, - otherwise a :exc:`~werkzeug.routing.BuildError` is raised. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it - is external. - :param _external: If given, prefer the URL to be internal - (False) or require it to be external (True). External URLs - include the scheme and domain. When not in an active - request, URLs are external by default. - :param values: Values to use for the variable parts of the URL - rule. Unknown keys are appended as query string arguments, - like ``?a=b&c=d``. - - .. versionadded:: 2.2 - Moved from ``flask.url_for``, which calls this method. - """ - req_ctx = _cv_request.get(None) - - if req_ctx is not None: - url_adapter = req_ctx.url_adapter - blueprint_name = req_ctx.request.blueprint - - # If the endpoint starts with "." and the request matches a - # blueprint, the endpoint is relative to the blueprint. - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = f"{blueprint_name}{endpoint}" - else: - endpoint = endpoint[1:] - - # When in a request, generate a URL without scheme and - # domain by default, unless a scheme is given. - if _external is None: - _external = _scheme is not None - else: - app_ctx = _cv_app.get(None) - - # If called by helpers.url_for, an app context is active, - # use its url_adapter. Otherwise, app.url_for was called - # directly, build an adapter. - if app_ctx is not None: - url_adapter = app_ctx.url_adapter - else: - url_adapter = self.create_url_adapter(None) - - if url_adapter is None: - raise RuntimeError( - "Unable to build URLs outside an active request" - " without 'SERVER_NAME' configured. Also configure" - " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" - " needed." - ) - - # When outside a request, generate a URL with scheme and - # domain by default. - if _external is None: - _external = True - - # It is an error to set _scheme when _external=False, in order - # to avoid accidental insecure URLs. - if _scheme is not None and not _external: - raise ValueError("When specifying '_scheme', '_external' must be True.") - - self.inject_url_defaults(endpoint, values) - - try: - rv = url_adapter.build( # type: ignore[union-attr] - endpoint, - values, - method=_method, - url_scheme=_scheme, - force_external=_external, - ) - except BuildError as error: - values.update( - _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external - ) - return self.handle_url_build_error(error, endpoint, values) - - if _anchor is not None: - _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") - rv = f"{rv}#{_anchor}" - - return rv - - def make_response(self, rv: ft.ResponseReturnValue) -> Response: - """Convert the return value from a view function to an instance of - :attr:`response_class`. - - :param rv: the return value from the view function. The view function - must return a response. Returning ``None``, or the view ending - without returning, is not allowed. The following types are allowed - for ``view_rv``: - - ``str`` - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``list`` - A list that will be jsonify'd before being returned. - - ``generator`` or ``iterator`` - A generator that returns ``str`` or ``bytes`` to be - streamed as the response. - - ``tuple`` - Either ``(body, status, headers)``, ``(body, status)``, or - ``(body, headers)``, where ``body`` is any of the other types - allowed here, ``status`` is a string or an integer, and - ``headers`` is a dictionary or a list of ``(key, value)`` - tuples. If ``body`` is a :attr:`response_class` instance, - ``status`` overwrites the exiting value and ``headers`` are - extended. - - :attr:`response_class` - The object is returned unchanged. - - other :class:`~werkzeug.wrappers.Response` class - The object is coerced to :attr:`response_class`. - - :func:`callable` - The function is called as a WSGI application. The result is - used to create a response object. - - .. versionchanged:: 2.2 - A generator will be converted to a streaming response. - A list will be converted to a JSON response. - - .. versionchanged:: 1.1 - A dict will be converted to a JSON response. - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - - status = headers = None - - # unpack tuple returns - if isinstance(rv, tuple): - len_rv = len(rv) - - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] - # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv - else: - rv, status = rv # type: ignore[assignment,misc] - # other sized tuples are not allowed - else: - raise TypeError( - "The view function did not return a valid response tuple." - " The tuple must have the form (body, status, headers)," - " (body, status), or (body, headers)." - ) - - # the body must not be None - if rv is None: - raise TypeError( - f"The view function for {request.endpoint!r} did not" - " return a valid response. The function either returned" - " None or ended without a return statement." - ) - - # make sure the body is an instance of the response class - if not isinstance(rv, self.response_class): - if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): - # let the response class set the status and headers instead of - # waiting to do it manually, so that the class can handle any - # special logic - rv = self.response_class( - rv, - status=status, - headers=headers, # type: ignore[arg-type] - ) - status = headers = None - elif isinstance(rv, (dict, list)): - rv = self.json.response(rv) - elif isinstance(rv, BaseResponse) or callable(rv): - # evaluate a WSGI callable, or coerce a different response - # class to the correct type - try: - rv = self.response_class.force_type( - rv, # type: ignore[arg-type] - request.environ, - ) - except TypeError as e: - raise TypeError( - f"{e}\nThe view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it" - f" was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) from None - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it was a" - f" {type(rv).__name__}." - ) - - rv = t.cast(Response, rv) - # prefer the status if it was provided - if status is not None: - if isinstance(status, (str, bytes, bytearray)): - rv.status = status - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.update(headers) # type: ignore[arg-type] - - return rv - - def preprocess_request(self) -> ft.ResponseReturnValue | None: - """Called before the request is dispatched. Calls - :attr:`url_value_preprocessors` registered with the app and the - current blueprint (if any). Then calls :attr:`before_request_funcs` - registered with the app and the blueprint. - - If any :meth:`before_request` handler returns a non-None value, the - value is handled as if it was the return value from the view, and - further request handling is stopped. - """ - names = (None, *reversed(request.blueprints)) - - for name in names: - if name in self.url_value_preprocessors: - for url_func in self.url_value_preprocessors[name]: - url_func(request.endpoint, request.view_args) - - for name in names: - if name in self.before_request_funcs: - for before_func in self.before_request_funcs[name]: - rv = self.ensure_sync(before_func)() - - if rv is not None: - return rv # type: ignore[no-any-return] - - return None - - def process_response(self, response: Response) -> Response: - """Can be overridden in order to modify the response object - before it's sent to the WSGI server. By default this will - call all the :meth:`after_request` decorated functions. - - .. versionchanged:: 0.5 - As of Flask 0.5 the functions registered for after request - execution are called in reverse order of registration. - - :param response: a :attr:`response_class` object. - :return: a new response object or the same, has to be an - instance of :attr:`response_class`. - """ - ctx = request_ctx._get_current_object() # type: ignore[attr-defined] - - for func in ctx._after_request_functions: - response = self.ensure_sync(func)(response) - - for name in chain(request.blueprints, (None,)): - if name in self.after_request_funcs: - for func in reversed(self.after_request_funcs[name]): - response = self.ensure_sync(func)(response) - - if not self.session_interface.is_null_session(ctx.session): - self.session_interface.save_session(self, ctx.session, response) - - return response - - def do_teardown_request( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called after the request is dispatched and the response is - returned, right before the request context is popped. - - This calls all functions decorated with - :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` - if a blueprint handled the request. Finally, the - :data:`request_tearing_down` signal is sent. - - This is called by - :meth:`RequestContext.pop() `, - which may be delayed during testing to maintain access to - resources. - - :param exc: An unhandled exception raised while dispatching the - request. Detected from the current exception information if - not passed. Passed to each teardown function. - - .. versionchanged:: 0.9 - Added the ``exc`` argument. - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for name in chain(request.blueprints, (None,)): - if name in self.teardown_request_funcs: - for func in reversed(self.teardown_request_funcs[name]): - self.ensure_sync(func)(exc) - - request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def do_teardown_appcontext( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called right before the application context is popped. - - When handling a request, the application context is popped - after the request context. See :meth:`do_teardown_request`. - - This calls all functions decorated with - :meth:`teardown_appcontext`. Then the - :data:`appcontext_tearing_down` signal is sent. - - This is called by - :meth:`AppContext.pop() `. - - .. versionadded:: 0.9 - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for func in reversed(self.teardown_appcontext_funcs): - self.ensure_sync(func)(exc) - - appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def app_context(self) -> AppContext: - """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` - block to push the context, which will make :data:`current_app` - point at this application. - - An application context is automatically pushed by - :meth:`RequestContext.push() ` - when handling a request, and when running a CLI command. Use - this to manually create a context outside of these situations. - - :: - - with app.app_context(): - init_db() - - See :doc:`/appcontext`. - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ: WSGIEnvironment) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` representing a - WSGI environment. Use a ``with`` block to push the context, - which will make :data:`request` point at this request. - - See :doc:`/reqcontext`. - - Typically you should not call this from your own code. A request - context is automatically pushed by the :meth:`wsgi_app` when - handling a request. Use :meth:`test_request_context` to create - an environment and context instead of this method. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` for a WSGI - environment created from the given values. This is mostly useful - during testing, where you may want to run a function that uses - request data without dispatching a full request. - - See :doc:`/reqcontext`. - - Use a ``with`` block to push the context, which will make - :data:`request` point at the request for the created - environment. :: - - with app.test_request_context(...): - generate_report() - - When using the shell, it may be easier to push and pop the - context manually to avoid indentation. :: - - ctx = app.test_request_context(...) - ctx.push() - ... - ctx.pop() - - Takes the same arguments as Werkzeug's - :class:`~werkzeug.test.EnvironBuilder`, with some defaults from - the application. See the linked Werkzeug docs for most of the - available arguments. Flask-specific behavior is listed here. - - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to - :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param data: The request body, either as a string or a dict of - form keys and values. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - from .testing import EnvironBuilder - - builder = EnvironBuilder(self, *args, **kwargs) - - try: - return self.request_context(builder.get_environ()) - finally: - builder.close() - - def wsgi_app( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The actual WSGI application. This is not implemented in - :meth:`__call__` so that middlewares can be applied without - losing a reference to the app object. Instead of doing this:: - - app = MyMiddleware(app) - - It's a better idea to do this instead:: - - app.wsgi_app = MyMiddleware(app.wsgi_app) - - Then you still have the original application object around and - can continue to call methods on it. - - .. versionchanged:: 0.7 - Teardown events for the request and app contexts are called - even if an unhandled error occurs. Other events may not be - called depending on when an error occurs during dispatch. - See :ref:`callbacks-and-errors`. - - :param environ: A WSGI environment. - :param start_response: A callable accepting a status code, - a list of headers, and an optional exception context to - start the response. - """ - ctx = self.request_context(environ) - error: BaseException | None = None - try: - try: - ctx.push() - response = self.full_dispatch_request() - except Exception as e: - error = e - response = self.handle_exception(e) - except: # noqa: B001 - error = sys.exc_info()[1] - raise - return response(environ, start_response) - finally: - if "werkzeug.debug.preserve_context" in environ: - environ["werkzeug.debug.preserve_context"](_cv_app.get()) - environ["werkzeug.debug.preserve_context"](_cv_request.get()) - - if error is not None and self.should_ignore_error(error): - error = None - - ctx.pop(error) - - def __call__( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app`, which can be - wrapped to apply middleware. - """ - return self.wsgi_app(environ, start_response) diff --git a/lib/python3.12/site-packages/flask/blueprints.py b/lib/python3.12/site-packages/flask/blueprints.py deleted file mode 100644 index aa9eacf..0000000 --- a/lib/python3.12/site-packages/flask/blueprints.py +++ /dev/null @@ -1,129 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from datetime import timedelta - -from .cli import AppGroup -from .globals import current_app -from .helpers import send_from_directory -from .sansio.blueprints import Blueprint as SansioBlueprint -from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa -from .sansio.scaffold import _sentinel - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -class Blueprint(SansioBlueprint): - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore - ) -> None: - super().__init__( - name, - import_name, - static_folder, - static_url_path, - template_folder, - url_prefix, - subdomain, - url_defaults, - root_path, - cli_group, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for - reading. - - For example, if the file ``schema.sql`` is next to the file - ``app.py`` where the ``Flask`` app is defined, it can be opened - with: - - .. code-block:: python - - with app.open_resource("schema.sql") as f: - conn.executescript(f.read()) - - :param resource: Path to the resource relative to - :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is - supported, valid values are "r" (or "rt") and "rb". - - Note this is a duplicate of the same method in the Flask - class. - - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - return open(os.path.join(self.root_path, resource), mode) diff --git a/lib/python3.12/site-packages/flask/cli.py b/lib/python3.12/site-packages/flask/cli.py deleted file mode 100644 index ecb292a..0000000 --- a/lib/python3.12/site-packages/flask/cli.py +++ /dev/null @@ -1,1109 +0,0 @@ -from __future__ import annotations - -import ast -import collections.abc as cabc -import importlib.metadata -import inspect -import os -import platform -import re -import sys -import traceback -import typing as t -from functools import update_wrapper -from operator import itemgetter -from types import ModuleType - -import click -from click.core import ParameterSource -from werkzeug import run_simple -from werkzeug.serving import is_running_from_reloader -from werkzeug.utils import import_string - -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_load_dotenv - -if t.TYPE_CHECKING: - import ssl - - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(module: ModuleType) -> Flask: - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in ("app", "application"): - app = getattr(module, attr_name, None) - - if isinstance(app, Flask): - return app - - # Otherwise find the only object that is a Flask instance. - matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - "Detected multiple Flask applications in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify the correct one." - ) - - # Search for app factory functions. - for attr_name in ("create_app", "make_app"): - app_factory = getattr(module, attr_name, None) - - if inspect.isfunction(app_factory): - try: - app = app_factory() - - if isinstance(app, Flask): - return app - except TypeError as e: - if not _called_with_wrong_args(app_factory): - raise - - raise NoAppException( - f"Detected factory '{attr_name}' in module '{module.__name__}'," - " but could not call it without arguments. Use" - f" '{module.__name__}:{attr_name}(args)'" - " to specify arguments." - ) from e - - raise NoAppException( - "Failed to find Flask application or factory in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify one." - ) - - -def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(module: ModuleType, app_name: str) -> Flask: - """Check if the given string is a variable name or a function. Call - a function to get the app instance, or return the variable directly. - """ - from . import Flask - - # Parse app_name as a single expression to determine if it's a valid - # attribute name or function call. - try: - expr = ast.parse(app_name.strip(), mode="eval").body - except SyntaxError: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) from None - - if isinstance(expr, ast.Name): - name = expr.id - args = [] - kwargs = {} - elif isinstance(expr, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expr.func, ast.Name): - raise NoAppException( - f"Function reference must be a simple name: {app_name!r}." - ) - - name = expr.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expr.args] - kwargs = { - kw.arg: ast.literal_eval(kw.value) - for kw in expr.keywords - if kw.arg is not None - } - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise NoAppException( - f"Failed to parse arguments as literal values: {app_name!r}." - ) from None - else: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - try: - attr = getattr(module, name) - except AttributeError as e: - raise NoAppException( - f"Failed to find attribute {name!r} in {module.__name__!r}." - ) from e - - # If the attribute is a function, call it with any args and kwargs - # to get the real application. - if inspect.isfunction(attr): - try: - app = attr(*args, **kwargs) - except TypeError as e: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - f"The factory {app_name!r} in module" - f" {module.__name__!r} could not be called with the" - " specified arguments." - ) from e - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from" - f" '{module.__name__}:{app_name}'." - ) - - -def prepare_import(path: str) -> str: - """Given a filename this will try to calculate the python path, add it - to the search path and return the actual module name that is expected. - """ - path = os.path.realpath(path) - - fname, ext = os.path.splitext(path) - if ext == ".py": - path = fname - - if os.path.basename(path) == "__init__": - path = os.path.dirname(path) - - module_name = [] - - # move up until outside package structure (no __init__.py) - while True: - path, name = os.path.split(path) - module_name.append(name) - - if not os.path.exists(os.path.join(path, "__init__.py")): - break - - if sys.path[0] != path: - sys.path.insert(0, path) - - return ".".join(module_name[::-1]) - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True -) -> Flask: ... - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... -) -> Flask | None: ... - - -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: bool = True -) -> Flask | None: - try: - __import__(module_name) - except ImportError: - # Reraise the ImportError if it occurred within the imported module. - # Determine this by checking whether the trace has a depth > 1. - if sys.exc_info()[2].tb_next: # type: ignore[union-attr] - raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) from None - elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") from None - else: - return None - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(module) - else: - return find_app_by_string(module, app_name) - - -def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: - if not value or ctx.resilient_parsing: - return - - flask_version = importlib.metadata.version("flask") - werkzeug_version = importlib.metadata.version("werkzeug") - - click.echo( - f"Python {platform.python_version()}\n" - f"Flask {flask_version}\n" - f"Werkzeug {werkzeug_version}", - color=ctx.color, - ) - ctx.exit() - - -version_option = click.Option( - ["--version"], - help="Show the Flask version.", - expose_value=False, - callback=get_version, - is_flag=True, - is_eager=True, -) - - -class ScriptInfo: - """Helper object to deal with Flask applications. This is usually not - necessary to interface with as it's used internally in the dispatching - to click. In future versions of Flask this object will most likely play - a bigger role. Typically it's created automatically by the - :class:`FlaskGroup` but you can also manually create it and pass it - onwards as click object. - """ - - def __init__( - self, - app_import_path: str | None = None, - create_app: t.Callable[..., Flask] | None = None, - set_debug_flag: bool = True, - ) -> None: - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data: dict[t.Any, t.Any] = {} - self.set_debug_flag = set_debug_flag - self._loaded_app: Flask | None = None - - def load_app(self) -> Flask: - """Loads the Flask app (if not yet loaded) and returns it. Calling - this multiple times will just result in the already loaded app to - be returned. - """ - if self._loaded_app is not None: - return self._loaded_app - - if self.create_app is not None: - app: Flask | None = self.create_app() - else: - if self.app_import_path: - path, name = ( - re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] - )[:2] - import_name = prepare_import(path) - app = locate_app(import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(import_name, None, raise_if_not_found=False) - - if app is not None: - break - - if app is None: - raise NoAppException( - "Could not locate a Flask application. Use the" - " 'flask --app' option, 'FLASK_APP' environment" - " variable, or a 'wsgi.py' or 'app.py' file in the" - " current directory." - ) - - if self.set_debug_flag: - # Update the app's debug flag through the descriptor so that - # other values repopulate as well. - app.debug = get_debug_flag() - - self._loaded_app = app - return app - - -pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def with_appcontext(f: F) -> F: - """Wraps a callback so that it's guaranteed to be executed with the - script's application context. - - Custom commands (and their options) registered under ``app.cli`` or - ``blueprint.cli`` will always have an app context available, this - decorator is not required in that case. - - .. versionchanged:: 2.2 - The app context is active for subcommands as well as the - decorated callback. The app context is always available to - ``app.cli`` command and parameter callbacks. - """ - - @click.pass_context - def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - if not current_app: - app = ctx.ensure_object(ScriptInfo).load_app() - ctx.with_resource(app.app_context()) - - return ctx.invoke(f, *args, **kwargs) - - return update_wrapper(decorator, f) # type: ignore[return-value] - - -class AppGroup(click.Group): - """This works similar to a regular click :class:`~click.Group` but it - changes the behavior of the :meth:`command` decorator so that it - automatically wraps the functions in :func:`with_appcontext`. - - Not to be confused with :class:`FlaskGroup`. - """ - - def command( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` - unless it's disabled by passing ``with_appcontext=False``. - """ - wrap_for_ctx = kwargs.pop("with_appcontext", True) - - def decorator(f: t.Callable[..., t.Any]) -> click.Command: - if wrap_for_ctx: - f = with_appcontext(f) - return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] - - return decorator - - def group( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it defaults the group class to - :class:`AppGroup`. - """ - kwargs.setdefault("cls", AppGroup) - return super().group(*args, **kwargs) # type: ignore[no-any-return] - - -def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: - if value is None: - return None - - info = ctx.ensure_object(ScriptInfo) - info.app_import_path = value - return value - - -# This option is eager so the app will be available if --help is given. -# --help is also eager, so --app must be before it in the param list. -# no_args_is_help bypasses eager processing, so this option must be -# processed manually in that case to ensure FLASK_APP gets picked up. -_app_option = click.Option( - ["-A", "--app"], - metavar="IMPORT", - help=( - "The Flask application or factory function to load, in the form 'module:name'." - " Module can be a dotted import or file path. Name is not required if it is" - " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" - " pass arguments." - ), - is_eager=True, - expose_value=False, - callback=_set_app, -) - - -def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: - # If the flag isn't provided, it will default to False. Don't use - # that, let debug be set by env in that case. - source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] - - if source is not None and source in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ): - return None - - # Set with env var instead of ScriptInfo.load so that it can be - # accessed early during a factory function. - os.environ["FLASK_DEBUG"] = "1" if value else "0" - return value - - -_debug_option = click.Option( - ["--debug/--no-debug"], - help="Set debug mode.", - expose_value=False, - callback=_set_debug, -) - - -def _env_file_callback( - ctx: click.Context, param: click.Option, value: str | None -) -> str | None: - if value is None: - return None - - import importlib - - try: - importlib.import_module("dotenv") - except ImportError: - raise click.BadParameter( - "python-dotenv must be installed to load an env file.", - ctx=ctx, - param=param, - ) from None - - # Don't check FLASK_SKIP_DOTENV, that only disables automatically - # loading .env and .flaskenv files. - load_dotenv(value) - return value - - -# This option is eager so env vars are loaded as early as possible to be -# used by other options. -_env_file_option = click.Option( - ["-e", "--env-file"], - type=click.Path(exists=True, dir_okay=False), - help="Load environment variables from this file. python-dotenv must be installed.", - is_eager=True, - expose_value=False, - callback=_env_file_callback, -) - - -class FlaskGroup(AppGroup): - """Special subclass of the :class:`AppGroup` group that supports - loading more commands from the configured Flask app. Normally a - developer does not have to interface with this class but there are - some very advanced use cases for which it makes sense to create an - instance of this. see :ref:`custom-scripts`. - - :param add_default_commands: if this is True then the default run and - shell commands will be added. - :param add_version_option: adds the ``--version`` option. - :param create_app: an optional callback that is passed the script info and - returns the loaded app. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param set_debug_flag: Set the app's debug flag. - - .. versionchanged:: 2.2 - Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. - - .. versionchanged:: 2.2 - An app context is pushed when running ``app.cli`` commands, so - ``@with_appcontext`` is no longer required for those commands. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment variables - from :file:`.env` and :file:`.flaskenv` files. - """ - - def __init__( - self, - add_default_commands: bool = True, - create_app: t.Callable[..., Flask] | None = None, - add_version_option: bool = True, - load_dotenv: bool = True, - set_debug_flag: bool = True, - **extra: t.Any, - ) -> None: - params = list(extra.pop("params", None) or ()) - # Processing is done with option callbacks instead of a group - # callback. This allows users to make a custom group callback - # without losing the behavior. --env-file must come first so - # that it is eagerly evaluated before --app. - params.extend((_env_file_option, _app_option, _debug_option)) - - if add_version_option: - params.append(version_option) - - if "context_settings" not in extra: - extra["context_settings"] = {} - - extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") - - super().__init__(params=params, **extra) - - self.create_app = create_app - self.load_dotenv = load_dotenv - self.set_debug_flag = set_debug_flag - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_command) - self.add_command(routes_command) - - self._loaded_plugin_commands = False - - def _load_plugin_commands(self) -> None: - if self._loaded_plugin_commands: - return - - if sys.version_info >= (3, 10): - from importlib import metadata - else: - # Use a backport on Python < 3.10. We technically have - # importlib.metadata on 3.8+, but the API changed in 3.10, - # so use the backport for consistency. - import importlib_metadata as metadata - - for ep in metadata.entry_points(group="flask.commands"): - self.add_command(ep.load(), ep.name) - - self._loaded_plugin_commands = True - - def get_command(self, ctx: click.Context, name: str) -> click.Command | None: - self._load_plugin_commands() - # Look up built-in and plugin commands, which should be - # available even if the app fails to load. - rv = super().get_command(ctx, name) - - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - - # Look up commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - app = info.load_app() - except NoAppException as e: - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - return None - - # Push an app context for the loaded app unless it is already - # active somehow. This makes the context available to parameter - # and command callbacks without needing @with_appcontext. - if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] - ctx.with_resource(app.app_context()) - - return app.cli.get_command(ctx, name) - - def list_commands(self, ctx: click.Context) -> list[str]: - self._load_plugin_commands() - # Start with the built-in and plugin commands. - rv = set(super().list_commands(ctx)) - info = ctx.ensure_object(ScriptInfo) - - # Add commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except NoAppException as e: - # When an app couldn't be loaded, show the error message - # without the traceback. - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - except Exception: - # When any other errors occurred during loading, show the - # full traceback. - click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") - - return sorted(rv) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: click.Context | None = None, - **extra: t.Any, - ) -> click.Context: - # Set a flag to tell app.run to become a no-op. If app.run was - # not in a __name__ == __main__ guard, it would start the server - # when importing, blocking whatever command is being called. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - # Attempt to load .env and .flask env files. The --env-file - # option can cause another file to be loaded. - if get_load_dotenv(self.load_dotenv): - load_dotenv() - - if "obj" not in extra and "obj" not in self.context_settings: - extra["obj"] = ScriptInfo( - create_app=self.create_app, set_debug_flag=self.set_debug_flag - ) - - return super().make_context(info_name, args, parent=parent, **extra) - - def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help: - # Attempt to load --env-file and --app early in case they - # were given as env vars. Otherwise no_args_is_help will not - # see commands from app.cli. - _env_file_option.handle_parse_result(ctx, {}, []) - _app_option.handle_parse_result(ctx, {}, []) - - return super().parse_args(ctx, args) - - -def _path_is_ancestor(path: str, other: str) -> bool: - """Take ``other`` and remove the length of ``path`` from it. Then join it - to ``path``. If it is the original value, ``path`` is an ancestor of - ``other``.""" - return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other - - -def load_dotenv(path: str | os.PathLike[str] | None = None) -> bool: - """Load "dotenv" files in order of precedence to set environment variables. - - If an env var is already set it is not overwritten, so earlier files in the - list are preferred over later files. - - This is a no-op if `python-dotenv`_ is not installed. - - .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme - - :param path: Load the file at this location instead of searching. - :return: ``True`` if a file was loaded. - - .. versionchanged:: 2.0 - The current directory is not changed to the location of the - loaded file. - - .. versionchanged:: 2.0 - When loading the env files, set the default encoding to UTF-8. - - .. versionchanged:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionadded:: 1.0 - """ - try: - import dotenv - except ImportError: - if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): - click.secho( - " * Tip: There are .env or .flaskenv files present." - ' Do "pip install python-dotenv" to use them.', - fg="yellow", - err=True, - ) - - return False - - # Always return after attempting to load a given path, don't load - # the default files. - if path is not None: - if os.path.isfile(path): - return dotenv.load_dotenv(path, encoding="utf-8") - - return False - - loaded = False - - for name in (".env", ".flaskenv"): - path = dotenv.find_dotenv(name, usecwd=True) - - if not path: - continue - - dotenv.load_dotenv(path, encoding="utf-8") - loaded = True - - return loaded # True if at least one file was located and loaded. - - -def show_server_banner(debug: bool, app_import_path: str | None) -> None: - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if is_running_from_reloader(): - return - - if app_import_path is not None: - click.echo(f" * Serving Flask app '{app_import_path}'") - - if debug is not None: - click.echo(f" * Debug mode: {'on' if debug else 'off'}") - - -class CertParamType(click.ParamType): - """Click option type for the ``--cert`` option. Allows either an - existing file, the string ``'adhoc'``, or an import for a - :class:`~ssl.SSLContext` object. - """ - - name = "path" - - def __init__(self) -> None: - self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - try: - import ssl - except ImportError: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) from None - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import cryptography # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires the cryptography library.", - ctx, - param, - ) from None - - return value - - obj = import_string(value, silent=True) - - if isinstance(obj, ssl.SSLContext): - return obj - - raise - - -def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: - """The ``--key`` option must be specified when ``--cert`` is a file. - Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. - """ - cert = ctx.params.get("cert") - is_adhoc = cert == "adhoc" - - try: - import ssl - except ImportError: - is_context = False - else: - is_context = isinstance(cert, ssl.SSLContext) - - if value is not None: - if is_adhoc: - raise click.BadParameter( - 'When "--cert" is "adhoc", "--key" is not used.', ctx, param - ) - - if is_context: - raise click.BadParameter( - 'When "--cert" is an SSLContext object, "--key" is not used.', - ctx, - param, - ) - - if not cert: - raise click.BadParameter('"--cert" must also be specified.', ctx, param) - - ctx.params["cert"] = cert, value - - else: - if cert and not (is_adhoc or is_context): - raise click.BadParameter('Required when using "--cert".', ctx, param) - - return value - - -class SeparatedPathType(click.Path): - """Click option type that accepts a list of values separated by the - OS's path separator (``:``, ``;`` on Windows). Each value is - validated as a :class:`click.Path` type. - """ - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - items = self.split_envvar_value(value) - # can't call no-arg super() inside list comprehension until Python 3.12 - super_convert = super().convert - return [super_convert(item, param, ctx) for item in items] - - -@click.command("run", short_help="Run a development server.") -@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") -@click.option("--port", "-p", default=5000, help="The port to bind to.") -@click.option( - "--cert", - type=CertParamType(), - help="Specify a certificate file to use HTTPS.", - is_eager=True, -) -@click.option( - "--key", - type=click.Path(exists=True, dir_okay=False, resolve_path=True), - callback=_validate_key, - expose_value=False, - help="The key file to use when specifying a certificate.", -) -@click.option( - "--reload/--no-reload", - default=None, - help="Enable or disable the reloader. By default the reloader " - "is active if debug is enabled.", -) -@click.option( - "--debugger/--no-debugger", - default=None, - help="Enable or disable the debugger. By default the debugger " - "is active if debug is enabled.", -) -@click.option( - "--with-threads/--without-threads", - default=True, - help="Enable or disable multithreading.", -) -@click.option( - "--extra-files", - default=None, - type=SeparatedPathType(), - help=( - "Extra files that trigger a reload on change. Multiple paths" - f" are separated by {os.path.pathsep!r}." - ), -) -@click.option( - "--exclude-patterns", - default=None, - type=SeparatedPathType(), - help=( - "Files matching these fnmatch patterns will not trigger a reload" - " on change. Multiple patterns are separated by" - f" {os.path.pathsep!r}." - ), -) -@pass_script_info -def run_command( - info: ScriptInfo, - host: str, - port: int, - reload: bool, - debugger: bool, - with_threads: bool, - cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, - extra_files: list[str] | None, - exclude_patterns: list[str] | None, -) -> None: - """Run a local development server. - - This server is for development purposes only. It does not provide - the stability, security, or performance of production WSGI servers. - - The reloader and debugger are enabled by default with the '--debug' - option. - """ - try: - app: WSGIApplication = info.load_app() - except Exception as e: - if is_running_from_reloader(): - # When reloading, print out the error immediately, but raise - # it later so the debugger or server can handle it. - traceback.print_exc() - err = e - - def app( - environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - raise err from None - - else: - # When not reloading, raise the error immediately so the - # command fails. - raise e from None - - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - show_server_banner(debug, info.app_import_path) - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - exclude_patterns=exclude_patterns, - ) - - -run_command.params.insert(0, _debug_option) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command() -> None: - """Run an interactive Python shell in the context of a given - Flask application. The application will populate the default - namespace of this shell according to its configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - - banner = ( - f"Python {sys.version} on {sys.platform}\n" - f"App: {current_app.import_name}\n" - f"Instance: {current_app.instance_path}" - ) - ctx: dict[str, t.Any] = {} - - # Support the regular Python interpreter startup script if someone - # is using it. - startup = os.environ.get("PYTHONSTARTUP") - if startup and os.path.isfile(startup): - with open(startup) as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(current_app.make_shell_context()) - - # Site, customize, or startup script can set a hook to call when - # entering interactive mode. The default one sets up readline with - # tab and history completion. - interactive_hook = getattr(sys, "__interactivehook__", None) - - if interactive_hook is not None: - try: - import readline - from rlcompleter import Completer - except ImportError: - pass - else: - # rlcompleter uses __main__.__dict__ by default, which is - # flask.__main__. Use the shell context instead. - readline.set_completer(Completer(ctx).complete) - - interactive_hook() - - code.interact(banner=banner, local=ctx) - - -@click.command("routes", short_help="Show the routes for the app.") -@click.option( - "--sort", - "-s", - type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), - default="endpoint", - help=( - "Method to sort routes by. 'match' is the order that Flask will match routes" - " when dispatching a request." - ), -) -@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") -@with_appcontext -def routes_command(sort: str, all_methods: bool) -> None: - """Show all registered routes with endpoints and methods.""" - rules = list(current_app.url_map.iter_rules()) - - if not rules: - click.echo("No routes were registered.") - return - - ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} - host_matching = current_app.url_map.host_matching - has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) - rows = [] - - for rule in rules: - row = [ - rule.endpoint, - ", ".join(sorted((rule.methods or set()) - ignored_methods)), - ] - - if has_domain: - row.append((rule.host if host_matching else rule.subdomain) or "") - - row.append(rule.rule) - rows.append(row) - - headers = ["Endpoint", "Methods"] - sorts = ["endpoint", "methods"] - - if has_domain: - headers.append("Host" if host_matching else "Subdomain") - sorts.append("domain") - - headers.append("Rule") - sorts.append("rule") - - try: - rows.sort(key=itemgetter(sorts.index(sort))) - except ValueError: - pass - - rows.insert(0, headers) - widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] - rows.insert(1, ["-" * w for w in widths]) - template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) - - for row in rows: - click.echo(template.format(*row)) - - -cli = FlaskGroup( - name="flask", - help="""\ -A general utility script for Flask applications. - -An application to load must be given with the '--app' option, -'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file -in the current directory. -""", -) - - -def main() -> None: - cli.main() - - -if __name__ == "__main__": - main() diff --git a/lib/python3.12/site-packages/flask/config.py b/lib/python3.12/site-packages/flask/config.py deleted file mode 100644 index 7e3ba17..0000000 --- a/lib/python3.12/site-packages/flask/config.py +++ /dev/null @@ -1,370 +0,0 @@ -from __future__ import annotations - -import errno -import json -import os -import types -import typing as t - -from werkzeug.utils import import_string - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .sansio.app import App - - -T = t.TypeVar("T") - - -class ConfigAttribute(t.Generic[T]): - """Makes an attribute forward to the config""" - - def __init__( - self, name: str, get_converter: t.Callable[[t.Any], T] | None = None - ) -> None: - self.__name__ = name - self.get_converter = get_converter - - @t.overload - def __get__(self, obj: None, owner: None) -> te.Self: ... - - @t.overload - def __get__(self, obj: App, owner: type[App]) -> T: ... - - def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: - if obj is None: - return self - - rv = obj.config[self.__name__] - - if self.get_converter is not None: - rv = self.get_converter(rv) - - return rv # type: ignore[no-any-return] - - def __set__(self, obj: App, value: t.Any) -> None: - obj.config[self.__name__] = value - - -class Config(dict): # type: ignore[type-arg] - """Works exactly like a dict but provides ways to fill it from files - or special dictionaries. There are two common patterns to populate the - config. - - Either you can fill the config from a config file:: - - app.config.from_pyfile('yourconfig.cfg') - - Or alternatively you can define the configuration options in the - module that calls :meth:`from_object` or provide an import path to - a module that should be loaded. It is also possible to tell it to - use the same module and with that provide the configuration values - just before the call:: - - DEBUG = True - SECRET_KEY = 'development key' - app.config.from_object(__name__) - - In both cases (loading from any Python file or loading from modules), - only uppercase keys are added to the config. This makes it possible to use - lowercase values in the config file for temporary values that are not added - to the config or to define the config keys in the same file that implements - the application. - - Probably the most interesting way to load configurations is from an - environment variable pointing to a file:: - - app.config.from_envvar('YOURAPPLICATION_SETTINGS') - - In this case before launching the application you have to set this - environment variable to the file you want to use. On Linux and OS X - use the export statement:: - - export YOURAPPLICATION_SETTINGS='/path/to/config/file' - - On windows use `set` instead. - - :param root_path: path to which files are read relative from. When the - config object is created by the application, this is - the application's :attr:`~flask.Flask.root_path`. - :param defaults: an optional dictionary of default values - """ - - def __init__( - self, - root_path: str | os.PathLike[str], - defaults: dict[str, t.Any] | None = None, - ) -> None: - super().__init__(defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name: str, silent: bool = False) -> bool: - """Loads a configuration from an environment variable pointing to - a configuration file. This is basically just a shortcut with nicer - error messages for this line of code:: - - app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) - - :param variable_name: name of the environment variable - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - f"The environment variable {variable_name!r} is not set" - " and as such configuration could not be loaded. Set" - " this variable and make it point to a configuration" - " file" - ) - return self.from_pyfile(rv, silent=silent) - - def from_prefixed_env( - self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads - ) -> bool: - """Load any environment variables that start with ``FLASK_``, - dropping the prefix from the env key for the config key. Values - are passed through a loading function to attempt to convert them - to more specific types than strings. - - Keys are loaded in :func:`sorted` order. - - The default loading function attempts to parse values as any - valid JSON type, including dicts and lists. - - Specific items in nested dicts can be set by separating the - keys with double underscores (``__``). If an intermediate key - doesn't exist, it will be initialized to an empty dict. - - :param prefix: Load env vars that start with this prefix, - separated with an underscore (``_``). - :param loads: Pass each string value to this function and use - the returned value as the config value. If any error is - raised it is ignored and the value remains a string. The - default is :func:`json.loads`. - - .. versionadded:: 2.1 - """ - prefix = f"{prefix}_" - len_prefix = len(prefix) - - for key in sorted(os.environ): - if not key.startswith(prefix): - continue - - value = os.environ[key] - - try: - value = loads(value) - except Exception: - # Keep the value as a string if loading failed. - pass - - # Change to key.removeprefix(prefix) on Python >= 3.9. - key = key[len_prefix:] - - if "__" not in key: - # A non-nested key, set directly. - self[key] = value - continue - - # Traverse nested dictionaries with keys separated by "__". - current = self - *parts, tail = key.split("__") - - for part in parts: - # If an intermediate dict does not exist, create it. - if part not in current: - current[part] = {} - - current = current[part] - - current[tail] = value - - return True - - def from_pyfile( - self, filename: str | os.PathLike[str], silent: bool = False - ) -> bool: - """Updates the values in the config from a Python file. This function - behaves as if the file was imported as module with the - :meth:`from_object` function. - - :param filename: the filename of the config. This can either be an - absolute filename or a filename relative to the - root path. - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - - .. versionadded:: 0.7 - `silent` parameter. - """ - filename = os.path.join(self.root_path, filename) - d = types.ModuleType("config") - d.__file__ = filename - try: - with open(filename, mode="rb") as config_file: - exec(compile(config_file.read(), filename, "exec"), d.__dict__) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - self.from_object(d) - return True - - def from_object(self, obj: object | str) -> None: - """Updates the values from the given object. An object can be of one - of the following two types: - - - a string: in this case the object with that name will be imported - - an actual object reference: that object is used directly - - Objects are usually either modules or classes. :meth:`from_object` - loads only the uppercase attributes of the module/class. A ``dict`` - object will not work with :meth:`from_object` because the keys of a - ``dict`` are not attributes of the ``dict`` class. - - Example of module-based configuration:: - - app.config.from_object('yourapplication.default_config') - from yourapplication import default_config - app.config.from_object(default_config) - - Nothing is done to the object before loading. If the object is a - class and has ``@property`` attributes, it needs to be - instantiated before being passed to this method. - - You should not use this function to load the actual configuration but - rather configuration defaults. The actual config should be loaded - with :meth:`from_pyfile` and ideally from a location not within the - package because the package might be installed system wide. - - See :ref:`config-dev-prod` for an example of class-based configuration - using :meth:`from_object`. - - :param obj: an import name or object - """ - if isinstance(obj, str): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_file( - self, - filename: str | os.PathLike[str], - load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], - silent: bool = False, - text: bool = True, - ) -> bool: - """Update the values in the config from a file that is loaded - using the ``load`` parameter. The loaded data is passed to the - :meth:`from_mapping` method. - - .. code-block:: python - - import json - app.config.from_file("config.json", load=json.load) - - import tomllib - app.config.from_file("config.toml", load=tomllib.load, text=False) - - :param filename: The path to the data file. This can be an - absolute path or relative to the config root path. - :param load: A callable that takes a file handle and returns a - mapping of loaded data from the file. - :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` - implements a ``read`` method. - :param silent: Ignore the file if it doesn't exist. - :param text: Open the file in text or binary mode. - :return: ``True`` if the file was loaded successfully. - - .. versionchanged:: 2.3 - The ``text`` parameter was added. - - .. versionadded:: 2.0 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename, "r" if text else "rb") as f: - obj = load(f) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - - return self.from_mapping(obj) - - def from_mapping( - self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any - ) -> bool: - """Updates the config like :meth:`update` ignoring items with - non-upper keys. - - :return: Always returns ``True``. - - .. versionadded:: 0.11 - """ - mappings: dict[str, t.Any] = {} - if mapping is not None: - mappings.update(mapping) - mappings.update(kwargs) - for key, value in mappings.items(): - if key.isupper(): - self[key] = value - return True - - def get_namespace( - self, namespace: str, lowercase: bool = True, trim_namespace: bool = True - ) -> dict[str, t.Any]: - """Returns a dictionary containing a subset of configuration options - that match the specified namespace/prefix. Example usage:: - - app.config['IMAGE_STORE_TYPE'] = 'fs' - app.config['IMAGE_STORE_PATH'] = '/var/app/images' - app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' - image_store_config = app.config.get_namespace('IMAGE_STORE_') - - The resulting dictionary `image_store_config` would look like:: - - { - 'type': 'fs', - 'path': '/var/app/images', - 'base_url': 'http://img.website.com' - } - - This is often useful when configuration options map directly to - keyword arguments in functions or class constructors. - - :param namespace: a configuration namespace - :param lowercase: a flag indicating if the keys of the resulting - dictionary should be lowercase - :param trim_namespace: a flag indicating if the keys of the resulting - dictionary should not include the namespace - - .. versionadded:: 0.11 - """ - rv = {} - for k, v in self.items(): - if not k.startswith(namespace): - continue - if trim_namespace: - key = k[len(namespace) :] - else: - key = k - if lowercase: - key = key.lower() - rv[key] = v - return rv - - def __repr__(self) -> str: - return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/lib/python3.12/site-packages/flask/ctx.py b/lib/python3.12/site-packages/flask/ctx.py deleted file mode 100644 index 9b164d3..0000000 --- a/lib/python3.12/site-packages/flask/ctx.py +++ /dev/null @@ -1,449 +0,0 @@ -from __future__ import annotations - -import contextvars -import sys -import typing as t -from functools import update_wrapper -from types import TracebackType - -from werkzeug.exceptions import HTTPException - -from . import typing as ft -from .globals import _cv_app -from .globals import _cv_request -from .signals import appcontext_popped -from .signals import appcontext_pushed - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - from .sessions import SessionMixin - from .wrappers import Request - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals: - """A plain object. Used as a namespace for storing data during an - application context. - - Creating an app context automatically creates this object, which is - made available as the :data:`g` proxy. - - .. describe:: 'key' in g - - Check whether an attribute is present. - - .. versionadded:: 0.10 - - .. describe:: iter(g) - - Return an iterator over the attribute names. - - .. versionadded:: 0.10 - """ - - # Define attr methods to let mypy know this is a namespace object - # that has arbitrary attributes. - - def __getattr__(self, name: str) -> t.Any: - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def __setattr__(self, name: str, value: t.Any) -> None: - self.__dict__[name] = value - - def __delattr__(self, name: str) -> None: - try: - del self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def get(self, name: str, default: t.Any | None = None) -> t.Any: - """Get an attribute by name, or a default value. Like - :meth:`dict.get`. - - :param name: Name of attribute to get. - :param default: Value to return if the attribute is not present. - - .. versionadded:: 0.10 - """ - return self.__dict__.get(name, default) - - def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: - """Get and remove an attribute by name. Like :meth:`dict.pop`. - - :param name: Name of attribute to pop. - :param default: Value to return if the attribute is not present, - instead of raising a ``KeyError``. - - .. versionadded:: 0.11 - """ - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name: str, default: t.Any = None) -> t.Any: - """Get the value of an attribute if it is present, otherwise - set and return a default value. Like :meth:`dict.setdefault`. - - :param name: Name of attribute to get. - :param default: Value to set and return if the attribute is not - present. - - .. versionadded:: 0.11 - """ - return self.__dict__.setdefault(name, default) - - def __contains__(self, item: str) -> bool: - return item in self.__dict__ - - def __iter__(self) -> t.Iterator[str]: - return iter(self.__dict__) - - def __repr__(self) -> str: - ctx = _cv_app.get(None) - if ctx is not None: - return f"" - return object.__repr__(self) - - -def after_this_request( - f: ft.AfterRequestCallable[t.Any], -) -> ft.AfterRequestCallable[t.Any]: - """Executes a function after this request. This is useful to modify - response objects. The function is passed the response object and has - to return the same or a new one. - - Example:: - - @app.route('/') - def index(): - @after_this_request - def add_header(response): - response.headers['X-Foo'] = 'Parachute' - return response - return 'Hello World!' - - This is more useful if a function other than the view function wants to - modify a response. For instance think of a decorator that wants to add - some headers without converting the return value into a response object. - - .. versionadded:: 0.9 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'after_this_request' can only be used when a request" - " context is active, such as in a view function." - ) - - ctx._after_request_functions.append(f) - return f - - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def copy_current_request_context(f: F) -> F: - """A helper function that decorates a function to retain the current - request context. This is useful when working with greenlets. The moment - the function is decorated a copy of the request context is created and - then pushed when the function is called. The current session is also - included in the copied request context. - - Example:: - - import gevent - from flask import copy_current_request_context - - @app.route('/') - def index(): - @copy_current_request_context - def do_some_work(): - # do some work here, it can access flask.request or - # flask.session like you would otherwise in the view function. - ... - gevent.spawn(do_some_work) - return 'Regular response' - - .. versionadded:: 0.10 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'copy_current_request_context' can only be used when a" - " request context is active, such as in a view function." - ) - - ctx = ctx.copy() - - def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: - with ctx: # type: ignore[union-attr] - return ctx.app.ensure_sync(f)(*args, **kwargs) # type: ignore[union-attr] - - return update_wrapper(wrapper, f) # type: ignore[return-value] - - -def has_request_context() -> bool: - """If you have code that wants to test if a request context is there or - not this function can be used. For instance, you may want to take advantage - of request information if the request object is available, but fail - silently if it is unavailable. - - :: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and has_request_context(): - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - Alternatively you can also just test any of the context bound objects - (such as :class:`request` or :class:`g`) for truthness:: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and request: - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - .. versionadded:: 0.7 - """ - return _cv_request.get(None) is not None - - -def has_app_context() -> bool: - """Works like :func:`has_request_context` but for the application - context. You can also just do a boolean check on the - :data:`current_app` object instead. - - .. versionadded:: 0.9 - """ - return _cv_app.get(None) is not None - - -class AppContext: - """The app context contains application-specific information. An app - context is created and pushed at the beginning of each request if - one is not already active. An app context is also pushed when - running CLI commands. - """ - - def __init__(self, app: Flask) -> None: - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g: _AppCtxGlobals = app.app_ctx_globals_class() - self._cv_tokens: list[contextvars.Token[AppContext]] = [] - - def push(self) -> None: - """Binds the app context to the current context.""" - self._cv_tokens.append(_cv_app.set(self)) - appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the app context.""" - try: - if len(self._cv_tokens) == 1: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - ctx = _cv_app.get() - _cv_app.reset(self._cv_tokens.pop()) - - if ctx is not self: - raise AssertionError( - f"Popped wrong app context. ({ctx!r} instead of {self!r})" - ) - - appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) - - def __enter__(self) -> AppContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - -class RequestContext: - """The request context contains per-request information. The Flask - app creates and pushes it at the beginning of the request, then pops - it at the end of the request. It will create the URL adapter and - request object for the WSGI environment provided. - - Do not attempt to use this class directly, instead use - :meth:`~flask.Flask.test_request_context` and - :meth:`~flask.Flask.request_context` to create this object. - - When the request context is popped, it will evaluate all the - functions registered on the application for teardown execution - (:meth:`~flask.Flask.teardown_request`). - - The request context is automatically popped at the end of the - request. When using the interactive debugger, the context will be - restored so ``request`` is still accessible. Similarly, the test - client can preserve the context after the request ends. However, - teardown functions may already have closed some resources such as - database connections. - """ - - def __init__( - self, - app: Flask, - environ: WSGIEnvironment, - request: Request | None = None, - session: SessionMixin | None = None, - ) -> None: - self.app = app - if request is None: - request = app.request_class(environ) - request.json_module = app.json - self.request: Request = request - self.url_adapter = None - try: - self.url_adapter = app.create_url_adapter(self.request) - except HTTPException as e: - self.request.routing_exception = e - self.flashes: list[tuple[str, str]] | None = None - self.session: SessionMixin | None = session - # Functions that should be executed after the request on the response - # object. These will be called before the regular "after_request" - # functions. - self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = [] - - self._cv_tokens: list[ - tuple[contextvars.Token[RequestContext], AppContext | None] - ] = [] - - def copy(self) -> RequestContext: - """Creates a copy of this request context with the same request object. - This can be used to move a request context to a different greenlet. - Because the actual request object is the same this cannot be used to - move a request context to a different thread unless access to the - request object is locked. - - .. versionadded:: 0.10 - - .. versionchanged:: 1.1 - The current session object is used instead of reloading the original - data. This prevents `flask.session` pointing to an out-of-date object. - """ - return self.__class__( - self.app, - environ=self.request.environ, - request=self.request, - session=self.session, - ) - - def match_request(self) -> None: - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) # type: ignore - self.request.url_rule, self.request.view_args = result # type: ignore - except HTTPException as e: - self.request.routing_exception = e - - def push(self) -> None: - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _cv_app.get(None) - - if app_ctx is None or app_ctx.app is not self.app: - app_ctx = self.app.app_context() - app_ctx.push() - else: - app_ctx = None - - self._cv_tokens.append((_cv_request.set(self), app_ctx)) - - # Open the session at the moment that the request context is available. - # This allows a custom open_session method to use the request context. - # Only open a new session if this is the first time the request was - # pushed, otherwise stream_with_context loses the session. - if self.session is None: - session_interface = self.app.session_interface - self.session = session_interface.open_session(self.app, self.request) - - if self.session is None: - self.session = session_interface.make_null_session(self.app) - - # Match the request URL after loading the session, so that the - # session is available in custom URL converters. - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the request context and unbinds it by doing that. This will - also trigger the execution of functions registered by the - :meth:`~flask.Flask.teardown_request` decorator. - - .. versionchanged:: 0.9 - Added the `exc` argument. - """ - clear_request = len(self._cv_tokens) == 1 - - try: - if clear_request: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - finally: - ctx = _cv_request.get() - token, app_ctx = self._cv_tokens.pop() - _cv_request.reset(token) - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - ctx.request.environ["werkzeug.request"] = None - - if app_ctx is not None: - app_ctx.pop(exc) - - if ctx is not self: - raise AssertionError( - f"Popped wrong request context. ({ctx!r} instead of {self!r})" - ) - - def __enter__(self) -> RequestContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - def __repr__(self) -> str: - return ( - f"<{type(self).__name__} {self.request.url!r}" - f" [{self.request.method}] of {self.app.name}>" - ) diff --git a/lib/python3.12/site-packages/flask/debughelpers.py b/lib/python3.12/site-packages/flask/debughelpers.py deleted file mode 100644 index 2c8c4c4..0000000 --- a/lib/python3.12/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2.loaders import BaseLoader -from werkzeug.routing import RequestRedirect - -from .blueprints import Blueprint -from .globals import request_ctx -from .sansio.app import App - -if t.TYPE_CHECKING: - from .sansio.scaffold import Scaffold - from .wrappers import Request - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -class DebugFilesKeyError(KeyError, AssertionError): - """Raised from request.files during debugging. The idea is that it can - provide a better error message than just a generic KeyError/BadRequest. - """ - - def __init__(self, request: Request, key: str) -> None: - form_matches = request.form.getlist(key) - buf = [ - f"You tried to access the file {key!r} in the request.files" - " dictionary but it does not exist. The mimetype for the" - f" request is {request.mimetype!r} instead of" - " 'multipart/form-data' which means that no file contents" - " were transmitted. To fix this error you should provide" - ' enctype="multipart/form-data" in your form.' - ] - if form_matches: - names = ", ".join(repr(x) for x in form_matches) - buf.append( - "\n\nThe browser instead transmitted some file names. " - f"This was submitted: {names}" - ) - self.msg = "".join(buf) - - def __str__(self) -> str: - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised in debug mode if a routing redirect - would cause the browser to drop the method or body. This happens - when method is not GET, HEAD or OPTIONS and the status code is not - 307 or 308. - """ - - def __init__(self, request: Request) -> None: - exc = request.routing_exception - assert isinstance(exc, RequestRedirect) - buf = [ - f"A request was sent to '{request.url}', but routing issued" - f" a redirect to the canonical URL '{exc.new_url}'." - ] - - if f"{request.base_url}/" == exc.new_url.partition("?")[0]: - buf.append( - " The URL was defined with a trailing slash. Flask" - " will redirect to the URL with a trailing slash if it" - " was accessed without one." - ) - - buf.append( - " Send requests to the canonical URL, or use 307 or 308 for" - " routing redirects. Otherwise, browsers will drop form" - " data.\n\n" - "This exception is only raised in debug mode." - ) - super().__init__("".join(buf)) - - -def attach_enctype_error_multidict(request: Request) -> None: - """Patch ``request.files.__getitem__`` to raise a descriptive error - about ``enctype=multipart/form-data``. - - :param request: The request to patch. - :meta private: - """ - oldcls = request.files.__class__ - - class newcls(oldcls): # type: ignore[valid-type, misc] - def __getitem__(self, key: str) -> t.Any: - try: - return super().__getitem__(key) - except KeyError as e: - if key not in request.form: - raise - - raise DebugFilesKeyError(request, key).with_traceback( - e.__traceback__ - ) from None - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: - yield f"class: {type(loader).__module__}.{type(loader).__name__}" - for key, value in sorted(loader.__dict__.items()): - if key.startswith("_"): - continue - if isinstance(value, (tuple, list)): - if not all(isinstance(x, str) for x in value): - continue - yield f"{key}:" - for item in value: - yield f" - {item}" - continue - elif not isinstance(value, (str, int, float, bool)): - continue - yield f"{key}: {value!r}" - - -def explain_template_loading_attempts( - app: App, - template: str, - attempts: list[ - tuple[ - BaseLoader, - Scaffold, - tuple[str, str | None, t.Callable[[], bool] | None] | None, - ] - ], -) -> None: - """This should help developers understand what failed""" - info = [f"Locating template {template!r}:"] - total_found = 0 - blueprint = None - if request_ctx and request_ctx.request.blueprint is not None: - blueprint = request_ctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, App): - src_info = f"application {srcobj.import_name!r}" - elif isinstance(srcobj, Blueprint): - src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" - else: - src_info = repr(srcobj) - - info.append(f"{idx + 1:5}: trying loader of {src_info}") - - for line in _dump_loader_info(loader): - info.append(f" {line}") - - if triple is None: - detail = "no match" - else: - detail = f"found ({triple[1] or ''!r})" - total_found += 1 - info.append(f" -> {detail}") - - seems_fishy = False - if total_found == 0: - info.append("Error: the template could not be found.") - seems_fishy = True - elif total_found > 1: - info.append("Warning: multiple loaders returned a match for the template.") - seems_fishy = True - - if blueprint is not None and seems_fishy: - info.append( - " The template was looked up from an endpoint that belongs" - f" to the blueprint {blueprint!r}." - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See https://flask.palletsprojects.com/blueprints/#templates") - - app.logger.info("\n".join(info)) diff --git a/lib/python3.12/site-packages/flask/globals.py b/lib/python3.12/site-packages/flask/globals.py deleted file mode 100644 index e2c410c..0000000 --- a/lib/python3.12/site-packages/flask/globals.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import typing as t -from contextvars import ContextVar - -from werkzeug.local import LocalProxy - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .ctx import _AppCtxGlobals - from .ctx import AppContext - from .ctx import RequestContext - from .sessions import SessionMixin - from .wrappers import Request - - -_no_app_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -the current application. To solve this, set up an application context -with app.app_context(). See the documentation for more information.\ -""" -_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") -app_ctx: AppContext = LocalProxy( # type: ignore[assignment] - _cv_app, unbound_message=_no_app_msg -) -current_app: Flask = LocalProxy( # type: ignore[assignment] - _cv_app, "app", unbound_message=_no_app_msg -) -g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] - _cv_app, "g", unbound_message=_no_app_msg -) - -_no_req_msg = """\ -Working outside of request context. - -This typically means that you attempted to use functionality that needed -an active HTTP request. Consult the documentation on testing for -information about how to avoid this problem.\ -""" -_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") -request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] - _cv_request, unbound_message=_no_req_msg -) -request: Request = LocalProxy( # type: ignore[assignment] - _cv_request, "request", unbound_message=_no_req_msg -) -session: SessionMixin = LocalProxy( # type: ignore[assignment] - _cv_request, "session", unbound_message=_no_req_msg -) diff --git a/lib/python3.12/site-packages/flask/helpers.py b/lib/python3.12/site-packages/flask/helpers.py deleted file mode 100644 index 359a842..0000000 --- a/lib/python3.12/site-packages/flask/helpers.py +++ /dev/null @@ -1,621 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import sys -import typing as t -from datetime import datetime -from functools import lru_cache -from functools import update_wrapper - -import werkzeug.utils -from werkzeug.exceptions import abort as _wz_abort -from werkzeug.utils import redirect as _wz_redirect -from werkzeug.wrappers import Response as BaseResponse - -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .globals import request_ctx -from .globals import session -from .signals import message_flashed - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -def get_debug_flag() -> bool: - """Get whether debug mode should be enabled for the app, indicated by the - :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. - """ - val = os.environ.get("FLASK_DEBUG") - return bool(val and val.lower() not in {"0", "false", "no"}) - - -def get_load_dotenv(default: bool = True) -> bool: - """Get whether the user has disabled loading default dotenv files by - setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load - the files. - - :param default: What to return if the env var isn't set. - """ - val = os.environ.get("FLASK_SKIP_DOTENV") - - if not val: - return default - - return val.lower() in ("0", "false", "no") - - -def stream_with_context( - generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], -) -> t.Iterator[t.AnyStr]: - """Request contexts disappear when the response is started on the server. - This is done for efficiency reasons and to make it less likely to encounter - memory leaks with badly written WSGI middlewares. The downside is that if - you are using streamed responses, the generator cannot access request bound - information any more. - - This function however can help you keep the context around for longer:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - @stream_with_context - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(generate()) - - Alternatively it can also be used around a specific generator:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(stream_with_context(generate())) - - .. versionadded:: 0.9 - """ - try: - gen = iter(generator_or_function) # type: ignore[arg-type] - except TypeError: - - def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: - gen = generator_or_function(*args, **kwargs) # type: ignore[operator] - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] - - def generator() -> t.Iterator[t.AnyStr | None]: - ctx = _cv_request.get(None) - if ctx is None: - raise RuntimeError( - "'stream_with_context' can only be used when a request" - " context is active, such as in a view function." - ) - with ctx: - # Dummy sentinel. Has to be inside the context block or we're - # not actually keeping the context around. - yield None - - # The try/finally is here so that if someone passes a WSGI level - # iterator in we're still running the cleanup logic. Generators - # don't need that because they are closed on their destruction - # automatically. - try: - yield from gen - finally: - if hasattr(gen, "close"): - gen.close() - - # The trick is to start the generator. Then the code execution runs until - # the first dummy None is yielded at which point the context was already - # pushed. This item is discarded. Then when the iteration continues the - # real generator is executed. - wrapped_g = generator() - next(wrapped_g) - return wrapped_g # type: ignore[return-value] - - -def make_response(*args: t.Any) -> Response: - """Sometimes it is necessary to set additional headers in a view. Because - views do not have to return response objects but can return a value that - is converted into a response object by Flask itself, it becomes tricky to - add headers to it. This function can be called instead of using a return - and you will get a response object which you can use to attach headers. - - If view looked like this and you want to add a new header:: - - def index(): - return render_template('index.html', foo=42) - - You can now do something like this:: - - def index(): - response = make_response(render_template('index.html', foo=42)) - response.headers['X-Parachutes'] = 'parachutes are cool' - return response - - This function accepts the very same arguments you can return from a - view function. This for example creates a response with a 404 error - code:: - - response = make_response(render_template('not_found.html'), 404) - - The other use case of this function is to force the return value of a - view function into a response which is helpful with view - decorators:: - - response = make_response(view_function()) - response.headers['X-Parachutes'] = 'parachutes are cool' - - Internally this function does the following things: - - - if no arguments are passed, it creates a new response argument - - if one argument is passed, :meth:`flask.Flask.make_response` - is invoked with it. - - if more than one argument is passed, the arguments are passed - to the :meth:`flask.Flask.make_response` function as tuple. - - .. versionadded:: 0.6 - """ - if not args: - return current_app.response_class() - if len(args) == 1: - args = args[0] - return current_app.make_response(args) - - -def url_for( - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, -) -> str: - """Generate a URL to the given endpoint with the given values. - - This requires an active request or application context, and calls - :meth:`current_app.url_for() `. See that method - for full documentation. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it is - external. - :param _external: If given, prefer the URL to be internal (False) or - require it to be external (True). External URLs include the - scheme and domain. When not in an active request, URLs are - external by default. - :param values: Values to use for the variable parts of the URL rule. - Unknown keys are appended as query string arguments, like - ``?a=b&c=d``. - - .. versionchanged:: 2.2 - Calls ``current_app.url_for``, allowing an app to override the - behavior. - - .. versionchanged:: 0.10 - The ``_scheme`` parameter was added. - - .. versionchanged:: 0.9 - The ``_anchor`` and ``_method`` parameters were added. - - .. versionchanged:: 0.9 - Calls ``app.handle_url_build_error`` on build errors. - """ - return current_app.url_for( - endpoint, - _anchor=_anchor, - _method=_method, - _scheme=_scheme, - _external=_external, - **values, - ) - - -def redirect( - location: str, code: int = 302, Response: type[BaseResponse] | None = None -) -> BaseResponse: - """Create a redirect response object. - - If :data:`~flask.current_app` is available, it will use its - :meth:`~flask.Flask.redirect` method, otherwise it will use - :func:`werkzeug.utils.redirect`. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - :param Response: The response class to use. Not used when - ``current_app`` is active, which uses ``app.response_class``. - - .. versionadded:: 2.2 - Calls ``current_app.redirect`` if available instead of always - using Werkzeug's default ``redirect``. - """ - if current_app: - return current_app.redirect(location, code=code) - - return _wz_redirect(location, code=code, Response=Response) - - -def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given - status code. - - If :data:`~flask.current_app` is available, it will call its - :attr:`~flask.Flask.aborter` object, otherwise it will use - :func:`werkzeug.exceptions.abort`. - - :param code: The status code for the exception, which must be - registered in ``app.aborter``. - :param args: Passed to the exception. - :param kwargs: Passed to the exception. - - .. versionadded:: 2.2 - Calls ``current_app.aborter`` if available instead of always - using Werkzeug's default ``abort``. - """ - if current_app: - current_app.aborter(code, *args, **kwargs) - - _wz_abort(code, *args, **kwargs) - - -def get_template_attribute(template_name: str, attribute: str) -> t.Any: - """Loads a macro (or variable) a template exports. This can be used to - invoke a macro from within Python code. If you for example have a - template named :file:`_cider.html` with the following contents: - - .. sourcecode:: html+jinja - - {% macro hello(name) %}Hello {{ name }}!{% endmacro %} - - You can access this from Python code like this:: - - hello = get_template_attribute('_cider.html', 'hello') - return hello('World') - - .. versionadded:: 0.2 - - :param template_name: the name of the template - :param attribute: the name of the variable of macro to access - """ - return getattr(current_app.jinja_env.get_template(template_name).module, attribute) - - -def flash(message: str, category: str = "message") -> None: - """Flashes a message to the next request. In order to remove the - flashed message from the session and to display it to the user, - the template has to call :func:`get_flashed_messages`. - - .. versionchanged:: 0.3 - `category` parameter added. - - :param message: the message to be flashed. - :param category: the category for the message. The following values - are recommended: ``'message'`` for any kind of message, - ``'error'`` for errors, ``'info'`` for information - messages and ``'warning'`` for warnings. However any - kind of string can be used as category. - """ - # Original implementation: - # - # session.setdefault('_flashes', []).append((category, message)) - # - # This assumed that changes made to mutable structures in the session are - # always in sync with the session object, which is not true for session - # implementations that use external storage for keeping their keys/values. - flashes = session.get("_flashes", []) - flashes.append((category, message)) - session["_flashes"] = flashes - app = current_app._get_current_object() # type: ignore - message_flashed.send( - app, - _async_wrapper=app.ensure_sync, - message=message, - category=category, - ) - - -def get_flashed_messages( - with_categories: bool = False, category_filter: t.Iterable[str] = () -) -> list[str] | list[tuple[str, str]]: - """Pulls all flashed messages from the session and returns them. - Further calls in the same request to the function will return - the same messages. By default just the messages are returned, - but when `with_categories` is set to ``True``, the return value will - be a list of tuples in the form ``(category, message)`` instead. - - Filter the flashed messages to one or more categories by providing those - categories in `category_filter`. This allows rendering categories in - separate html blocks. The `with_categories` and `category_filter` - arguments are distinct: - - * `with_categories` controls whether categories are returned with message - text (``True`` gives a tuple, where ``False`` gives just the message text). - * `category_filter` filters the messages down to only those matching the - provided categories. - - See :doc:`/patterns/flashing` for examples. - - .. versionchanged:: 0.3 - `with_categories` parameter added. - - .. versionchanged:: 0.9 - `category_filter` parameter added. - - :param with_categories: set to ``True`` to also receive categories. - :param category_filter: filter of categories to limit return values. Only - categories in the list will be returned. - """ - flashes = request_ctx.flashes - if flashes is None: - flashes = session.pop("_flashes") if "_flashes" in session else [] - request_ctx.flashes = flashes - if category_filter: - flashes = list(filter(lambda f: f[0] in category_filter, flashes)) - if not with_categories: - return [x[1] for x in flashes] - return flashes - - -def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: - if kwargs.get("max_age") is None: - kwargs["max_age"] = current_app.get_send_file_max_age - - kwargs.update( - environ=request.environ, - use_x_sendfile=current_app.config["USE_X_SENDFILE"], - response_class=current_app.response_class, - _root_path=current_app.root_path, # type: ignore - ) - return kwargs - - -def send_file( - path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO, - mimetype: str | None = None, - as_attachment: bool = False, - download_name: str | None = None, - conditional: bool = True, - etag: bool | str = True, - last_modified: datetime | int | float | None = None, - max_age: None | (int | t.Callable[[str | None], int | None]) = None, -) -> Response: - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. Use :func:`send_from_directory` to safely serve - user-requested paths from within a directory. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, configuring Flask with - ``USE_X_SENDFILE = True`` will tell the server to send the given - path, which is much more efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - - .. versionchanged:: 2.0 - ``download_name`` replaces the ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces the ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces the ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - Passing a file-like object that inherits from - :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather - than sending an empty file. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionchanged:: 1.1 - ``filename`` may be a :class:`~os.PathLike` object. - - .. versionchanged:: 1.1 - Passing a :class:`~io.BytesIO` object supports range requests. - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.0 - UTF-8 filenames as specified in :rfc:`2231` are supported. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file - objects. If you want to use automatic MIME and etag support, - pass a filename via ``filename_or_fp`` or - ``attachment_filename``. - - .. versionchanged:: 0.12 - ``attachment_filename`` is preferred over ``filename`` for MIME - detection. - - .. versionchanged:: 0.9 - ``cache_timeout`` defaults to - :meth:`Flask.get_send_file_max_age`. - - .. versionchanged:: 0.7 - MIME guessing and etag support for file-like objects was - removed because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. - - .. versionchanged:: 0.5 - The ``add_etags``, ``cache_timeout`` and ``conditional`` - parameters were added. The default behavior is to add etags. - - .. versionadded:: 0.2 - """ - return werkzeug.utils.send_file( # type: ignore[return-value] - **_prepare_send_file_kwargs( - path_or_file=path_or_file, - environ=request.environ, - mimetype=mimetype, - as_attachment=as_attachment, - download_name=download_name, - conditional=conditional, - etag=etag, - last_modified=last_modified, - max_age=max_age, - ) - ) - - -def send_from_directory( - directory: os.PathLike[str] | str, - path: os.PathLike[str] | str, - **kwargs: t.Any, -) -> Response: - """Send a file from within a directory using :func:`send_file`. - - .. code-block:: python - - @app.route("/uploads/") - def download_file(name): - return send_from_directory( - app.config['UPLOAD_FOLDER'], name, as_attachment=True - ) - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under, - relative to the current application's root path. - :param path: The path to the file to send, relative to - ``directory``. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionchanged:: 2.0 - ``path`` replaces the ``filename`` parameter. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionadded:: 0.5 - """ - return werkzeug.utils.send_from_directory( # type: ignore[return-value] - directory, path, **_prepare_send_file_kwargs(**kwargs) - ) - - -def get_root_path(import_name: str) -> str: - """Find the root path of a package, or the path that contains a - module. If it cannot be found, returns the current working - directory. - - Not to be confused with the value returned by :func:`find_package`. - - :meta private: - """ - # Module already imported and has a file attribute. Use that first. - mod = sys.modules.get(import_name) - - if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: - return os.path.dirname(os.path.abspath(mod.__file__)) - - # Next attempt: check the loader. - try: - spec = importlib.util.find_spec(import_name) - - if spec is None: - raise ValueError - except (ImportError, ValueError): - loader = None - else: - loader = spec.loader - - # Loader does not exist or we're referring to an unloaded main - # module or a main module without path (interactive sessions), go - # with the current working directory. - if loader is None: - return os.getcwd() - - if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) - else: - # Fall back to imports. - __import__(import_name) - mod = sys.modules[import_name] - filepath = getattr(mod, "__file__", None) - - # If we don't have a file path it might be because it is a - # namespace package. In this case pick the root path from the - # first module that is contained in the package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided module" - f" {import_name!r}. This can happen because the module" - " came from an import hook that does not provide file" - " name information or because it's a namespace package." - " In this case the root path needs to be explicitly" - " provided." - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] - - -@lru_cache(maxsize=None) -def _split_blueprint_path(name: str) -> list[str]: - out: list[str] = [name] - - if "." in name: - out.extend(_split_blueprint_path(name.rpartition(".")[0])) - - return out diff --git a/lib/python3.12/site-packages/flask/json/__init__.py b/lib/python3.12/site-packages/flask/json/__init__.py deleted file mode 100644 index c0941d0..0000000 --- a/lib/python3.12/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - -from ..globals import current_app -from .provider import _default - -if t.TYPE_CHECKING: # pragma: no cover - from ..wrappers import Response - - -def dumps(obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dumps() ` - method, otherwise it will use :func:`json.dumps`. - - :param obj: The data to serialize. - :param kwargs: Arguments passed to the ``dumps`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dumps``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.dumps(obj, **kwargs) - - kwargs.setdefault("default", _default) - return _json.dumps(obj, **kwargs) - - -def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dump() ` - method, otherwise it will use :func:`json.dump`. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: Arguments passed to the ``dump`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dump``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - Writing to a binary file, and the ``encoding`` argument, will be - removed in Flask 2.1. - """ - if current_app: - current_app.json.dump(obj, fp, **kwargs) - else: - kwargs.setdefault("default", _default) - _json.dump(obj, fp, **kwargs) - - -def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.loads() ` - method, otherwise it will use :func:`json.loads`. - - :param s: Text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``loads`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.loads``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The data must be a - string or UTF-8 bytes. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.loads(s, **kwargs) - - return _json.loads(s, **kwargs) - - -def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.load() ` - method, otherwise it will use :func:`json.load`. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``load`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.load``, allowing an app to override - the behavior. - - .. versionchanged:: 2.2 - The ``app`` parameter will be removed in Flask 2.3. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The file must be text - mode, or binary mode with UTF-8 bytes. - """ - if current_app: - return current_app.json.load(fp, **kwargs) - - return _json.load(fp, **kwargs) - - -def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. A dict or list returned from a view will be converted to a - JSON response automatically without needing to call this. - - This requires an active request or application context, and calls - :meth:`app.json.response() `. - - In debug mode, the output is formatted with indentation to make it - easier to read. This may also be controlled by the provider. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - - .. versionchanged:: 2.2 - Calls ``current_app.json.response``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 0.11 - Added support for serializing top-level arrays. This was a - security risk in ancient browsers. See :ref:`security-json`. - - .. versionadded:: 0.2 - """ - return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3e9d461d526b11d17d576623b165d69b722ce8b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6698 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 diff --git a/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc b/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc deleted file mode 100644 index 528ff9dec25d106a4567c1d729578a9861263b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9265 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 to an instance of the class. - - :param app: An application instance. This will be stored as a - :class:`weakref.proxy` on the :attr:`_app` attribute. - - .. versionadded:: 2.2 - """ - - def __init__(self, app: App) -> None: - self._app: App = weakref.proxy(app) - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - :param obj: The data to serialize. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: May be passed to the underlying JSON library. - """ - fp.write(self.dumps(obj, **kwargs)) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - :param s: Text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - return self.loads(fp.read(), **kwargs) - - def _prepare_response_obj( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> t.Any: - if args and kwargs: - raise TypeError("app.json.response() takes either args or kwargs, not both") - - if not args and not kwargs: - return None - - if len(args) == 1: - return args[0] - - return args or kwargs - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. - - The :func:`~flask.json.jsonify` function calls this method for - the current application. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - return self._app.response_class(self.dumps(obj), mimetype="application/json") - - -def _default(o: t.Any) -> t.Any: - if isinstance(o, date): - return http_date(o) - - if isinstance(o, (decimal.Decimal, uuid.UUID)): - return str(o) - - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) - - if hasattr(o, "__html__"): - return str(o.__html__()) - - raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") - - -class DefaultJSONProvider(JSONProvider): - """Provide JSON operations using Python's built-in :mod:`json` - library. Serializes the following additional data types: - - - :class:`datetime.datetime` and :class:`datetime.date` are - serialized to :rfc:`822` strings. This is the same as the HTTP - date format. - - :class:`uuid.UUID` is serialized to a string. - - :class:`dataclasses.dataclass` is passed to - :func:`dataclasses.asdict`. - - :class:`~markupsafe.Markup` (or any object with a ``__html__`` - method) will call the ``__html__`` method to get a string. - """ - - default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] - """Apply this function to any object that :meth:`json.dumps` does - not know how to serialize. It should return a valid JSON type or - raise a ``TypeError``. - """ - - ensure_ascii = True - """Replace non-ASCII characters with escape sequences. This may be - more compatible with some clients, but can be disabled for better - performance and size. - """ - - sort_keys = True - """Sort the keys in any serialized dicts. This may be useful for - some caching situations, but can be disabled for better performance. - When enabled, keys must all be strings, they are not converted - before sorting. - """ - - compact: bool | None = None - """If ``True``, or ``None`` out of debug mode, the :meth:`response` - output will not add indentation, newlines, or spaces. If ``False``, - or ``None`` in debug mode, it will use a non-compact representation. - """ - - mimetype = "application/json" - """The mimetype set in :meth:`response`.""" - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON to a string. - - Keyword arguments are passed to :func:`json.dumps`. Sets some - parameter defaults from the :attr:`default`, - :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. - - :param obj: The data to serialize. - :param kwargs: Passed to :func:`json.dumps`. - """ - kwargs.setdefault("default", self.default) - kwargs.setdefault("ensure_ascii", self.ensure_ascii) - kwargs.setdefault("sort_keys", self.sort_keys) - return json.dumps(obj, **kwargs) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON from a string or bytes. - - :param s: Text or UTF-8 bytes. - :param kwargs: Passed to :func:`json.loads`. - """ - return json.loads(s, **kwargs) - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with it. The response mimetype - will be "application/json" and can be changed with - :attr:`mimetype`. - - If :attr:`compact` is ``False`` or debug mode is enabled, the - output will be formatted to be easier to read. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - dump_args: dict[str, t.Any] = {} - - if (self.compact is None and self._app.debug) or self.compact is False: - dump_args.setdefault("indent", 2) - else: - dump_args.setdefault("separators", (",", ":")) - - return self._app.response_class( - f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype - ) diff --git a/lib/python3.12/site-packages/flask/json/tag.py b/lib/python3.12/site-packages/flask/json/tag.py deleted file mode 100644 index 8dc3629..0000000 --- a/lib/python3.12/site-packages/flask/json/tag.py +++ /dev/null @@ -1,327 +0,0 @@ -""" -Tagged JSON -~~~~~~~~~~~ - -A compact representation for lossless serialization of non-standard JSON -types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this -to serialize the session data, but it may be useful in other places. It -can be extended to support other types. - -.. autoclass:: TaggedJSONSerializer - :members: - -.. autoclass:: JSONTag - :members: - -Let's see an example that adds support for -:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so -to handle this we will dump the items as a list of ``[key, value]`` -pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to -identify the type. The session serializer processes dicts first, so -insert the new tag at the front of the order since ``OrderedDict`` must -be processed before ``dict``. - -.. code-block:: python - - from flask.json.tag import JSONTag - - class TagOrderedDict(JSONTag): - __slots__ = ('serializer',) - key = ' od' - - def check(self, value): - return isinstance(value, OrderedDict) - - def to_json(self, value): - return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] - - def to_python(self, value): - return OrderedDict(value) - - app.session_interface.serializer.register(TagOrderedDict, index=0) -""" - -from __future__ import annotations - -import typing as t -from base64 import b64decode -from base64 import b64encode -from datetime import datetime -from uuid import UUID - -from markupsafe import Markup -from werkzeug.http import http_date -from werkzeug.http import parse_date - -from ..json import dumps -from ..json import loads - - -class JSONTag: - """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" - - __slots__ = ("serializer",) - - #: The tag to mark the serialized object with. If empty, this tag is - #: only used as an intermediate step during tagging. - key: str = "" - - def __init__(self, serializer: TaggedJSONSerializer) -> None: - """Create a tagger for the given serializer.""" - self.serializer = serializer - - def check(self, value: t.Any) -> bool: - """Check if the given value should be tagged by this tag.""" - raise NotImplementedError - - def to_json(self, value: t.Any) -> t.Any: - """Convert the Python object to an object that is a valid JSON type. - The tag will be added later.""" - raise NotImplementedError - - def to_python(self, value: t.Any) -> t.Any: - """Convert the JSON representation back to the correct type. The tag - will already be removed.""" - raise NotImplementedError - - def tag(self, value: t.Any) -> dict[str, t.Any]: - """Convert the value to a valid JSON type and add the tag structure - around it.""" - return {self.key: self.to_json(value)} - - -class TagDict(JSONTag): - """Tag for 1-item dicts whose only key matches a registered tag. - - Internally, the dict key is suffixed with `__`, and the suffix is removed - when deserializing. - """ - - __slots__ = () - key = " di" - - def check(self, value: t.Any) -> bool: - return ( - isinstance(value, dict) - and len(value) == 1 - and next(iter(value)) in self.serializer.tags - ) - - def to_json(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {f"{key}__": self.serializer.tag(value[key])} - - def to_python(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {key[:-2]: value[key]} - - -class PassDict(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, dict) - - def to_json(self, value: t.Any) -> t.Any: - # JSON objects may only have string keys, so don't bother tagging the - # key here. - return {k: self.serializer.tag(v) for k, v in value.items()} - - tag = to_json - - -class TagTuple(JSONTag): - __slots__ = () - key = " t" - - def check(self, value: t.Any) -> bool: - return isinstance(value, tuple) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - def to_python(self, value: t.Any) -> t.Any: - return tuple(value) - - -class PassList(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, list) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - tag = to_json - - -class TagBytes(JSONTag): - __slots__ = () - key = " b" - - def check(self, value: t.Any) -> bool: - return isinstance(value, bytes) - - def to_json(self, value: t.Any) -> t.Any: - return b64encode(value).decode("ascii") - - def to_python(self, value: t.Any) -> t.Any: - return b64decode(value) - - -class TagMarkup(JSONTag): - """Serialize anything matching the :class:`~markupsafe.Markup` API by - having a ``__html__`` method to the result of that method. Always - deserializes to an instance of :class:`~markupsafe.Markup`.""" - - __slots__ = () - key = " m" - - def check(self, value: t.Any) -> bool: - return callable(getattr(value, "__html__", None)) - - def to_json(self, value: t.Any) -> t.Any: - return str(value.__html__()) - - def to_python(self, value: t.Any) -> t.Any: - return Markup(value) - - -class TagUUID(JSONTag): - __slots__ = () - key = " u" - - def check(self, value: t.Any) -> bool: - return isinstance(value, UUID) - - def to_json(self, value: t.Any) -> t.Any: - return value.hex - - def to_python(self, value: t.Any) -> t.Any: - return UUID(value) - - -class TagDateTime(JSONTag): - __slots__ = () - key = " d" - - def check(self, value: t.Any) -> bool: - return isinstance(value, datetime) - - def to_json(self, value: t.Any) -> t.Any: - return http_date(value) - - def to_python(self, value: t.Any) -> t.Any: - return parse_date(value) - - -class TaggedJSONSerializer: - """Serializer that uses a tag system to compactly represent objects that - are not JSON types. Passed as the intermediate serializer to - :class:`itsdangerous.Serializer`. - - The following extra types are supported: - - * :class:`dict` - * :class:`tuple` - * :class:`bytes` - * :class:`~markupsafe.Markup` - * :class:`~uuid.UUID` - * :class:`~datetime.datetime` - """ - - __slots__ = ("tags", "order") - - #: Tag classes to bind when creating the serializer. Other tags can be - #: added later using :meth:`~register`. - default_tags = [ - TagDict, - PassDict, - TagTuple, - PassList, - TagBytes, - TagMarkup, - TagUUID, - TagDateTime, - ] - - def __init__(self) -> None: - self.tags: dict[str, JSONTag] = {} - self.order: list[JSONTag] = [] - - for cls in self.default_tags: - self.register(cls) - - def register( - self, - tag_class: type[JSONTag], - force: bool = False, - index: int | None = None, - ) -> None: - """Register a new tag with this serializer. - - :param tag_class: tag class to register. Will be instantiated with this - serializer instance. - :param force: overwrite an existing tag. If false (default), a - :exc:`KeyError` is raised. - :param index: index to insert the new tag in the tag order. Useful when - the new tag is a special case of an existing tag. If ``None`` - (default), the tag is appended to the end of the order. - - :raise KeyError: if the tag key is already registered and ``force`` is - not true. - """ - tag = tag_class(self) - key = tag.key - - if key: - if not force and key in self.tags: - raise KeyError(f"Tag '{key}' is already registered.") - - self.tags[key] = tag - - if index is None: - self.order.append(tag) - else: - self.order.insert(index, tag) - - def tag(self, value: t.Any) -> t.Any: - """Convert a value to a tagged representation if necessary.""" - for tag in self.order: - if tag.check(value): - return tag.tag(value) - - return value - - def untag(self, value: dict[str, t.Any]) -> t.Any: - """Convert a tagged representation back to the original type.""" - if len(value) != 1: - return value - - key = next(iter(value)) - - if key not in self.tags: - return value - - return self.tags[key].to_python(value[key]) - - def _untag_scan(self, value: t.Any) -> t.Any: - if isinstance(value, dict): - # untag each item recursively - value = {k: self._untag_scan(v) for k, v in value.items()} - # untag the dict itself - value = self.untag(value) - elif isinstance(value, list): - # untag each item recursively - value = [self._untag_scan(item) for item in value] - - return value - - def dumps(self, value: t.Any) -> str: - """Tag the value and dump it to a compact JSON string.""" - return dumps(self.tag(value), separators=(",", ":")) - - def loads(self, value: str) -> t.Any: - """Load data from a JSON string and deserialized any tagged objects.""" - return self._untag_scan(loads(value)) diff --git a/lib/python3.12/site-packages/flask/logging.py b/lib/python3.12/site-packages/flask/logging.py deleted file mode 100644 index 0cb8f43..0000000 --- a/lib/python3.12/site-packages/flask/logging.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -import logging -import sys -import typing as t - -from werkzeug.local import LocalProxy - -from .globals import request - -if t.TYPE_CHECKING: # pragma: no cover - from .sansio.app import App - - -@LocalProxy -def wsgi_errors_stream() -> t.TextIO: - """Find the most appropriate error stream for the application. If a request - is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. - - If you configure your own :class:`logging.StreamHandler`, you may want to - use this for the stream. If you are using file or dict configuration and - can't import this directly, you can refer to it as - ``ext://flask.logging.wsgi_errors_stream``. - """ - if request: - return request.environ["wsgi.errors"] # type: ignore[no-any-return] - - return sys.stderr - - -def has_level_handler(logger: logging.Logger) -> bool: - """Check if there is a handler in the logging chain that will handle the - given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. - """ - level = logger.getEffectiveLevel() - current = logger - - while current: - if any(handler.level <= level for handler in current.handlers): - return True - - if not current.propagate: - break - - current = current.parent # type: ignore - - return False - - -#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format -#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. -default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore -default_handler.setFormatter( - logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") -) - - -def create_logger(app: App) -> logging.Logger: - """Get the Flask app's logger and configure it if needed. - - The logger name will be the same as - :attr:`app.import_name `. - - When :attr:`~flask.Flask.debug` is enabled, set the logger level to - :data:`logging.DEBUG` if it is not set. - - If there is no handler for the logger's effective level, add a - :class:`~logging.StreamHandler` for - :func:`~flask.logging.wsgi_errors_stream` with a basic format. - """ - logger = logging.getLogger(app.name) - - if app.debug and not logger.level: - logger.setLevel(logging.DEBUG) - - if not has_level_handler(logger): - logger.addHandler(default_handler) - - return logger diff --git a/lib/python3.12/site-packages/flask/py.typed b/lib/python3.12/site-packages/flask/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/flask/sansio/README.md b/lib/python3.12/site-packages/flask/sansio/README.md deleted file mode 100644 index 623ac19..0000000 --- a/lib/python3.12/site-packages/flask/sansio/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sansio - -This folder contains code that can be used by alternative Flask -implementations, for example Quart. The code therefore cannot do any -IO, nor be part of a likely IO path. Finally this code cannot use the -Flask globals. diff --git a/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc b/lib/python3.12/site-packages/flask/sansio/__pycache__/app.cpython-312.pyc deleted file mode 100644 index ae8980389cc5f3792d93c5134131ae4a8e721940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33592 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 j^1-wDgJ&eOcm`==V+d9eO3pFS!9 diff --git a/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc b/lib/python3.12/site-packages/flask/sansio/__pycache__/blueprints.cpython-312.pyc deleted file mode 100644 index c60b95911e924c486f8c6c1827e24d28b1722572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31189 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 p%js>$_`jkNQX&8V diff --git a/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc b/lib/python3.12/site-packages/flask/sansio/__pycache__/scaffold.cpython-312.pyc deleted file mode 100644 index 158028df33c1d396169b0abd8fd948f84f74db91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30494 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 timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class App(Scaffold): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - #: The class of the object assigned to :attr:`aborter`, created by - #: :meth:`create_aborter`. That object is called by - #: :func:`flask.abort` to raise HTTP errors, and can be - #: called directly as well. - #: - #: Defaults to :class:`werkzeug.exceptions.Aborter`. - #: - #: .. versionadded:: 2.2 - aborter_class = Aborter - - #: The class that is used for the Jinja environment. - #: - #: .. versionadded:: 0.11 - jinja_environment = Environment - - #: The class that is used for the :data:`~flask.g` instance. - #: - #: Example use cases for a custom class: - #: - #: 1. Store arbitrary attributes on flask.g. - #: 2. Add a property for lazy per-request database connectors. - #: 3. Return None instead of AttributeError on unexpected attributes. - #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. - #: - #: In Flask 0.9 this property was called `request_globals_class` but it - #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the - #: flask.g object is now application context scoped. - #: - #: .. versionadded:: 0.10 - app_ctx_globals_class = _AppCtxGlobals - - #: The class that is used for the ``config`` attribute of this app. - #: Defaults to :class:`~flask.Config`. - #: - #: Example use cases for a custom class: - #: - #: 1. Default values for certain config options. - #: 2. Access to config values through attributes in addition to keys. - #: - #: .. versionadded:: 0.11 - config_class = Config - - #: The testing flag. Set this to ``True`` to enable the test mode of - #: Flask extensions (and in the future probably also Flask itself). - #: For example this might activate test helpers that have an - #: additional runtime cost which should not be enabled by default. - #: - #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the - #: default it's implicitly enabled. - #: - #: This attribute can also be configured from the config with the - #: ``TESTING`` configuration key. Defaults to ``False``. - testing = ConfigAttribute[bool]("TESTING") - - #: If a secret key is set, cryptographic components can use this to - #: sign cookies and other things. Set this to a complex random value - #: when you want to use the secure cookie for instance. - #: - #: This attribute can also be configured from the config with the - #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. - secret_key = ConfigAttribute[t.Union[str, bytes, None]]("SECRET_KEY") - - #: A :class:`~datetime.timedelta` which is used to set the expiration - #: date of a permanent session. The default is 31 days which makes a - #: permanent session survive for roughly one month. - #: - #: This attribute can also be configured from the config with the - #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to - #: ``timedelta(days=31)`` - permanent_session_lifetime = ConfigAttribute[timedelta]( - "PERMANENT_SESSION_LIFETIME", - get_converter=_make_timedelta, # type: ignore[arg-type] - ) - - json_provider_class: type[JSONProvider] = DefaultJSONProvider - """A subclass of :class:`~flask.json.provider.JSONProvider`. An - instance is created and assigned to :attr:`app.json` when creating - the app. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses - Python's built-in :mod:`json` library. A different provider can use - a different JSON library. - - .. versionadded:: 2.2 - """ - - #: Options that are passed to the Jinja environment in - #: :meth:`create_jinja_environment`. Changing these options after - #: the environment is created (accessing :attr:`jinja_env`) will - #: have no effect. - #: - #: .. versionchanged:: 1.1.0 - #: This is a ``dict`` instead of an ``ImmutableDict`` to allow - #: easier configuration. - #: - jinja_options: dict[str, t.Any] = {} - - #: The rule object to use for URL rules created. This is used by - #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. - #: - #: .. versionadded:: 0.7 - url_rule_class = Rule - - #: The map object to use for storing the URL rules and routing - #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. - #: - #: .. versionadded:: 1.1.0 - url_map_class = Map - - #: The :meth:`test_client` method creates an instance of this test - #: client class. Defaults to :class:`~flask.testing.FlaskClient`. - #: - #: .. versionadded:: 0.7 - test_client_class: type[FlaskClient] | None = None - - #: The :class:`~click.testing.CliRunner` subclass, by default - #: :class:`~flask.testing.FlaskCliRunner` that is used by - #: :meth:`test_cli_runner`. Its ``__init__`` method should take a - #: Flask app object as the first argument. - #: - #: .. versionadded:: 1.0 - test_cli_runner_class: type[FlaskCliRunner] | None = None - - default_config: dict[str, t.Any] - response_class: type[Response] - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if instance_path is None: - instance_path = self.auto_find_instance_path() - elif not os.path.isabs(instance_path): - raise ValueError( - "If an instance path is provided it must be absolute." - " A relative path was given instead." - ) - - #: Holds the path to the instance folder. - #: - #: .. versionadded:: 0.8 - self.instance_path = instance_path - - #: The configuration dictionary as :class:`Config`. This behaves - #: exactly like a regular dictionary but supports additional methods - #: to load a config from files. - self.config = self.make_config(instance_relative_config) - - #: An instance of :attr:`aborter_class` created by - #: :meth:`make_aborter`. This is called by :func:`flask.abort` - #: to raise HTTP errors, and can be called directly as well. - #: - #: .. versionadded:: 2.2 - #: Moved from ``flask.abort``, which calls this object. - self.aborter = self.make_aborter() - - self.json: JSONProvider = self.json_provider_class(self) - """Provides access to JSON methods. Functions in ``flask.json`` - will call methods on this provider when the application context - is active. Used for handling JSON requests and responses. - - An instance of :attr:`json_provider_class`. Can be customized by - changing that attribute on a subclass, or by assigning to this - attribute afterwards. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, - uses Python's built-in :mod:`json` library. A different provider - can use a different JSON library. - - .. versionadded:: 2.2 - """ - - #: A list of functions that are called by - #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function is called - #: with ``error``, ``endpoint`` and ``values``. If a function - #: returns ``None`` or raises a ``BuildError``, it is skipped. - #: Otherwise, its return value is returned by ``url_for``. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers: list[ - t.Callable[[Exception, str, dict[str, t.Any]], str] - ] = [] - - #: A list of functions that are called when the application context - #: is destroyed. Since the application context is also torn down - #: if the request ends this is the place to store code that disconnects - #: from databases. - #: - #: .. versionadded:: 0.9 - self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] - - #: Maps registered blueprint names to blueprint objects. The - #: dict retains the order the blueprints were registered in. - #: Blueprints can be registered multiple times, this dict does - #: not track how often they were attached. - #: - #: .. versionadded:: 0.7 - self.blueprints: dict[str, Blueprint] = {} - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. - #: - #: The key must match the name of the extension module. For example in - #: case of a "Flask-Foo" extension in `flask_foo`, the key would be - #: ``'foo'``. - #: - #: .. versionadded:: 0.7 - self.extensions: dict[str, t.Any] = {} - - #: The :class:`~werkzeug.routing.Map` for this instance. You can use - #: this to change the routing converters after the class was created - #: but before any routes are connected. Example:: - #: - #: from werkzeug.routing import BaseConverter - #: - #: class ListConverter(BaseConverter): - #: def to_python(self, value): - #: return value.split(',') - #: def to_url(self, values): - #: return ','.join(super(ListConverter, self).to_url(value) - #: for value in values) - #: - #: app = Flask(__name__) - #: app.url_map.converters['list'] = ListConverter - self.url_map = self.url_map_class(host_matching=host_matching) - - self.subdomain_matching = subdomain_matching - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_first_request: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called" - " on the application. It has already handled its first" - " request, any changes will not be applied" - " consistently.\n" - "Make sure all imports, decorators, functions, etc." - " needed to set up the application are done before" - " running it." - ) - - @cached_property - def name(self) -> str: # type: ignore - """The name of the application. This is usually the import name - with the difference that it's guessed from the run file if the - import name is main. This name is used as a display name when - Flask needs the name of the application. It can be set and overridden - to change the value. - - .. versionadded:: 0.8 - """ - if self.import_name == "__main__": - fn: str | None = getattr(sys.modules["__main__"], "__file__", None) - if fn is None: - return "__main__" - return os.path.splitext(os.path.basename(fn))[0] - return self.import_name - - @cached_property - def logger(self) -> logging.Logger: - """A standard Python :class:`~logging.Logger` for the app, with - the same name as :attr:`name`. - - In debug mode, the logger's :attr:`~logging.Logger.level` will - be set to :data:`~logging.DEBUG`. - - If there are no handlers configured, a default handler will be - added. See :doc:`/logging` for more information. - - .. versionchanged:: 1.1.0 - The logger takes the same name as :attr:`name` rather than - hard-coding ``"flask.app"``. - - .. versionchanged:: 1.0.0 - Behavior was simplified. The logger is always named - ``"flask.app"``. The level is only set during configuration, - it doesn't check ``app.debug`` each time. Only one format is - used, not different ones depending on ``app.debug``. No - handlers are removed, and a handler is only added if no - handlers are already configured. - - .. versionadded:: 0.3 - """ - return create_logger(self) - - @cached_property - def jinja_env(self) -> Environment: - """The Jinja environment used to load templates. - - The environment is created the first time this property is - accessed. Changing :attr:`jinja_options` after that will have no - effect. - """ - return self.create_jinja_environment() - - def create_jinja_environment(self) -> Environment: - raise NotImplementedError() - - def make_config(self, instance_relative: bool = False) -> Config: - """Used to create the config attribute by the Flask constructor. - The `instance_relative` parameter is passed in from the constructor - of Flask (there named `instance_relative_config`) and indicates if - the config should be relative to the instance path or the root path - of the application. - - .. versionadded:: 0.8 - """ - root_path = self.root_path - if instance_relative: - root_path = self.instance_path - defaults = dict(self.default_config) - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def make_aborter(self) -> Aborter: - """Create the object to assign to :attr:`aborter`. That object - is called by :func:`flask.abort` to raise HTTP errors, and can - be called directly as well. - - By default, this creates an instance of :attr:`aborter_class`, - which defaults to :class:`werkzeug.exceptions.Aborter`. - - .. versionadded:: 2.2 - """ - return self.aborter_class() - - def auto_find_instance_path(self) -> str: - """Tries to locate the instance path if it was not provided to the - constructor of the application class. It will basically calculate - the path to a folder named ``instance`` next to your main file or - the package. - - .. versionadded:: 0.8 - """ - prefix, package_path = find_package(self.import_name) - if prefix is None: - return os.path.join(package_path, "instance") - return os.path.join(prefix, "var", f"{self.name}-instance") - - def create_global_jinja_loader(self) -> DispatchingJinjaLoader: - """Creates the loader for the Jinja2 environment. Can be used to - override just the loader and keeping the rest unchanged. It's - discouraged to override this function. Instead one should override - the :meth:`jinja_loader` function instead. - - The global loader dispatches between the loaders of the application - and the individual blueprints. - - .. versionadded:: 0.7 - """ - return DispatchingJinjaLoader(self) - - def select_jinja_autoescape(self, filename: str) -> bool: - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionchanged:: 2.2 - Autoescaping is now enabled by default for ``.svg`` files. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) - - @property - def debug(self) -> bool: - """Whether debug mode is enabled. When using ``flask run`` to start the - development server, an interactive debugger will be shown for unhandled - exceptions, and the server will be reloaded when code changes. This maps to the - :data:`DEBUG` config key. It may not behave as expected if set late. - - **Do not enable debug mode when deploying in production.** - - Default: ``False`` - """ - return self.config["DEBUG"] # type: ignore[no-any-return] - - @debug.setter - def debug(self, value: bool) -> None: - self.config["DEBUG"] = value - - if self.config["TEMPLATES_AUTO_RELOAD"] is None: - self.jinja_env.auto_reload = value - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on the application. Keyword - arguments passed to this method will override the defaults set on the - blueprint. - - Calls the blueprint's :meth:`~flask.Blueprint.register` method after - recording the blueprint in the application's :attr:`blueprints`. - - :param blueprint: The blueprint to register. - :param url_prefix: Blueprint routes will be prefixed with this. - :param subdomain: Blueprint routes will match on this subdomain. - :param url_defaults: Blueprint routes will use these default values for - view arguments. - :param options: Additional keyword arguments are passed to - :class:`~flask.blueprints.BlueprintSetupState`. They can be - accessed in :meth:`~flask.Blueprint.record` callbacks. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 0.7 - """ - blueprint.register(self, options) - - def iter_blueprints(self) -> t.ValuesView[Blueprint]: - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return self.blueprints.values() - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - options["endpoint"] = endpoint - methods = options.pop("methods", None) - - # if the methods are not given and the view_func object knows its - # methods we can use that instead. If neither exists, we go with - # a tuple of only ``GET`` as default. - if methods is None: - methods = getattr(view_func, "methods", None) or ("GET",) - if isinstance(methods, str): - raise TypeError( - "Allowed methods must be a list of strings, for" - ' example: @app.route(..., methods=["POST"])' - ) - methods = {item.upper() for item in methods} - - # Methods that should always be added - required_methods = set(getattr(view_func, "required_methods", ())) - - # starting with Flask 0.8 the view_func object can disable and - # force-enable the automatic options handling. - if provide_automatic_options is None: - provide_automatic_options = getattr( - view_func, "provide_automatic_options", None - ) - - if provide_automatic_options is None: - if "OPTIONS" not in methods: - provide_automatic_options = True - required_methods.add("OPTIONS") - else: - provide_automatic_options = False - - # Add the required methods now. - methods |= required_methods - - rule_obj = self.url_rule_class(rule, methods=methods, **options) - rule_obj.provide_automatic_options = provide_automatic_options # type: ignore[attr-defined] - - self.url_map.add(rule_obj) - if view_func is not None: - old_func = self.view_functions.get(endpoint) - if old_func is not None and old_func != view_func: - raise AssertionError( - "View function mapping is overwriting an existing" - f" endpoint function: {endpoint}" - ) - self.view_functions[endpoint] = view_func - - @setupmethod - def template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """A decorator that is used to register custom template filter. - You can specify a name for the filter, otherwise the function - name will be used. Example:: - - @app.template_filter() - def reverse(s): - return s[::-1] - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a custom template filter. Works exactly like the - :meth:`template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - self.jinja_env.filters[name or f.__name__] = f - - @setupmethod - def template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """A decorator that is used to register custom template test. - You can specify a name for the test, otherwise the function - name will be used. Example:: - - @app.template_test() - def is_prime(n): - if n == 2: - return True - for i in range(2, int(math.ceil(math.sqrt(n))) + 1): - if n % i == 0: - return False - return True - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a custom template test. Works exactly like the - :meth:`template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - self.jinja_env.tests[name or f.__name__] = f - - @setupmethod - def template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """A decorator that is used to register a custom template global function. - You can specify a name for the global function, otherwise the function - name will be used. Example:: - - @app.template_global() - def double(n): - return 2 * n - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a custom template global function. Works exactly like the - :meth:`template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - self.jinja_env.globals[name or f.__name__] = f - - @setupmethod - def teardown_appcontext(self, f: T_teardown) -> T_teardown: - """Registers a function to be called when the application - context is popped. The application context is typically popped - after the request context for each request, at the end of CLI - commands, or after a manually pushed context ends. - - .. code-block:: python - - with app.app_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the app context is - made inactive. Since a request context typically also manages an - application context it would also be called when you pop a - request context. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def shell_context_processor( - self, f: T_shell_context_processor - ) -> T_shell_context_processor: - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - def _find_error_handler( - self, e: Exception, blueprints: list[str] - ) -> ft.ErrorHandlerCallable | None: - """Return a registered error handler for an exception in this order: - blueprint handler for a specific code, app handler for a specific code, - blueprint handler for an exception class, app handler for an exception - class, or ``None`` if a suitable handler is not found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - names = (*blueprints, None) - - for c in (code, None) if code is not None else (None,): - for name in names: - handler_map = self.error_handler_spec[name][c] - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - return None - - def trap_http_exception(self, e: Exception) -> bool: - """Checks if an HTTP exception should be trapped or not. By default - this will return ``False`` for all exceptions except for a bad request - key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It - also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. - - This is called for all HTTP exceptions raised by a view function. - If it returns ``True`` for any exception the error handler for this - exception is not called and it shows up as regular exception in the - traceback. This is helpful for debugging implicitly raised HTTP - exceptions. - - .. versionchanged:: 1.0 - Bad request errors are not trapped by default in debug mode. - - .. versionadded:: 0.8 - """ - if self.config["TRAP_HTTP_EXCEPTIONS"]: - return True - - trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] - - # if unset, trap key errors in debug mode - if ( - trap_bad_request is None - and self.debug - and isinstance(e, BadRequestKeyError) - ): - return True - - if trap_bad_request: - return isinstance(e, BadRequest) - - return False - - def should_ignore_error(self, error: BaseException | None) -> bool: - """This is called to figure out if an error should be ignored - or not as far as the teardown system is concerned. If this - function returns ``True`` then the teardown handlers will not be - passed the error. - - .. versionadded:: 0.10 - """ - return False - - def redirect(self, location: str, code: int = 302) -> BaseResponse: - """Create a redirect response object. - - This is called by :func:`flask.redirect`, and can be called - directly as well. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - - .. versionadded:: 2.2 - Moved from ``flask.redirect``, which calls this method. - """ - return _wz_redirect( - location, - code=code, - Response=self.response_class, # type: ignore[arg-type] - ) - - def inject_url_defaults(self, endpoint: str, values: dict[str, t.Any]) -> None: - """Injects the URL defaults for the given endpoint directly into - the values dictionary passed. This is used internally and - automatically called on URL building. - - .. versionadded:: 0.7 - """ - names: t.Iterable[str | None] = (None,) - - # url_for may be called outside a request context, parse the - # passed endpoint instead of using request.blueprints. - if "." in endpoint: - names = chain( - names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) - ) - - for name in names: - if name in self.url_default_functions: - for func in self.url_default_functions[name]: - func(endpoint, values) - - def handle_url_build_error( - self, error: BuildError, endpoint: str, values: dict[str, t.Any] - ) -> str: - """Called by :meth:`.url_for` if a - :exc:`~werkzeug.routing.BuildError` was raised. If this returns - a value, it will be returned by ``url_for``, otherwise the error - will be re-raised. - - Each function in :attr:`url_build_error_handlers` is called with - ``error``, ``endpoint`` and ``values``. If a function returns - ``None`` or raises a ``BuildError``, it is skipped. Otherwise, - its return value is returned by ``url_for``. - - :param error: The active ``BuildError`` being handled. - :param endpoint: The endpoint being built. - :param values: The keyword arguments passed to ``url_for``. - """ - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - except BuildError as e: - # make error available outside except block - error = e - else: - if rv is not None: - return rv - - # Re-raise if called with an active exception, otherwise raise - # the passed in exception. - if error is sys.exc_info()[1]: - raise - - raise error diff --git a/lib/python3.12/site-packages/flask/sansio/blueprints.py b/lib/python3.12/site-packages/flask/sansio/blueprints.py deleted file mode 100644 index 4f912cc..0000000 --- a/lib/python3.12/site-packages/flask/sansio/blueprints.py +++ /dev/null @@ -1,632 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from .. import typing as ft -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from .app import App - -DeferredSetupFunction = t.Callable[["BlueprintSetupState"], None] -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) - - -class BlueprintSetupState: - """Temporary holder object for registering a blueprint with the - application. An instance of this class is created by the - :meth:`~flask.Blueprint.make_setup_state` method and later passed - to all register callback functions. - """ - - def __init__( - self, - blueprint: Blueprint, - app: App, - options: t.Any, - first_registration: bool, - ) -> None: - #: a reference to the current application - self.app = app - - #: a reference to the blueprint that created this setup state. - self.blueprint = blueprint - - #: a dictionary with all options that were passed to the - #: :meth:`~flask.Flask.register_blueprint` method. - self.options = options - - #: as blueprints can be registered multiple times with the - #: application and not everything wants to be registered - #: multiple times on it, this attribute can be used to figure - #: out if the blueprint was registered in the past already. - self.first_registration = first_registration - - subdomain = self.options.get("subdomain") - if subdomain is None: - subdomain = self.blueprint.subdomain - - #: The subdomain that the blueprint should be active for, ``None`` - #: otherwise. - self.subdomain = subdomain - - url_prefix = self.options.get("url_prefix") - if url_prefix is None: - url_prefix = self.blueprint.url_prefix - #: The prefix that should be used for all URLs defined on the - #: blueprint. - self.url_prefix = url_prefix - - self.name = self.options.get("name", blueprint.name) - self.name_prefix = self.options.get("name_prefix", "") - - #: A dictionary with URL defaults that is added to each and every - #: URL that was defined with the blueprint. - self.url_defaults = dict(self.blueprint.url_values_defaults) - self.url_defaults.update(self.options.get("url_defaults", ())) - - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - **options: t.Any, - ) -> None: - """A helper method to register a rule (and optionally a view function) - to the application. The endpoint is automatically prefixed with the - blueprint's name. - """ - if self.url_prefix is not None: - if rule: - rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) - else: - rule = self.url_prefix - options.setdefault("subdomain", self.subdomain) - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - - self.app.add_url_rule( - rule, - f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), - view_func, - defaults=defaults, - **options, - ) - - -class Blueprint(Scaffold): - """Represents a blueprint, a collection of routes and other - app-related functions that can be registered on a real application - later. - - A blueprint is an object that allows defining application functions - without requiring an application object ahead of time. It uses the - same decorators as :class:`~flask.Flask`, but defers the need for an - application by recording them for later registration. - - Decorating a function with a blueprint creates a deferred function - that is called with :class:`~flask.blueprints.BlueprintSetupState` - when the blueprint is registered on an application. - - See :doc:`/blueprints` for more information. - - :param name: The name of the blueprint. Will be prepended to each - endpoint name. - :param import_name: The name of the blueprint package, usually - ``__name__``. This helps locate the ``root_path`` for the - blueprint. - :param static_folder: A folder with static files that should be - served by the blueprint's static route. The path is relative to - the blueprint's root path. Blueprint static files are disabled - by default. - :param static_url_path: The url to serve static files from. - Defaults to ``static_folder``. If the blueprint does not have - a ``url_prefix``, the app's static route will take precedence, - and the blueprint's static files won't be accessible. - :param template_folder: A folder with templates that should be added - to the app's template search path. The path is relative to the - blueprint's root path. Blueprint templates are disabled by - default. Blueprint templates have a lower precedence than those - in the app's templates folder. - :param url_prefix: A path to prepend to all of the blueprint's URLs, - to make them distinct from the rest of the app's routes. - :param subdomain: A subdomain that blueprint routes will match on by - default. - :param url_defaults: A dict of default values that blueprint routes - will receive by default. - :param root_path: By default, the blueprint will automatically set - this based on ``import_name``. In certain situations this - automatic detection can fail, so the path can be specified - manually instead. - - .. versionchanged:: 1.1.0 - Blueprints have a ``cli`` group to register nested CLI commands. - The ``cli_group`` parameter controls the name of the group under - the ``flask`` command. - - .. versionadded:: 0.7 - """ - - _got_registered_once = False - - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore[assignment] - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if not name: - raise ValueError("'name' may not be empty.") - - if "." in name: - raise ValueError("'name' may not contain a dot '.' character.") - - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.deferred_functions: list[DeferredSetupFunction] = [] - - if url_defaults is None: - url_defaults = {} - - self.url_values_defaults = url_defaults - self.cli_group = cli_group - self._blueprints: list[tuple[Blueprint, dict[str, t.Any]]] = [] - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_registered_once: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called on the blueprint" - f" '{self.name}'. It has already been registered at least once, any" - " changes will not be applied consistently.\n" - "Make sure all imports, decorators, functions, etc. needed to set up" - " the blueprint are done before registering it." - ) - - @setupmethod - def record(self, func: DeferredSetupFunction) -> None: - """Registers a function that is called when the blueprint is - registered on the application. This function is called with the - state as argument as returned by the :meth:`make_setup_state` - method. - """ - self.deferred_functions.append(func) - - @setupmethod - def record_once(self, func: DeferredSetupFunction) -> None: - """Works like :meth:`record` but wraps the function in another - function that will ensure the function is only called once. If the - blueprint is registered a second time on the application, the - function passed is not called. - """ - - def wrapper(state: BlueprintSetupState) -> None: - if state.first_registration: - func(state) - - self.record(update_wrapper(wrapper, func)) - - def make_setup_state( - self, app: App, options: dict[str, t.Any], first_registration: bool = False - ) -> BlueprintSetupState: - """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` - object that is later passed to the register callback functions. - Subclasses can override this to return a subclass of the setup state. - """ - return BlueprintSetupState(self, app, options, first_registration) - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on this blueprint. Keyword - arguments passed to this method will override the defaults set - on the blueprint. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 2.0 - """ - if blueprint is self: - raise ValueError("Cannot register a blueprint on itself") - self._blueprints.append((blueprint, options)) - - def register(self, app: App, options: dict[str, t.Any]) -> None: - """Called by :meth:`Flask.register_blueprint` to register all - views and callbacks registered on the blueprint with the - application. Creates a :class:`.BlueprintSetupState` and calls - each :meth:`record` callback with it. - - :param app: The application this blueprint is being registered - with. - :param options: Keyword arguments forwarded from - :meth:`~Flask.register_blueprint`. - - .. versionchanged:: 2.3 - Nested blueprints now correctly apply subdomains. - - .. versionchanged:: 2.1 - Registering the same blueprint with the same name multiple - times is an error. - - .. versionchanged:: 2.0.1 - Nested blueprints are registered with their dotted name. - This allows different blueprints with the same name to be - nested at different locations. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - """ - name_prefix = options.get("name_prefix", "") - self_name = options.get("name", self.name) - name = f"{name_prefix}.{self_name}".lstrip(".") - - if name in app.blueprints: - bp_desc = "this" if app.blueprints[name] is self else "a different" - existing_at = f" '{name}'" if self_name != name else "" - - raise ValueError( - f"The name '{self_name}' is already registered for" - f" {bp_desc} blueprint{existing_at}. Use 'name=' to" - f" provide a unique name." - ) - - first_bp_registration = not any(bp is self for bp in app.blueprints.values()) - first_name_registration = name not in app.blueprints - - app.blueprints[name] = self - self._got_registered_once = True - state = self.make_setup_state(app, options, first_bp_registration) - - if self.has_static_folder: - state.add_url_rule( - f"{self.static_url_path}/", - view_func=self.send_static_file, # type: ignore[attr-defined] - endpoint="static", - ) - - # Merge blueprint data into parent. - if first_bp_registration or first_name_registration: - self._merge_blueprint_funcs(app, name) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if self.cli.commands: - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - for blueprint, bp_options in self._blueprints: - bp_options = bp_options.copy() - bp_url_prefix = bp_options.get("url_prefix") - bp_subdomain = bp_options.get("subdomain") - - if bp_subdomain is None: - bp_subdomain = blueprint.subdomain - - if state.subdomain is not None and bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain + "." + state.subdomain - elif bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain - elif state.subdomain is not None: - bp_options["subdomain"] = state.subdomain - - if bp_url_prefix is None: - bp_url_prefix = blueprint.url_prefix - - if state.url_prefix is not None and bp_url_prefix is not None: - bp_options["url_prefix"] = ( - state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") - ) - elif bp_url_prefix is not None: - bp_options["url_prefix"] = bp_url_prefix - elif state.url_prefix is not None: - bp_options["url_prefix"] = state.url_prefix - - bp_options["name_prefix"] = name - blueprint.register(app, bp_options) - - def _merge_blueprint_funcs(self, app: App, name: str) -> None: - def extend( - bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - ) -> None: - for key, values in bp_dict.items(): - key = name if key is None else f"{name}.{key}" - parent_dict[key].extend(values) - - for key, value in self.error_handler_spec.items(): - key = name if key is None else f"{name}.{key}" - value = defaultdict( - dict, - { - code: {exc_class: func for exc_class, func in code_values.items()} - for code, code_values in value.items() - }, - ) - app.error_handler_spec[key] = value - - for endpoint, func in self.view_functions.items(): - app.view_functions[endpoint] = func - - extend(self.before_request_funcs, app.before_request_funcs) - extend(self.after_request_funcs, app.after_request_funcs) - extend( - self.teardown_request_funcs, - app.teardown_request_funcs, - ) - extend(self.url_default_functions, app.url_default_functions) - extend(self.url_value_preprocessors, app.url_value_preprocessors) - extend(self.template_context_processors, app.template_context_processors) - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for - full documentation. - - The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, - used with :func:`url_for`, is prefixed with the blueprint's name. - """ - if endpoint and "." in endpoint: - raise ValueError("'endpoint' may not contain a dot '.' character.") - - if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: - raise ValueError("'view_func' name may not contain a dot '.' character.") - - self.record( - lambda s: s.add_url_rule( - rule, - endpoint, - view_func, - provide_automatic_options=provide_automatic_options, - **options, - ) - ) - - @setupmethod - def app_template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """Register a template filter, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_app_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a template filter, available in any template rendered by the - application. Works like the :meth:`app_template_filter` decorator. Equivalent to - :meth:`.Flask.add_template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """Register a template test, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_app_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a template test, available in any template rendered by the - application. Works like the :meth:`app_template_test` decorator. Equivalent to - :meth:`.Flask.add_template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """Register a template global, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_app_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a template global, available in any template rendered by the - application. Works like the :meth:`app_template_global` decorator. Equivalent to - :meth:`.Flask.add_template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def before_app_request(self, f: T_before_request) -> T_before_request: - """Like :meth:`before_request`, but before every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.before_request`. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def after_app_request(self, f: T_after_request) -> T_after_request: - """Like :meth:`after_request`, but after every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.after_request`. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def teardown_app_request(self, f: T_teardown) -> T_teardown: - """Like :meth:`teardown_request`, but after every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_context_processor( - self, f: T_template_context_processor - ) -> T_template_context_processor: - """Like :meth:`context_processor`, but for templates rendered by every view, not - only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_errorhandler( - self, code: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Like :meth:`errorhandler`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.errorhandler`. - """ - - def decorator(f: T_error_handler) -> T_error_handler: - def from_blueprint(state: BlueprintSetupState) -> None: - state.app.errorhandler(code)(f) - - self.record_once(from_blueprint) - return f - - return decorator - - @setupmethod - def app_url_value_preprocessor( - self, f: T_url_value_preprocessor - ) -> T_url_value_preprocessor: - """Like :meth:`url_value_preprocessor`, but for every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Like :meth:`url_defaults`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.url_defaults`. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f diff --git a/lib/python3.12/site-packages/flask/sansio/scaffold.py b/lib/python3.12/site-packages/flask/sansio/scaffold.py deleted file mode 100644 index 69e33a0..0000000 --- a/lib/python3.12/site-packages/flask/sansio/scaffold.py +++ /dev/null @@ -1,801 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import pathlib -import sys -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from jinja2 import BaseLoader -from jinja2 import FileSystemLoader -from werkzeug.exceptions import default_exceptions -from werkzeug.exceptions import HTTPException -from werkzeug.utils import cached_property - -from .. import typing as ft -from ..helpers import get_root_path -from ..templating import _default_template_ctx_processor - -if t.TYPE_CHECKING: # pragma: no cover - from click import Group - -# a singleton sentinel value for parameter defaults -_sentinel = object() - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) -T_route = t.TypeVar("T_route", bound=ft.RouteCallable) - - -def setupmethod(f: F) -> F: - f_name = f.__name__ - - def wrapper_func(self: Scaffold, *args: t.Any, **kwargs: t.Any) -> t.Any: - self._check_setup_finished(f_name) - return f(self, *args, **kwargs) - - return t.cast(F, update_wrapper(wrapper_func, f)) - - -class Scaffold: - """Common behavior shared between :class:`~flask.Flask` and - :class:`~flask.blueprints.Blueprint`. - - :param import_name: The import name of the module where this object - is defined. Usually :attr:`__name__` should be used. - :param static_folder: Path to a folder of static files to serve. - If this is set, a static route will be added. - :param static_url_path: URL prefix for the static route. - :param template_folder: Path to a folder containing template files. - for rendering. If this is set, a Jinja loader will be added. - :param root_path: The path that static, template, and resource files - are relative to. Typically not set, it is discovered based on - the ``import_name``. - - .. versionadded:: 2.0 - """ - - cli: Group - name: str - _static_folder: str | None = None - _static_url_path: str | None = None - - def __init__( - self, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - root_path: str | None = None, - ): - #: The name of the package or module that this object belongs - #: to. Do not change this once it is set by the constructor. - self.import_name = import_name - - self.static_folder = static_folder # type: ignore - self.static_url_path = static_url_path - - #: The path to the templates folder, relative to - #: :attr:`root_path`, to add to the template loader. ``None`` if - #: templates should not be added. - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - #: Absolute path to the package on the filesystem. Used to look - #: up resources contained in the package. - self.root_path = root_path - - #: A dictionary mapping endpoint names to view functions. - #: - #: To register a view function, use the :meth:`route` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.view_functions: dict[str, ft.RouteCallable] = {} - - #: A data structure of registered error handlers, in the format - #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is - #: the name of a blueprint the handlers are active for, or - #: ``None`` for all requests. The ``code`` key is the HTTP - #: status code for ``HTTPException``, or ``None`` for - #: other exceptions. The innermost dictionary maps exception - #: classes to handler functions. - #: - #: To register an error handler, use the :meth:`errorhandler` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.error_handler_spec: dict[ - ft.AppOrBlueprintKey, - dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], - ] = defaultdict(lambda: defaultdict(dict)) - - #: A data structure of functions to call at the beginning of - #: each request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`before_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.before_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`after_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.after_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.AfterRequestCallable[t.Any]] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request even if an exception is raised, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`teardown_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.teardown_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.TeardownCallable] - ] = defaultdict(list) - - #: A data structure of functions to call to pass extra context - #: values when rendering templates, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`context_processor` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.template_context_processors: dict[ - ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] - ] = defaultdict(list, {None: [_default_template_ctx_processor]}) - - #: A data structure of functions to call to modify the keyword - #: arguments passed to the view function, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the - #: :meth:`url_value_preprocessor` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_value_preprocessors: dict[ - ft.AppOrBlueprintKey, - list[ft.URLValuePreprocessorCallable], - ] = defaultdict(list) - - #: A data structure of functions to call to modify the keyword - #: arguments when generating URLs, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`url_defaults` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_default_functions: dict[ - ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] - ] = defaultdict(list) - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.name!r}>" - - def _check_setup_finished(self, f_name: str) -> None: - raise NotImplementedError - - @property - def static_folder(self) -> str | None: - """The absolute path to the configured static folder. ``None`` - if no static folder is set. - """ - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - else: - return None - - @static_folder.setter - def static_folder(self, value: str | os.PathLike[str] | None) -> None: - if value is not None: - value = os.fspath(value).rstrip(r"\/") - - self._static_folder = value - - @property - def has_static_folder(self) -> bool: - """``True`` if :attr:`static_folder` is set. - - .. versionadded:: 0.5 - """ - return self.static_folder is not None - - @property - def static_url_path(self) -> str | None: - """The URL prefix that the static route will be accessible from. - - If it was not configured during init, it is derived from - :attr:`static_folder`. - """ - if self._static_url_path is not None: - return self._static_url_path - - if self.static_folder is not None: - basename = os.path.basename(self.static_folder) - return f"/{basename}".rstrip("/") - - return None - - @static_url_path.setter - def static_url_path(self, value: str | None) -> None: - if value is not None: - value = value.rstrip("/") - - self._static_url_path = value - - @cached_property - def jinja_loader(self) -> BaseLoader | None: - """The Jinja loader for this object's templates. By default this - is a class :class:`jinja2.loaders.FileSystemLoader` to - :attr:`template_folder` if it is set. - - .. versionadded:: 0.5 - """ - if self.template_folder is not None: - return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) - else: - return None - - def _method_route( - self, - method: str, - rule: str, - options: dict[str, t.Any], - ) -> t.Callable[[T_route], T_route]: - if "methods" in options: - raise TypeError("Use the 'route' decorator to use the 'methods' argument.") - - return self.route(rule, methods=[method], **options) - - @setupmethod - def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["GET"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("GET", rule, options) - - @setupmethod - def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["POST"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("POST", rule, options) - - @setupmethod - def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PUT"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PUT", rule, options) - - @setupmethod - def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["DELETE"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("DELETE", rule, options) - - @setupmethod - def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PATCH"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PATCH", rule, options) - - @setupmethod - def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Decorate a view function to register it with the given URL - rule and options. Calls :meth:`add_url_rule`, which has more - details about the implementation. - - .. code-block:: python - - @app.route("/") - def index(): - return "Hello, World!" - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and - ``OPTIONS`` are added automatically. - - :param rule: The URL rule string. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - - def decorator(f: T_route) -> T_route: - endpoint = options.pop("endpoint", None) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a rule for routing incoming requests and building - URLs. The :meth:`route` decorator is a shortcut to call this - with the ``view_func`` argument. These are equivalent: - - .. code-block:: python - - @app.route("/") - def index(): - ... - - .. code-block:: python - - def index(): - ... - - app.add_url_rule("/", view_func=index) - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. An error - will be raised if a function has already been registered for the - endpoint. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is - always added automatically, and ``OPTIONS`` is added - automatically by default. - - ``view_func`` does not necessarily need to be passed, but if the - rule should participate in routing an endpoint name must be - associated with a view function at some point with the - :meth:`endpoint` decorator. - - .. code-block:: python - - app.add_url_rule("/", endpoint="index") - - @app.endpoint("index") - def index(): - ... - - If ``view_func`` has a ``required_methods`` attribute, those - methods are added to the passed and automatic methods. If it - has a ``provide_automatic_methods`` attribute, it is used as the - default if the parameter is not passed. - - :param rule: The URL rule string. - :param endpoint: The endpoint name to associate with the rule - and view function. Used when routing and building URLs. - Defaults to ``view_func.__name__``. - :param view_func: The view function to associate with the - endpoint name. - :param provide_automatic_options: Add the ``OPTIONS`` method and - respond to ``OPTIONS`` requests automatically. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - raise NotImplementedError - - @setupmethod - def endpoint(self, endpoint: str) -> t.Callable[[F], F]: - """Decorate a view function to register it for the given - endpoint. Used if a rule is added without a ``view_func`` with - :meth:`add_url_rule`. - - .. code-block:: python - - app.add_url_rule("/ex", endpoint="example") - - @app.endpoint("example") - def example(): - ... - - :param endpoint: The endpoint name to associate with the view - function. - """ - - def decorator(f: F) -> F: - self.view_functions[endpoint] = f - return f - - return decorator - - @setupmethod - def before_request(self, f: T_before_request) -> T_before_request: - """Register a function to run before each request. - - For example, this can be used to open a database connection, or - to load the logged in user from the session. - - .. code-block:: python - - @app.before_request - def load_user(): - if "user_id" in session: - g.user = db.session.get(session["user_id"]) - - The function will be called without any arguments. If it returns - a non-``None`` value, the value is handled as if it was the - return value from the view, and further request handling is - stopped. - - This is available on both app and blueprint objects. When used on an app, this - executes before every request. When used on a blueprint, this executes before - every request that the blueprint handles. To register with a blueprint and - execute before every request, use :meth:`.Blueprint.before_app_request`. - """ - self.before_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def after_request(self, f: T_after_request) -> T_after_request: - """Register a function to run after each request to this object. - - The function is called with the response object, and must return - a response object. This allows the functions to modify or - replace the response before it is sent. - - If a function raises an exception, any remaining - ``after_request`` functions will not be called. Therefore, this - should not be used for actions that must execute, such as to - close resources. Use :meth:`teardown_request` for that. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.after_app_request`. - """ - self.after_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_request(self, f: T_teardown) -> T_teardown: - """Register a function to be called when the request context is - popped. Typically this happens at the end of each request, but - contexts may be pushed manually as well during testing. - - .. code-block:: python - - with app.test_request_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the request context is - made inactive. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.teardown_app_request`. - """ - self.teardown_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def context_processor( - self, - f: T_template_context_processor, - ) -> T_template_context_processor: - """Registers a template context processor function. These functions run before - rendering a template. The keys of the returned dict are added as variables - available in the template. - - This is available on both app and blueprint objects. When used on an app, this - is called for every rendered template. When used on a blueprint, this is called - for templates rendered from the blueprint's views. To register with a blueprint - and affect every template, use :meth:`.Blueprint.app_context_processor`. - """ - self.template_context_processors[None].append(f) - return f - - @setupmethod - def url_value_preprocessor( - self, - f: T_url_value_preprocessor, - ) -> T_url_value_preprocessor: - """Register a URL value preprocessor function for all view - functions in the application. These functions will be called before the - :meth:`before_request` functions. - - The function can modify the values captured from the matched url before - they are passed to the view. For example, this can be used to pop a - common language code value and place it in ``g`` rather than pass it to - every view. - - The function is passed the endpoint name and values dict. The return - value is ignored. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_value_preprocessor`. - """ - self.url_value_preprocessors[None].append(f) - return f - - @setupmethod - def url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Callback function for URL defaults for all view functions of the - application. It's called with the endpoint and values and should - update the values passed in place. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_defaults`. - """ - self.url_default_functions[None].append(f) - return f - - @setupmethod - def errorhandler( - self, code_or_exception: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Register a function to handle errors by code or exception class. - - A decorator that is used to register a function given an - error code. Example:: - - @app.errorhandler(404) - def page_not_found(error): - return 'This page does not exist', 404 - - You can also register handlers for arbitrary exceptions:: - - @app.errorhandler(DatabaseError) - def special_exception_handler(error): - return 'Database connection failed', 500 - - This is available on both app and blueprint objects. When used on an app, this - can handle errors from every request. When used on a blueprint, this can handle - errors from requests that the blueprint handles. To register with a blueprint - and affect every request, use :meth:`.Blueprint.app_errorhandler`. - - .. versionadded:: 0.7 - Use :meth:`register_error_handler` instead of modifying - :attr:`error_handler_spec` directly, for application wide error - handlers. - - .. versionadded:: 0.7 - One can now additionally also register custom exception types - that do not necessarily have to be a subclass of the - :class:`~werkzeug.exceptions.HTTPException` class. - - :param code_or_exception: the code as integer for the handler, or - an arbitrary exception - """ - - def decorator(f: T_error_handler) -> T_error_handler: - self.register_error_handler(code_or_exception, f) - return f - - return decorator - - @setupmethod - def register_error_handler( - self, - code_or_exception: type[Exception] | int, - f: ft.ErrorHandlerCallable, - ) -> None: - """Alternative error attach function to the :meth:`errorhandler` - decorator that is more straightforward to use for non decorator - usage. - - .. versionadded:: 0.7 - """ - exc_class, code = self._get_exc_class_and_code(code_or_exception) - self.error_handler_spec[None][code][exc_class] = f - - @staticmethod - def _get_exc_class_and_code( - exc_class_or_code: type[Exception] | int, - ) -> tuple[type[Exception], int | None]: - """Get the exception class being handled. For HTTP status codes - or ``HTTPException`` subclasses, return both the exception and - status code. - - :param exc_class_or_code: Any exception class, or an HTTP status - code as an integer. - """ - exc_class: type[Exception] - - if isinstance(exc_class_or_code, int): - try: - exc_class = default_exceptions[exc_class_or_code] - except KeyError: - raise ValueError( - f"'{exc_class_or_code}' is not a recognized HTTP" - " error code. Use a subclass of HTTPException with" - " that code instead." - ) from None - else: - exc_class = exc_class_or_code - - if isinstance(exc_class, Exception): - raise TypeError( - f"{exc_class!r} is an instance, not a class. Handlers" - " can only be registered for Exception classes or HTTP" - " error codes." - ) - - if not issubclass(exc_class, Exception): - raise ValueError( - f"'{exc_class.__name__}' is not a subclass of Exception." - " Handlers can only be registered for Exception classes" - " or HTTP error codes." - ) - - if issubclass(exc_class, HTTPException): - return exc_class, exc_class.code - else: - return exc_class, None - - -def _endpoint_from_view_func(view_func: ft.RouteCallable) -> str: - """Internal helper that returns the default endpoint for a given - function. This always is the function name. - """ - assert view_func is not None, "expected view func if endpoint is not provided." - return view_func.__name__ - - -def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: - # Path.is_relative_to doesn't exist until Python 3.9 - try: - path.relative_to(base) - return True - except ValueError: - return False - - -def _find_package_path(import_name: str) -> str: - """Find the path that contains the package or module.""" - root_mod_name, _, _ = import_name.partition(".") - - try: - root_spec = importlib.util.find_spec(root_mod_name) - - if root_spec is None: - raise ValueError("not found") - except (ImportError, ValueError): - # ImportError: the machinery told us it does not exist - # ValueError: - # - the module name was invalid - # - the module name is __main__ - # - we raised `ValueError` due to `root_spec` being `None` - return os.getcwd() - - if root_spec.submodule_search_locations: - if root_spec.origin is None or root_spec.origin == "namespace": - # namespace package - package_spec = importlib.util.find_spec(import_name) - - if package_spec is not None and package_spec.submodule_search_locations: - # Pick the path in the namespace that contains the submodule. - package_path = pathlib.Path( - os.path.commonpath(package_spec.submodule_search_locations) - ) - search_location = next( - location - for location in root_spec.submodule_search_locations - if _path_is_relative_to(package_path, location) - ) - else: - # Pick the first path. - search_location = root_spec.submodule_search_locations[0] - - return os.path.dirname(search_location) - else: - # package with __init__.py - return os.path.dirname(os.path.dirname(root_spec.origin)) - else: - # module - return os.path.dirname(root_spec.origin) # type: ignore[type-var, return-value] - - -def find_package(import_name: str) -> tuple[str | None, str]: - """Find the prefix that a package is installed under, and the path - that it would be imported from. - - The prefix is the directory containing the standard directory - hierarchy (lib, bin, etc.). If the package is not installed to the - system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), - ``None`` is returned. - - The path is the entry in :attr:`sys.path` that contains the package - for import. If the package is not installed, it's assumed that the - package was imported from the current working directory. - """ - package_path = _find_package_path(import_name) - py_prefix = os.path.abspath(sys.prefix) - - # installed to the system - if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): - return py_prefix, package_path - - site_parent, site_folder = os.path.split(package_path) - - # installed to a virtualenv - if site_folder.lower() == "site-packages": - parent, folder = os.path.split(site_parent) - - # Windows (prefix/lib/site-packages) - if folder.lower() == "lib": - return parent, package_path - - # Unix (prefix/lib/pythonX.Y/site-packages) - if os.path.basename(parent).lower() == "lib": - return os.path.dirname(parent), package_path - - # something else (prefix/site-packages) - return site_parent, package_path - - # not installed - return None, package_path diff --git a/lib/python3.12/site-packages/flask/sessions.py b/lib/python3.12/site-packages/flask/sessions.py deleted file mode 100644 index ee19ad6..0000000 --- a/lib/python3.12/site-packages/flask/sessions.py +++ /dev/null @@ -1,379 +0,0 @@ -from __future__ import annotations - -import hashlib -import typing as t -from collections.abc import MutableMapping -from datetime import datetime -from datetime import timezone - -from itsdangerous import BadSignature -from itsdangerous import URLSafeTimedSerializer -from werkzeug.datastructures import CallbackDict - -from .json.tag import TaggedJSONSerializer - -if t.TYPE_CHECKING: # pragma: no cover - import typing_extensions as te - - from .app import Flask - from .wrappers import Request - from .wrappers import Response - - -# TODO generic when Python > 3.8 -class SessionMixin(MutableMapping): # type: ignore[type-arg] - """Expands a basic dictionary with session attributes.""" - - @property - def permanent(self) -> bool: - """This reflects the ``'_permanent'`` key in the dict.""" - return self.get("_permanent", False) - - @permanent.setter - def permanent(self, value: bool) -> None: - self["_permanent"] = bool(value) - - #: Some implementations can detect whether a session is newly - #: created, but that is not guaranteed. Use with caution. The mixin - # default is hard-coded ``False``. - new = False - - #: Some implementations can detect changes to the session and set - #: this when that happens. The mixin default is hard coded to - #: ``True``. - modified = True - - #: Some implementations can detect when session data is read or - #: written and set this when that happens. The mixin default is hard - #: coded to ``True``. - accessed = True - - -# TODO generic when Python > 3.8 -class SecureCookieSession(CallbackDict, SessionMixin): # type: ignore[type-arg] - """Base class for sessions based on signed cookies. - - This session backend will set the :attr:`modified` and - :attr:`accessed` attributes. It cannot reliably track whether a - session is new (vs. empty), so :attr:`new` remains hard coded to - ``False``. - """ - - #: When data is changed, this is set to ``True``. Only the session - #: dictionary itself is tracked; if the session contains mutable - #: data (for example a nested dict) then this must be set to - #: ``True`` manually when modifying that data. The session cookie - #: will only be written to the response if this is ``True``. - modified = False - - #: When data is read or written, this is set to ``True``. Used by - # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` - #: header, which allows caching proxies to cache different pages for - #: different users. - accessed = False - - def __init__(self, initial: t.Any = None) -> None: - def on_update(self: te.Self) -> None: - self.modified = True - self.accessed = True - - super().__init__(initial, on_update) - - def __getitem__(self, key: str) -> t.Any: - self.accessed = True - return super().__getitem__(key) - - def get(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().get(key, default) - - def setdefault(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().setdefault(key, default) - - -class NullSession(SecureCookieSession): - """Class used to generate nicer error messages if sessions are not - available. Will still allow read-only access to the empty session - but fail on setting. - """ - - def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - raise RuntimeError( - "The session is unavailable because no secret " - "key was set. Set the secret_key on the " - "application to something unique and secret." - ) - - __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 - del _fail - - -class SessionInterface: - """The basic interface you have to implement in order to replace the - default session interface which uses werkzeug's securecookie - implementation. The only methods you have to implement are - :meth:`open_session` and :meth:`save_session`, the others have - useful defaults which you don't need to change. - - The session object returned by the :meth:`open_session` method has to - provide a dictionary like interface plus the properties and methods - from the :class:`SessionMixin`. We recommend just subclassing a dict - and adding that mixin:: - - class Session(dict, SessionMixin): - pass - - If :meth:`open_session` returns ``None`` Flask will call into - :meth:`make_null_session` to create a session that acts as replacement - if the session support cannot work because some requirement is not - fulfilled. The default :class:`NullSession` class that is created - will complain that the secret key was not set. - - To replace the session interface on an application all you have to do - is to assign :attr:`flask.Flask.session_interface`:: - - app = Flask(__name__) - app.session_interface = MySessionInterface() - - Multiple requests with the same session may be sent and handled - concurrently. When implementing a new session interface, consider - whether reads or writes to the backing store must be synchronized. - There is no guarantee on the order in which the session for each - request is opened or saved, it will occur in the order that requests - begin and end processing. - - .. versionadded:: 0.8 - """ - - #: :meth:`make_null_session` will look here for the class that should - #: be created when a null session is requested. Likewise the - #: :meth:`is_null_session` method will perform a typecheck against - #: this type. - null_session_class = NullSession - - #: A flag that indicates if the session interface is pickle based. - #: This can be used by Flask extensions to make a decision in regards - #: to how to deal with the session object. - #: - #: .. versionadded:: 0.10 - pickle_based = False - - def make_null_session(self, app: Flask) -> NullSession: - """Creates a null session which acts as a replacement object if the - real session support could not be loaded due to a configuration - error. This mainly aids the user experience because the job of the - null session is to still support lookup without complaining but - modifications are answered with a helpful error message of what - failed. - - This creates an instance of :attr:`null_session_class` by default. - """ - return self.null_session_class() - - def is_null_session(self, obj: object) -> bool: - """Checks if a given object is a null session. Null sessions are - not asked to be saved. - - This checks if the object is an instance of :attr:`null_session_class` - by default. - """ - return isinstance(obj, self.null_session_class) - - def get_cookie_name(self, app: Flask) -> str: - """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" - return app.config["SESSION_COOKIE_NAME"] # type: ignore[no-any-return] - - def get_cookie_domain(self, app: Flask) -> str | None: - """The value of the ``Domain`` parameter on the session cookie. If not set, - browsers will only send the cookie to the exact domain it was set from. - Otherwise, they will send it to any subdomain of the given value as well. - - Uses the :data:`SESSION_COOKIE_DOMAIN` config. - - .. versionchanged:: 2.3 - Not set by default, does not fall back to ``SERVER_NAME``. - """ - return app.config["SESSION_COOKIE_DOMAIN"] # type: ignore[no-any-return] - - def get_cookie_path(self, app: Flask) -> str: - """Returns the path for which the cookie should be valid. The - default implementation uses the value from the ``SESSION_COOKIE_PATH`` - config var if it's set, and falls back to ``APPLICATION_ROOT`` or - uses ``/`` if it's ``None``. - """ - return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] # type: ignore[no-any-return] - - def get_cookie_httponly(self, app: Flask) -> bool: - """Returns True if the session cookie should be httponly. This - currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` - config var. - """ - return app.config["SESSION_COOKIE_HTTPONLY"] # type: ignore[no-any-return] - - def get_cookie_secure(self, app: Flask) -> bool: - """Returns True if the cookie should be secure. This currently - just returns the value of the ``SESSION_COOKIE_SECURE`` setting. - """ - return app.config["SESSION_COOKIE_SECURE"] # type: ignore[no-any-return] - - def get_cookie_samesite(self, app: Flask) -> str | None: - """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the - ``SameSite`` attribute. This currently just returns the value of - the :data:`SESSION_COOKIE_SAMESITE` setting. - """ - return app.config["SESSION_COOKIE_SAMESITE"] # type: ignore[no-any-return] - - def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: - """A helper method that returns an expiration date for the session - or ``None`` if the session is linked to the browser session. The - default implementation returns now + the permanent session - lifetime configured on the application. - """ - if session.permanent: - return datetime.now(timezone.utc) + app.permanent_session_lifetime - return None - - def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: - """Used by session backends to determine if a ``Set-Cookie`` header - should be set for this session cookie for this response. If the session - has been modified, the cookie is set. If the session is permanent and - the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is - always set. - - This check is usually skipped if the session was deleted. - - .. versionadded:: 0.11 - """ - - return session.modified or ( - session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] - ) - - def open_session(self, app: Flask, request: Request) -> SessionMixin | None: - """This is called at the beginning of each request, after - pushing the request context, before matching the URL. - - This must return an object which implements a dictionary-like - interface as well as the :class:`SessionMixin` interface. - - This will return ``None`` to indicate that loading failed in - some way that is not immediately an error. The request - context will fall back to using :meth:`make_null_session` - in this case. - """ - raise NotImplementedError() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - """This is called at the end of each request, after generating - a response, before removing the request context. It is skipped - if :meth:`is_null_session` returns ``True``. - """ - raise NotImplementedError() - - -session_json_serializer = TaggedJSONSerializer() - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class SecureCookieSessionInterface(SessionInterface): - """The default session interface that stores sessions in signed cookies - through the :mod:`itsdangerous` module. - """ - - #: the salt that should be applied on top of the secret key for the - #: signing of cookie based sessions. - salt = "cookie-session" - #: the hash function to use for the signature. The default is sha1 - digest_method = staticmethod(_lazy_sha1) - #: the name of the itsdangerous supported key derivation. The default - #: is hmac. - key_derivation = "hmac" - #: A python serializer for the payload. The default is a compact - #: JSON derived serializer with support for some extra Python types - #: such as datetime objects or tuples. - serializer = session_json_serializer - session_class = SecureCookieSession - - def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: - if not app.secret_key: - return None - signer_kwargs = dict( - key_derivation=self.key_derivation, digest_method=self.digest_method - ) - return URLSafeTimedSerializer( - app.secret_key, - salt=self.salt, - serializer=self.serializer, - signer_kwargs=signer_kwargs, - ) - - def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: - s = self.get_signing_serializer(app) - if s is None: - return None - val = request.cookies.get(self.get_cookie_name(app)) - if not val: - return self.session_class() - max_age = int(app.permanent_session_lifetime.total_seconds()) - try: - data = s.loads(val, max_age=max_age) - return self.session_class(data) - except BadSignature: - return self.session_class() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - name = self.get_cookie_name(app) - domain = self.get_cookie_domain(app) - path = self.get_cookie_path(app) - secure = self.get_cookie_secure(app) - samesite = self.get_cookie_samesite(app) - httponly = self.get_cookie_httponly(app) - - # Add a "Vary: Cookie" header if the session was accessed at all. - if session.accessed: - response.vary.add("Cookie") - - # If the session is modified to be empty, remove the cookie. - # If the session is empty, return without setting the cookie. - if not session: - if session.modified: - response.delete_cookie( - name, - domain=domain, - path=path, - secure=secure, - samesite=samesite, - httponly=httponly, - ) - response.vary.add("Cookie") - - return - - if not self.should_set_cookie(app, session): - return - - expires = self.get_expiration_time(app, session) - val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore - response.set_cookie( - name, - val, # type: ignore - expires=expires, - httponly=httponly, - domain=domain, - path=path, - secure=secure, - samesite=samesite, - ) - response.vary.add("Cookie") diff --git a/lib/python3.12/site-packages/flask/signals.py b/lib/python3.12/site-packages/flask/signals.py deleted file mode 100644 index 444fda9..0000000 --- a/lib/python3.12/site-packages/flask/signals.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from blinker import Namespace - -# This namespace is only for signals provided by Flask itself. -_signals = Namespace() - -template_rendered = _signals.signal("template-rendered") -before_render_template = _signals.signal("before-render-template") -request_started = _signals.signal("request-started") -request_finished = _signals.signal("request-finished") -request_tearing_down = _signals.signal("request-tearing-down") -got_request_exception = _signals.signal("got-request-exception") -appcontext_tearing_down = _signals.signal("appcontext-tearing-down") -appcontext_pushed = _signals.signal("appcontext-pushed") -appcontext_popped = _signals.signal("appcontext-popped") -message_flashed = _signals.signal("message-flashed") diff --git a/lib/python3.12/site-packages/flask/templating.py b/lib/python3.12/site-packages/flask/templating.py deleted file mode 100644 index 618a3b3..0000000 --- a/lib/python3.12/site-packages/flask/templating.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2 import BaseLoader -from jinja2 import Environment as BaseEnvironment -from jinja2 import Template -from jinja2 import TemplateNotFound - -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .helpers import stream_with_context -from .signals import before_render_template -from .signals import template_rendered - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .sansio.app import App - from .sansio.scaffold import Scaffold - - -def _default_template_ctx_processor() -> dict[str, t.Any]: - """Default template context processor. Injects `request`, - `session` and `g`. - """ - appctx = _cv_app.get(None) - reqctx = _cv_request.get(None) - rv: dict[str, t.Any] = {} - if appctx is not None: - rv["g"] = appctx.g - if reqctx is not None: - rv["request"] = reqctx.request - rv["session"] = reqctx.session - return rv - - -class Environment(BaseEnvironment): - """Works like a regular Jinja2 environment but has some additional - knowledge of how Flask's blueprint works so that it can prepend the - name of the blueprint to referenced templates if necessary. - """ - - def __init__(self, app: App, **options: t.Any) -> None: - if "loader" not in options: - options["loader"] = app.create_global_jinja_loader() - BaseEnvironment.__init__(self, **options) - self.app = app - - -class DispatchingJinjaLoader(BaseLoader): - """A loader that looks for templates in the application and all - the blueprint folders. - """ - - def __init__(self, app: App) -> None: - self.app = app - - def get_source( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: - return self._get_source_explained(environment, template) - return self._get_source_fast(environment, template) - - def _get_source_explained( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - attempts = [] - rv: tuple[str, str | None, t.Callable[[], bool] | None] | None - trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None - - for srcobj, loader in self._iter_loaders(template): - try: - rv = loader.get_source(environment, template) - if trv is None: - trv = rv - except TemplateNotFound: - rv = None - attempts.append((loader, srcobj, rv)) - - from .debughelpers import explain_template_loading_attempts - - explain_template_loading_attempts(self.app, template, attempts) - - if trv is not None: - return trv - raise TemplateNotFound(template) - - def _get_source_fast( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - for _srcobj, loader in self._iter_loaders(template): - try: - return loader.get_source(environment, template) - except TemplateNotFound: - continue - raise TemplateNotFound(template) - - def _iter_loaders(self, template: str) -> t.Iterator[tuple[Scaffold, BaseLoader]]: - loader = self.app.jinja_loader - if loader is not None: - yield self.app, loader - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - yield blueprint, loader - - def list_templates(self) -> list[str]: - result = set() - loader = self.app.jinja_loader - if loader is not None: - result.update(loader.list_templates()) - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - for template in loader.list_templates(): - result.add(template) - - return list(result) - - -def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - rv = template.render(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - return rv - - -def render_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> str: - """Render a template by name with the given context. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _render(app, template, context) - - -def render_template_string(source: str, **context: t.Any) -> str: - """Render a template from the given source string with the given - context. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _render(app, template, context) - - -def _stream( - app: Flask, template: Template, context: dict[str, t.Any] -) -> t.Iterator[str]: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - def generate() -> t.Iterator[str]: - yield from template.generate(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - rv = generate() - - # If a request context is active, keep it while generating. - if request: - rv = stream_with_context(rv) - - return rv - - -def stream_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> t.Iterator[str]: - """Render a template by name with the given context as a stream. - This returns an iterator of strings, which can be used as a - streaming response from a view. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _stream(app, template, context) - - -def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: - """Render a template from the given source string with the given - context as a stream. This returns an iterator of strings, which can - be used as a streaming response from a view. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _stream(app, template, context) diff --git a/lib/python3.12/site-packages/flask/testing.py b/lib/python3.12/site-packages/flask/testing.py deleted file mode 100644 index a27b7c8..0000000 --- a/lib/python3.12/site-packages/flask/testing.py +++ /dev/null @@ -1,298 +0,0 @@ -from __future__ import annotations - -import importlib.metadata -import typing as t -from contextlib import contextmanager -from contextlib import ExitStack -from copy import copy -from types import TracebackType -from urllib.parse import urlsplit - -import werkzeug.test -from click.testing import CliRunner -from werkzeug.test import Client -from werkzeug.wrappers import Request as BaseRequest - -from .cli import ScriptInfo -from .sessions import SessionMixin - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - from werkzeug.test import TestResponse - - from .app import Flask - - -class EnvironBuilder(werkzeug.test.EnvironBuilder): - """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the - application. - - :param app: The Flask application to configure the environment from. - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - - def __init__( - self, - app: Flask, - path: str = "/", - base_url: str | None = None, - subdomain: str | None = None, - url_scheme: str | None = None, - *args: t.Any, - **kwargs: t.Any, - ) -> None: - assert not (base_url or subdomain or url_scheme) or ( - base_url is not None - ) != bool( - subdomain or url_scheme - ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' - - if base_url is None: - http_host = app.config.get("SERVER_NAME") or "localhost" - app_root = app.config["APPLICATION_ROOT"] - - if subdomain: - http_host = f"{subdomain}.{http_host}" - - if url_scheme is None: - url_scheme = app.config["PREFERRED_URL_SCHEME"] - - url = urlsplit(path) - base_url = ( - f"{url.scheme or url_scheme}://{url.netloc or http_host}" - f"/{app_root.lstrip('/')}" - ) - path = url.path - - if url.query: - sep = b"?" if isinstance(url.query, bytes) else "?" - path += sep + url.query - - self.app = app - super().__init__(path, base_url, *args, **kwargs) - - def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore - """Serialize ``obj`` to a JSON-formatted string. - - The serialization will be configured according to the config associated - with this EnvironBuilder's ``app``. - """ - return self.app.json.dumps(obj, **kwargs) - - -_werkzeug_version = "" - - -def _get_werkzeug_version() -> str: - global _werkzeug_version - - if not _werkzeug_version: - _werkzeug_version = importlib.metadata.version("werkzeug") - - return _werkzeug_version - - -class FlaskClient(Client): - """Works like a regular Werkzeug test client but has knowledge about - Flask's contexts to defer the cleanup of the request context until - the end of a ``with`` block. For general information about how to - use this class refer to :class:`werkzeug.test.Client`. - - .. versionchanged:: 0.12 - `app.test_client()` includes preset default environment, which can be - set after instantiation of the `app.test_client()` object in - `client.environ_base`. - - Basic usage is outlined in the :doc:`/testing` chapter. - """ - - application: Flask - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - super().__init__(*args, **kwargs) - self.preserve_context = False - self._new_contexts: list[t.ContextManager[t.Any]] = [] - self._context_stack = ExitStack() - self.environ_base = { - "REMOTE_ADDR": "127.0.0.1", - "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", - } - - @contextmanager - def session_transaction( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Iterator[SessionMixin]: - """When used in combination with a ``with`` statement this opens a - session transaction. This can be used to modify the session that - the test client uses. Once the ``with`` block is left the session is - stored back. - - :: - - with client.session_transaction() as session: - session['value'] = 42 - - Internally this is implemented by going through a temporary test - request context and since session handling could depend on - request variables this function accepts the same arguments as - :meth:`~flask.Flask.test_request_context` which are directly - passed through. - """ - if self._cookies is None: - raise TypeError( - "Cookies are disabled. Create a client with 'use_cookies=True'." - ) - - app = self.application - ctx = app.test_request_context(*args, **kwargs) - self._add_cookies_to_wsgi(ctx.request.environ) - - with ctx: - sess = app.session_interface.open_session(app, ctx.request) - - if sess is None: - raise RuntimeError("Session backend did not open a session.") - - yield sess - resp = app.response_class() - - if app.session_interface.is_null_session(sess): - return - - with ctx: - app.session_interface.save_session(app, sess, resp) - - self._update_cookies_from_response( - ctx.request.host.partition(":")[0], - ctx.request.path, - resp.headers.getlist("Set-Cookie"), - ) - - def _copy_environ(self, other: WSGIEnvironment) -> WSGIEnvironment: - out = {**self.environ_base, **other} - - if self.preserve_context: - out["werkzeug.debug.preserve_context"] = self._new_contexts.append - - return out - - def _request_from_builder_args( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> BaseRequest: - kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) - builder = EnvironBuilder(self.application, *args, **kwargs) - - try: - return builder.get_request() - finally: - builder.close() - - def open( - self, - *args: t.Any, - buffered: bool = False, - follow_redirects: bool = False, - **kwargs: t.Any, - ) -> TestResponse: - if args and isinstance( - args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) - ): - if isinstance(args[0], werkzeug.test.EnvironBuilder): - builder = copy(args[0]) - builder.environ_base = self._copy_environ(builder.environ_base or {}) # type: ignore[arg-type] - request = builder.get_request() - elif isinstance(args[0], dict): - request = EnvironBuilder.from_environ( - args[0], app=self.application, environ_base=self._copy_environ({}) - ).get_request() - else: - # isinstance(args[0], BaseRequest) - request = copy(args[0]) - request.environ = self._copy_environ(request.environ) - else: - # request is None - request = self._request_from_builder_args(args, kwargs) - - # Pop any previously preserved contexts. This prevents contexts - # from being preserved across redirects or multiple requests - # within a single block. - self._context_stack.close() - - response = super().open( - request, - buffered=buffered, - follow_redirects=follow_redirects, - ) - response.json_module = self.application.json # type: ignore[assignment] - - # Re-push contexts that were preserved during the request. - while self._new_contexts: - cm = self._new_contexts.pop() - self._context_stack.enter_context(cm) - - return response - - def __enter__(self) -> FlaskClient: - if self.preserve_context: - raise RuntimeError("Cannot nest client invocations") - self.preserve_context = True - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.preserve_context = False - self._context_stack.close() - - -class FlaskCliRunner(CliRunner): - """A :class:`~click.testing.CliRunner` for testing a Flask app's - CLI commands. Typically created using - :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. - """ - - def __init__(self, app: Flask, **kwargs: t.Any) -> None: - self.app = app - super().__init__(**kwargs) - - def invoke( # type: ignore - self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any - ) -> t.Any: - """Invokes a CLI command in an isolated environment. See - :meth:`CliRunner.invoke ` for - full method documentation. See :ref:`testing-cli` for examples. - - If the ``obj`` argument is not given, passes an instance of - :class:`~flask.cli.ScriptInfo` that knows how to load the Flask - app being tested. - - :param cli: Command object to invoke. Default is the app's - :attr:`~flask.app.Flask.cli` group. - :param args: List of strings to invoke the command with. - - :return: a :class:`~click.testing.Result` object. - """ - if cli is None: - cli = self.app.cli - - if "obj" not in kwargs: - kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) - - return super().invoke(cli, args, **kwargs) diff --git a/lib/python3.12/site-packages/flask/typing.py b/lib/python3.12/site-packages/flask/typing.py deleted file mode 100644 index cf6d4ae..0000000 --- a/lib/python3.12/site-packages/flask/typing.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import annotations - -import typing as t - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIApplication # noqa: F401 - from werkzeug.datastructures import Headers # noqa: F401 - from werkzeug.sansio.response import Response # noqa: F401 - -# The possible types that are directly convertible or are a Response object. -ResponseValue = t.Union[ - "Response", - str, - bytes, - t.List[t.Any], - # Only dict is actually accepted, but Mapping allows for TypedDict. - t.Mapping[str, t.Any], - t.Iterator[str], - t.Iterator[bytes], -] - -# the possible types for an individual HTTP header -# This should be a Union, but mypy doesn't pass unless it's a TypeVar. -HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] - -# the possible types for HTTP headers -HeadersValue = t.Union[ - "Headers", - t.Mapping[str, HeaderValue], - t.Sequence[t.Tuple[str, HeaderValue]], -] - -# The possible types returned by a route function. -ResponseReturnValue = t.Union[ - ResponseValue, - t.Tuple[ResponseValue, HeadersValue], - t.Tuple[ResponseValue, int], - t.Tuple[ResponseValue, int, HeadersValue], - "WSGIApplication", -] - -# Allow any subclass of werkzeug.Response, such as the one from Flask, -# as a callback argument. Using werkzeug.Response directly makes a -# callback annotated with flask.Response fail type checking. -ResponseClass = t.TypeVar("ResponseClass", bound="Response") - -AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named -AfterRequestCallable = t.Union[ - t.Callable[[ResponseClass], ResponseClass], - t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], -] -BeforeFirstRequestCallable = t.Union[ - t.Callable[[], None], t.Callable[[], t.Awaitable[None]] -] -BeforeRequestCallable = t.Union[ - t.Callable[[], t.Optional[ResponseReturnValue]], - t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], -] -ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] -TeardownCallable = t.Union[ - t.Callable[[t.Optional[BaseException]], None], - t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], -] -TemplateContextProcessorCallable = t.Union[ - t.Callable[[], t.Dict[str, t.Any]], - t.Callable[[], t.Awaitable[t.Dict[str, t.Any]]], -] -TemplateFilterCallable = t.Callable[..., t.Any] -TemplateGlobalCallable = t.Callable[..., t.Any] -TemplateTestCallable = t.Callable[..., bool] -URLDefaultCallable = t.Callable[[str, t.Dict[str, t.Any]], None] -URLValuePreprocessorCallable = t.Callable[ - [t.Optional[str], t.Optional[t.Dict[str, t.Any]]], None -] - -# This should take Exception, but that either breaks typing the argument -# with a specific exception, or decorating multiple times with different -# exceptions (and using a union type on the argument). -# https://github.com/pallets/flask/issues/4095 -# https://github.com/pallets/flask/issues/4295 -# https://github.com/pallets/flask/issues/4297 -ErrorHandlerCallable = t.Union[ - t.Callable[[t.Any], ResponseReturnValue], - t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], -] - -RouteCallable = t.Union[ - t.Callable[..., ResponseReturnValue], - t.Callable[..., t.Awaitable[ResponseReturnValue]], -] diff --git a/lib/python3.12/site-packages/flask/views.py b/lib/python3.12/site-packages/flask/views.py deleted file mode 100644 index 794fdc0..0000000 --- a/lib/python3.12/site-packages/flask/views.py +++ /dev/null @@ -1,191 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import typing as ft -from .globals import current_app -from .globals import request - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -http_method_funcs = frozenset( - ["get", "post", "head", "options", "delete", "put", "trace", "patch"] -) - - -class View: - """Subclass this class and override :meth:`dispatch_request` to - create a generic class-based view. Call :meth:`as_view` to create a - view function that creates an instance of the class with the given - arguments and calls its ``dispatch_request`` method with any URL - variables. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class Hello(View): - init_every_request = False - - def dispatch_request(self, name): - return f"Hello, {name}!" - - app.add_url_rule( - "/hello/", view_func=Hello.as_view("hello") - ) - - Set :attr:`methods` on the class to change what methods the view - accepts. - - Set :attr:`decorators` on the class to apply a list of decorators to - the generated view function. Decorators applied to the class itself - will not be applied to the generated view function! - - Set :attr:`init_every_request` to ``False`` for efficiency, unless - you need to store request-global data on ``self``. - """ - - #: The methods this view is registered for. Uses the same default - #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and - #: ``add_url_rule`` by default. - methods: t.ClassVar[t.Collection[str] | None] = None - - #: Control whether the ``OPTIONS`` method is handled automatically. - #: Uses the same default (``True``) as ``route`` and - #: ``add_url_rule`` by default. - provide_automatic_options: t.ClassVar[bool | None] = None - - #: A list of decorators to apply, in order, to the generated view - #: function. Remember that ``@decorator`` syntax is applied bottom - #: to top, so the first decorator in the list would be the bottom - #: decorator. - #: - #: .. versionadded:: 0.8 - decorators: t.ClassVar[list[t.Callable[[F], F]]] = [] - - #: Create a new instance of this view class for every request by - #: default. If a view subclass sets this to ``False``, the same - #: instance is used for every request. - #: - #: A single instance is more efficient, especially if complex setup - #: is done during init. However, storing data on ``self`` is no - #: longer safe across requests, and :data:`~flask.g` should be used - #: instead. - #: - #: .. versionadded:: 2.2 - init_every_request: t.ClassVar[bool] = True - - def dispatch_request(self) -> ft.ResponseReturnValue: - """The actual view function behavior. Subclasses must override - this and return a valid response. Any variables from the URL - rule are passed as keyword arguments. - """ - raise NotImplementedError() - - @classmethod - def as_view( - cls, name: str, *class_args: t.Any, **class_kwargs: t.Any - ) -> ft.RouteCallable: - """Convert the class into a view function that can be registered - for a route. - - By default, the generated view will create a new instance of the - view class for every request and call its - :meth:`dispatch_request` method. If the view class sets - :attr:`init_every_request` to ``False``, the same instance will - be used for every request. - - Except for ``name``, all other arguments passed to this method - are forwarded to the view class ``__init__`` method. - - .. versionchanged:: 2.2 - Added the ``init_every_request`` class attribute. - """ - if cls.init_every_request: - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - self = view.view_class( # type: ignore[attr-defined] - *class_args, **class_kwargs - ) - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - else: - self = cls(*class_args, **class_kwargs) - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - if cls.decorators: - view.__name__ = name - view.__module__ = cls.__module__ - for decorator in cls.decorators: - view = decorator(view) - - # We attach the view class to the view function for two reasons: - # first of all it allows us to easily figure out what class-based - # view this thing came from, secondly it's also used for instantiating - # the view class so you can actually replace it with something else - # for testing purposes and debugging. - view.view_class = cls # type: ignore - view.__name__ = name - view.__doc__ = cls.__doc__ - view.__module__ = cls.__module__ - view.methods = cls.methods # type: ignore - view.provide_automatic_options = cls.provide_automatic_options # type: ignore - return view - - -class MethodView(View): - """Dispatches request methods to the corresponding instance methods. - For example, if you implement a ``get`` method, it will be used to - handle ``GET`` requests. - - This can be useful for defining a REST API. - - :attr:`methods` is automatically set based on the methods defined on - the class. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class CounterAPI(MethodView): - def get(self): - return str(session.get("counter", 0)) - - def post(self): - session["counter"] = session.get("counter", 0) + 1 - return redirect(url_for("counter")) - - app.add_url_rule( - "/counter", view_func=CounterAPI.as_view("counter") - ) - """ - - def __init_subclass__(cls, **kwargs: t.Any) -> None: - super().__init_subclass__(**kwargs) - - if "methods" not in cls.__dict__: - methods = set() - - for base in cls.__bases__: - if getattr(base, "methods", None): - methods.update(base.methods) # type: ignore[attr-defined] - - for key in http_method_funcs: - if hasattr(cls, key): - methods.add(key.upper()) - - if methods: - cls.methods = methods - - def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: - meth = getattr(self, request.method.lower(), None) - - # If the request method is HEAD and we don't have a handler for it - # retry with GET. - if meth is None and request.method == "HEAD": - meth = getattr(self, "get", None) - - assert meth is not None, f"Unimplemented method {request.method!r}" - return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return] diff --git a/lib/python3.12/site-packages/flask/wrappers.py b/lib/python3.12/site-packages/flask/wrappers.py deleted file mode 100644 index c1eca80..0000000 --- a/lib/python3.12/site-packages/flask/wrappers.py +++ /dev/null @@ -1,174 +0,0 @@ -from __future__ import annotations - -import typing as t - -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import HTTPException -from werkzeug.wrappers import Request as RequestBase -from werkzeug.wrappers import Response as ResponseBase - -from . import json -from .globals import current_app -from .helpers import _split_blueprint_path - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.routing import Rule - - -class Request(RequestBase): - """The request object used by default in Flask. Remembers the - matched endpoint and view arguments. - - It is what ends up as :class:`~flask.request`. If you want to replace - the request object used you can subclass this and set - :attr:`~flask.Flask.request_class` to your subclass. - - The request object is a :class:`~werkzeug.wrappers.Request` subclass and - provides all of the attributes Werkzeug defines plus a few Flask - specific ones. - """ - - json_module: t.Any = json - - #: The internal URL rule that matched the request. This can be - #: useful to inspect which methods are allowed for the URL from - #: a before/after handler (``request.url_rule.methods``) etc. - #: Though if the request's method was invalid for the URL rule, - #: the valid list is available in ``routing_exception.valid_methods`` - #: instead (an attribute of the Werkzeug exception - #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) - #: because the request was never internally bound. - #: - #: .. versionadded:: 0.6 - url_rule: Rule | None = None - - #: A dict of view arguments that matched the request. If an exception - #: happened when matching, this will be ``None``. - view_args: dict[str, t.Any] | None = None - - #: If matching the URL failed, this is the exception that will be - #: raised / was raised as part of the request handling. This is - #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or - #: something similar. - routing_exception: HTTPException | None = None - - @property - def max_content_length(self) -> int | None: # type: ignore[override] - """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" - if current_app: - return current_app.config["MAX_CONTENT_LENGTH"] # type: ignore[no-any-return] - else: - return None - - @property - def endpoint(self) -> str | None: - """The endpoint that matched the request URL. - - This will be ``None`` if matching failed or has not been - performed yet. - - This in combination with :attr:`view_args` can be used to - reconstruct the same URL or a modified URL. - """ - if self.url_rule is not None: - return self.url_rule.endpoint - - return None - - @property - def blueprint(self) -> str | None: - """The registered name of the current blueprint. - - This will be ``None`` if the endpoint is not part of a - blueprint, or if URL matching failed or has not been performed - yet. - - This does not necessarily match the name the blueprint was - created with. It may have been nested, or registered with a - different name. - """ - endpoint = self.endpoint - - if endpoint is not None and "." in endpoint: - return endpoint.rpartition(".")[0] - - return None - - @property - def blueprints(self) -> list[str]: - """The registered names of the current blueprint upwards through - parent blueprints. - - This will be an empty list if there is no current blueprint, or - if URL matching failed. - - .. versionadded:: 2.0.1 - """ - name = self.blueprint - - if name is None: - return [] - - return _split_blueprint_path(name) - - def _load_form_data(self) -> None: - super()._load_form_data() - - # In debug mode we're replacing the files multidict with an ad-hoc - # subclass that raises a different error for key errors. - if ( - current_app - and current_app.debug - and self.mimetype != "multipart/form-data" - and not self.files - ): - from .debughelpers import attach_enctype_error_multidict - - attach_enctype_error_multidict(self) - - def on_json_loading_failed(self, e: ValueError | None) -> t.Any: - try: - return super().on_json_loading_failed(e) - except BadRequest as e: - if current_app and current_app.debug: - raise - - raise BadRequest() from e - - -class Response(ResponseBase): - """The response object that is used by default in Flask. Works like the - response object from Werkzeug but is set to have an HTML mimetype by - default. Quite often you don't have to create this object yourself because - :meth:`~flask.Flask.make_response` will take care of that for you. - - If you want to replace the response object used you can subclass this and - set :attr:`~flask.Flask.response_class` to your subclass. - - .. versionchanged:: 1.0 - JSON support is added to the response, like the request. This is useful - when testing to get the test client response data as JSON. - - .. versionchanged:: 1.0 - - Added :attr:`max_cookie_size`. - """ - - default_mimetype: str | None = "text/html" - - json_module = json - - autocorrect_location_header = False - - @property - def max_cookie_size(self) -> int: # type: ignore - """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. - - See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in - Werkzeug's docs. - """ - if current_app: - return current_app.config["MAX_COOKIE_SIZE"] # type: ignore[no-any-return] - - # return Werkzeug's default when not in an app context - return super().max_cookie_size diff --git a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt deleted file mode 100644 index 7b190ca..0000000 --- a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2011 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA deleted file mode 100644 index ddf5464..0000000 --- a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: itsdangerous -Version: 2.2.0 -Summary: Safely pass data to untrusted environments and back. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/itsdangerous/ - -# ItsDangerous - -... so better sign this - -Various helpers to pass data to untrusted environments and to get it -back safe and sound. Data is cryptographically signed to ensure that a -token has not been tampered with. - -It's possible to customize how data is serialized. Data is compressed as -needed. A timestamp can be added and verified automatically while -loading a token. - - -## A Simple Example - -Here's how you could generate a token for transmitting a user's id and -name between web requests. - -```python -from itsdangerous import URLSafeSerializer -auth_s = URLSafeSerializer("secret key", "auth") -token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) - -print(token) -# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg - -data = auth_s.loads(token) -print(data["name"]) -# itsdangerous -``` - - -## Donate - -The Pallets organization develops and supports ItsDangerous and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -[please donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD deleted file mode 100644 index 245f43e..0000000 --- a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 -itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 -itsdangerous-2.2.0.dist-info/RECORD,, -itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 -itsdangerous/__pycache__/__init__.cpython-312.pyc,, -itsdangerous/__pycache__/_json.cpython-312.pyc,, -itsdangerous/__pycache__/encoding.cpython-312.pyc,, -itsdangerous/__pycache__/exc.cpython-312.pyc,, -itsdangerous/__pycache__/serializer.cpython-312.pyc,, -itsdangerous/__pycache__/signer.cpython-312.pyc,, -itsdangerous/__pycache__/timed.cpython-312.pyc,, -itsdangerous/__pycache__/url_safe.cpython-312.pyc,, -itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 -itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 -itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 -itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 -itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 -itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 -itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/lib/python3.12/site-packages/itsdangerous/__init__.py b/lib/python3.12/site-packages/itsdangerous/__init__.py deleted file mode 100644 index ea55256..0000000 --- a/lib/python3.12/site-packages/itsdangerous/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .encoding import base64_decode as base64_decode -from .encoding import base64_encode as base64_encode -from .encoding import want_bytes as want_bytes -from .exc import BadData as BadData -from .exc import BadHeader as BadHeader -from .exc import BadPayload as BadPayload -from .exc import BadSignature as BadSignature -from .exc import BadTimeSignature as BadTimeSignature -from .exc import SignatureExpired as SignatureExpired -from .serializer import Serializer as Serializer -from .signer import HMACAlgorithm as HMACAlgorithm -from .signer import NoneAlgorithm as NoneAlgorithm -from .signer import Signer as Signer -from .timed import TimedSerializer as TimedSerializer -from .timed import TimestampSigner as TimestampSigner -from .url_safe import URLSafeSerializer as URLSafeSerializer -from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " ItsDangerous 2.3. Use feature detection or" - " 'importlib.metadata.version(\"itsdangerous\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("itsdangerous") - - raise AttributeError(name) diff --git a/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 767020b1871ad440123b1ab73607a55f26aa01f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1637 zcmZXU&ube;6vt=vW3~FRk}UsDO|o{=I(vxJ+G!y)6x=v%3au$sLSZk=AC)PQ@|IT3&1mM`umLYRzGFW9^%$* zEh*A4j3kv_6vi8e+No%^Xv{yn<}%)n7>8LSfrmq(uuDVfw)&FCFr52@vUMscU>@)` zr;H0Q3SfLi`+h_jSS7HUUMHloC(vmX>^ok-&uM4It@~Y1aQv>&RBQ-|*1J6B;!r zCz2*aJAMf8fb2v0+`B@E_=u$#@yUUv-r7NGKedf>-)Jl?^^wFfzh@tTFKimw*S3vQ z9`Cn{ce=hEO|0!BR@;_GPsT<)KC2oX!F+Q%lo+EhlH4$kq`WrT{w*OQVW*Q!NCTea z&z2Ai5KxRcvMlT0&Bj&~@CNI(c)!sV(Kc*1ZgjUI8R1?xBj1Y}-M-v{d&LE;(tzy` zh1L4|D~;Hb{Aw4rMms!ijBl*rx?bo>*R6N^n7R&}83YHZdj}Su!zh~2eM_F_ia#9u znOk^aEWR*i|1zpSnLnCGsg(JdcA^vW((~E5qaw-AoDe-r&O_4{#}E~!QS E11)ICk^lez diff --git a/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc b/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc deleted file mode 100644 index 1822a381d0d34955d64ed44734ba29c2500fe931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1191 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 diff --git a/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc b/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc deleted file mode 100644 index c8ef4f39c850fe5203f03c110e77a4bb551100ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11296 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 YYi>MOJ+12=Jil#w*Tq9OQ_cwbZ=f%$yZ`_I diff --git a/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc b/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc deleted file mode 100644 index e020643c0ea28fcbb1f01b1f04a0fe1ce1a1f988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8740 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 BX^sE@ diff --git a/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc b/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc deleted file mode 100644 index e98f4d7ad1c820f917bc041eec5429734ab44af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3541 zcmbtWU2Ggz6~41Gv;RN-+qIp<_%=?}Y)E!#k_O=fsFTppintYS71%0_$2)iJv1fOd zJF_@mt!adU*a(4|2NYMdl2!4LDj)@k2cA%a!~>!aNsWXxBvMezLnR(IwW~(y3+LR~ z^*W{$0oUt0=bm%!nLFp4@7(jJL?TLH{Nv-)>>ne9yoZa<2>FDx@eUAIi9rm>B4w!{ zNk|8*KtUEyrJxwHp;&4;SO|hlHdHHA4j00L4gwu1Lt?B)VnlZE3%dra;;Q(w_F- zj&xutknQ~dRkM;8(<>F*)m_uBIFlbpJ~OVJvddMy=sq{~{3IwPW^{)gJE|G1Xd7%B zgH_s$=t?8_kPK1?yaWL#$V@4yMt}tk`2@%f#ZX_DB4p>E5pI%_WCSlI3n3#S=+LEj0k{{W zLS%|$qh98vZ+>G+FR|`1&YBm@O8p&pFoT*Ex@fv{RHvNH)-0V4MO*sP4L~ zTy?2y)4FBOL@A6SIFB>Oq3#@`j?2x;EXvFJ0>gdIoXuUvsac{GRs=nrFXia79fOu* z3oE|Qsqfo^!C9#xzbXAHXp)BV z3+boQ6d5CKJCg|6M|l5o$ZZ1}vPNx$ei^*p{=!D+2LXdDhrSAD6>HfKU=h%AJJY|FA?h_$P8*TE#`K{%xs`C8|d zJdA4vZF|wKaZhz>RmQzI0$uA^ig=2{tdbXMGdLs)Y}Wa#;{_KM@yRoSHSgFJPhws~ z(~6evIGW~Q&=E8^El&^Aoo)ujuU!AjEy9%f&*_LVNt4r=2lq<%+ z$9Nu2*k&BbJ$X3qm@Yd6rE5W-Wlr979Ye3oGH%zLe2rTgf+bg7;zRJ(`q-!AKezqk z20_vJ9ZU}{l2(#rb~mHo! zt`4sCXPc+*CrLch3Ir3wcLsM~edWq4tM1z1!B>^dBtwi;SY%dhWhrb_nciHrJJhUpKJxmK)Mx@6X{P{GDtt!>>~pspa|A8 zbba95`q(~D9P9(dpP2Ixu~zX1Z_?;=->%Rzu3l!tAA4nT2`T`U=5%wuxx z7>%tWv8;4~-%vUr-^Sb0Gy-)f3=05St~8Y8fFZ+MVjaWVEUFEetA^50>mY2El04aB6^8YM%KFeqGjS(9 zeD(a5^Q%YK()*jy_hZRs{l{N@y|}vX=jOG?UMs&FJGkCI(mcJshc?f?-#5Cdto1$K z4E-%Ow4T|ua_&l{dFEa!(@bu_8{jhJyWrueGfOUW_->#ds%~zgvLvuvj|-YM=%ig? z9O^CMpGW;5XKsyG#3HNk$2$Uk5UB$&!8IG!w2EG4n&w3{t!x`L3+cF~eYd7tZAnPe z47;dl9FvA8Ve(R%wyie-5n@)j&r7t+N0C{Ure!7H)mUzy_MMFP1IGy~k@GT44}M7Q z2V^zeijpV4d`rpP8alM5oM^?#zWw(jpHq+D>&>)Ocmi^I0AfgmN&2xC%3x3bP%DO1 zoJ3O}C4l<)X(_1=-X}2eZ0Bu{bTREaP}=ALakq!T4h9-9+3Wq6>QjIFoXr;;YMIa| zjEe#}KAoG|YC5LrOwFa3BM#gT2E{t%K$`-+g}Csem}pqxI!#9rs-)?-Soz^f!EU5h zh4S6ryvTSF`Z`*i(>e5d!1tAe8QrSR=`+lwx t.Any: - return _json.loads(payload) - - @staticmethod - def dumps(obj: t.Any, **kwargs: t.Any) -> str: - kwargs.setdefault("ensure_ascii", False) - kwargs.setdefault("separators", (",", ":")) - return _json.dumps(obj, **kwargs) diff --git a/lib/python3.12/site-packages/itsdangerous/encoding.py b/lib/python3.12/site-packages/itsdangerous/encoding.py deleted file mode 100644 index f5ca80f..0000000 --- a/lib/python3.12/site-packages/itsdangerous/encoding.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import base64 -import string -import struct -import typing as t - -from .exc import BadData - - -def want_bytes( - s: str | bytes, encoding: str = "utf-8", errors: str = "strict" -) -> bytes: - if isinstance(s, str): - s = s.encode(encoding, errors) - - return s - - -def base64_encode(string: str | bytes) -> bytes: - """Base64 encode a string of bytes or text. The resulting bytes are - safe to use in URLs. - """ - string = want_bytes(string) - return base64.urlsafe_b64encode(string).rstrip(b"=") - - -def base64_decode(string: str | bytes) -> bytes: - """Base64 decode a URL-safe string of bytes or text. The result is - bytes. - """ - string = want_bytes(string, encoding="ascii", errors="ignore") - string += b"=" * (-len(string) % 4) - - try: - return base64.urlsafe_b64decode(string) - except (TypeError, ValueError) as e: - raise BadData("Invalid base64-encoded data") from e - - -# The alphabet used by base64.urlsafe_* -_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") - -_int64_struct = struct.Struct(">Q") -_int_to_bytes = _int64_struct.pack -_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) - - -def int_to_bytes(num: int) -> bytes: - return _int_to_bytes(num).lstrip(b"\x00") - - -def bytes_to_int(bytestr: bytes) -> int: - return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/lib/python3.12/site-packages/itsdangerous/exc.py b/lib/python3.12/site-packages/itsdangerous/exc.py deleted file mode 100644 index a75adcd..0000000 --- a/lib/python3.12/site-packages/itsdangerous/exc.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -import typing as t -from datetime import datetime - - -class BadData(Exception): - """Raised if bad data of any sort was encountered. This is the base - for all exceptions that ItsDangerous defines. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str): - super().__init__(message) - self.message = message - - def __str__(self) -> str: - return self.message - - -class BadSignature(BadData): - """Raised if a signature does not match.""" - - def __init__(self, message: str, payload: t.Any | None = None): - super().__init__(message) - - #: The payload that failed the signature test. In some - #: situations you might still want to inspect this, even if - #: you know it was tampered with. - #: - #: .. versionadded:: 0.14 - self.payload: t.Any | None = payload - - -class BadTimeSignature(BadSignature): - """Raised if a time-based signature is invalid. This is a subclass - of :class:`BadSignature`. - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - date_signed: datetime | None = None, - ): - super().__init__(message, payload) - - #: If the signature expired this exposes the date of when the - #: signature was created. This can be helpful in order to - #: tell the user how long a link has been gone stale. - #: - #: .. versionchanged:: 2.0 - #: The datetime value is timezone-aware rather than naive. - #: - #: .. versionadded:: 0.14 - self.date_signed = date_signed - - -class SignatureExpired(BadTimeSignature): - """Raised if a signature timestamp is older than ``max_age``. This - is a subclass of :exc:`BadTimeSignature`. - """ - - -class BadHeader(BadSignature): - """Raised if a signed header is invalid in some form. This only - happens for serializers that have a header that goes with the - signature. - - .. versionadded:: 0.24 - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - header: t.Any | None = None, - original_error: Exception | None = None, - ): - super().__init__(message, payload) - - #: If the header is actually available but just malformed it - #: might be stored here. - self.header: t.Any | None = header - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error - - -class BadPayload(BadData): - """Raised if a payload is invalid. This could happen if the payload - is loaded despite an invalid signature, or if there is a mismatch - between the serializer and deserializer. The original exception - that occurred during loading is stored on as :attr:`original_error`. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str, original_error: Exception | None = None): - super().__init__(message) - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error diff --git a/lib/python3.12/site-packages/itsdangerous/py.typed b/lib/python3.12/site-packages/itsdangerous/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.12/site-packages/itsdangerous/serializer.py b/lib/python3.12/site-packages/itsdangerous/serializer.py deleted file mode 100644 index 5ddf387..0000000 --- a/lib/python3.12/site-packages/itsdangerous/serializer.py +++ /dev/null @@ -1,406 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import json -import typing as t - -from .encoding import want_bytes -from .exc import BadPayload -from .exc import BadSignature -from .signer import _make_keys_list -from .signer import Signer - -if t.TYPE_CHECKING: - import typing_extensions as te - - # This should be either be str or bytes. To avoid having to specify the - # bound type, it falls back to a union if structural matching fails. - _TSerialized = te.TypeVar( - "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] - ) -else: - # Still available at runtime on Python < 3.13, but without the default. - _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) - - -class _PDataSerializer(t.Protocol[_TSerialized]): - def loads(self, payload: _TSerialized, /) -> t.Any: ... - # A signature with additional arguments is not handled correctly by type - # checkers right now, so an overload is used below for serializers that - # don't match this strict protocol. - def dumps(self, obj: t.Any, /) -> _TSerialized: ... - - -# Use TypeIs once it's available in typing_extensions or 3.13. -def is_text_serializer( - serializer: _PDataSerializer[t.Any], -) -> te.TypeGuard[_PDataSerializer[str]]: - """Checks whether a serializer generates text or binary.""" - return isinstance(serializer.dumps({}), str) - - -class Serializer(t.Generic[_TSerialized]): - """A serializer wraps a :class:`~itsdangerous.signer.Signer` to - enable serializing and securely signing data other than bytes. It - can unsign to verify that the data hasn't been changed. - - The serializer provides :meth:`dumps` and :meth:`loads`, similar to - :mod:`json`, and by default uses :mod:`json` internally to serialize - the data to bytes. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param serializer: An object that provides ``dumps`` and ``loads`` - methods for serializing data to a string. Defaults to - :attr:`default_serializer`, which defaults to :mod:`json`. - :param serializer_kwargs: Keyword arguments to pass when calling - ``serializer.dumps``. - :param signer: A ``Signer`` class to instantiate when signing data. - Defaults to :attr:`default_signer`, which defaults to - :class:`~itsdangerous.signer.Signer`. - :param signer_kwargs: Keyword arguments to pass when instantiating - the ``Signer`` class. - :param fallback_signers: List of signer parameters to try when - unsigning with the default signer fails. Each item can be a dict - of ``signer_kwargs``, a ``Signer`` class, or a tuple of - ``(signer, signer_kwargs)``. Defaults to - :attr:`default_fallback_signers`. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 2.0 - Removed the default SHA-512 fallback signer from - ``default_fallback_signers``. - - .. versionchanged:: 1.1 - Added support for ``fallback_signers`` and configured a default - SHA-512 fallback. This fallback is for users who used the yanked - 1.0.0 release which defaulted to SHA-512. - - .. versionchanged:: 0.14 - The ``signer`` and ``signer_kwargs`` parameters were added to - the constructor. - """ - - #: The default serialization module to use to serialize data to a - #: string internally. The default is :mod:`json`, but can be changed - #: to any object that provides ``dumps`` and ``loads`` methods. - default_serializer: _PDataSerializer[t.Any] = json - - #: The default ``Signer`` class to instantiate when signing data. - #: The default is :class:`itsdangerous.signer.Signer`. - default_signer: type[Signer] = Signer - - #: The default fallback signers to try when unsigning fails. - default_fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = [] - - # Serializer[str] if no data serializer is provided, or if it returns str. - @t.overload - def __init__( - self: Serializer[str], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: None | _PDataSerializer[str] = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer positional argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer keyword argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a positional argument. If the strict signature of - # _PDataSerializer doesn't match, fall back to a union, requiring the user - # to specify the type. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a keyword argument. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: t.Any | None = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - - if salt is not None: - salt = want_bytes(salt) - # if salt is None then the signer's default is used - - self.salt = salt - - if serializer is None: - serializer = self.default_serializer - - self.serializer: _PDataSerializer[_TSerialized] = serializer - self.is_text_serializer: bool = is_text_serializer(serializer) - - if signer is None: - signer = self.default_signer - - self.signer: type[Signer] = signer - self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} - - if fallback_signers is None: - fallback_signers = list(self.default_fallback_signers) - - self.fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = fallback_signers - self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def load_payload( - self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None - ) -> t.Any: - """Loads the encoded object. This function raises - :class:`.BadPayload` if the payload is not valid. The - ``serializer`` parameter can be used to override the serializer - stored on the class. The encoded ``payload`` should always be - bytes. - """ - if serializer is None: - use_serializer = self.serializer - is_text = self.is_text_serializer - else: - use_serializer = serializer - is_text = is_text_serializer(serializer) - - try: - if is_text: - return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] - - return use_serializer.loads(payload) # type: ignore[arg-type] - except Exception as e: - raise BadPayload( - "Could not load the payload because an exception" - " occurred on unserializing the data.", - original_error=e, - ) from e - - def dump_payload(self, obj: t.Any) -> bytes: - """Dumps the encoded object. The return value is always bytes. - If the internal serializer returns text, the value will be - encoded as UTF-8. - """ - return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) - - def make_signer(self, salt: str | bytes | None = None) -> Signer: - """Creates a new instance of the signer to be used. The default - implementation uses the :class:`.Signer` base class. - """ - if salt is None: - salt = self.salt - - return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) - - def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: - """Iterates over all signers to be tried for unsigning. Starts - with the configured signer, then constructs each signer - specified in ``fallback_signers``. - """ - if salt is None: - salt = self.salt - - yield self.make_signer(salt) - - for fallback in self.fallback_signers: - if isinstance(fallback, dict): - kwargs = fallback - fallback = self.signer - elif isinstance(fallback, tuple): - fallback, kwargs = fallback - else: - kwargs = self.signer_kwargs - - for secret_key in self.secret_keys: - yield fallback(secret_key, salt=salt, **kwargs) - - def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: - """Returns a signed string serialized with the internal - serializer. The return value can be either a byte or unicode - string depending on the format of the internal serializer. - """ - payload = want_bytes(self.dump_payload(obj)) - rv = self.make_signer(salt).sign(payload) - - if self.is_text_serializer: - return rv.decode("utf-8") # type: ignore[return-value] - - return rv # type: ignore[return-value] - - def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: - """Like :meth:`dumps` but dumps into a file. The file handle has - to be compatible with what the internal serializer expects. - """ - f.write(self.dumps(obj, salt)) - - def loads( - self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any - ) -> t.Any: - """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the - signature validation fails. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - return self.load_payload(signer.unsign(s)) - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: - """Like :meth:`loads` but loads from a file.""" - return self.loads(f.read(), salt) - - def loads_unsafe( - self, s: str | bytes, salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads` but without verifying the signature. This - is potentially very dangerous to use depending on how your - serializer works. The return value is ``(signature_valid, - payload)`` instead of just the payload. The first item will be a - boolean that indicates if the signature is valid. This function - never fails. - - Use it for debugging only and if you know that your serializer - module is not exploitable (for example, do not use it with a - pickle serializer). - - .. versionadded:: 0.15 - """ - return self._loads_unsafe_impl(s, salt) - - def _loads_unsafe_impl( - self, - s: str | bytes, - salt: str | bytes | None, - load_kwargs: dict[str, t.Any] | None = None, - load_payload_kwargs: dict[str, t.Any] | None = None, - ) -> tuple[bool, t.Any]: - """Low level helper function to implement :meth:`loads_unsafe` - in serializer subclasses. - """ - if load_kwargs is None: - load_kwargs = {} - - try: - return True, self.loads(s, salt=salt, **load_kwargs) - except BadSignature as e: - if e.payload is None: - return False, None - - if load_payload_kwargs is None: - load_payload_kwargs = {} - - try: - return ( - False, - self.load_payload(e.payload, **load_payload_kwargs), - ) - except BadPayload: - return False, None - - def load_unsafe( - self, f: t.IO[t.Any], salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads_unsafe` but loads from a file. - - .. versionadded:: 0.15 - """ - return self.loads_unsafe(f.read(), salt=salt) diff --git a/lib/python3.12/site-packages/itsdangerous/signer.py b/lib/python3.12/site-packages/itsdangerous/signer.py deleted file mode 100644 index e324dc0..0000000 --- a/lib/python3.12/site-packages/itsdangerous/signer.py +++ /dev/null @@ -1,266 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import hashlib -import hmac -import typing as t - -from .encoding import _base64_alphabet -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import want_bytes -from .exc import BadSignature - - -class SigningAlgorithm: - """Subclasses must implement :meth:`get_signature` to provide - signature generation functionality. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - """Returns the signature for the given key and value.""" - raise NotImplementedError() - - def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: - """Verifies the given signature matches the expected - signature. - """ - return hmac.compare_digest(sig, self.get_signature(key, value)) - - -class NoneAlgorithm(SigningAlgorithm): - """Provides an algorithm that does not perform any signing and - returns an empty signature. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - return b"" - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class HMACAlgorithm(SigningAlgorithm): - """Provides signature generation using HMACs.""" - - #: The digest method to use with the MAC algorithm. This defaults to - #: SHA1, but can be changed to any other function in the hashlib - #: module. - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - def __init__(self, digest_method: t.Any = None): - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - def get_signature(self, key: bytes, value: bytes) -> bytes: - mac = hmac.new(key, msg=value, digestmod=self.digest_method) - return mac.digest() - - -def _make_keys_list( - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], -) -> list[bytes]: - if isinstance(secret_key, (str, bytes)): - return [want_bytes(secret_key)] - - return [want_bytes(s) for s in secret_key] # pyright: ignore - - -class Signer: - """A signer securely signs bytes, then unsigns them to verify that - the value hasn't been changed. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param sep: Separator between the signature and value. - :param key_derivation: How to derive the signing key from the secret - key and salt. Possible values are ``concat``, ``django-concat``, - or ``hmac``. Defaults to :attr:`default_key_derivation`, which - defaults to ``django-concat``. - :param digest_method: Hash function to use when generating the HMAC - signature. Defaults to :attr:`default_digest_method`, which - defaults to :func:`hashlib.sha1`. Note that the security of the - hash alone doesn't apply when used intermediately in HMAC. - :param algorithm: A :class:`SigningAlgorithm` instance to use - instead of building a default :class:`HMACAlgorithm` with the - ``digest_method``. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 0.18 - ``algorithm`` was added as an argument to the class constructor. - - .. versionchanged:: 0.14 - ``key_derivation`` and ``digest_method`` were added as arguments - to the class constructor. - """ - - #: The default digest method to use for the signer. The default is - #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or - #: compatible object. Note that the security of the hash alone - #: doesn't apply when used intermediately in HMAC. - #: - #: .. versionadded:: 0.14 - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - #: The default scheme to use to derive the signing key from the - #: secret key and salt. The default is ``django-concat``. Possible - #: values are ``concat``, ``django-concat``, and ``hmac``. - #: - #: .. versionadded:: 0.14 - default_key_derivation: str = "django-concat" - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous.Signer", - sep: str | bytes = b".", - key_derivation: str | None = None, - digest_method: t.Any | None = None, - algorithm: SigningAlgorithm | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - self.sep: bytes = want_bytes(sep) - - if self.sep in _base64_alphabet: - raise ValueError( - "The given separator cannot be used because it may be" - " contained in the signature itself. ASCII letters," - " digits, and '-_=' must not be used." - ) - - if salt is not None: - salt = want_bytes(salt) - else: - salt = b"itsdangerous.Signer" - - self.salt = salt - - if key_derivation is None: - key_derivation = self.default_key_derivation - - self.key_derivation: str = key_derivation - - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - if algorithm is None: - algorithm = HMACAlgorithm(self.digest_method) - - self.algorithm: SigningAlgorithm = algorithm - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def derive_key(self, secret_key: str | bytes | None = None) -> bytes: - """This method is called to derive the key. The default key - derivation choices can be overridden here. Key derivation is not - intended to be used as a security method to make a complex key - out of a short password. Instead you should use large random - secret keys. - - :param secret_key: A specific secret key to derive from. - Defaults to the last item in :attr:`secret_keys`. - - .. versionchanged:: 2.0 - Added the ``secret_key`` parameter. - """ - if secret_key is None: - secret_key = self.secret_keys[-1] - else: - secret_key = want_bytes(secret_key) - - if self.key_derivation == "concat": - return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) - elif self.key_derivation == "django-concat": - return t.cast( - bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() - ) - elif self.key_derivation == "hmac": - mac = hmac.new(secret_key, digestmod=self.digest_method) - mac.update(self.salt) - return mac.digest() - elif self.key_derivation == "none": - return secret_key - else: - raise TypeError("Unknown key derivation method") - - def get_signature(self, value: str | bytes) -> bytes: - """Returns the signature for the given value.""" - value = want_bytes(value) - key = self.derive_key() - sig = self.algorithm.get_signature(key, value) - return base64_encode(sig) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string.""" - value = want_bytes(value) - return value + self.sep + self.get_signature(value) - - def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: - """Verifies the signature for the given value.""" - try: - sig = base64_decode(sig) - except Exception: - return False - - value = want_bytes(value) - - for secret_key in reversed(self.secret_keys): - key = self.derive_key(secret_key) - - if self.algorithm.verify_signature(key, value, sig): - return True - - return False - - def unsign(self, signed_value: str | bytes) -> bytes: - """Unsigns the given string.""" - signed_value = want_bytes(signed_value) - - if self.sep not in signed_value: - raise BadSignature(f"No {self.sep!r} found in value") - - value, sig = signed_value.rsplit(self.sep, 1) - - if self.verify_signature(value, sig): - return value - - raise BadSignature(f"Signature {sig!r} does not match", payload=value) - - def validate(self, signed_value: str | bytes) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid. - """ - try: - self.unsign(signed_value) - return True - except BadSignature: - return False diff --git a/lib/python3.12/site-packages/itsdangerous/timed.py b/lib/python3.12/site-packages/itsdangerous/timed.py deleted file mode 100644 index 7384375..0000000 --- a/lib/python3.12/site-packages/itsdangerous/timed.py +++ /dev/null @@ -1,228 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import time -import typing as t -from datetime import datetime -from datetime import timezone - -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import bytes_to_int -from .encoding import int_to_bytes -from .encoding import want_bytes -from .exc import BadSignature -from .exc import BadTimeSignature -from .exc import SignatureExpired -from .serializer import _TSerialized -from .serializer import Serializer -from .signer import Signer - - -class TimestampSigner(Signer): - """Works like the regular :class:`.Signer` but also records the time - of the signing and can be used to expire signatures. The - :meth:`unsign` method can raise :exc:`.SignatureExpired` if the - unsigning failed because the signature is expired. - """ - - def get_timestamp(self) -> int: - """Returns the current timestamp. The function must return an - integer. - """ - return int(time.time()) - - def timestamp_to_datetime(self, ts: int) -> datetime: - """Convert the timestamp from :meth:`get_timestamp` into an - aware :class`datetime.datetime` in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - return datetime.fromtimestamp(ts, tz=timezone.utc) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string and also attaches time information.""" - value = want_bytes(value) - timestamp = base64_encode(int_to_bytes(self.get_timestamp())) - sep = want_bytes(self.sep) - value = value + sep + timestamp - return value + sep + self.get_signature(value) - - # Ignore overlapping signatures check, return_timestamp is the only - # parameter that affects the return type. - - @t.overload - def unsign( # type: ignore[overload-overlap] - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[False] = False, - ) -> bytes: ... - - @t.overload - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[True] = True, - ) -> tuple[bytes, datetime]: ... - - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - ) -> tuple[bytes, datetime] | bytes: - """Works like the regular :meth:`.Signer.unsign` but can also - validate the time. See the base docstring of the class for - the general behavior. If ``return_timestamp`` is ``True`` the - timestamp of the signature will be returned as an aware - :class:`datetime.datetime` object in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - try: - result = super().unsign(signed_value) - sig_error = None - except BadSignature as e: - sig_error = e - result = e.payload or b"" - - sep = want_bytes(self.sep) - - # If there is no timestamp in the result there is something - # seriously wrong. In case there was a signature error, we raise - # that one directly, otherwise we have a weird situation in - # which we shouldn't have come except someone uses a time-based - # serializer on non-timestamp data, so catch that. - if sep not in result: - if sig_error: - raise sig_error - - raise BadTimeSignature("timestamp missing", payload=result) - - value, ts_bytes = result.rsplit(sep, 1) - ts_int: int | None = None - ts_dt: datetime | None = None - - try: - ts_int = bytes_to_int(base64_decode(ts_bytes)) - except Exception: - pass - - # Signature is *not* okay. Raise a proper error now that we have - # split the value and the timestamp. - if sig_error is not None: - if ts_int is not None: - try: - ts_dt = self.timestamp_to_datetime(ts_int) - except (ValueError, OSError, OverflowError) as exc: - # Windows raises OSError - # 32-bit raises OverflowError - raise BadTimeSignature( - "Malformed timestamp", payload=value - ) from exc - - raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) - - # Signature was okay but the timestamp is actually not there or - # malformed. Should not happen, but we handle it anyway. - if ts_int is None: - raise BadTimeSignature("Malformed timestamp", payload=value) - - # Check timestamp is not older than max_age - if max_age is not None: - age = self.get_timestamp() - ts_int - - if age > max_age: - raise SignatureExpired( - f"Signature age {age} > {max_age} seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if age < 0: - raise SignatureExpired( - f"Signature age {age} < 0 seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if return_timestamp: - return value, self.timestamp_to_datetime(ts_int) - - return value - - def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid.""" - try: - self.unsign(signed_value, max_age=max_age) - return True - except BadSignature: - return False - - -class TimedSerializer(Serializer[_TSerialized]): - """Uses :class:`TimestampSigner` instead of the default - :class:`.Signer`. - """ - - default_signer: type[TimestampSigner] = TimestampSigner - - def iter_unsigners( - self, salt: str | bytes | None = None - ) -> cabc.Iterator[TimestampSigner]: - return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) - - # TODO: Signature is incompatible because parameters were added - # before salt. - - def loads( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - salt: str | bytes | None = None, - ) -> t.Any: - """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the - signature validation fails. If a ``max_age`` is provided it will - ensure the signature is not older than that time in seconds. In - case the signature is outdated, :exc:`.SignatureExpired` is - raised. All arguments are forwarded to the signer's - :meth:`~TimestampSigner.unsign` method. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - base64d, timestamp = signer.unsign( - s, max_age=max_age, return_timestamp=True - ) - payload = self.load_payload(base64d) - - if return_timestamp: - return payload, timestamp - - return payload - except SignatureExpired: - # The signature was unsigned successfully but was - # expired. Do not try the next signer. - raise - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def loads_unsafe( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - salt: str | bytes | None = None, - ) -> tuple[bool, t.Any]: - return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/lib/python3.12/site-packages/itsdangerous/url_safe.py b/lib/python3.12/site-packages/itsdangerous/url_safe.py deleted file mode 100644 index 56a0793..0000000 --- a/lib/python3.12/site-packages/itsdangerous/url_safe.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -import typing as t -import zlib - -from ._json import _CompactJSON -from .encoding import base64_decode -from .encoding import base64_encode -from .exc import BadPayload -from .serializer import _PDataSerializer -from .serializer import Serializer -from .timed import TimedSerializer - - -class URLSafeSerializerMixin(Serializer[str]): - """Mixed in with a regular serializer it will attempt to zlib - compress the string to make it shorter if necessary. It will also - base64 encode the string so that it can safely be placed in a URL. - """ - - default_serializer: _PDataSerializer[str] = _CompactJSON - - def load_payload( - self, - payload: bytes, - *args: t.Any, - serializer: t.Any | None = None, - **kwargs: t.Any, - ) -> t.Any: - decompress = False - - if payload.startswith(b"."): - payload = payload[1:] - decompress = True - - try: - json = base64_decode(payload) - except Exception as e: - raise BadPayload( - "Could not base64 decode the payload because of an exception", - original_error=e, - ) from e - - if decompress: - try: - json = zlib.decompress(json) - except Exception as e: - raise BadPayload( - "Could not zlib decompress the payload before decoding the payload", - original_error=e, - ) from e - - return super().load_payload(json, *args, **kwargs) - - def dump_payload(self, obj: t.Any) -> bytes: - json = super().dump_payload(obj) - is_compressed = False - compressed = zlib.compress(json) - - if len(compressed) < (len(json) - 1): - json = compressed - is_compressed = True - - base64d = base64_encode(json) - - if is_compressed: - base64d = b"." + base64d - - return base64d - - -class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): - """Works like :class:`.Serializer` but dumps and loads into a URL - safe string consisting of the upper and lowercase character of the - alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ - - -class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): - """Works like :class:`.TimedSerializer` but dumps and loads into a - URL safe string consisting of the upper and lowercase character of - the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/INSTALLER b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt deleted file mode 100644 index c37cae4..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2007 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/METADATA b/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/METADATA deleted file mode 100644 index 265cc32..0000000 --- a/lib/python3.12/site-packages/jinja2-3.1.4.dist-info/METADATA +++ /dev/null @@ -1,76 +0,0 @@ -Metadata-Version: 2.1 -Name: Jinja2 -Version: 3.1.4 -Summary: A very fast and expressive template engine. -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Typing :: Typed -Requires-Dist: MarkupSafe>=2.0 -Requires-Dist: Babel>=2.7 ; extra == "i18n" -Project-URL: Changes, https://jinja.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/jinja/ -Provides-Extra: i18n - -# Jinja - -Jinja is a fast, expressive, extensible templating engine. Special -placeholders in the template allow writing code similar to Python -syntax. Then the template is passed data to render the final document. - -It includes: - -- Template inheritance and inclusion. -- Define and import macros within templates. -- HTML templates can use autoescaping to prevent XSS from untrusted - user input. -- A sandboxed environment can safely render untrusted templates. -- AsyncIO support for generating templates and calling async - functions. -- I18N support with Babel. -- Templates are compiled to optimized Python code just-in-time and - cached, or can be compiled ahead-of-time. -- Exceptions point to the correct line in templates to make debugging - easier. -- Extensible filters, tests, functions, and even syntax. - -Jinja's philosophy is that while application logic belongs in Python if -possible, it shouldn't make the template designer's job difficult by -restricting functionality too much. - - -## In A Nutshell - -.. code-block:: jinja - - {% extends "base.html" %} - {% block title %}Members{% endblock %} - {% block content %} -