From 2f45997b797c75379c604d4862b0e1614693b83f Mon Sep 17 00:00:00 2001
From: hellcat <>
Date: Fri, 2 Jan 2026 19:10:22 +0800
Subject: [PATCH] no message
---
.editorconfig | 0
.env.example | 0
.gitignore | 0
app/Services/Article/CacheTg.php | 0
app/Services/Article/Cmd.php | 0
app/Services/Article/Schema.php | 0
app/Services/Article_old.php | 0
app/Services/Country-meiyong.php | 0
app/Services/Cron.php | 28 +-
app/Services/Cron/ArticleSchema.php | 0
app/Services/Cron/Book.php | 0
app/Services/Cron/FnTgPublish.php | 77 ++
app/Services/Cron/FreenodeCrawl.php | 0
app/Services/Cron/FreenodeFile.php | 0
app/Services/Cron/FreenodeLog.php | 0
app/Services/Cron/FreenodeMerge.php | 0
app/Services/Cron/FreenodePool.php | 0
app/Services/Cron/FreenodeSync.php | 0
app/Services/Cron/HttpQueue.php | 8 +
app/Services/HttpQueue.php | 0
app/Services/OpenApi/Telegram.php | 9 +-
app/Services/SDK/Master/Master.php | 0
app/Services/SDK/Master/Telegram.php | 0
app/Services/SlaveMap.php | 0
app/Services/Tg/Hook/Dog.php | 0
app/Services/Tg/Hook/Mod/Article.php | 0
app/Services/Tg/Hook/Mod/ArticleCache.php | 0
app/Services/Tg/Hook/Mod/ArticleConfig.php | 0
app/Services/Tg/Hook/Mod/ArticleSchema.php | 0
.../Tg/Hook/Mod/ArticleSiteMapGroup.php | 0
app/Services/Tg/Hook/Mod/Article_old.php | 0
app/Services/Tg/Hook/Mod/Base.php | 0
app/Services/Tg/Hook/Mod/Blade.php | 0
app/Services/Tg/Hook/Mod/BladeOld.php | 0
app/Services/Tg/Hook/Mod/Book.php | 0
app/Services/Tg/Hook/Mod/Box.php | 0
app/Services/Tg/Hook/Mod/Cron.php | 0
app/Services/Tg/Hook/Mod/Db.php | 0
app/Services/Tg/Hook/Mod/Dev.php | 0
app/Services/Tg/Hook/Mod/Dove.php | 0
app/Services/Tg/Hook/Mod/DoveSite.php | 0
app/Services/Tg/Hook/Mod/FreenodeFrom.php | 0
app/Services/Tg/Hook/Mod/FreenodePool.php | 0
app/Services/Tg/Hook/Mod/GemboxDns.php | 0
app/Services/Tg/Hook/Mod/Good.php | 0
app/Services/Tg/Hook/Mod/Hook.php | 0
app/Services/Tg/Hook/Mod/Hook_old.php | 0
app/Services/Tg/Hook/Mod/HttpQueue.php | 0
app/Services/Tg/Hook/Mod/Jctj.php | 0
app/Services/Tg/Hook/Mod/JctjOption.php | 0
app/Services/Tg/Hook/Mod/Note.php | 0
app/Services/Tg/Hook/Mod/Note_option.php | 0
app/Services/Tg/Hook/Mod/Option.php | 0
app/Services/Tg/Hook/Mod/Ship.php | 0
app/Services/Tg/Hook/Mod/SiteMap.php | 0
app/Services/Tg/Hook/Mod/SitePathMap.php | 0
app/Services/Tg/Hook/Mod/TelegramKey.php | 0
app/Services/Tg/Hook/Mod/Test.php | 0
app/Services/Tg/Hook/Mod/Tool.php | 0
app/Services/Tg/Hook/Mod/Upload.php | 0
app/Services/Tg/Http.php | 0
app/Services/TomTool/Telegram/Master.php | 29 +-
app/Services/TomTool/Telegram/Sdk.php | 74 +-
app/Services/TomTool/Telegram/Slave.php | 29 +-
composer.json | 1 +
composer.lock | 146 ++-
fn的tg策略.md | 0
fn部署.md | 0
public/js/jquery.min.js | 0
public/upload/无标题.png | Bin
resources/views/cmd.blade.php | 0
resources/views/cmd/image/upload.blade.php | 0
scripts/cron.php | 0
tg发送逻辑.md | 8 +
vendor/composer/autoload_classmap.php | 409 ++++++-
vendor/composer/autoload_psr4.php | 2 +
vendor/composer/autoload_static.php | 419 ++++++-
vendor/composer/installed.json | 150 +++
vendor/composer/installed.php | 22 +-
.../tmp-b1bec4785aa3cb26f6cad297d3828558.zip | Bin
vendor/intervention/gif/LICENSE | 21 +
vendor/intervention/gif/composer.json | 44 +
vendor/intervention/gif/phpunit.xml.dist | 13 +
.../intervention/gif/src/AbstractEntity.php | 40 +
.../gif/src/AbstractExtension.php | 10 +
.../gif/src/Blocks/ApplicationExtension.php | 95 ++
vendor/intervention/gif/src/Blocks/Color.php | 100 ++
.../gif/src/Blocks/ColorTable.php | 140 +++
.../gif/src/Blocks/CommentExtension.php | 52 +
.../gif/src/Blocks/DataSubBlock.php | 47 +
.../gif/src/Blocks/FrameBlock.php | 262 ++++
.../src/Blocks/GraphicControlExtension.php | 159 +++
vendor/intervention/gif/src/Blocks/Header.php | 42 +
.../intervention/gif/src/Blocks/ImageData.php | 80 ++
.../gif/src/Blocks/ImageDescriptor.php | 246 ++++
.../src/Blocks/LogicalScreenDescriptor.php | 254 ++++
.../Blocks/NetscapeApplicationExtension.php | 52 +
.../gif/src/Blocks/PlainTextExtension.php | 63 +
.../gif/src/Blocks/TableBasedImage.php | 50 +
.../intervention/gif/src/Blocks/Trailer.php | 12 +
vendor/intervention/gif/src/Builder.php | 219 ++++
vendor/intervention/gif/src/Decoder.php | 47 +
.../gif/src/Decoders/AbstractDecoder.php | 165 +++
.../src/Decoders/AbstractPackedBitDecoder.php | 43 +
.../Decoders/ApplicationExtensionDecoder.php | 71 ++
.../gif/src/Decoders/ColorDecoder.php | 38 +
.../gif/src/Decoders/ColorTableDecoder.php | 28 +
.../src/Decoders/CommentExtensionDecoder.php | 61 +
.../gif/src/Decoders/DataSubBlockDecoder.php | 27 +
.../gif/src/Decoders/FrameBlockDecoder.php | 53 +
.../gif/src/Decoders/GifDataStreamDecoder.php | 59 +
.../GraphicControlExtensionDecoder.php | 97 ++
.../gif/src/Decoders/HeaderDecoder.php | 42 +
.../gif/src/Decoders/ImageDataDecoder.php | 42 +
.../src/Decoders/ImageDescriptorDecoder.php | 94 ++
.../LogicalScreenDescriptorDecoder.php | 139 +++
.../NetscapeApplicationExtensionDecoder.php | 9 +
.../Decoders/PlainTextExtensionDecoder.php | 65 +
.../src/Decoders/TableBasedImageDecoder.php | 42 +
.../intervention/gif/src/DisposalMethod.php | 13 +
.../gif/src/Encoders/AbstractEncoder.php | 24 +
.../Encoders/ApplicationExtensionEncoder.php | 40 +
.../gif/src/Encoders/ColorEncoder.php | 44 +
.../gif/src/Encoders/ColorTableEncoder.php | 36 +
.../src/Encoders/CommentExtensionEncoder.php | 47 +
.../gif/src/Encoders/DataSubBlockEncoder.php | 30 +
.../gif/src/Encoders/FrameBlockEncoder.php | 49 +
.../gif/src/Encoders/GifDataStreamEncoder.php | 78 ++
.../GraphicControlExtensionEncoder.php | 73 ++
.../gif/src/Encoders/HeaderEncoder.php | 30 +
.../gif/src/Encoders/ImageDataEncoder.php | 45 +
.../src/Encoders/ImageDescriptorEncoder.php | 113 ++
.../LogicalScreenDescriptorEncoder.php | 111 ++
.../NetscapeApplicationExtensionEncoder.php | 39 +
.../Encoders/PlainTextExtensionEncoder.php | 63 +
.../src/Encoders/TableBasedImageEncoder.php | 29 +
.../gif/src/Encoders/TrailerEncoder.php | 30 +
.../gif/src/Exceptions/DecoderException.php | 9 +
.../gif/src/Exceptions/EncoderException.php | 9 +
.../gif/src/Exceptions/FormatException.php | 9 +
.../src/Exceptions/NotReadableException.php | 9 +
vendor/intervention/gif/src/GifDataStream.php | 225 ++++
vendor/intervention/gif/src/Splitter.php | 283 +++++
.../intervention/gif/src/Traits/CanDecode.php | 53 +
.../intervention/gif/src/Traits/CanEncode.php | 49 +
.../gif/src/Traits/CanHandleFiles.php | 56 +
vendor/intervention/image/LICENSE | 21 +
vendor/intervention/image/composer.json | 51 +
.../src/Analyzers/ColorspaceAnalyzer.php | 12 +
.../image/src/Analyzers/HeightAnalyzer.php | 12 +
.../src/Analyzers/PixelColorAnalyzer.php | 18 +
.../src/Analyzers/PixelColorsAnalyzer.php | 17 +
.../image/src/Analyzers/ProfileAnalyzer.php | 12 +
.../src/Analyzers/ResolutionAnalyzer.php | 12 +
.../image/src/Analyzers/WidthAnalyzer.php | 12 +
vendor/intervention/image/src/Collection.php | 217 ++++
.../image/src/Colors/AbstractColor.php | 116 ++
.../image/src/Colors/AbstractColorChannel.php | 92 ++
.../image/src/Colors/Cmyk/Channels/Cyan.php | 20 +
.../image/src/Colors/Cmyk/Channels/Key.php | 10 +
.../src/Colors/Cmyk/Channels/Magenta.php | 10 +
.../image/src/Colors/Cmyk/Channels/Yellow.php | 10 +
.../image/src/Colors/Cmyk/Color.php | 153 +++
.../image/src/Colors/Cmyk/Colorspace.php | 77 ++
.../Cmyk/Decoders/StringColorDecoder.php | 36 +
.../image/src/Colors/Hsl/Channels/Hue.php | 30 +
.../src/Colors/Hsl/Channels/Luminance.php | 30 +
.../src/Colors/Hsl/Channels/Saturation.php | 30 +
.../image/src/Colors/Hsl/Color.php | 132 ++
.../image/src/Colors/Hsl/Colorspace.php | 137 +++
.../Hsl/Decoders/StringColorDecoder.php | 39 +
.../image/src/Colors/Hsv/Channels/Hue.php | 30 +
.../src/Colors/Hsv/Channels/Saturation.php | 30 +
.../image/src/Colors/Hsv/Channels/Value.php | 30 +
.../image/src/Colors/Hsv/Color.php | 132 ++
.../image/src/Colors/Hsv/Colorspace.php | 122 ++
.../Hsv/Decoders/StringColorDecoder.php | 39 +
.../intervention/image/src/Colors/Profile.php | 22 +
.../image/src/Colors/Rgb/Channels/Alpha.php | 18 +
.../image/src/Colors/Rgb/Channels/Blue.php | 10 +
.../image/src/Colors/Rgb/Channels/Green.php | 10 +
.../image/src/Colors/Rgb/Channels/Red.php | 30 +
.../image/src/Colors/Rgb/Color.php | 179 +++
.../image/src/Colors/Rgb/Colorspace.php | 135 ++
.../Colors/Rgb/Decoders/HexColorDecoder.php | 46 +
.../Rgb/Decoders/HtmlColornameDecoder.php | 176 +++
.../Rgb/Decoders/StringColorDecoder.php | 49 +
.../Rgb/Decoders/TransparentColorDecoder.php | 30 +
vendor/intervention/image/src/Config.php | 70 ++
.../image/src/Decoders/Base64ImageDecoder.php | 12 +
.../image/src/Decoders/BinaryImageDecoder.php | 12 +
.../image/src/Decoders/ColorObjectDecoder.php | 27 +
.../src/Decoders/DataUriImageDecoder.php | 12 +
.../Decoders/EncodedImageObjectDecoder.php | 12 +
.../src/Decoders/FilePathImageDecoder.php | 12 +
.../src/Decoders/FilePointerImageDecoder.php | 12 +
.../image/src/Decoders/ImageObjectDecoder.php | 27 +
.../src/Decoders/NativeObjectDecoder.php | 12 +
.../src/Decoders/SplFileInfoImageDecoder.php | 12 +
.../image/src/Drivers/AbstractDecoder.php | 146 +++
.../image/src/Drivers/AbstractDriver.php | 127 ++
.../image/src/Drivers/AbstractEncoder.php | 42 +
.../src/Drivers/AbstractFontProcessor.php | 172 +++
.../image/src/Drivers/AbstractFrame.php | 25 +
.../Gd/Analyzers/ColorspaceAnalyzer.php | 23 +
.../Drivers/Gd/Analyzers/HeightAnalyzer.php | 22 +
.../Gd/Analyzers/PixelColorAnalyzer.php | 51 +
.../Gd/Analyzers/PixelColorsAnalyzer.php | 30 +
.../Gd/Analyzers/ResolutionAnalyzer.php | 23 +
.../Drivers/Gd/Analyzers/WidthAnalyzer.php | 22 +
.../image/src/Drivers/Gd/Cloner.php | 90 ++
.../image/src/Drivers/Gd/ColorProcessor.php | 148 +++
.../image/src/Drivers/Gd/Core.php | 117 ++
.../Drivers/Gd/Decoders/AbstractDecoder.php | 57 +
.../Gd/Decoders/Base64ImageDecoder.php | 27 +
.../Gd/Decoders/BinaryImageDecoder.php | 68 ++
.../Gd/Decoders/DataUriImageDecoder.php | 37 +
.../Gd/Decoders/EncodedImageObjectDecoder.php | 27 +
.../Gd/Decoders/FilePathImageDecoder.php | 60 +
.../Gd/Decoders/FilePointerImageDecoder.php | 32 +
.../Gd/Decoders/NativeObjectDecoder.php | 109 ++
.../Gd/Decoders/SplFileInfoImageDecoder.php | 28 +
.../image/src/Drivers/Gd/Driver.php | 163 +++
.../src/Drivers/Gd/Encoders/AvifEncoder.php | 25 +
.../src/Drivers/Gd/Encoders/BmpEncoder.php | 25 +
.../src/Drivers/Gd/Encoders/GifEncoder.php | 64 +
.../src/Drivers/Gd/Encoders/JpegEncoder.php | 36 +
.../src/Drivers/Gd/Encoders/PngEncoder.php | 52 +
.../src/Drivers/Gd/Encoders/WebpEncoder.php | 27 +
.../image/src/Drivers/Gd/FontProcessor.php | 107 ++
.../image/src/Drivers/Gd/Frame.php | 193 +++
.../Gd/Modifiers/AlignRotationModifier.php | 52 +
.../Modifiers/BlendTransparencyModifier.php | 36 +
.../src/Drivers/Gd/Modifiers/BlurModifier.php | 28 +
.../Gd/Modifiers/BrightnessModifier.php | 26 +
.../Drivers/Gd/Modifiers/ColorizeModifier.php | 31 +
.../Gd/Modifiers/ColorspaceModifier.php | 30 +
.../Drivers/Gd/Modifiers/ContainModifier.php | 93 ++
.../Drivers/Gd/Modifiers/ContrastModifier.php | 26 +
.../Gd/Modifiers/CoverDownModifier.php | 19 +
.../Drivers/Gd/Modifiers/CoverModifier.php | 59 +
.../src/Drivers/Gd/Modifiers/CropModifier.php | 78 ++
.../Gd/Modifiers/DrawBezierModifier.php | 234 ++++
.../Gd/Modifiers/DrawEllipseModifier.php | 78 ++
.../Drivers/Gd/Modifiers/DrawLineModifier.php | 39 +
.../Gd/Modifiers/DrawPixelModifier.php | 36 +
.../Gd/Modifiers/DrawPolygonModifier.php | 51 +
.../Gd/Modifiers/DrawRectangleModifier.php | 61 +
.../src/Drivers/Gd/Modifiers/FillModifier.php | 67 +
.../src/Drivers/Gd/Modifiers/FlipModifier.php | 26 +
.../src/Drivers/Gd/Modifiers/FlopModifier.php | 26 +
.../Drivers/Gd/Modifiers/GammaModifier.php | 26 +
.../Gd/Modifiers/GreyscaleModifier.php | 26 +
.../Drivers/Gd/Modifiers/InvertModifier.php | 26 +
.../src/Drivers/Gd/Modifiers/PadModifier.php | 24 +
.../Drivers/Gd/Modifiers/PixelateModifier.php | 26 +
.../Drivers/Gd/Modifiers/PlaceModifier.php | 111 ++
.../Drivers/Gd/Modifiers/ProfileModifier.php | 25 +
.../Gd/Modifiers/ProfileRemovalModifier.php | 24 +
.../Gd/Modifiers/QuantizeColorsModifier.php | 65 +
.../Gd/Modifiers/RemoveAnimationModifier.php | 26 +
.../Gd/Modifiers/ResizeCanvasModifier.php | 32 +
.../ResizeCanvasRelativeModifier.php | 16 +
.../Gd/Modifiers/ResizeDownModifier.php | 16 +
.../Drivers/Gd/Modifiers/ResizeModifier.php | 70 ++
.../Gd/Modifiers/ResolutionModifier.php | 29 +
.../Drivers/Gd/Modifiers/RotateModifier.php | 106 ++
.../Gd/Modifiers/ScaleDownModifier.php | 21 +
.../Drivers/Gd/Modifiers/ScaleModifier.php | 16 +
.../Drivers/Gd/Modifiers/SharpenModifier.php | 45 +
.../Gd/Modifiers/SliceAnimationModifier.php | 29 +
.../src/Drivers/Gd/Modifiers/TextModifier.php | 145 +++
.../src/Drivers/Gd/Modifiers/TrimModifier.php | 85 ++
.../Imagick/Analyzers/ColorspaceAnalyzer.php | 23 +
.../Imagick/Analyzers/HeightAnalyzer.php | 17 +
.../Imagick/Analyzers/PixelColorAnalyzer.php | 36 +
.../Imagick/Analyzers/PixelColorsAnalyzer.php | 25 +
.../Imagick/Analyzers/ProfileAnalyzer.php | 25 +
.../Imagick/Analyzers/ResolutionAnalyzer.php | 25 +
.../Imagick/Analyzers/WidthAnalyzer.php | 17 +
.../src/Drivers/Imagick/ColorProcessor.php | 45 +
.../image/src/Drivers/Imagick/Core.php | 324 +++++
.../Imagick/Decoders/Base64ImageDecoder.php | 26 +
.../Imagick/Decoders/BinaryImageDecoder.php | 47 +
.../Imagick/Decoders/DataUriImageDecoder.php | 36 +
.../Decoders/EncodedImageObjectDecoder.php | 27 +
.../Imagick/Decoders/FilePathImageDecoder.php | 46 +
.../Decoders/FilePointerImageDecoder.php | 32 +
.../Imagick/Decoders/NativeObjectDecoder.php | 70 ++
.../Decoders/SplFileInfoImageDecoder.php | 27 +
.../image/src/Drivers/Imagick/Driver.php | 175 +++
.../Drivers/Imagick/Encoders/AvifEncoder.php | 37 +
.../Drivers/Imagick/Encoders/BmpEncoder.php | 29 +
.../Drivers/Imagick/Encoders/GifEncoder.php | 34 +
.../Drivers/Imagick/Encoders/HeicEncoder.php | 33 +
.../Imagick/Encoders/Jpeg2000Encoder.php | 39 +
.../Drivers/Imagick/Encoders/JpegEncoder.php | 57 +
.../Drivers/Imagick/Encoders/PngEncoder.php | 46 +
.../Drivers/Imagick/Encoders/TiffEncoder.php | 35 +
.../Drivers/Imagick/Encoders/WebpEncoder.php | 47 +
.../src/Drivers/Imagick/FontProcessor.php | 69 ++
.../image/src/Drivers/Imagick/Frame.php | 185 +++
.../Modifiers/AlignRotationModifier.php | 54 +
.../Modifiers/BlendTransparencyModifier.php | 32 +
.../Imagick/Modifiers/BlurModifier.php | 21 +
.../Imagick/Modifiers/BrightnessModifier.php | 21 +
.../Imagick/Modifiers/ColorizeModifier.php | 34 +
.../Imagick/Modifiers/ColorspaceModifier.php | 51 +
.../Imagick/Modifiers/ContainModifier.php | 95 ++
.../Imagick/Modifiers/ContrastModifier.php | 21 +
.../Imagick/Modifiers/CoverDownModifier.php | 19 +
.../Imagick/Modifiers/CoverModifier.php | 36 +
.../Imagick/Modifiers/CropModifier.php | 75 ++
.../Imagick/Modifiers/DrawBezierModifier.php | 77 ++
.../Imagick/Modifiers/DrawEllipseModifier.php | 51 +
.../Imagick/Modifiers/DrawLineModifier.php | 42 +
.../Imagick/Modifiers/DrawPixelModifier.php | 30 +
.../Imagick/Modifiers/DrawPolygonModifier.php | 64 +
.../Modifiers/DrawRectangleModifier.php | 50 +
.../Imagick/Modifiers/FillModifier.php | 63 +
.../Imagick/Modifiers/FlipModifier.php | 21 +
.../Imagick/Modifiers/FlopModifier.php | 21 +
.../Imagick/Modifiers/GammaModifier.php | 21 +
.../Imagick/Modifiers/GreyscaleModifier.php | 21 +
.../Imagick/Modifiers/InvertModifier.php | 21 +
.../Drivers/Imagick/Modifiers/PadModifier.php | 24 +
.../Imagick/Modifiers/PixelateModifier.php | 34 +
.../Imagick/Modifiers/PlaceModifier.php | 40 +
.../Imagick/Modifiers/ProfileModifier.php | 25 +
.../Modifiers/ProfileRemovalModifier.php | 25 +
.../Modifiers/QuantizeColorsModifier.php | 37 +
.../Modifiers/RemoveAnimationModifier.php | 26 +
.../Modifiers/ResizeCanvasModifier.php | 27 +
.../ResizeCanvasRelativeModifier.php | 16 +
.../Imagick/Modifiers/ResizeDownModifier.php | 16 +
.../Imagick/Modifiers/ResizeModifier.php | 36 +
.../Imagick/Modifiers/ResolutionModifier.php | 20 +
.../Imagick/Modifiers/RotateModifier.php | 28 +
.../Imagick/Modifiers/ScaleDownModifier.php | 16 +
.../Imagick/Modifiers/ScaleModifier.php | 16 +
.../Imagick/Modifiers/SharpenModifier.php | 21 +
.../Modifiers/SliceAnimationModifier.php | 24 +
.../Imagick/Modifiers/StripMetaModifier.php | 34 +
.../Imagick/Modifiers/TextModifier.php | 139 +++
.../Imagick/Modifiers/TrimModifier.php | 26 +
.../image/src/Drivers/Specializable.php | 13 +
.../src/Drivers/SpecializableAnalyzer.php | 21 +
.../src/Drivers/SpecializableDecoder.php | 26 +
.../src/Drivers/SpecializableEncoder.php | 13 +
.../src/Drivers/SpecializableModifier.php | 21 +
.../intervention/image/src/EncodedImage.php | 65 +
.../image/src/Encoders/AutoEncoder.php | 25 +
.../image/src/Encoders/AvifEncoder.php | 23 +
.../image/src/Encoders/BmpEncoder.php | 15 +
.../src/Encoders/FileExtensionEncoder.php | 69 ++
.../image/src/Encoders/FilePathEncoder.php | 38 +
.../image/src/Encoders/GifEncoder.php | 20 +
.../image/src/Encoders/HeicEncoder.php | 23 +
.../image/src/Encoders/Jpeg2000Encoder.php | 23 +
.../image/src/Encoders/JpegEncoder.php | 24 +
.../image/src/Encoders/MediaTypeEncoder.php | 64 +
.../image/src/Encoders/PngEncoder.php | 20 +
.../image/src/Encoders/TiffEncoder.php | 23 +
.../image/src/Encoders/WebpEncoder.php | 23 +
.../src/Exceptions/AnimationException.php | 10 +
.../image/src/Exceptions/ColorException.php | 10 +
.../image/src/Exceptions/DecoderException.php | 10 +
.../image/src/Exceptions/DriverException.php | 10 +
.../image/src/Exceptions/EncoderException.php | 10 +
.../image/src/Exceptions/FontException.php | 10 +
.../src/Exceptions/GeometryException.php | 10 +
.../image/src/Exceptions/InputException.php | 10 +
.../src/Exceptions/NotSupportedException.php | 10 +
.../src/Exceptions/NotWritableException.php | 10 +
.../image/src/Exceptions/RuntimeException.php | 10 +
vendor/intervention/image/src/File.php | 122 ++
.../intervention/image/src/FileExtension.php | 127 ++
vendor/intervention/image/src/Format.php | 165 +++
.../image/src/Geometry/Bezier.php | 202 +++
.../image/src/Geometry/Circle.php | 57 +
.../image/src/Geometry/Ellipse.php | 103 ++
.../src/Geometry/Factories/BezierFactory.php | 88 ++
.../src/Geometry/Factories/CircleFactory.php | 102 ++
.../image/src/Geometry/Factories/Drawable.php | 56 +
.../src/Geometry/Factories/EllipseFactory.php | 112 ++
.../src/Geometry/Factories/LineFactory.php | 122 ++
.../src/Geometry/Factories/PolygonFactory.php | 88 ++
.../Geometry/Factories/RectangleFactory.php | 112 ++
.../intervention/image/src/Geometry/Line.php | 127 ++
.../intervention/image/src/Geometry/Pixel.php | 45 +
.../intervention/image/src/Geometry/Point.php | 145 +++
.../image/src/Geometry/Polygon.php | 390 ++++++
.../image/src/Geometry/Rectangle.php | 335 +++++
.../src/Geometry/Tools/RectangleResizer.php | 341 ++++++
.../Geometry/Traits/HasBackgroundColor.php | 42 +
.../image/src/Geometry/Traits/HasBorder.php | 75 ++
vendor/intervention/image/src/Image.php | 1082 +++++++++++++++++
.../intervention/image/src/ImageManager.php | 143 +++
.../intervention/image/src/InputHandler.php | 132 ++
.../src/Interfaces/AnalyzerInterface.php | 17 +
.../src/Interfaces/CollectionInterface.php | 71 ++
.../src/Interfaces/ColorChannelInterface.php | 57 +
.../image/src/Interfaces/ColorInterface.php | 87 ++
.../Interfaces/ColorProcessorInterface.php | 24 +
.../src/Interfaces/ColorspaceInterface.php | 20 +
.../image/src/Interfaces/CoreInterface.php | 70 ++
.../image/src/Interfaces/DecoderInterface.php | 17 +
.../Interfaces/DrawableFactoryInterface.php | 35 +
.../src/Interfaces/DrawableInterface.php | 63 +
.../image/src/Interfaces/DriverInterface.php | 92 ++
.../src/Interfaces/EncodedImageInterface.php | 23 +
.../image/src/Interfaces/EncoderInterface.php | 17 +
.../image/src/Interfaces/FileInterface.php | 39 +
.../image/src/Interfaces/FontInterface.php | 123 ++
.../src/Interfaces/FontProcessorInterface.php | 52 +
.../image/src/Interfaces/FrameInterface.php | 77 ++
.../image/src/Interfaces/ImageInterface.php | 771 ++++++++++++
.../src/Interfaces/ImageManagerInterface.php | 63 +
.../src/Interfaces/InputHandlerInterface.php | 17 +
.../src/Interfaces/ModifierInterface.php | 17 +
.../image/src/Interfaces/PointInterface.php | 53 +
.../image/src/Interfaces/ProfileInterface.php | 13 +
.../src/Interfaces/ResolutionInterface.php | 53 +
.../image/src/Interfaces/SizeInterface.php | 123 ++
.../src/Interfaces/SpecializableInterface.php | 30 +
.../src/Interfaces/SpecializedInterface.php | 10 +
vendor/intervention/image/src/MediaType.php | 143 +++
.../intervention/image/src/ModifierStack.php | 44 +
.../src/Modifiers/AbstractDrawModifier.php | 47 +
.../src/Modifiers/AlignRotationModifier.php | 12 +
.../Modifiers/BlendTransparencyModifier.php | 54 +
.../image/src/Modifiers/BlurModifier.php | 15 +
.../src/Modifiers/BrightnessModifier.php | 15 +
.../image/src/Modifiers/ColorizeModifier.php | 23 +
.../src/Modifiers/ColorspaceModifier.php | 39 +
.../image/src/Modifiers/ContainModifier.php | 44 +
.../image/src/Modifiers/ContrastModifier.php | 20 +
.../image/src/Modifiers/CoverDownModifier.php | 10 +
.../image/src/Modifiers/CoverModifier.php | 49 +
.../image/src/Modifiers/CropModifier.php | 44 +
.../src/Modifiers/DrawBezierModifier.php | 29 +
.../src/Modifiers/DrawEllipseModifier.php | 21 +
.../image/src/Modifiers/DrawLineModifier.php | 29 +
.../image/src/Modifiers/DrawPixelModifier.php | 23 +
.../src/Modifiers/DrawPolygonModifier.php | 21 +
.../src/Modifiers/DrawRectangleModifier.php | 29 +
.../image/src/Modifiers/FillModifier.php | 23 +
.../image/src/Modifiers/FlipModifier.php | 12 +
.../image/src/Modifiers/FlopModifier.php | 12 +
.../image/src/Modifiers/GammaModifier.php | 15 +
.../image/src/Modifiers/GreyscaleModifier.php | 12 +
.../image/src/Modifiers/InvertModifier.php | 12 +
.../image/src/Modifiers/PadModifier.php | 24 +
.../image/src/Modifiers/PixelateModifier.php | 15 +
.../image/src/Modifiers/PlaceModifier.php | 46 +
.../image/src/Modifiers/ProfileModifier.php | 16 +
.../src/Modifiers/ProfileRemovalModifier.php | 12 +
.../src/Modifiers/QuantizeColorsModifier.php | 22 +
.../src/Modifiers/RemoveAnimationModifier.php | 55 +
.../src/Modifiers/ResizeCanvasModifier.php | 49 +
.../ResizeCanvasRelativeModifier.php | 10 +
.../src/Modifiers/ResizeDownModifier.php | 10 +
.../image/src/Modifiers/ResizeModifier.php | 20 +
.../src/Modifiers/ResolutionModifier.php | 20 +
.../image/src/Modifiers/RotateModifier.php | 24 +
.../image/src/Modifiers/ScaleDownModifier.php | 10 +
.../image/src/Modifiers/ScaleModifier.php | 10 +
.../image/src/Modifiers/SharpenModifier.php | 15 +
.../src/Modifiers/SliceAnimationModifier.php | 15 +
.../image/src/Modifiers/TextModifier.php | 94 ++
.../image/src/Modifiers/TrimModifier.php | 20 +
vendor/intervention/image/src/Origin.php | 88 ++
vendor/intervention/image/src/Resolution.php | 162 +++
.../src/Traits/CanBeDriverSpecialized.php | 77 ++
.../image/src/Traits/CanBuildFilePointer.php | 42 +
.../image/src/Typography/Font.php | 279 +++++
.../image/src/Typography/FontFactory.php | 141 +++
.../image/src/Typography/Line.php | 125 ++
.../image/src/Typography/TextBlock.php | 72 ++
vendor/irazasyed/telegram-bot-sdk/LICENSE.md | 0
.../irazasyed/telegram-bot-sdk/composer.json | 0
.../telegram-bot-sdk/src/Actions.php | 0
.../src/Answers/AnswerBus.php | 0
.../src/Answers/Answerable.php | 0
vendor/irazasyed/telegram-bot-sdk/src/Api.php | 0
.../telegram-bot-sdk/src/BotsManager.php | 0
.../telegram-bot-sdk/src/Commands/Command.php | 0
.../src/Commands/CommandBus.php | 0
.../src/Commands/CommandInterface.php | 0
.../src/Commands/HelpCommand.php | 0
.../telegram-bot-sdk/src/EntityType.php | 0
.../src/Events/AbstractEvent.php | 0
.../telegram-bot-sdk/src/Events/Emitter.php | 0
.../src/Events/EventDispatcherFactory.php | 0
.../EventDispatcherListenerContract.php | 0
.../src/Events/HasEventDispatcher.php | 0
.../src/Events/HasEventName.php | 0
.../src/Events/LeagueEventDispatcher.php | 0
.../src/Events/UpdateEvent.php | 0
.../src/Events/UpdateWasReceived.php | 0
.../Exceptions/CouldNotUploadInputFile.php | 0
.../src/Exceptions/ResponseParameters.php | 0
.../TelegramBotNotFoundException.php | 0
.../TelegramEmojiMapFileNotFoundException.php | 0
.../src/Exceptions/TelegramOtherException.php | 0
.../Exceptions/TelegramResponseException.php | 0
.../src/Exceptions/TelegramSDKException.php | 0
.../TelegramUndefinedPropertyException.php | 0
.../src/FileUpload/InputFile.php | 0
.../telegram-bot-sdk/src/Helpers/Emojify.php | 0
.../telegram-bot-sdk/src/Helpers/Entities.php | 0
.../src/HttpClients/GuzzleHttpClient.php | 0
.../src/HttpClients/HttpClientInterface.php | 0
.../telegram-bot-sdk/src/Keyboard/Base.php | 0
.../telegram-bot-sdk/src/Keyboard/Button.php | 0
.../src/Keyboard/Keyboard.php | 0
.../src/Laravel/Artisan/WebhookCommand.php | 0
.../src/Laravel/Facades/Telegram.php | 0
.../src/Laravel/TelegramServiceProvider.php | 0
.../src/Laravel/config/telegram.php | 0
.../telegram-bot-sdk/src/Methods/Chat.php | 0
.../telegram-bot-sdk/src/Methods/Commands.php | 0
.../src/Methods/EditMessage.php | 0
.../telegram-bot-sdk/src/Methods/Forum.php | 0
.../telegram-bot-sdk/src/Methods/Game.php | 0
.../telegram-bot-sdk/src/Methods/Get.php | 0
.../telegram-bot-sdk/src/Methods/Location.php | 0
.../telegram-bot-sdk/src/Methods/Message.php | 0
.../telegram-bot-sdk/src/Methods/Passport.php | 0
.../telegram-bot-sdk/src/Methods/Payments.php | 0
.../telegram-bot-sdk/src/Methods/Query.php | 0
.../telegram-bot-sdk/src/Methods/Stickers.php | 0
.../telegram-bot-sdk/src/Methods/Update.php | 0
.../src/Objects/Animation.php | 0
.../telegram-bot-sdk/src/Objects/Audio.php | 0
.../src/Objects/BaseObject.php | 0
.../src/Objects/BotCommand.php | 0
.../src/Objects/CallbackQuery.php | 0
.../telegram-bot-sdk/src/Objects/Chat.php | 0
.../src/Objects/ChatInviteLink.php | 0
.../src/Objects/ChatJoinRequest.php | 0
.../src/Objects/ChatLocation.php | 0
.../src/Objects/ChatMember.php | 0
.../src/Objects/ChatMemberUpdated.php | 0
.../src/Objects/ChatPermissions.php | 0
.../src/Objects/ChatPhoto.php | 0
.../src/Objects/ChosenInlineResult.php | 0
.../telegram-bot-sdk/src/Objects/Contact.php | 0
.../telegram-bot-sdk/src/Objects/Dice.php | 0
.../telegram-bot-sdk/src/Objects/Document.php | 0
.../src/Objects/EditedMessage.php | 0
.../telegram-bot-sdk/src/Objects/File.php | 0
.../src/Objects/ForumTopic.php | 0
.../telegram-bot-sdk/src/Objects/Game.php | 0
.../src/Objects/GameHighScore.php | 0
.../src/Objects/InlineQuery.php | 0
.../Objects/InlineQuery/InlineBaseObject.php | 0
.../InlineQuery/InlineQueryResultArticle.php | 0
.../InlineQuery/InlineQueryResultAudio.php | 0
.../InlineQueryResultCachedAudio.php | 0
.../InlineQueryResultCachedDocument.php | 0
.../InlineQueryResultCachedGif.php | 0
.../InlineQueryResultCachedMpeg4Gif.php | 0
.../InlineQueryResultCachedPhoto.php | 0
.../InlineQueryResultCachedSticker.php | 0
.../InlineQueryResultCachedVideo.php | 0
.../InlineQueryResultCachedVoice.php | 0
.../InlineQuery/InlineQueryResultContact.php | 0
.../InlineQuery/InlineQueryResultDocument.php | 0
.../InlineQuery/InlineQueryResultGame.php | 0
.../InlineQuery/InlineQueryResultGif.php | 0
.../InlineQuery/InlineQueryResultLocation.php | 0
.../InlineQuery/InlineQueryResultMpeg4Gif.php | 0
.../InlineQuery/InlineQueryResultPhoto.php | 0
.../InlineQuery/InlineQueryResultVenue.php | 0
.../InlineQuery/InlineQueryResultVideo.php | 0
.../InlineQuery/InlineQueryResultVoice.php | 0
.../InputContactMessageContent.php | 0
.../InputLocationMessageContent.php | 0
.../InputContent/InputTextMessageContent.php | 0
.../InputContent/InputVenueMessageContent.php | 0
.../src/Objects/InputMedia/InputMedia.php | 0
.../InputMedia/InputMediaAnimation.php | 0
.../Objects/InputMedia/InputMediaAudio.php | 0
.../Objects/InputMedia/InputMediaDocument.php | 0
.../Objects/InputMedia/InputMediaPhoto.php | 0
.../Objects/InputMedia/InputMediaVideo.php | 0
.../telegram-bot-sdk/src/Objects/Location.php | 0
.../telegram-bot-sdk/src/Objects/LoginUrl.php | 0
.../src/Objects/MaskPosition.php | 0
.../telegram-bot-sdk/src/Objects/Message.php | 0
.../Objects/MessageAutoDeleteTimerChanged.php | 0
.../src/Objects/MessageEntity.php | 0
.../src/Objects/Passport/Credentials.php | 0
.../src/Objects/Passport/DataCredentials.php | 0
.../Objects/Passport/EncryptedCredentials.php | 0
.../Passport/EncryptedPassportElement.php | 0
.../src/Objects/Passport/FileCredentials.php | 0
.../src/Objects/Passport/IdDocumentData.php | 0
.../src/Objects/Passport/PassportData.php | 0
.../Objects/Passport/PassportElementError.php | 0
.../PassportElementErrorDataField.php | 0
.../Passport/PassportElementErrorFile.php | 0
.../Passport/PassportElementErrorFiles.php | 0
.../PassportElementErrorFrontSide.php | 0
.../PassportElementErrorReverseSide.php | 0
.../Passport/PassportElementErrorSelfie.php | 0
.../PassportElementErrorTranslationFile.php | 0
.../PassportElementErrorTranslationFiles.php | 0
.../PassportElementErrorUnspecified.php | 0
.../src/Objects/Passport/PassportFile.php | 0
.../src/Objects/Passport/PassportScope.php | 0
.../Objects/Passport/PassportScopeElement.php | 0
.../Passport/PassportScopeElementOne.php | 0
.../PassportScopeElementOneOfSeveral.php | 0
.../src/Objects/Passport/PersonalDetails.php | 0
.../Objects/Passport/ResidentialAddress.php | 0
.../src/Objects/Passport/SecureData.php | 0
.../src/Objects/Passport/SecureValue.php | 0
.../src/Objects/Payments/Invoice.php | 0
.../src/Objects/Payments/LabeledPrice.php | 0
.../src/Objects/Payments/OrderInfo.php | 0
.../src/Objects/Payments/PreCheckoutQuery.php | 0
.../src/Objects/Payments/ShippingAddress.php | 0
.../src/Objects/Payments/ShippingOption.php | 0
.../src/Objects/Payments/ShippingQuery.php | 0
.../Objects/Payments/SuccessfulPayment.php | 0
.../src/Objects/PhotoSize.php | 0
.../telegram-bot-sdk/src/Objects/Poll.php | 0
.../src/Objects/PollAnswer.php | 0
.../src/Objects/PollOption.php | 0
.../src/Objects/ProximityAlertTriggered.php | 0
.../src/Objects/ReactionType.php | 0
.../src/Objects/ResponseParameters.php | 0
.../telegram-bot-sdk/src/Objects/Sticker.php | 0
.../src/Objects/StickerSet.php | 0
.../src/Objects/TelegramObject.php | 0
.../src/Objects/UnknownObject.php | 0
.../telegram-bot-sdk/src/Objects/Update.php | 0
.../telegram-bot-sdk/src/Objects/User.php | 0
.../src/Objects/UserProfilePhotos.php | 0
.../telegram-bot-sdk/src/Objects/Venue.php | 0
.../telegram-bot-sdk/src/Objects/Video.php | 0
.../src/Objects/VideoNote.php | 0
.../telegram-bot-sdk/src/Objects/Voice.php | 0
.../src/Objects/VoiceChatEnded.php | 0
.../Objects/VoiceChatParticipantsInvited.php | 0
.../src/Objects/VoiceChatScheduled.php | 0
.../src/Objects/VoiceChatStarted.php | 0
.../src/Objects/WebApp/WebAppData.php | 0
.../src/Objects/WebhookInfo.php | 0
.../telegram-bot-sdk/src/Storage/emoji.json | 0
.../telegram-bot-sdk/src/TelegramClient.php | 0
.../telegram-bot-sdk/src/TelegramRequest.php | 0
.../telegram-bot-sdk/src/TelegramResponse.php | 0
.../src/Traits/CommandsHandler.php | 0
.../src/Traits/HasContainer.php | 0
.../telegram-bot-sdk/src/Traits/Http.php | 0
.../telegram-bot-sdk/src/Traits/Singleton.php | 0
.../telegram-bot-sdk/src/Traits/Telegram.php | 0
.../telegram-bot-sdk/src/Traits/Validator.php | 0
vendor/symfony/yaml/CHANGELOG.md | 0
vendor/symfony/yaml/Command/LintCommand.php | 0
vendor/symfony/yaml/Dumper.php | 0
vendor/symfony/yaml/Escaper.php | 0
.../symfony/yaml/Exception/DumpException.php | 0
.../yaml/Exception/ExceptionInterface.php | 0
.../symfony/yaml/Exception/ParseException.php | 0
.../yaml/Exception/RuntimeException.php | 0
vendor/symfony/yaml/Inline.php | 0
vendor/symfony/yaml/LICENSE | 0
vendor/symfony/yaml/Parser.php | 0
vendor/symfony/yaml/Tag/TaggedValue.php | 0
vendor/symfony/yaml/Unescaper.php | 0
vendor/symfony/yaml/Yaml.php | 0
vendor/symfony/yaml/composer.json | 0
676 files changed, 25455 insertions(+), 30 deletions(-)
mode change 100644 => 100755 .editorconfig
mode change 100644 => 100755 .env.example
mode change 100644 => 100755 .gitignore
mode change 100644 => 100755 app/Services/Article/CacheTg.php
mode change 100644 => 100755 app/Services/Article/Cmd.php
mode change 100644 => 100755 app/Services/Article/Schema.php
mode change 100644 => 100755 app/Services/Article_old.php
mode change 100644 => 100755 app/Services/Country-meiyong.php
mode change 100644 => 100755 app/Services/Cron.php
mode change 100644 => 100755 app/Services/Cron/ArticleSchema.php
mode change 100644 => 100755 app/Services/Cron/Book.php
create mode 100755 app/Services/Cron/FnTgPublish.php
mode change 100644 => 100755 app/Services/Cron/FreenodeCrawl.php
mode change 100644 => 100755 app/Services/Cron/FreenodeFile.php
mode change 100644 => 100755 app/Services/Cron/FreenodeLog.php
mode change 100644 => 100755 app/Services/Cron/FreenodeMerge.php
mode change 100644 => 100755 app/Services/Cron/FreenodePool.php
mode change 100644 => 100755 app/Services/Cron/FreenodeSync.php
mode change 100644 => 100755 app/Services/Cron/HttpQueue.php
mode change 100644 => 100755 app/Services/HttpQueue.php
mode change 100644 => 100755 app/Services/OpenApi/Telegram.php
mode change 100644 => 100755 app/Services/SDK/Master/Master.php
mode change 100644 => 100755 app/Services/SDK/Master/Telegram.php
mode change 100644 => 100755 app/Services/SlaveMap.php
mode change 100644 => 100755 app/Services/Tg/Hook/Dog.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Article.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleCache.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleConfig.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleSchema.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Article_old.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Base.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Blade.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/BladeOld.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Book.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Box.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Cron.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Db.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Dev.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Dove.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/DoveSite.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/FreenodeFrom.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/FreenodePool.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/GemboxDns.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Good.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Hook.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Hook_old.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/HttpQueue.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Jctj.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/JctjOption.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Note.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Note_option.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Option.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Ship.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/SiteMap.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/SitePathMap.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/TelegramKey.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Test.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Tool.php
mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Upload.php
mode change 100644 => 100755 app/Services/Tg/Http.php
mode change 100644 => 100755 fn的tg策略.md
mode change 100644 => 100755 fn部署.md
mode change 100644 => 100755 public/js/jquery.min.js
mode change 100644 => 100755 public/upload/无标题.png
mode change 100644 => 100755 resources/views/cmd.blade.php
mode change 100644 => 100755 resources/views/cmd/image/upload.blade.php
mode change 100644 => 100755 scripts/cron.php
create mode 100644 tg发送逻辑.md
mode change 100644 => 100755 vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip
create mode 100755 vendor/intervention/gif/LICENSE
create mode 100755 vendor/intervention/gif/composer.json
create mode 100755 vendor/intervention/gif/phpunit.xml.dist
create mode 100755 vendor/intervention/gif/src/AbstractEntity.php
create mode 100755 vendor/intervention/gif/src/AbstractExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/ApplicationExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/Color.php
create mode 100755 vendor/intervention/gif/src/Blocks/ColorTable.php
create mode 100755 vendor/intervention/gif/src/Blocks/CommentExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/DataSubBlock.php
create mode 100755 vendor/intervention/gif/src/Blocks/FrameBlock.php
create mode 100755 vendor/intervention/gif/src/Blocks/GraphicControlExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/Header.php
create mode 100755 vendor/intervention/gif/src/Blocks/ImageData.php
create mode 100755 vendor/intervention/gif/src/Blocks/ImageDescriptor.php
create mode 100755 vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php
create mode 100755 vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/PlainTextExtension.php
create mode 100755 vendor/intervention/gif/src/Blocks/TableBasedImage.php
create mode 100755 vendor/intervention/gif/src/Blocks/Trailer.php
create mode 100755 vendor/intervention/gif/src/Builder.php
create mode 100755 vendor/intervention/gif/src/Decoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/AbstractDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/ColorDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/ColorTableDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/HeaderDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/ImageDataDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php
create mode 100755 vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php
create mode 100755 vendor/intervention/gif/src/DisposalMethod.php
create mode 100755 vendor/intervention/gif/src/Encoders/AbstractEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/ColorEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/ColorTableEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/HeaderEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/ImageDataEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php
create mode 100755 vendor/intervention/gif/src/Encoders/TrailerEncoder.php
create mode 100755 vendor/intervention/gif/src/Exceptions/DecoderException.php
create mode 100755 vendor/intervention/gif/src/Exceptions/EncoderException.php
create mode 100755 vendor/intervention/gif/src/Exceptions/FormatException.php
create mode 100755 vendor/intervention/gif/src/Exceptions/NotReadableException.php
create mode 100755 vendor/intervention/gif/src/GifDataStream.php
create mode 100755 vendor/intervention/gif/src/Splitter.php
create mode 100755 vendor/intervention/gif/src/Traits/CanDecode.php
create mode 100755 vendor/intervention/gif/src/Traits/CanEncode.php
create mode 100755 vendor/intervention/gif/src/Traits/CanHandleFiles.php
create mode 100755 vendor/intervention/image/LICENSE
create mode 100755 vendor/intervention/image/composer.json
create mode 100755 vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/HeightAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/PixelColorAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/PixelColorsAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/ProfileAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/ResolutionAnalyzer.php
create mode 100755 vendor/intervention/image/src/Analyzers/WidthAnalyzer.php
create mode 100755 vendor/intervention/image/src/Collection.php
create mode 100755 vendor/intervention/image/src/Colors/AbstractColor.php
create mode 100755 vendor/intervention/image/src/Colors/AbstractColorChannel.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Key.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Magenta.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Yellow.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Color.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Colorspace.php
create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Luminance.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Saturation.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Color.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Colorspace.php
create mode 100755 vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Saturation.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Value.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Color.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Colorspace.php
create mode 100755 vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Profile.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Alpha.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Green.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Red.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Color.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Colorspace.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php
create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php
create mode 100755 vendor/intervention/image/src/Config.php
create mode 100755 vendor/intervention/image/src/Decoders/Base64ImageDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/BinaryImageDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/ColorObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/DataUriImageDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/EncodedImageObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/FilePathImageDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/FilePointerImageDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/ImageObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/NativeObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Decoders/SplFileInfoImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/AbstractDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/AbstractDriver.php
create mode 100755 vendor/intervention/image/src/Drivers/AbstractEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/AbstractFontProcessor.php
create mode 100755 vendor/intervention/image/src/Drivers/AbstractFrame.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Cloner.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Core.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Driver.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/FontProcessor.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Frame.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Core.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Driver.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Frame.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php
create mode 100755 vendor/intervention/image/src/Drivers/Specializable.php
create mode 100755 vendor/intervention/image/src/Drivers/SpecializableAnalyzer.php
create mode 100755 vendor/intervention/image/src/Drivers/SpecializableDecoder.php
create mode 100755 vendor/intervention/image/src/Drivers/SpecializableEncoder.php
create mode 100755 vendor/intervention/image/src/Drivers/SpecializableModifier.php
create mode 100755 vendor/intervention/image/src/EncodedImage.php
create mode 100755 vendor/intervention/image/src/Encoders/AutoEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/AvifEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/BmpEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/FileExtensionEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/FilePathEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/GifEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/HeicEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/Jpeg2000Encoder.php
create mode 100755 vendor/intervention/image/src/Encoders/JpegEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/MediaTypeEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/PngEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/TiffEncoder.php
create mode 100755 vendor/intervention/image/src/Encoders/WebpEncoder.php
create mode 100755 vendor/intervention/image/src/Exceptions/AnimationException.php
create mode 100755 vendor/intervention/image/src/Exceptions/ColorException.php
create mode 100755 vendor/intervention/image/src/Exceptions/DecoderException.php
create mode 100755 vendor/intervention/image/src/Exceptions/DriverException.php
create mode 100755 vendor/intervention/image/src/Exceptions/EncoderException.php
create mode 100755 vendor/intervention/image/src/Exceptions/FontException.php
create mode 100755 vendor/intervention/image/src/Exceptions/GeometryException.php
create mode 100755 vendor/intervention/image/src/Exceptions/InputException.php
create mode 100755 vendor/intervention/image/src/Exceptions/NotSupportedException.php
create mode 100755 vendor/intervention/image/src/Exceptions/NotWritableException.php
create mode 100755 vendor/intervention/image/src/Exceptions/RuntimeException.php
create mode 100755 vendor/intervention/image/src/File.php
create mode 100755 vendor/intervention/image/src/FileExtension.php
create mode 100755 vendor/intervention/image/src/Format.php
create mode 100755 vendor/intervention/image/src/Geometry/Bezier.php
create mode 100755 vendor/intervention/image/src/Geometry/Circle.php
create mode 100755 vendor/intervention/image/src/Geometry/Ellipse.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/BezierFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/CircleFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/Drawable.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/EllipseFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/LineFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php
create mode 100755 vendor/intervention/image/src/Geometry/Line.php
create mode 100755 vendor/intervention/image/src/Geometry/Pixel.php
create mode 100755 vendor/intervention/image/src/Geometry/Point.php
create mode 100755 vendor/intervention/image/src/Geometry/Polygon.php
create mode 100755 vendor/intervention/image/src/Geometry/Rectangle.php
create mode 100755 vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php
create mode 100755 vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php
create mode 100755 vendor/intervention/image/src/Geometry/Traits/HasBorder.php
create mode 100755 vendor/intervention/image/src/Image.php
create mode 100755 vendor/intervention/image/src/ImageManager.php
create mode 100755 vendor/intervention/image/src/InputHandler.php
create mode 100755 vendor/intervention/image/src/Interfaces/AnalyzerInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/CollectionInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ColorChannelInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ColorInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ColorspaceInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/CoreInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/DecoderInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/DrawableFactoryInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/DrawableInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/DriverInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/EncodedImageInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/EncoderInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/FileInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/FontInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/FontProcessorInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/FrameInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ImageInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ImageManagerInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/InputHandlerInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ModifierInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/PointInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ProfileInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/ResolutionInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/SizeInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/SpecializableInterface.php
create mode 100755 vendor/intervention/image/src/Interfaces/SpecializedInterface.php
create mode 100755 vendor/intervention/image/src/MediaType.php
create mode 100755 vendor/intervention/image/src/ModifierStack.php
create mode 100755 vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/AlignRotationModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/BlendTransparencyModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/BlurModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/BrightnessModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ColorizeModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ColorspaceModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ContainModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ContrastModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/CoverDownModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/CoverModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/CropModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawBezierModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawLineModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawPixelModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawPolygonModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/FillModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/FlipModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/FlopModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/GammaModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/GreyscaleModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/InvertModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/PadModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/PixelateModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/PlaceModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ProfileModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ProfileRemovalModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/QuantizeColorsModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/RemoveAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ResizeDownModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ResizeModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ResolutionModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/RotateModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ScaleDownModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/ScaleModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/SharpenModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/SliceAnimationModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/TextModifier.php
create mode 100755 vendor/intervention/image/src/Modifiers/TrimModifier.php
create mode 100755 vendor/intervention/image/src/Origin.php
create mode 100755 vendor/intervention/image/src/Resolution.php
create mode 100755 vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php
create mode 100755 vendor/intervention/image/src/Traits/CanBuildFilePointer.php
create mode 100755 vendor/intervention/image/src/Typography/Font.php
create mode 100755 vendor/intervention/image/src/Typography/FontFactory.php
create mode 100755 vendor/intervention/image/src/Typography/Line.php
create mode 100755 vendor/intervention/image/src/Typography/TextBlock.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/LICENSE.md
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/composer.json
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Actions.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Answers/AnswerBus.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Answers/Answerable.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Api.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/BotsManager.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/Command.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandBus.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandInterface.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/HelpCommand.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/EntityType.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/AbstractEvent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/Emitter.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherFactory.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherListenerContract.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventDispatcher.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventName.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/LeagueEventDispatcher.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateEvent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateWasReceived.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/CouldNotUploadInputFile.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/ResponseParameters.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramBotNotFoundException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramEmojiMapFileNotFoundException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramOtherException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramResponseException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramSDKException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramUndefinedPropertyException.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/FileUpload/InputFile.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Helpers/Emojify.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Helpers/Entities.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/HttpClients/GuzzleHttpClient.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/HttpClients/HttpClientInterface.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Base.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Button.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Keyboard.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/Artisan/WebhookCommand.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/Facades/Telegram.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/TelegramServiceProvider.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/config/telegram.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Chat.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Commands.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/EditMessage.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Forum.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Game.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Get.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Location.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Message.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Passport.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Payments.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Query.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Stickers.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Update.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Animation.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Audio.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/BaseObject.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/BotCommand.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/CallbackQuery.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Chat.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatInviteLink.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatJoinRequest.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatLocation.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMember.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMemberUpdated.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPermissions.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPhoto.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChosenInlineResult.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Contact.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Dice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Document.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/EditedMessage.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/File.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ForumTopic.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Game.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/GameHighScore.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineBaseObject.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultArticle.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultAudio.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedAudio.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedDocument.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedGif.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedMpeg4Gif.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedPhoto.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedSticker.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVideo.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVoice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultContact.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultDocument.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGame.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGif.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultLocation.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultMpeg4Gif.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultPhoto.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVenue.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVideo.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVoice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputContactMessageContent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputLocationMessageContent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputTextMessageContent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputVenueMessageContent.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMedia.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAnimation.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAudio.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaDocument.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaPhoto.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaVideo.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Location.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/LoginUrl.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MaskPosition.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Message.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageAutoDeleteTimerChanged.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageEntity.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/Credentials.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/DataCredentials.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedCredentials.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedPassportElement.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/FileCredentials.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/IdDocumentData.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportData.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementError.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorDataField.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFile.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFiles.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFrontSide.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorReverseSide.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorSelfie.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFile.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFiles.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorUnspecified.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportFile.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScope.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElement.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOne.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOneOfSeveral.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PersonalDetails.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/ResidentialAddress.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureData.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureValue.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/Invoice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/LabeledPrice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/OrderInfo.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/PreCheckoutQuery.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingAddress.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingOption.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingQuery.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/SuccessfulPayment.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PhotoSize.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Poll.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PollAnswer.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PollOption.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ProximityAlertTriggered.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ReactionType.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ResponseParameters.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Sticker.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/StickerSet.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/TelegramObject.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/UnknownObject.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Update.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/User.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/UserProfilePhotos.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Venue.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Video.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VideoNote.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Voice.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatEnded.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatParticipantsInvited.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatScheduled.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatStarted.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/WebApp/WebAppData.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/WebhookInfo.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Storage/emoji.json
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramClient.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramRequest.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramResponse.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/CommandsHandler.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/HasContainer.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Http.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Singleton.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Telegram.php
mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Validator.php
mode change 100644 => 100755 vendor/symfony/yaml/CHANGELOG.md
mode change 100644 => 100755 vendor/symfony/yaml/Command/LintCommand.php
mode change 100644 => 100755 vendor/symfony/yaml/Dumper.php
mode change 100644 => 100755 vendor/symfony/yaml/Escaper.php
mode change 100644 => 100755 vendor/symfony/yaml/Exception/DumpException.php
mode change 100644 => 100755 vendor/symfony/yaml/Exception/ExceptionInterface.php
mode change 100644 => 100755 vendor/symfony/yaml/Exception/ParseException.php
mode change 100644 => 100755 vendor/symfony/yaml/Exception/RuntimeException.php
mode change 100644 => 100755 vendor/symfony/yaml/Inline.php
mode change 100644 => 100755 vendor/symfony/yaml/LICENSE
mode change 100644 => 100755 vendor/symfony/yaml/Parser.php
mode change 100644 => 100755 vendor/symfony/yaml/Tag/TaggedValue.php
mode change 100644 => 100755 vendor/symfony/yaml/Unescaper.php
mode change 100644 => 100755 vendor/symfony/yaml/Yaml.php
mode change 100644 => 100755 vendor/symfony/yaml/composer.json
diff --git a/.editorconfig b/.editorconfig
old mode 100644
new mode 100755
diff --git a/.env.example b/.env.example
old mode 100644
new mode 100755
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/app/Services/Article/CacheTg.php b/app/Services/Article/CacheTg.php
old mode 100644
new mode 100755
diff --git a/app/Services/Article/Cmd.php b/app/Services/Article/Cmd.php
old mode 100644
new mode 100755
diff --git a/app/Services/Article/Schema.php b/app/Services/Article/Schema.php
old mode 100644
new mode 100755
diff --git a/app/Services/Article_old.php b/app/Services/Article_old.php
old mode 100644
new mode 100755
diff --git a/app/Services/Country-meiyong.php b/app/Services/Country-meiyong.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron.php b/app/Services/Cron.php
old mode 100644
new mode 100755
index 53bdfc99..301aeffe
--- a/app/Services/Cron.php
+++ b/app/Services/Cron.php
@@ -13,6 +13,7 @@ use App\Services\Cron\FreenodeMerge as CronFreenodeMerge;
use App\Services\Cron\FreenodeLog as CronFreenodeLog;
use App\Services\Cron\FreenodeSync as CronFreenodeSync;
use App\Services\Cron\ArticleSchema as CronArticleSchema;
+use App\Services\Cron\FnTgPublish as CronFnTgPublish;
use App\Services\TomTool\Telegram\Slave as TeleSlave;
final class Cron
@@ -50,22 +51,26 @@ final class Cron
CronFreenodeSync::run();
}
- if ($i % 3 === 0) {
- CronArticleSchema::cacheTgSave();
- CronArticleSchema::pushToSlave();
- CronHttpQueue::pop();
- }
-
- if ($i === 0) {
- // ReportSender::handle();
- }
+// if ($i === 0) {
+// // ReportSender::handle();
+// }
if ($h == 5 && $i === 3) {
CronFreenodeFile::clear();
}
- if ($h == 15 && $i == 3) {
-// CronFreenodeLog::fromLast();
+// if ($h == 15 && $i == 3) {
+//// CronFreenodeLog::fromLast();
+// }
+
+ if ($h == 11 && $i == 3) { // 中午12点03发布fn的tg
+ CronFnTgPublish::run();
+ }
+
+ if ($i % 3 === 0) {
+ CronArticleSchema::cacheTgSave();
+ CronArticleSchema::pushToSlave();
+ CronHttpQueue::pop();
}
} catch (\Throwable $e) {
@@ -90,7 +95,6 @@ final class Cron
}
-
}
public function setTestH(int $h): void
diff --git a/app/Services/Cron/ArticleSchema.php b/app/Services/Cron/ArticleSchema.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/Book.php b/app/Services/Cron/Book.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FnTgPublish.php b/app/Services/Cron/FnTgPublish.php
new file mode 100755
index 00000000..ba5f71bb
--- /dev/null
+++ b/app/Services/Cron/FnTgPublish.php
@@ -0,0 +1,77 @@
+get()->toArray();
+
+ foreach ($aSiteList as $aSite) {
+ $sConfig = $aSite["config"] ?? "";
+ $sApiPath = $aSite["api_path"] ?? "";
+ $sSiteDomain = $aSite["url"] ?? "";
+ $sSiteCode = $aSite["code"] ?? "";
+ $iImgId = $aSite["img_id"] ?? 1;
+
+ //// test
+// $sSiteCode = "clashfreenode.com";
+
+ $aConfig = json_decode($sConfig, true);
+ $aApiPath = json_decode($sApiPath, true);
+
+ $sApiPath = $aApiPath["article_find"] ?? "";
+ $sApiUrl = "https://".$sSiteDomain."/".$sApiPath;
+
+ $aData = [
+ "articleType" => "node",
+ "code" => date("Ymd")
+ ];
+
+ $sResult = HttpV2::make($sApiUrl, "post")->setDataA($aData)->enableJsonSend(true)->send();
+ $aResult = json_decode($sResult, true);
+
+ if (!isset($aResult["isDone"])) {
+ throw new \Exception("没有isDone? >>> ".$sResult);
+ }
+
+ if (!$aResult["isDone"]) {
+ throw new \Exception($aResult["sMsg"]);
+ }
+
+ $sTitle = "「".date("m月d日")."」最新免费节点,SSR/V2ray/Clash/Shadowrocket";
+
+ $sStr = $sTitle."\n\n👉 https://".$sSiteDomain."/fn/".date("Ymd").".html";
+
+ $sImgUrl = "https://".$sSiteDomain."/site/".$sSiteCode."/images/article/".$iImgId.".png";
+// $sImgUrl = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png";
+// $sImgUrl = "https://clashfreenode.com/site/clashfreenode.com/images/article/5.png";
+// $sImgUrl = "https://gips3.baidu.com/it/u=1821127123,1149655687&fm=3028&app=3028&f=JPEG&fmt=auto?w=720&h=1280";
+// $sImgUrl = "";
+
+ $r = TeleSlave::start($sSiteCode, $sSiteCode)
+// ->enableSlaveQueue(false)
+ ->enableDetail(false)
+ ->enableAsync(false)
+ ->setPhotoUrl($sImgUrl, 1280, 720)
+ ->setMsgS($sStr)
+ ->setType("html")
+ ->send();
+
+ echo "\n - ok";
+ }
+ }
+
+}
diff --git a/app/Services/Cron/FreenodeCrawl.php b/app/Services/Cron/FreenodeCrawl.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FreenodeFile.php b/app/Services/Cron/FreenodeFile.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FreenodeLog.php b/app/Services/Cron/FreenodeLog.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FreenodeMerge.php b/app/Services/Cron/FreenodeMerge.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FreenodePool.php b/app/Services/Cron/FreenodePool.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/FreenodeSync.php b/app/Services/Cron/FreenodeSync.php
old mode 100644
new mode 100755
diff --git a/app/Services/Cron/HttpQueue.php b/app/Services/Cron/HttpQueue.php
old mode 100644
new mode 100755
index 300edf65..4ddeb95b
--- a/app/Services/Cron/HttpQueue.php
+++ b/app/Services/Cron/HttpQueue.php
@@ -31,7 +31,11 @@ final class HttpQueue
$sBotToken = $aArg["sBotToken"] ?? '';
$iChatId = $aArg["iChatId"] ?? 0;
$sMsg = $aArg["sMsg"] ?? '';
+ $sPhotoUrl = $aArg["sPhotoUrl"] ?? '';
+ $iPhotoWidth = $aArg["iPhotoWidth"] ?? 0;
+ $iPhotoHeight = $aArg["iPhotoHeight"] ?? 0;
$enableMaster = $aArg["enableMaster"] ?? null;
+ $sType = $aArg["sType"] ?? '';
if ($enableMaster) {
$oTgSlave = TelegramSlave::start()
@@ -44,6 +48,8 @@ final class HttpQueue
->setBotToken($sBotToken)
->setChatId($iChatId)
->setMsgS($sMsg)
+ ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight)
+ ->setType($sType)
->send();
if ($oTgSlave->isFail()) {
@@ -62,6 +68,8 @@ final class HttpQueue
->setBotToken($sBotToken)
->setChatId($iChatId)
->setMsgS($sMsg)
+ ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight)
+ ->setType($sType)
->send();
if ($oTgSlave->isFail()) {
diff --git a/app/Services/HttpQueue.php b/app/Services/HttpQueue.php
old mode 100644
new mode 100755
diff --git a/app/Services/OpenApi/Telegram.php b/app/Services/OpenApi/Telegram.php
old mode 100644
new mode 100755
index a04698e5..88465724
--- a/app/Services/OpenApi/Telegram.php
+++ b/app/Services/OpenApi/Telegram.php
@@ -33,15 +33,22 @@ final class Telegram
$iChatId = (int) ($aArg["iChatId"] ?? 0);
$enableMasterQueue = $aArg["enableMasterQueue"] ?? false; // 用不着了
$sMsg = $aArg["sMsg"] ?? '';
+ $sPhotoUrl = $aArg["sPhotoUrl"] ?? '';
+ $iPhotoWidth = $aArg["iPhotoWidth"] ?? 0;
+ $iPhotoHeight = $aArg["iPhotoHeight"] ?? 0;
+ $sType = $aArg["sType"] ?? '';
$r = TeleMaster::start()
->setBotCode($sBotCode)
->setChatCode($sChatCode)
->setBotToken($sBotToken)
->setChatId($iChatId)
+ ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight)
+ ->setType($sType)
->send($sMsg);
- return $oFlow->done();
+ echo json_encode($r->getResult());
+ exit;
}
diff --git a/app/Services/SDK/Master/Master.php b/app/Services/SDK/Master/Master.php
old mode 100644
new mode 100755
diff --git a/app/Services/SDK/Master/Telegram.php b/app/Services/SDK/Master/Telegram.php
old mode 100644
new mode 100755
diff --git a/app/Services/SlaveMap.php b/app/Services/SlaveMap.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Dog.php b/app/Services/Tg/Hook/Dog.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Article.php b/app/Services/Tg/Hook/Mod/Article.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/ArticleCache.php b/app/Services/Tg/Hook/Mod/ArticleCache.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/ArticleConfig.php b/app/Services/Tg/Hook/Mod/ArticleConfig.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/ArticleSchema.php b/app/Services/Tg/Hook/Mod/ArticleSchema.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php b/app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Article_old.php b/app/Services/Tg/Hook/Mod/Article_old.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Base.php b/app/Services/Tg/Hook/Mod/Base.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Blade.php b/app/Services/Tg/Hook/Mod/Blade.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/BladeOld.php b/app/Services/Tg/Hook/Mod/BladeOld.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Book.php b/app/Services/Tg/Hook/Mod/Book.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Box.php b/app/Services/Tg/Hook/Mod/Box.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Cron.php b/app/Services/Tg/Hook/Mod/Cron.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Db.php b/app/Services/Tg/Hook/Mod/Db.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Dev.php b/app/Services/Tg/Hook/Mod/Dev.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Dove.php b/app/Services/Tg/Hook/Mod/Dove.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/DoveSite.php b/app/Services/Tg/Hook/Mod/DoveSite.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/FreenodeFrom.php b/app/Services/Tg/Hook/Mod/FreenodeFrom.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/FreenodePool.php b/app/Services/Tg/Hook/Mod/FreenodePool.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/GemboxDns.php b/app/Services/Tg/Hook/Mod/GemboxDns.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Good.php b/app/Services/Tg/Hook/Mod/Good.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Hook.php b/app/Services/Tg/Hook/Mod/Hook.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Hook_old.php b/app/Services/Tg/Hook/Mod/Hook_old.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/HttpQueue.php b/app/Services/Tg/Hook/Mod/HttpQueue.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Jctj.php b/app/Services/Tg/Hook/Mod/Jctj.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/JctjOption.php b/app/Services/Tg/Hook/Mod/JctjOption.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Note.php b/app/Services/Tg/Hook/Mod/Note.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Note_option.php b/app/Services/Tg/Hook/Mod/Note_option.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Option.php b/app/Services/Tg/Hook/Mod/Option.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Ship.php b/app/Services/Tg/Hook/Mod/Ship.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/SiteMap.php b/app/Services/Tg/Hook/Mod/SiteMap.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/SitePathMap.php b/app/Services/Tg/Hook/Mod/SitePathMap.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/TelegramKey.php b/app/Services/Tg/Hook/Mod/TelegramKey.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Test.php b/app/Services/Tg/Hook/Mod/Test.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Tool.php b/app/Services/Tg/Hook/Mod/Tool.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Hook/Mod/Upload.php b/app/Services/Tg/Hook/Mod/Upload.php
old mode 100644
new mode 100755
diff --git a/app/Services/Tg/Http.php b/app/Services/Tg/Http.php
old mode 100644
new mode 100755
diff --git a/app/Services/TomTool/Telegram/Master.php b/app/Services/TomTool/Telegram/Master.php
index 559671d7..03d800f7 100755
--- a/app/Services/TomTool/Telegram/Master.php
+++ b/app/Services/TomTool/Telegram/Master.php
@@ -36,6 +36,11 @@ final class Master
public int $iChatId = 0;
public string $sMsg = '';
+ public string $sPhotoUrl = '';
+ public int $iPhotoWidth = 0;
+ public int $iPhotoHeight = 0;
+
+ public string $sType = '';
public bool $enableQueue = false; // 应该用不到了
@@ -79,6 +84,20 @@ final class Master
return $this;
}
+ public function setPhotoUrl(string $sPhotoUrl, int $iPhotoWidth = 0, int $iPhotoHeight = 0): self
+ {
+ $this->sPhotoUrl = $sPhotoUrl;
+ $this->iPhotoWidth = $iPhotoWidth;
+ $this->iPhotoHeight = $iPhotoHeight;
+ return $this;
+ }
+
+ public function setType(string $sType): self
+ {
+ $this->sType = $sType;
+ return $this;
+ }
+
public function send($sMsg = ''): Flow
{
if ($sMsg) {
@@ -99,9 +118,11 @@ final class Master
->setBotToken($this->sBotToken)
->setChatId($this->iChatId)
->setMsgS($this->sMsg)
+ ->setPhotoUrl($this->sPhotoUrl, $this->iPhotoWidth, $this->iPhotoHeight)
+ ->setType($this->sType)
->send();
}
-
+
return $oFlow;
}
@@ -131,7 +152,11 @@ final class Master
"sChatCode" => $this->sChatCode ?? '',
"sBotToken" => $this->sBotToken ?? '',
"iChatId" => $this->iChatId ?? '',
- "sMsg" => $this->sMsg ?? '',
+ "sPhotoUrl" => $this->sPhotoUrl ?? '',
+ "iPhotoWidth" => $this->iPhotoWidth,
+ "iPhotoHeight" => $this->iPhotoHeight,
+ "sMsg" => $this->sMsg ?? '',
+ "sType" => $this->sType ?? '',
];
}
diff --git a/app/Services/TomTool/Telegram/Sdk.php b/app/Services/TomTool/Telegram/Sdk.php
index aaf55f1d..9375fb99 100755
--- a/app/Services/TomTool/Telegram/Sdk.php
+++ b/app/Services/TomTool/Telegram/Sdk.php
@@ -4,8 +4,13 @@ declare(strict_types=1);
namespace App\Services\TomTool\Telegram;
use Telegram\Bot\Api;
+use Telegram\Bot\FileUpload\InputFile;
use Telegram\Bot\Exceptions\TelegramSDKException;
use App\Services\TomTool\Flow;
+//use Intervention\Image\Laravel\Facades\Image;
+use Intervention\Image\ImageManager;
+use Intervention\Image\Drivers\Gd\Driver;
+use App\Services\TomTool\HttpV2;
class Sdk
{
@@ -13,6 +18,9 @@ class Sdk
public $sMsgFormatType = 'none';
public $sBotToken = '';
public $iChatId = 0;
+ public $sPhotoUrl = '';
+ public $iPhotoWidth = 0;
+ public $iPhotoHeight = 0;
public $sMsg;
public $oApi;
@@ -43,20 +51,44 @@ class Sdk
return $this;
}
+ public function setPhotoUrl($sUrl = '', $iPhotoWidth = 0, $iPhotoHeight = 0)
+ {
+ $this->sPhotoUrl = $sUrl;
+ $this->iPhotoWidth = $iPhotoWidth;
+ $this->iPhotoHeight = $iPhotoHeight;
+// tomd($iPhotoWidth, 1);
+ return $this;
+ }
+
+ public function setType($sType)
+ {
+ if ($sType) {
+ $this->sMsgFormatType = $sType;
+ }
+
+ return $this;
+ }
+
public function send()
{
$oFlow = Flow::start("tg_sdk_send");
$this->msgFormat();
-
- try {
- $r = $this->oApi->sendMessage($this->sMsgFormat);
- if (!$r->isOk()) {
- return $oFlow->fail();
+
+// try {
+
+ if ($this->sPhotoUrl) {
+ $r = $this->oApi->sendPhoto($this->sMsgFormat);
+ } else {
+ $r = $this->oApi->sendMessage($this->sMsgFormat);
}
- } catch (TelegramSDKException $e) {
- return $oFlow->fail(['error' => $e->getMessage()]);
- }
+
+ if (!($r && $r->getMessageId())) {
+ return $oFlow->fail($r);
+ }
+// } catch (TelegramSDKException $e) {
+// return $oFlow->fail(['error' => $e->getMessage()]);
+// }
return $oFlow->done();
}
@@ -73,9 +105,33 @@ class Sdk
if (!in_array($this->sMsgFormatType, self::ALLOWED_FORMATS, true)) {
throw new \RuntimeException("不支持的格式类型: {$this->sMsgFormatType}");
}
-
+// ini_set('memory_limit', '512M');
$method = 'msgFormat_' . $this->sMsgFormatType;
$this->sMsgFormat = $this->$method();
+
+ if ($this->sPhotoUrl) {
+
+ $oManager = new ImageManager(new Driver());
+
+ $sTempPath = $_ENV['dir_base'].'public/upload';
+ $sTempPath .= "/tg_output.png";
+
+ $sImg = file_get_contents($this->sPhotoUrl);
+ $oImage = $oManager->read($sImg);
+// tomd($this->iPhotoWidth, 1);
+ if ($this->iPhotoWidth && $this->iPhotoHeight) {
+ $oImage = $oImage->cover($this->iPhotoWidth, $this->iPhotoHeight);
+ }
+
+ $oImage->toJpg(80)->save($sTempPath);
+
+ $photo = InputFile::create($sTempPath, date("Y-m-d").'.jpg');
+
+ $this->sMsgFormat["photo"] = $photo;
+
+ $this->sMsgFormat["caption"] = $this->sMsgFormat["text"];
+ unset($this->sMsgFormat["text"]);
+ }
return $this;
}
diff --git a/app/Services/TomTool/Telegram/Slave.php b/app/Services/TomTool/Telegram/Slave.php
index 00ca8af4..2b7ed6fa 100755
--- a/app/Services/TomTool/Telegram/Slave.php
+++ b/app/Services/TomTool/Telegram/Slave.php
@@ -57,6 +57,11 @@ class Slave
public int $iChatId = 0;
public string $sMsg = '';
+ public string $sPhotoUrl = '';
+ public int $iPhotoWidth = 0;
+ public int $iPhotoHeight = 0;
+
+ public string $sType = '';
public bool $enableMaster = true;
public bool $enableMasterQueue = false; // 这里之前想错了,不会有master队列,只在slave有,master转发就行了
@@ -138,6 +143,22 @@ class Slave
return $this;
}
+ // set
+ public function setPhotoUrl(string $sPhotoUrl, int $iWidth = 0, int $iHeight = 0): self
+ {
+ $this->sPhotoUrl = $sPhotoUrl;
+ $this->iPhotoWidth = $iWidth;
+ $this->iPhotoHeight = $iHeight;
+ return $this;
+ }
+
+ // set
+ public function setType(string $sType): self
+ {
+ $this->sType = $sType;
+ return $this;
+ }
+
// set
public function setMsgS(string $sMsg = ''): self
{
@@ -240,6 +261,7 @@ class Slave
private function _send_master(): Flow
{
+// tomd(11111,1);
$aData = $this->buildDataTom();
if ($this->enableSlaveQueue) {
@@ -264,7 +286,7 @@ class Slave
}
$r = $oHttpV2->enableJsonAs()->setData($aData)->send();
-
+
if ($this->enableAsync) {
return $oFlow->sData("async")->done("async");
} else {
@@ -287,6 +309,7 @@ class Slave
return $oFlow;
}
+ // 直接从本地发到tg,几乎用不上,都走master了
private function _send_local(): Flow
{
if ($this->enableSlaveQueue) {
@@ -309,6 +332,10 @@ class Slave
"enableMasterQueue" => $this->enableMasterQueue ?? '',
"enableMaster" => $this->enableMaster,
"sMsg" => $this->sMsg ?? '',
+ "sPhotoUrl" => $this->sPhotoUrl ?? '',
+ "iPhotoWidth" => $this->iPhotoWidth ?? 0,
+ "iPhotoHeight" => $this->iPhotoHeight ?? 0,
+ "sType" => $this->sType ?? '',
];
}
diff --git a/composer.json b/composer.json
index 284e66a8..c541d9c1 100755
--- a/composer.json
+++ b/composer.json
@@ -8,6 +8,7 @@
"require": {
"php": "^8.2",
"guzzlehttp/guzzle": "^7.9",
+ "intervention/image": "^3.11",
"irazasyed/telegram-bot-sdk": "^3.15",
"laravel/framework": "^11.31",
"laravel/tinker": "^2.9",
diff --git a/composer.lock b/composer.lock
index 1cd220dc..2d25c574 100755
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "0276bc3b1e98a844fc7c078b38dc44f8",
+ "content-hash": "60674f80fc8b7a52ce2d729648d5b538",
"packages": [
{
"name": "brick/math",
@@ -1054,6 +1054,150 @@
],
"time": "2023-12-03T19:50:20+00:00"
},
+ {
+ "name": "intervention/gif",
+ "version": "4.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/gif.git",
+ "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a",
+ "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Gif\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Native PHP GIF Encoder/Decoder",
+ "homepage": "https://github.com/intervention/gif",
+ "keywords": [
+ "animation",
+ "gd",
+ "gif",
+ "image"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/gif/issues",
+ "source": "https://github.com/Intervention/gif/tree/4.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-03-29T07:46:21+00:00"
+ },
+ {
+ "name": "intervention/image",
+ "version": "3.11.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image.git",
+ "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1",
+ "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "intervention/gif": "^4.2",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.6",
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "suggest": {
+ "ext-exif": "Recommended to be able to read EXIF data properly."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io"
+ }
+ ],
+ "description": "PHP Image Processing",
+ "homepage": "https://image.intervention.io",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "resize",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image/issues",
+ "source": "https://github.com/Intervention/image/tree/3.11.6"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-12-17T13:38:29+00:00"
+ },
{
"name": "irazasyed/telegram-bot-sdk",
"version": "v3.15.0",
diff --git a/fn的tg策略.md b/fn的tg策略.md
old mode 100644
new mode 100755
diff --git a/fn部署.md b/fn部署.md
old mode 100644
new mode 100755
diff --git a/public/js/jquery.min.js b/public/js/jquery.min.js
old mode 100644
new mode 100755
diff --git a/public/upload/无标题.png b/public/upload/无标题.png
old mode 100644
new mode 100755
diff --git a/resources/views/cmd.blade.php b/resources/views/cmd.blade.php
old mode 100644
new mode 100755
diff --git a/resources/views/cmd/image/upload.blade.php b/resources/views/cmd/image/upload.blade.php
old mode 100644
new mode 100755
diff --git a/scripts/cron.php b/scripts/cron.php
old mode 100644
new mode 100755
diff --git a/tg发送逻辑.md b/tg发送逻辑.md
new file mode 100644
index 00000000..86755f59
--- /dev/null
+++ b/tg发送逻辑.md
@@ -0,0 +1,8 @@
+
+本地(队列) 》〉masterOpenApi(无队列) 》〉tg
+
+有点乱的地方:
+ 原设想本地和master都有队列,后来发现master队列没有必要,因为判断成功只从本地队列判断就够了。
+ 所以现在的玩法是:数据严格的就走本地队列,不严格的直接发送master
+ 也是为什么master里的tg接受api没有队列代码,而sdk设计的有。(没必要的过度设计反而误导了)
+ 而master里的HttpQueue实际是他作为slave时使用的,别误会了
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index dc222020..7e1ef830 100755
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir);
return array(
'App\\Http\\Controllers\\Api\\CountryController' => $baseDir . '/app/Http/Controllers/Api/CountryController.php',
+ 'App\\Http\\Controllers\\Api\\FreenodeController' => $baseDir . '/app/Http/Controllers/Api/FreenodeController.php',
'App\\Http\\Controllers\\Api\\GithubController' => $baseDir . '/app/Http/Controllers/Api/GithubController.php',
'App\\Http\\Controllers\\Api\\GoodController' => $baseDir . '/app/Http/Controllers/Api/GoodController.php',
'App\\Http\\Controllers\\Api\\ShipController' => $baseDir . '/app/Http/Controllers/Api/ShipController.php',
@@ -32,6 +33,8 @@ return array(
'App\\Models\\CrawlFreenode' => $baseDir . '/app/Models/CrawlFreenode.php',
'App\\Models\\DogOption' => $baseDir . '/app/Models/DogOption.php',
'App\\Models\\DoveSite' => $baseDir . '/app/Models/DoveSite.php',
+ 'App\\Models\\FreenodePool' => $baseDir . '/app/Models/FreenodePool.php',
+ 'App\\Models\\GemboxDns' => $baseDir . '/app/Models/GemboxDns.php',
'App\\Models\\GoodPool' => $baseDir . '/app/Models/GoodPool.php',
'App\\Models\\Hook' => $baseDir . '/app/Models/Hook.php',
'App\\Models\\HttpQueue' => $baseDir . '/app/Models/HttpQueue.php',
@@ -49,7 +52,13 @@ return array(
'App\\Services\\Article\\Schema' => $baseDir . '/app/Services/Article/Schema.php',
'App\\Services\\Cron' => $baseDir . '/app/Services/Cron.php',
'App\\Services\\Cron\\ArticleSchema' => $baseDir . '/app/Services/Cron/ArticleSchema.php',
- 'App\\Services\\Cron\\CrawlFreenode' => $baseDir . '/app/Services/Cron/CrawlFreenode.php',
+ 'App\\Services\\Cron\\FnTgPublish' => $baseDir . '/app/Services/Cron/FnTgPublish.php',
+ 'App\\Services\\Cron\\FreenodeCrawl' => $baseDir . '/app/Services/Cron/FreenodeCrawl.php',
+ 'App\\Services\\Cron\\FreenodeFile' => $baseDir . '/app/Services/Cron/FreenodeFile.php',
+ 'App\\Services\\Cron\\FreenodeLog' => $baseDir . '/app/Services/Cron/FreenodeLog.php',
+ 'App\\Services\\Cron\\FreenodeMerge' => $baseDir . '/app/Services/Cron/FreenodeMerge.php',
+ 'App\\Services\\Cron\\FreenodePool' => $baseDir . '/app/Services/Cron/FreenodePool.php',
+ 'App\\Services\\Cron\\FreenodeSync' => $baseDir . '/app/Services/Cron/FreenodeSync.php',
'App\\Services\\Cron\\HttpQueue' => $baseDir . '/app/Services/Cron/HttpQueue.php',
'App\\Services\\HttpQueue' => $baseDir . '/app/Services/HttpQueue.php',
'App\\Services\\OpenApi\\Telegram' => $baseDir . '/app/Services/OpenApi/Telegram.php',
@@ -70,8 +79,12 @@ return array(
'App\\Services\\Tg\\Hook\\Mod\\Dev' => $baseDir . '/app/Services/Tg/Hook/Mod/Dev.php',
'App\\Services\\Tg\\Hook\\Mod\\Dove' => $baseDir . '/app/Services/Tg/Hook/Mod/Dove.php',
'App\\Services\\Tg\\Hook\\Mod\\DoveSite' => $baseDir . '/app/Services/Tg/Hook/Mod/DoveSite.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\FreenodeFrom' => $baseDir . '/app/Services/Tg/Hook/Mod/FreenodeFrom.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\FreenodePool' => $baseDir . '/app/Services/Tg/Hook/Mod/FreenodePool.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\GemboxDns' => $baseDir . '/app/Services/Tg/Hook/Mod/GemboxDns.php',
'App\\Services\\Tg\\Hook\\Mod\\Good' => $baseDir . '/app/Services/Tg/Hook/Mod/Good.php',
'App\\Services\\Tg\\Hook\\Mod\\Hook' => $baseDir . '/app/Services/Tg/Hook/Mod/Hook.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\HttpQueue' => $baseDir . '/app/Services/Tg/Hook/Mod/HttpQueue.php',
'App\\Services\\Tg\\Hook\\Mod\\Jctj' => $baseDir . '/app/Services/Tg/Hook/Mod/Jctj.php',
'App\\Services\\Tg\\Hook\\Mod\\JctjOption' => $baseDir . '/app/Services/Tg/Hook/Mod/JctjOption.php',
'App\\Services\\Tg\\Hook\\Mod\\Note' => $baseDir . '/app/Services/Tg/Hook/Mod/Note.php',
@@ -2422,6 +2435,400 @@ return array(
'Illuminate\\View\\ViewFinderInterface' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php',
'Illuminate\\View\\ViewName' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewName.php',
'Illuminate\\View\\ViewServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php',
+ 'Intervention\\Gif\\AbstractEntity' => $vendorDir . '/intervention/gif/src/AbstractEntity.php',
+ 'Intervention\\Gif\\AbstractExtension' => $vendorDir . '/intervention/gif/src/AbstractExtension.php',
+ 'Intervention\\Gif\\Blocks\\ApplicationExtension' => $vendorDir . '/intervention/gif/src/Blocks/ApplicationExtension.php',
+ 'Intervention\\Gif\\Blocks\\Color' => $vendorDir . '/intervention/gif/src/Blocks/Color.php',
+ 'Intervention\\Gif\\Blocks\\ColorTable' => $vendorDir . '/intervention/gif/src/Blocks/ColorTable.php',
+ 'Intervention\\Gif\\Blocks\\CommentExtension' => $vendorDir . '/intervention/gif/src/Blocks/CommentExtension.php',
+ 'Intervention\\Gif\\Blocks\\DataSubBlock' => $vendorDir . '/intervention/gif/src/Blocks/DataSubBlock.php',
+ 'Intervention\\Gif\\Blocks\\FrameBlock' => $vendorDir . '/intervention/gif/src/Blocks/FrameBlock.php',
+ 'Intervention\\Gif\\Blocks\\GraphicControlExtension' => $vendorDir . '/intervention/gif/src/Blocks/GraphicControlExtension.php',
+ 'Intervention\\Gif\\Blocks\\Header' => $vendorDir . '/intervention/gif/src/Blocks/Header.php',
+ 'Intervention\\Gif\\Blocks\\ImageData' => $vendorDir . '/intervention/gif/src/Blocks/ImageData.php',
+ 'Intervention\\Gif\\Blocks\\ImageDescriptor' => $vendorDir . '/intervention/gif/src/Blocks/ImageDescriptor.php',
+ 'Intervention\\Gif\\Blocks\\LogicalScreenDescriptor' => $vendorDir . '/intervention/gif/src/Blocks/LogicalScreenDescriptor.php',
+ 'Intervention\\Gif\\Blocks\\NetscapeApplicationExtension' => $vendorDir . '/intervention/gif/src/Blocks/NetscapeApplicationExtension.php',
+ 'Intervention\\Gif\\Blocks\\PlainTextExtension' => $vendorDir . '/intervention/gif/src/Blocks/PlainTextExtension.php',
+ 'Intervention\\Gif\\Blocks\\TableBasedImage' => $vendorDir . '/intervention/gif/src/Blocks/TableBasedImage.php',
+ 'Intervention\\Gif\\Blocks\\Trailer' => $vendorDir . '/intervention/gif/src/Blocks/Trailer.php',
+ 'Intervention\\Gif\\Builder' => $vendorDir . '/intervention/gif/src/Builder.php',
+ 'Intervention\\Gif\\Decoder' => $vendorDir . '/intervention/gif/src/Decoder.php',
+ 'Intervention\\Gif\\Decoders\\AbstractDecoder' => $vendorDir . '/intervention/gif/src/Decoders/AbstractDecoder.php',
+ 'Intervention\\Gif\\Decoders\\AbstractPackedBitDecoder' => $vendorDir . '/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ApplicationExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ColorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ColorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ColorTableDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ColorTableDecoder.php',
+ 'Intervention\\Gif\\Decoders\\CommentExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/CommentExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\DataSubBlockDecoder' => $vendorDir . '/intervention/gif/src/Decoders/DataSubBlockDecoder.php',
+ 'Intervention\\Gif\\Decoders\\FrameBlockDecoder' => $vendorDir . '/intervention/gif/src/Decoders/FrameBlockDecoder.php',
+ 'Intervention\\Gif\\Decoders\\GifDataStreamDecoder' => $vendorDir . '/intervention/gif/src/Decoders/GifDataStreamDecoder.php',
+ 'Intervention\\Gif\\Decoders\\GraphicControlExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\HeaderDecoder' => $vendorDir . '/intervention/gif/src/Decoders/HeaderDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ImageDataDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ImageDataDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ImageDescriptorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ImageDescriptorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\LogicalScreenDescriptorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\NetscapeApplicationExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\PlainTextExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\TableBasedImageDecoder' => $vendorDir . '/intervention/gif/src/Decoders/TableBasedImageDecoder.php',
+ 'Intervention\\Gif\\DisposalMethod' => $vendorDir . '/intervention/gif/src/DisposalMethod.php',
+ 'Intervention\\Gif\\Encoders\\AbstractEncoder' => $vendorDir . '/intervention/gif/src/Encoders/AbstractEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ApplicationExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ColorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ColorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ColorTableEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ColorTableEncoder.php',
+ 'Intervention\\Gif\\Encoders\\CommentExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/CommentExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\DataSubBlockEncoder' => $vendorDir . '/intervention/gif/src/Encoders/DataSubBlockEncoder.php',
+ 'Intervention\\Gif\\Encoders\\FrameBlockEncoder' => $vendorDir . '/intervention/gif/src/Encoders/FrameBlockEncoder.php',
+ 'Intervention\\Gif\\Encoders\\GifDataStreamEncoder' => $vendorDir . '/intervention/gif/src/Encoders/GifDataStreamEncoder.php',
+ 'Intervention\\Gif\\Encoders\\GraphicControlExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\HeaderEncoder' => $vendorDir . '/intervention/gif/src/Encoders/HeaderEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ImageDataEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ImageDataEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ImageDescriptorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ImageDescriptorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\LogicalScreenDescriptorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\NetscapeApplicationExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\PlainTextExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\TableBasedImageEncoder' => $vendorDir . '/intervention/gif/src/Encoders/TableBasedImageEncoder.php',
+ 'Intervention\\Gif\\Encoders\\TrailerEncoder' => $vendorDir . '/intervention/gif/src/Encoders/TrailerEncoder.php',
+ 'Intervention\\Gif\\Exceptions\\DecoderException' => $vendorDir . '/intervention/gif/src/Exceptions/DecoderException.php',
+ 'Intervention\\Gif\\Exceptions\\EncoderException' => $vendorDir . '/intervention/gif/src/Exceptions/EncoderException.php',
+ 'Intervention\\Gif\\Exceptions\\FormatException' => $vendorDir . '/intervention/gif/src/Exceptions/FormatException.php',
+ 'Intervention\\Gif\\Exceptions\\NotReadableException' => $vendorDir . '/intervention/gif/src/Exceptions/NotReadableException.php',
+ 'Intervention\\Gif\\GifDataStream' => $vendorDir . '/intervention/gif/src/GifDataStream.php',
+ 'Intervention\\Gif\\Splitter' => $vendorDir . '/intervention/gif/src/Splitter.php',
+ 'Intervention\\Gif\\Traits\\CanDecode' => $vendorDir . '/intervention/gif/src/Traits/CanDecode.php',
+ 'Intervention\\Gif\\Traits\\CanEncode' => $vendorDir . '/intervention/gif/src/Traits/CanEncode.php',
+ 'Intervention\\Gif\\Traits\\CanHandleFiles' => $vendorDir . '/intervention/gif/src/Traits/CanHandleFiles.php',
+ 'Intervention\\Image\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\ProfileAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ProfileAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Collection' => $vendorDir . '/intervention/image/src/Collection.php',
+ 'Intervention\\Image\\Colors\\AbstractColor' => $vendorDir . '/intervention/image/src/Colors/AbstractColor.php',
+ 'Intervention\\Image\\Colors\\AbstractColorChannel' => $vendorDir . '/intervention/image/src/Colors/AbstractColorChannel.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Cyan' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Cyan.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Key' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Key.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Magenta' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Magenta.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Yellow' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Yellow.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Color' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Color.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Hue' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Hue.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Luminance' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Luminance.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Saturation' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Saturation.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Color' => $vendorDir . '/intervention/image/src/Colors/Hsl/Color.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Hsl/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Hue' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Hue.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Saturation' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Saturation.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Value' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Value.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Color' => $vendorDir . '/intervention/image/src/Colors/Hsv/Color.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Hsv/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Profile' => $vendorDir . '/intervention/image/src/Colors/Profile.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Alpha' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Alpha.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Blue' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Blue.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Green' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Green.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Red' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Red.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Color' => $vendorDir . '/intervention/image/src/Colors/Rgb/Color.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Rgb/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HexColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HtmlColornameDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\TransparentColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php',
+ 'Intervention\\Image\\Config' => $vendorDir . '/intervention/image/src/Config.php',
+ 'Intervention\\Image\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\ColorObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/ColorObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\ImageObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/ImageObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Drivers/AbstractDecoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractDriver' => $vendorDir . '/intervention/image/src/Drivers/AbstractDriver.php',
+ 'Intervention\\Image\\Drivers\\AbstractEncoder' => $vendorDir . '/intervention/image/src/Drivers/AbstractEncoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractFontProcessor' => $vendorDir . '/intervention/image/src/Drivers/AbstractFontProcessor.php',
+ 'Intervention\\Image\\Drivers\\AbstractFrame' => $vendorDir . '/intervention/image/src/Drivers/AbstractFrame.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Cloner' => $vendorDir . '/intervention/image/src/Drivers/Gd/Cloner.php',
+ 'Intervention\\Image\\Drivers\\Gd\\ColorProcessor' => $vendorDir . '/intervention/image/src/Drivers/Gd/ColorProcessor.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Core' => $vendorDir . '/intervention/image/src/Drivers/Gd/Core.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Driver' => $vendorDir . '/intervention/image/src/Drivers/Gd/Driver.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\FontProcessor' => $vendorDir . '/intervention/image/src/Drivers/Gd/FontProcessor.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Frame' => $vendorDir . '/intervention/image/src/Drivers/Gd/Frame.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ProfileAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\ColorProcessor' => $vendorDir . '/intervention/image/src/Drivers/Imagick/ColorProcessor.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Core' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Core.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Driver' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Driver.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\HeicEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\Jpeg2000Encoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\TiffEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\FontProcessor' => $vendorDir . '/intervention/image/src/Drivers/Imagick/FontProcessor.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Frame' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Frame.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\StripMetaModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Drivers\\Specializable' => $vendorDir . '/intervention/image/src/Drivers/Specializable.php',
+ 'Intervention\\Image\\Drivers\\SpecializableAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/SpecializableAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\SpecializableDecoder' => $vendorDir . '/intervention/image/src/Drivers/SpecializableDecoder.php',
+ 'Intervention\\Image\\Drivers\\SpecializableEncoder' => $vendorDir . '/intervention/image/src/Drivers/SpecializableEncoder.php',
+ 'Intervention\\Image\\Drivers\\SpecializableModifier' => $vendorDir . '/intervention/image/src/Drivers/SpecializableModifier.php',
+ 'Intervention\\Image\\EncodedImage' => $vendorDir . '/intervention/image/src/EncodedImage.php',
+ 'Intervention\\Image\\Encoders\\AutoEncoder' => $vendorDir . '/intervention/image/src/Encoders/AutoEncoder.php',
+ 'Intervention\\Image\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Encoders\\FileExtensionEncoder' => $vendorDir . '/intervention/image/src/Encoders/FileExtensionEncoder.php',
+ 'Intervention\\Image\\Encoders\\FilePathEncoder' => $vendorDir . '/intervention/image/src/Encoders/FilePathEncoder.php',
+ 'Intervention\\Image\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Encoders\\HeicEncoder' => $vendorDir . '/intervention/image/src/Encoders/HeicEncoder.php',
+ 'Intervention\\Image\\Encoders\\Jpeg2000Encoder' => $vendorDir . '/intervention/image/src/Encoders/Jpeg2000Encoder.php',
+ 'Intervention\\Image\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Encoders\\MediaTypeEncoder' => $vendorDir . '/intervention/image/src/Encoders/MediaTypeEncoder.php',
+ 'Intervention\\Image\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Encoders\\TiffEncoder' => $vendorDir . '/intervention/image/src/Encoders/TiffEncoder.php',
+ 'Intervention\\Image\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Exceptions\\AnimationException' => $vendorDir . '/intervention/image/src/Exceptions/AnimationException.php',
+ 'Intervention\\Image\\Exceptions\\ColorException' => $vendorDir . '/intervention/image/src/Exceptions/ColorException.php',
+ 'Intervention\\Image\\Exceptions\\DecoderException' => $vendorDir . '/intervention/image/src/Exceptions/DecoderException.php',
+ 'Intervention\\Image\\Exceptions\\DriverException' => $vendorDir . '/intervention/image/src/Exceptions/DriverException.php',
+ 'Intervention\\Image\\Exceptions\\EncoderException' => $vendorDir . '/intervention/image/src/Exceptions/EncoderException.php',
+ 'Intervention\\Image\\Exceptions\\FontException' => $vendorDir . '/intervention/image/src/Exceptions/FontException.php',
+ 'Intervention\\Image\\Exceptions\\GeometryException' => $vendorDir . '/intervention/image/src/Exceptions/GeometryException.php',
+ 'Intervention\\Image\\Exceptions\\InputException' => $vendorDir . '/intervention/image/src/Exceptions/InputException.php',
+ 'Intervention\\Image\\Exceptions\\NotSupportedException' => $vendorDir . '/intervention/image/src/Exceptions/NotSupportedException.php',
+ 'Intervention\\Image\\Exceptions\\NotWritableException' => $vendorDir . '/intervention/image/src/Exceptions/NotWritableException.php',
+ 'Intervention\\Image\\Exceptions\\RuntimeException' => $vendorDir . '/intervention/image/src/Exceptions/RuntimeException.php',
+ 'Intervention\\Image\\File' => $vendorDir . '/intervention/image/src/File.php',
+ 'Intervention\\Image\\FileExtension' => $vendorDir . '/intervention/image/src/FileExtension.php',
+ 'Intervention\\Image\\Format' => $vendorDir . '/intervention/image/src/Format.php',
+ 'Intervention\\Image\\Geometry\\Bezier' => $vendorDir . '/intervention/image/src/Geometry/Bezier.php',
+ 'Intervention\\Image\\Geometry\\Circle' => $vendorDir . '/intervention/image/src/Geometry/Circle.php',
+ 'Intervention\\Image\\Geometry\\Ellipse' => $vendorDir . '/intervention/image/src/Geometry/Ellipse.php',
+ 'Intervention\\Image\\Geometry\\Factories\\BezierFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/BezierFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\CircleFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/CircleFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\Drawable' => $vendorDir . '/intervention/image/src/Geometry/Factories/Drawable.php',
+ 'Intervention\\Image\\Geometry\\Factories\\EllipseFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/EllipseFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\LineFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/LineFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\PolygonFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/PolygonFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\RectangleFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/RectangleFactory.php',
+ 'Intervention\\Image\\Geometry\\Line' => $vendorDir . '/intervention/image/src/Geometry/Line.php',
+ 'Intervention\\Image\\Geometry\\Pixel' => $vendorDir . '/intervention/image/src/Geometry/Pixel.php',
+ 'Intervention\\Image\\Geometry\\Point' => $vendorDir . '/intervention/image/src/Geometry/Point.php',
+ 'Intervention\\Image\\Geometry\\Polygon' => $vendorDir . '/intervention/image/src/Geometry/Polygon.php',
+ 'Intervention\\Image\\Geometry\\Rectangle' => $vendorDir . '/intervention/image/src/Geometry/Rectangle.php',
+ 'Intervention\\Image\\Geometry\\Tools\\RectangleResizer' => $vendorDir . '/intervention/image/src/Geometry/Tools/RectangleResizer.php',
+ 'Intervention\\Image\\Geometry\\Traits\\HasBackgroundColor' => $vendorDir . '/intervention/image/src/Geometry/Traits/HasBackgroundColor.php',
+ 'Intervention\\Image\\Geometry\\Traits\\HasBorder' => $vendorDir . '/intervention/image/src/Geometry/Traits/HasBorder.php',
+ 'Intervention\\Image\\Image' => $vendorDir . '/intervention/image/src/Image.php',
+ 'Intervention\\Image\\ImageManager' => $vendorDir . '/intervention/image/src/ImageManager.php',
+ 'Intervention\\Image\\InputHandler' => $vendorDir . '/intervention/image/src/InputHandler.php',
+ 'Intervention\\Image\\Interfaces\\AnalyzerInterface' => $vendorDir . '/intervention/image/src/Interfaces/AnalyzerInterface.php',
+ 'Intervention\\Image\\Interfaces\\CollectionInterface' => $vendorDir . '/intervention/image/src/Interfaces/CollectionInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorChannelInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorChannelInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorProcessorInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorProcessorInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorspaceInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorspaceInterface.php',
+ 'Intervention\\Image\\Interfaces\\CoreInterface' => $vendorDir . '/intervention/image/src/Interfaces/CoreInterface.php',
+ 'Intervention\\Image\\Interfaces\\DecoderInterface' => $vendorDir . '/intervention/image/src/Interfaces/DecoderInterface.php',
+ 'Intervention\\Image\\Interfaces\\DrawableFactoryInterface' => $vendorDir . '/intervention/image/src/Interfaces/DrawableFactoryInterface.php',
+ 'Intervention\\Image\\Interfaces\\DrawableInterface' => $vendorDir . '/intervention/image/src/Interfaces/DrawableInterface.php',
+ 'Intervention\\Image\\Interfaces\\DriverInterface' => $vendorDir . '/intervention/image/src/Interfaces/DriverInterface.php',
+ 'Intervention\\Image\\Interfaces\\EncodedImageInterface' => $vendorDir . '/intervention/image/src/Interfaces/EncodedImageInterface.php',
+ 'Intervention\\Image\\Interfaces\\EncoderInterface' => $vendorDir . '/intervention/image/src/Interfaces/EncoderInterface.php',
+ 'Intervention\\Image\\Interfaces\\FileInterface' => $vendorDir . '/intervention/image/src/Interfaces/FileInterface.php',
+ 'Intervention\\Image\\Interfaces\\FontInterface' => $vendorDir . '/intervention/image/src/Interfaces/FontInterface.php',
+ 'Intervention\\Image\\Interfaces\\FontProcessorInterface' => $vendorDir . '/intervention/image/src/Interfaces/FontProcessorInterface.php',
+ 'Intervention\\Image\\Interfaces\\FrameInterface' => $vendorDir . '/intervention/image/src/Interfaces/FrameInterface.php',
+ 'Intervention\\Image\\Interfaces\\ImageInterface' => $vendorDir . '/intervention/image/src/Interfaces/ImageInterface.php',
+ 'Intervention\\Image\\Interfaces\\ImageManagerInterface' => $vendorDir . '/intervention/image/src/Interfaces/ImageManagerInterface.php',
+ 'Intervention\\Image\\Interfaces\\InputHandlerInterface' => $vendorDir . '/intervention/image/src/Interfaces/InputHandlerInterface.php',
+ 'Intervention\\Image\\Interfaces\\ModifierInterface' => $vendorDir . '/intervention/image/src/Interfaces/ModifierInterface.php',
+ 'Intervention\\Image\\Interfaces\\PointInterface' => $vendorDir . '/intervention/image/src/Interfaces/PointInterface.php',
+ 'Intervention\\Image\\Interfaces\\ProfileInterface' => $vendorDir . '/intervention/image/src/Interfaces/ProfileInterface.php',
+ 'Intervention\\Image\\Interfaces\\ResolutionInterface' => $vendorDir . '/intervention/image/src/Interfaces/ResolutionInterface.php',
+ 'Intervention\\Image\\Interfaces\\SizeInterface' => $vendorDir . '/intervention/image/src/Interfaces/SizeInterface.php',
+ 'Intervention\\Image\\Interfaces\\SpecializableInterface' => $vendorDir . '/intervention/image/src/Interfaces/SpecializableInterface.php',
+ 'Intervention\\Image\\Interfaces\\SpecializedInterface' => $vendorDir . '/intervention/image/src/Interfaces/SpecializedInterface.php',
+ 'Intervention\\Image\\MediaType' => $vendorDir . '/intervention/image/src/MediaType.php',
+ 'Intervention\\Image\\ModifierStack' => $vendorDir . '/intervention/image/src/ModifierStack.php',
+ 'Intervention\\Image\\Modifiers\\AbstractDrawModifier' => $vendorDir . '/intervention/image/src/Modifiers/AbstractDrawModifier.php',
+ 'Intervention\\Image\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Origin' => $vendorDir . '/intervention/image/src/Origin.php',
+ 'Intervention\\Image\\Resolution' => $vendorDir . '/intervention/image/src/Resolution.php',
+ 'Intervention\\Image\\Traits\\CanBeDriverSpecialized' => $vendorDir . '/intervention/image/src/Traits/CanBeDriverSpecialized.php',
+ 'Intervention\\Image\\Traits\\CanBuildFilePointer' => $vendorDir . '/intervention/image/src/Traits/CanBuildFilePointer.php',
+ 'Intervention\\Image\\Typography\\Font' => $vendorDir . '/intervention/image/src/Typography/Font.php',
+ 'Intervention\\Image\\Typography\\FontFactory' => $vendorDir . '/intervention/image/src/Typography/FontFactory.php',
+ 'Intervention\\Image\\Typography\\Line' => $vendorDir . '/intervention/image/src/Typography/Line.php',
+ 'Intervention\\Image\\Typography\\TextBlock' => $vendorDir . '/intervention/image/src/Typography/TextBlock.php',
'Laravel\\Pail\\Console\\Commands\\PailCommand' => $vendorDir . '/laravel/pail/src/Console/Commands/PailCommand.php',
'Laravel\\Pail\\Contracts\\Printer' => $vendorDir . '/laravel/pail/src/Contracts/Printer.php',
'Laravel\\Pail\\File' => $vendorDir . '/laravel/pail/src/File.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 5dacbe42..6f9b21b8 100755
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -70,6 +70,8 @@ return array(
'Laravel\\Sail\\' => array($vendorDir . '/laravel/sail/src'),
'Laravel\\Prompts\\' => array($vendorDir . '/laravel/prompts/src'),
'Laravel\\Pail\\' => array($vendorDir . '/laravel/pail/src'),
+ 'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src'),
+ 'Intervention\\Gif\\' => array($vendorDir . '/intervention/gif/src'),
'Illuminate\\Support\\' => array($vendorDir . '/laravel/framework/src/Illuminate/Macroable', $vendorDir . '/laravel/framework/src/Illuminate/Collections', $vendorDir . '/laravel/framework/src/Illuminate/Conditionable'),
'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'),
'GuzzleHttp\\UriTemplate\\' => array($vendorDir . '/guzzlehttp/uri-template/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index d4af8bdd..2e18c020 100755
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -137,6 +137,8 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
),
'I' =>
array (
+ 'Intervention\\Image\\' => 19,
+ 'Intervention\\Gif\\' => 17,
'Illuminate\\Support\\' => 19,
'Illuminate\\' => 11,
),
@@ -443,6 +445,14 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
array (
0 => __DIR__ . '/..' . '/laravel/pail/src',
),
+ 'Intervention\\Image\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/intervention/image/src',
+ ),
+ 'Intervention\\Gif\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/intervention/gif/src',
+ ),
'Illuminate\\Support\\' =>
array (
0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Macroable',
@@ -540,6 +550,7 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
public static $classMap = array (
'App\\Http\\Controllers\\Api\\CountryController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/CountryController.php',
+ 'App\\Http\\Controllers\\Api\\FreenodeController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/FreenodeController.php',
'App\\Http\\Controllers\\Api\\GithubController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/GithubController.php',
'App\\Http\\Controllers\\Api\\GoodController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/GoodController.php',
'App\\Http\\Controllers\\Api\\ShipController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/ShipController.php',
@@ -565,6 +576,8 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
'App\\Models\\CrawlFreenode' => __DIR__ . '/../..' . '/app/Models/CrawlFreenode.php',
'App\\Models\\DogOption' => __DIR__ . '/../..' . '/app/Models/DogOption.php',
'App\\Models\\DoveSite' => __DIR__ . '/../..' . '/app/Models/DoveSite.php',
+ 'App\\Models\\FreenodePool' => __DIR__ . '/../..' . '/app/Models/FreenodePool.php',
+ 'App\\Models\\GemboxDns' => __DIR__ . '/../..' . '/app/Models/GemboxDns.php',
'App\\Models\\GoodPool' => __DIR__ . '/../..' . '/app/Models/GoodPool.php',
'App\\Models\\Hook' => __DIR__ . '/../..' . '/app/Models/Hook.php',
'App\\Models\\HttpQueue' => __DIR__ . '/../..' . '/app/Models/HttpQueue.php',
@@ -582,7 +595,13 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
'App\\Services\\Article\\Schema' => __DIR__ . '/../..' . '/app/Services/Article/Schema.php',
'App\\Services\\Cron' => __DIR__ . '/../..' . '/app/Services/Cron.php',
'App\\Services\\Cron\\ArticleSchema' => __DIR__ . '/../..' . '/app/Services/Cron/ArticleSchema.php',
- 'App\\Services\\Cron\\CrawlFreenode' => __DIR__ . '/../..' . '/app/Services/Cron/CrawlFreenode.php',
+ 'App\\Services\\Cron\\FnTgPublish' => __DIR__ . '/../..' . '/app/Services/Cron/FnTgPublish.php',
+ 'App\\Services\\Cron\\FreenodeCrawl' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeCrawl.php',
+ 'App\\Services\\Cron\\FreenodeFile' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeFile.php',
+ 'App\\Services\\Cron\\FreenodeLog' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeLog.php',
+ 'App\\Services\\Cron\\FreenodeMerge' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeMerge.php',
+ 'App\\Services\\Cron\\FreenodePool' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodePool.php',
+ 'App\\Services\\Cron\\FreenodeSync' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeSync.php',
'App\\Services\\Cron\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/Cron/HttpQueue.php',
'App\\Services\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/HttpQueue.php',
'App\\Services\\OpenApi\\Telegram' => __DIR__ . '/../..' . '/app/Services/OpenApi/Telegram.php',
@@ -603,8 +622,12 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
'App\\Services\\Tg\\Hook\\Mod\\Dev' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Dev.php',
'App\\Services\\Tg\\Hook\\Mod\\Dove' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Dove.php',
'App\\Services\\Tg\\Hook\\Mod\\DoveSite' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/DoveSite.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\FreenodeFrom' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/FreenodeFrom.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\FreenodePool' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/FreenodePool.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\GemboxDns' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/GemboxDns.php',
'App\\Services\\Tg\\Hook\\Mod\\Good' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Good.php',
'App\\Services\\Tg\\Hook\\Mod\\Hook' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Hook.php',
+ 'App\\Services\\Tg\\Hook\\Mod\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/HttpQueue.php',
'App\\Services\\Tg\\Hook\\Mod\\Jctj' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Jctj.php',
'App\\Services\\Tg\\Hook\\Mod\\JctjOption' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/JctjOption.php',
'App\\Services\\Tg\\Hook\\Mod\\Note' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Note.php',
@@ -2955,6 +2978,400 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad
'Illuminate\\View\\ViewFinderInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php',
'Illuminate\\View\\ViewName' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewName.php',
'Illuminate\\View\\ViewServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php',
+ 'Intervention\\Gif\\AbstractEntity' => __DIR__ . '/..' . '/intervention/gif/src/AbstractEntity.php',
+ 'Intervention\\Gif\\AbstractExtension' => __DIR__ . '/..' . '/intervention/gif/src/AbstractExtension.php',
+ 'Intervention\\Gif\\Blocks\\ApplicationExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ApplicationExtension.php',
+ 'Intervention\\Gif\\Blocks\\Color' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Color.php',
+ 'Intervention\\Gif\\Blocks\\ColorTable' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ColorTable.php',
+ 'Intervention\\Gif\\Blocks\\CommentExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/CommentExtension.php',
+ 'Intervention\\Gif\\Blocks\\DataSubBlock' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/DataSubBlock.php',
+ 'Intervention\\Gif\\Blocks\\FrameBlock' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/FrameBlock.php',
+ 'Intervention\\Gif\\Blocks\\GraphicControlExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/GraphicControlExtension.php',
+ 'Intervention\\Gif\\Blocks\\Header' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Header.php',
+ 'Intervention\\Gif\\Blocks\\ImageData' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ImageData.php',
+ 'Intervention\\Gif\\Blocks\\ImageDescriptor' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ImageDescriptor.php',
+ 'Intervention\\Gif\\Blocks\\LogicalScreenDescriptor' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/LogicalScreenDescriptor.php',
+ 'Intervention\\Gif\\Blocks\\NetscapeApplicationExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/NetscapeApplicationExtension.php',
+ 'Intervention\\Gif\\Blocks\\PlainTextExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/PlainTextExtension.php',
+ 'Intervention\\Gif\\Blocks\\TableBasedImage' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/TableBasedImage.php',
+ 'Intervention\\Gif\\Blocks\\Trailer' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Trailer.php',
+ 'Intervention\\Gif\\Builder' => __DIR__ . '/..' . '/intervention/gif/src/Builder.php',
+ 'Intervention\\Gif\\Decoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoder.php',
+ 'Intervention\\Gif\\Decoders\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/AbstractDecoder.php',
+ 'Intervention\\Gif\\Decoders\\AbstractPackedBitDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ApplicationExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ColorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ColorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ColorTableDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ColorTableDecoder.php',
+ 'Intervention\\Gif\\Decoders\\CommentExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/CommentExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\DataSubBlockDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/DataSubBlockDecoder.php',
+ 'Intervention\\Gif\\Decoders\\FrameBlockDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/FrameBlockDecoder.php',
+ 'Intervention\\Gif\\Decoders\\GifDataStreamDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/GifDataStreamDecoder.php',
+ 'Intervention\\Gif\\Decoders\\GraphicControlExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\HeaderDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/HeaderDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ImageDataDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ImageDataDecoder.php',
+ 'Intervention\\Gif\\Decoders\\ImageDescriptorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ImageDescriptorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\LogicalScreenDescriptorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php',
+ 'Intervention\\Gif\\Decoders\\NetscapeApplicationExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\PlainTextExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php',
+ 'Intervention\\Gif\\Decoders\\TableBasedImageDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/TableBasedImageDecoder.php',
+ 'Intervention\\Gif\\DisposalMethod' => __DIR__ . '/..' . '/intervention/gif/src/DisposalMethod.php',
+ 'Intervention\\Gif\\Encoders\\AbstractEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/AbstractEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ApplicationExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ColorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ColorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ColorTableEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ColorTableEncoder.php',
+ 'Intervention\\Gif\\Encoders\\CommentExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/CommentExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\DataSubBlockEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/DataSubBlockEncoder.php',
+ 'Intervention\\Gif\\Encoders\\FrameBlockEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/FrameBlockEncoder.php',
+ 'Intervention\\Gif\\Encoders\\GifDataStreamEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/GifDataStreamEncoder.php',
+ 'Intervention\\Gif\\Encoders\\GraphicControlExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\HeaderEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/HeaderEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ImageDataEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ImageDataEncoder.php',
+ 'Intervention\\Gif\\Encoders\\ImageDescriptorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ImageDescriptorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\LogicalScreenDescriptorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php',
+ 'Intervention\\Gif\\Encoders\\NetscapeApplicationExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\PlainTextExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php',
+ 'Intervention\\Gif\\Encoders\\TableBasedImageEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/TableBasedImageEncoder.php',
+ 'Intervention\\Gif\\Encoders\\TrailerEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/TrailerEncoder.php',
+ 'Intervention\\Gif\\Exceptions\\DecoderException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/DecoderException.php',
+ 'Intervention\\Gif\\Exceptions\\EncoderException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/EncoderException.php',
+ 'Intervention\\Gif\\Exceptions\\FormatException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/FormatException.php',
+ 'Intervention\\Gif\\Exceptions\\NotReadableException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/NotReadableException.php',
+ 'Intervention\\Gif\\GifDataStream' => __DIR__ . '/..' . '/intervention/gif/src/GifDataStream.php',
+ 'Intervention\\Gif\\Splitter' => __DIR__ . '/..' . '/intervention/gif/src/Splitter.php',
+ 'Intervention\\Gif\\Traits\\CanDecode' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanDecode.php',
+ 'Intervention\\Gif\\Traits\\CanEncode' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanEncode.php',
+ 'Intervention\\Gif\\Traits\\CanHandleFiles' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanHandleFiles.php',
+ 'Intervention\\Image\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\ProfileAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ProfileAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Collection' => __DIR__ . '/..' . '/intervention/image/src/Collection.php',
+ 'Intervention\\Image\\Colors\\AbstractColor' => __DIR__ . '/..' . '/intervention/image/src/Colors/AbstractColor.php',
+ 'Intervention\\Image\\Colors\\AbstractColorChannel' => __DIR__ . '/..' . '/intervention/image/src/Colors/AbstractColorChannel.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Cyan' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Cyan.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Key' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Key.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Magenta' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Magenta.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Yellow' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Yellow.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Color.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Cmyk\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Hue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Hue.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Luminance' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Luminance.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Channels\\Saturation' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Saturation.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Color.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Hsl\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Hue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Hue.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Saturation' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Saturation.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Channels\\Value' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Value.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Color.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Hsv\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Profile' => __DIR__ . '/..' . '/intervention/image/src/Colors/Profile.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Alpha' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Alpha.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Blue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Blue.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Green' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Green.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Channels\\Red' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Red.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Color.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Colorspace.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HexColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HtmlColornameDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php',
+ 'Intervention\\Image\\Colors\\Rgb\\Decoders\\TransparentColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php',
+ 'Intervention\\Image\\Config' => __DIR__ . '/..' . '/intervention/image/src/Config.php',
+ 'Intervention\\Image\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\ColorObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/ColorObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Decoders\\ImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/ImageObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractDecoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractDriver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractDriver.php',
+ 'Intervention\\Image\\Drivers\\AbstractEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractEncoder.php',
+ 'Intervention\\Image\\Drivers\\AbstractFontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractFontProcessor.php',
+ 'Intervention\\Image\\Drivers\\AbstractFrame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractFrame.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Cloner' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Cloner.php',
+ 'Intervention\\Image\\Drivers\\Gd\\ColorProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/ColorProcessor.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Core' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Core.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Driver.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Gd\\FontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/FontProcessor.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Frame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Frame.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ProfileAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\ColorProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/ColorProcessor.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Core' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Core.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Driver.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\HeicEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\Jpeg2000Encoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\TiffEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\FontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/FontProcessor.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Frame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Frame.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\StripMetaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Drivers\\Specializable' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Specializable.php',
+ 'Intervention\\Image\\Drivers\\SpecializableAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableAnalyzer.php',
+ 'Intervention\\Image\\Drivers\\SpecializableDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableDecoder.php',
+ 'Intervention\\Image\\Drivers\\SpecializableEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableEncoder.php',
+ 'Intervention\\Image\\Drivers\\SpecializableModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableModifier.php',
+ 'Intervention\\Image\\EncodedImage' => __DIR__ . '/..' . '/intervention/image/src/EncodedImage.php',
+ 'Intervention\\Image\\Encoders\\AutoEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/AutoEncoder.php',
+ 'Intervention\\Image\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/AvifEncoder.php',
+ 'Intervention\\Image\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/BmpEncoder.php',
+ 'Intervention\\Image\\Encoders\\FileExtensionEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/FileExtensionEncoder.php',
+ 'Intervention\\Image\\Encoders\\FilePathEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/FilePathEncoder.php',
+ 'Intervention\\Image\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/GifEncoder.php',
+ 'Intervention\\Image\\Encoders\\HeicEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/HeicEncoder.php',
+ 'Intervention\\Image\\Encoders\\Jpeg2000Encoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/Jpeg2000Encoder.php',
+ 'Intervention\\Image\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/JpegEncoder.php',
+ 'Intervention\\Image\\Encoders\\MediaTypeEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/MediaTypeEncoder.php',
+ 'Intervention\\Image\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/PngEncoder.php',
+ 'Intervention\\Image\\Encoders\\TiffEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/TiffEncoder.php',
+ 'Intervention\\Image\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/WebpEncoder.php',
+ 'Intervention\\Image\\Exceptions\\AnimationException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/AnimationException.php',
+ 'Intervention\\Image\\Exceptions\\ColorException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/ColorException.php',
+ 'Intervention\\Image\\Exceptions\\DecoderException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/DecoderException.php',
+ 'Intervention\\Image\\Exceptions\\DriverException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/DriverException.php',
+ 'Intervention\\Image\\Exceptions\\EncoderException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/EncoderException.php',
+ 'Intervention\\Image\\Exceptions\\FontException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/FontException.php',
+ 'Intervention\\Image\\Exceptions\\GeometryException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/GeometryException.php',
+ 'Intervention\\Image\\Exceptions\\InputException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/InputException.php',
+ 'Intervention\\Image\\Exceptions\\NotSupportedException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/NotSupportedException.php',
+ 'Intervention\\Image\\Exceptions\\NotWritableException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/NotWritableException.php',
+ 'Intervention\\Image\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/RuntimeException.php',
+ 'Intervention\\Image\\File' => __DIR__ . '/..' . '/intervention/image/src/File.php',
+ 'Intervention\\Image\\FileExtension' => __DIR__ . '/..' . '/intervention/image/src/FileExtension.php',
+ 'Intervention\\Image\\Format' => __DIR__ . '/..' . '/intervention/image/src/Format.php',
+ 'Intervention\\Image\\Geometry\\Bezier' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Bezier.php',
+ 'Intervention\\Image\\Geometry\\Circle' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Circle.php',
+ 'Intervention\\Image\\Geometry\\Ellipse' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Ellipse.php',
+ 'Intervention\\Image\\Geometry\\Factories\\BezierFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/BezierFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\CircleFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/CircleFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\Drawable' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/Drawable.php',
+ 'Intervention\\Image\\Geometry\\Factories\\EllipseFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/EllipseFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\LineFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/LineFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\PolygonFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/PolygonFactory.php',
+ 'Intervention\\Image\\Geometry\\Factories\\RectangleFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/RectangleFactory.php',
+ 'Intervention\\Image\\Geometry\\Line' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Line.php',
+ 'Intervention\\Image\\Geometry\\Pixel' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Pixel.php',
+ 'Intervention\\Image\\Geometry\\Point' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Point.php',
+ 'Intervention\\Image\\Geometry\\Polygon' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Polygon.php',
+ 'Intervention\\Image\\Geometry\\Rectangle' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Rectangle.php',
+ 'Intervention\\Image\\Geometry\\Tools\\RectangleResizer' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Tools/RectangleResizer.php',
+ 'Intervention\\Image\\Geometry\\Traits\\HasBackgroundColor' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Traits/HasBackgroundColor.php',
+ 'Intervention\\Image\\Geometry\\Traits\\HasBorder' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Traits/HasBorder.php',
+ 'Intervention\\Image\\Image' => __DIR__ . '/..' . '/intervention/image/src/Image.php',
+ 'Intervention\\Image\\ImageManager' => __DIR__ . '/..' . '/intervention/image/src/ImageManager.php',
+ 'Intervention\\Image\\InputHandler' => __DIR__ . '/..' . '/intervention/image/src/InputHandler.php',
+ 'Intervention\\Image\\Interfaces\\AnalyzerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/AnalyzerInterface.php',
+ 'Intervention\\Image\\Interfaces\\CollectionInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/CollectionInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorChannelInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorChannelInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorProcessorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorProcessorInterface.php',
+ 'Intervention\\Image\\Interfaces\\ColorspaceInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorspaceInterface.php',
+ 'Intervention\\Image\\Interfaces\\CoreInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/CoreInterface.php',
+ 'Intervention\\Image\\Interfaces\\DecoderInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DecoderInterface.php',
+ 'Intervention\\Image\\Interfaces\\DrawableFactoryInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DrawableFactoryInterface.php',
+ 'Intervention\\Image\\Interfaces\\DrawableInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DrawableInterface.php',
+ 'Intervention\\Image\\Interfaces\\DriverInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DriverInterface.php',
+ 'Intervention\\Image\\Interfaces\\EncodedImageInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/EncodedImageInterface.php',
+ 'Intervention\\Image\\Interfaces\\EncoderInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/EncoderInterface.php',
+ 'Intervention\\Image\\Interfaces\\FileInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FileInterface.php',
+ 'Intervention\\Image\\Interfaces\\FontInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FontInterface.php',
+ 'Intervention\\Image\\Interfaces\\FontProcessorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FontProcessorInterface.php',
+ 'Intervention\\Image\\Interfaces\\FrameInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FrameInterface.php',
+ 'Intervention\\Image\\Interfaces\\ImageInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ImageInterface.php',
+ 'Intervention\\Image\\Interfaces\\ImageManagerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ImageManagerInterface.php',
+ 'Intervention\\Image\\Interfaces\\InputHandlerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/InputHandlerInterface.php',
+ 'Intervention\\Image\\Interfaces\\ModifierInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ModifierInterface.php',
+ 'Intervention\\Image\\Interfaces\\PointInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/PointInterface.php',
+ 'Intervention\\Image\\Interfaces\\ProfileInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ProfileInterface.php',
+ 'Intervention\\Image\\Interfaces\\ResolutionInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ResolutionInterface.php',
+ 'Intervention\\Image\\Interfaces\\SizeInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SizeInterface.php',
+ 'Intervention\\Image\\Interfaces\\SpecializableInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SpecializableInterface.php',
+ 'Intervention\\Image\\Interfaces\\SpecializedInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SpecializedInterface.php',
+ 'Intervention\\Image\\MediaType' => __DIR__ . '/..' . '/intervention/image/src/MediaType.php',
+ 'Intervention\\Image\\ModifierStack' => __DIR__ . '/..' . '/intervention/image/src/ModifierStack.php',
+ 'Intervention\\Image\\Modifiers\\AbstractDrawModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/AbstractDrawModifier.php',
+ 'Intervention\\Image\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/AlignRotationModifier.php',
+ 'Intervention\\Image\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BlendTransparencyModifier.php',
+ 'Intervention\\Image\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BlurModifier.php',
+ 'Intervention\\Image\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BrightnessModifier.php',
+ 'Intervention\\Image\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ColorizeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ColorspaceModifier.php',
+ 'Intervention\\Image\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ContainModifier.php',
+ 'Intervention\\Image\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ContrastModifier.php',
+ 'Intervention\\Image\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CoverDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CoverModifier.php',
+ 'Intervention\\Image\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CropModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawBezierModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawEllipseModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawLineModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawPixelModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawPolygonModifier.php',
+ 'Intervention\\Image\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawRectangleModifier.php',
+ 'Intervention\\Image\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FillModifier.php',
+ 'Intervention\\Image\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FlipModifier.php',
+ 'Intervention\\Image\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FlopModifier.php',
+ 'Intervention\\Image\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/GammaModifier.php',
+ 'Intervention\\Image\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/GreyscaleModifier.php',
+ 'Intervention\\Image\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/InvertModifier.php',
+ 'Intervention\\Image\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PadModifier.php',
+ 'Intervention\\Image\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PixelateModifier.php',
+ 'Intervention\\Image\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PlaceModifier.php',
+ 'Intervention\\Image\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ProfileModifier.php',
+ 'Intervention\\Image\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ProfileRemovalModifier.php',
+ 'Intervention\\Image\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/QuantizeColorsModifier.php',
+ 'Intervention\\Image\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/RemoveAnimationModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeCanvasModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeModifier.php',
+ 'Intervention\\Image\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResolutionModifier.php',
+ 'Intervention\\Image\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/RotateModifier.php',
+ 'Intervention\\Image\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ScaleDownModifier.php',
+ 'Intervention\\Image\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ScaleModifier.php',
+ 'Intervention\\Image\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/SharpenModifier.php',
+ 'Intervention\\Image\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/SliceAnimationModifier.php',
+ 'Intervention\\Image\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/TextModifier.php',
+ 'Intervention\\Image\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/TrimModifier.php',
+ 'Intervention\\Image\\Origin' => __DIR__ . '/..' . '/intervention/image/src/Origin.php',
+ 'Intervention\\Image\\Resolution' => __DIR__ . '/..' . '/intervention/image/src/Resolution.php',
+ 'Intervention\\Image\\Traits\\CanBeDriverSpecialized' => __DIR__ . '/..' . '/intervention/image/src/Traits/CanBeDriverSpecialized.php',
+ 'Intervention\\Image\\Traits\\CanBuildFilePointer' => __DIR__ . '/..' . '/intervention/image/src/Traits/CanBuildFilePointer.php',
+ 'Intervention\\Image\\Typography\\Font' => __DIR__ . '/..' . '/intervention/image/src/Typography/Font.php',
+ 'Intervention\\Image\\Typography\\FontFactory' => __DIR__ . '/..' . '/intervention/image/src/Typography/FontFactory.php',
+ 'Intervention\\Image\\Typography\\Line' => __DIR__ . '/..' . '/intervention/image/src/Typography/Line.php',
+ 'Intervention\\Image\\Typography\\TextBlock' => __DIR__ . '/..' . '/intervention/image/src/Typography/TextBlock.php',
'Laravel\\Pail\\Console\\Commands\\PailCommand' => __DIR__ . '/..' . '/laravel/pail/src/Console/Commands/PailCommand.php',
'Laravel\\Pail\\Contracts\\Printer' => __DIR__ . '/..' . '/laravel/pail/src/Contracts/Printer.php',
'Laravel\\Pail\\File' => __DIR__ . '/..' . '/laravel/pail/src/File.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index bec9380d..53f9853c 100755
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1281,6 +1281,156 @@
},
"install-path": "../hamcrest/hamcrest-php"
},
+ {
+ "name": "intervention/gif",
+ "version": "4.2.2",
+ "version_normalized": "4.2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/gif.git",
+ "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a",
+ "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "time": "2025-03-29T07:46:21+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Gif\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Native PHP GIF Encoder/Decoder",
+ "homepage": "https://github.com/intervention/gif",
+ "keywords": [
+ "animation",
+ "gd",
+ "gif",
+ "image"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/gif/issues",
+ "source": "https://github.com/Intervention/gif/tree/4.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "install-path": "../intervention/gif"
+ },
+ {
+ "name": "intervention/image",
+ "version": "3.11.6",
+ "version_normalized": "3.11.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image.git",
+ "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1",
+ "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "intervention/gif": "^4.2",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.6",
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "suggest": {
+ "ext-exif": "Recommended to be able to read EXIF data properly."
+ },
+ "time": "2025-12-17T13:38:29+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io"
+ }
+ ],
+ "description": "PHP Image Processing",
+ "homepage": "https://image.intervention.io",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "resize",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image/issues",
+ "source": "https://github.com/Intervention/image/tree/3.11.6"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "install-path": "../intervention/image"
+ },
{
"name": "irazasyed/telegram-bot-sdk",
"version": "v3.15.0",
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index adcbbbe6..bc96a316 100755
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
'name' => 'laravel/laravel',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => '6843f40b786f201ee5dec7fe59e77678399fbc3a',
+ 'reference' => 'e87d0e91e4344582a24e8ed70cec7979575b73a4',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -370,6 +370,24 @@
0 => 'v11.36.1',
),
),
+ 'intervention/gif' => array(
+ 'pretty_version' => '4.2.2',
+ 'version' => '4.2.2.0',
+ 'reference' => '5999eac6a39aa760fb803bc809e8909ee67b451a',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../intervention/gif',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
+ 'intervention/image' => array(
+ 'pretty_version' => '3.11.6',
+ 'version' => '3.11.6.0',
+ 'reference' => '5f6d27d9fd56312c47f347929e7ac15345c605a1',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../intervention/image',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'irazasyed/telegram-bot-sdk' => array(
'pretty_version' => 'v3.15.0',
'version' => '3.15.0.0',
@@ -397,7 +415,7 @@
'laravel/laravel' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => '6843f40b786f201ee5dec7fe59e77678399fbc3a',
+ 'reference' => 'e87d0e91e4344582a24e8ed70cec7979575b73a4',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
diff --git a/vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip b/vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip
old mode 100644
new mode 100755
diff --git a/vendor/intervention/gif/LICENSE b/vendor/intervention/gif/LICENSE
new file mode 100755
index 00000000..d621d287
--- /dev/null
+++ b/vendor/intervention/gif/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2020-present Oliver Vogel
+
+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/vendor/intervention/gif/composer.json b/vendor/intervention/gif/composer.json
new file mode 100755
index 00000000..0fd37ab3
--- /dev/null
+++ b/vendor/intervention/gif/composer.json
@@ -0,0 +1,44 @@
+{
+ "name": "intervention/gif",
+ "description": "Native PHP GIF Encoder/Decoder",
+ "homepage": "https://github.com/intervention/gif",
+ "keywords": [
+ "image",
+ "gd",
+ "gif",
+ "animation"
+ ],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0",
+ "phpstan/phpstan": "^2.1",
+ "squizlabs/php_codesniffer": "^3.8",
+ "slevomat/coding-standard": "~8.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Gif\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Intervention\\Gif\\Tests\\": "tests"
+ }
+ },
+ "minimum-stability": "stable",
+ "config": {
+ "allow-plugins": {
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
+ }
+}
diff --git a/vendor/intervention/gif/phpunit.xml.dist b/vendor/intervention/gif/phpunit.xml.dist
new file mode 100755
index 00000000..6a2bf073
--- /dev/null
+++ b/vendor/intervention/gif/phpunit.xml.dist
@@ -0,0 +1,13 @@
+
+
+
+
+ ./tests/Unit/
+
+
+
+
+ src
+
+
+
diff --git a/vendor/intervention/gif/src/AbstractEntity.php b/vendor/intervention/gif/src/AbstractEntity.php
new file mode 100755
index 00000000..6acd426a
--- /dev/null
+++ b/vendor/intervention/gif/src/AbstractEntity.php
@@ -0,0 +1,40 @@
+getShortName();
+ }
+
+ /**
+ * Cast object to string
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function __toString(): string
+ {
+ return $this->encode();
+ }
+}
diff --git a/vendor/intervention/gif/src/AbstractExtension.php b/vendor/intervention/gif/src/AbstractExtension.php
new file mode 100755
index 00000000..329ac501
--- /dev/null
+++ b/vendor/intervention/gif/src/AbstractExtension.php
@@ -0,0 +1,10 @@
+
+ */
+ protected array $blocks = [];
+
+ /**
+ * Get size of block
+ *
+ * @return int
+ */
+ public function getBlockSize(): int
+ {
+ return strlen($this->application);
+ }
+
+ /**
+ * Set application name
+ *
+ * @param string $value
+ * @return ApplicationExtension
+ */
+ public function setApplication(string $value): self
+ {
+ $this->application = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get application name
+ *
+ * @return string
+ */
+ public function getApplication(): string
+ {
+ return $this->application;
+ }
+
+ /**
+ * Add block to application extension
+ *
+ * @param DataSubBlock $block
+ * @return ApplicationExtension
+ */
+ public function addBlock(DataSubBlock $block): self
+ {
+ $this->blocks[] = $block;
+
+ return $this;
+ }
+
+ /**
+ * Set data sub blocks of instance
+ *
+ * @param array $blocks
+ * @return ApplicationExtension
+ */
+ public function setBlocks(array $blocks): self
+ {
+ $this->blocks = $blocks;
+
+ return $this;
+ }
+
+ /**
+ * Get blocks of ApplicationExtension
+ *
+ * @return array
+ */
+ public function getBlocks(): array
+ {
+ return $this->blocks;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/Color.php b/vendor/intervention/gif/src/Blocks/Color.php
new file mode 100755
index 00000000..7d473aef
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/Color.php
@@ -0,0 +1,100 @@
+r;
+ }
+
+ /**
+ * Set red value
+ *
+ * @param int $value
+ */
+ public function setRed(int $value): self
+ {
+ $this->r = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get green value
+ *
+ * @return int
+ */
+ public function getGreen(): int
+ {
+ return $this->g;
+ }
+
+ /**
+ * Set green value
+ *
+ * @param int $value
+ */
+ public function setGreen(int $value): self
+ {
+ $this->g = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get blue value
+ *
+ * @return int
+ */
+ public function getBlue(): int
+ {
+ return $this->b;
+ }
+
+ /**
+ * Set blue value
+ *
+ * @param int $value
+ */
+ public function setBlue(int $value): self
+ {
+ $this->b = $value;
+
+ return $this;
+ }
+
+ /**
+ * Return hash value of current color
+ *
+ * @return string
+ */
+ public function getHash(): string
+ {
+ return md5($this->r . $this->g . $this->b);
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/ColorTable.php b/vendor/intervention/gif/src/Blocks/ColorTable.php
new file mode 100755
index 00000000..1a70f71f
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/ColorTable.php
@@ -0,0 +1,140 @@
+ $colors
+ * @return void
+ */
+ public function __construct(protected array $colors = [])
+ {
+ //
+ }
+
+ /**
+ * Return array of current colors
+ *
+ * @return array
+ */
+ public function getColors(): array
+ {
+ return array_values($this->colors);
+ }
+
+ /**
+ * Add color to table
+ *
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ * @return self
+ */
+ public function addRgb(int $r, int $g, int $b): self
+ {
+ $this->addColor(new Color($r, $g, $b));
+
+ return $this;
+ }
+
+ /**
+ * Add color to table
+ *
+ * @param Color $color
+ * @return self
+ */
+ public function addColor(Color $color): self
+ {
+ $this->colors[] = $color;
+
+ return $this;
+ }
+
+ /**
+ * Reset colors to array of color objects
+ *
+ * @param array $colors
+ * @return self
+ */
+ public function setColors(array $colors): self
+ {
+ $this->empty();
+ foreach ($colors as $color) {
+ $this->addColor($color);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Count colors of current instance
+ *
+ * @return int
+ */
+ public function countColors(): int
+ {
+ return count($this->colors);
+ }
+
+ /**
+ * Determine if any colors are present on the current table
+ *
+ * @return bool
+ */
+ public function hasColors(): bool
+ {
+ return $this->countColors() >= 1;
+ }
+
+ /**
+ * Empty color table
+ *
+ * @return self
+ */
+ public function empty(): self
+ {
+ $this->colors = [];
+
+ return $this;
+ }
+
+ /**
+ * Get size of color table in logical screen descriptor
+ *
+ * @return int
+ */
+ public function getLogicalSize(): int
+ {
+ return match ($this->countColors()) {
+ 4 => 1,
+ 8 => 2,
+ 16 => 3,
+ 32 => 4,
+ 64 => 5,
+ 128 => 6,
+ 256 => 7,
+ default => 0,
+ };
+ }
+
+ /**
+ * Calculate the number of bytes contained by the current table
+ *
+ * @return int
+ */
+ public function getByteSize(): int
+ {
+ if (!$this->hasColors()) {
+ return 0;
+ }
+
+ return 3 * pow(2, $this->getLogicalSize() + 1);
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/CommentExtension.php b/vendor/intervention/gif/src/Blocks/CommentExtension.php
new file mode 100755
index 00000000..7c8a54e3
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/CommentExtension.php
@@ -0,0 +1,52 @@
+
+ */
+ protected array $comments = [];
+
+ /**
+ * Get all or one comment
+ *
+ * @return array
+ */
+ public function getComments(): array
+ {
+ return $this->comments;
+ }
+
+ /**
+ * Get one comment by key
+ *
+ * @param int $key
+ * @return mixed
+ */
+ public function getComment(int $key): mixed
+ {
+ return array_key_exists($key, $this->comments) ? $this->comments[$key] : null;
+ }
+
+ /**
+ * Set comment text
+ *
+ * @param string $value
+ */
+ public function addComment(string $value): self
+ {
+ $this->comments[] = $value;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/DataSubBlock.php b/vendor/intervention/gif/src/Blocks/DataSubBlock.php
new file mode 100755
index 00000000..613580b8
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/DataSubBlock.php
@@ -0,0 +1,47 @@
+getSize() > 255) {
+ throw new FormatException(
+ 'Data Sub-Block can not have a block size larger than 255 bytes.'
+ );
+ }
+ }
+
+ /**
+ * Return size of current block
+ *
+ * @return int
+ */
+ public function getSize(): int
+ {
+ return strlen($this->value);
+ }
+
+ /**
+ * Return block value
+ *
+ * @return string
+ */
+ public function getValue(): string
+ {
+ return $this->value;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/FrameBlock.php b/vendor/intervention/gif/src/Blocks/FrameBlock.php
new file mode 100755
index 00000000..b5516698
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/FrameBlock.php
@@ -0,0 +1,262 @@
+ $applicationExtensions
+ */
+ protected array $applicationExtensions = [];
+
+ /**
+ * @var array $commentExtensions
+ */
+ protected array $commentExtensions = [];
+
+ public function __construct(
+ protected ImageDescriptor $imageDescriptor = new ImageDescriptor(),
+ protected ImageData $imageData = new ImageData()
+ ) {
+ //
+ }
+
+ public function addEntity(AbstractEntity $entity): self
+ {
+ return match (true) {
+ $entity instanceof TableBasedImage => $this->setTableBasedImage($entity),
+ $entity instanceof GraphicControlExtension => $this->setGraphicControlExtension($entity),
+ $entity instanceof ImageDescriptor => $this->setImageDescriptor($entity),
+ $entity instanceof ColorTable => $this->setColorTable($entity),
+ $entity instanceof ImageData => $this->setImageData($entity),
+ $entity instanceof PlainTextExtension => $this->setPlainTextExtension($entity),
+ $entity instanceof NetscapeApplicationExtension,
+ $entity instanceof ApplicationExtension => $this->addApplicationExtension($entity),
+ $entity instanceof CommentExtension => $this->addCommentExtension($entity),
+ default => $this,
+ };
+ }
+
+ /**
+ * Return application extensions of current frame block
+ *
+ * @return array
+ */
+ public function getApplicationExtensions(): array
+ {
+ return $this->applicationExtensions;
+ }
+
+ /**
+ * Return comment extensions of current frame block
+ *
+ * @return array
+ */
+ public function getCommentExtensions(): array
+ {
+ return $this->commentExtensions;
+ }
+
+ /**
+ * Set the graphic control extension
+ *
+ * @param GraphicControlExtension $extension
+ * @return self
+ */
+ public function setGraphicControlExtension(GraphicControlExtension $extension): self
+ {
+ $this->graphicControlExtension = $extension;
+
+ return $this;
+ }
+
+ /**
+ * Get the graphic control extension of the current frame block
+ *
+ * @return null|GraphicControlExtension
+ */
+ public function getGraphicControlExtension(): ?GraphicControlExtension
+ {
+ return $this->graphicControlExtension;
+ }
+
+ /**
+ * Set the image descriptor
+ *
+ * @param ImageDescriptor $descriptor
+ * @return self
+ */
+ public function setImageDescriptor(ImageDescriptor $descriptor): self
+ {
+ $this->imageDescriptor = $descriptor;
+ return $this;
+ }
+
+ /**
+ * Get the image descriptor of the frame block
+ *
+ * @return ImageDescriptor
+ */
+ public function getImageDescriptor(): ImageDescriptor
+ {
+ return $this->imageDescriptor;
+ }
+
+ /**
+ * Set the color table of the current frame block
+ *
+ * @param ColorTable $table
+ * @return FrameBlock
+ */
+ public function setColorTable(ColorTable $table): self
+ {
+ $this->colorTable = $table;
+
+ return $this;
+ }
+
+ /**
+ * Get color table
+ *
+ * @return null|ColorTable
+ */
+ public function getColorTable(): ?ColorTable
+ {
+ return $this->colorTable;
+ }
+
+ /**
+ * Determine if frame block has color table
+ *
+ * @return bool
+ */
+ public function hasColorTable(): bool
+ {
+ return !is_null($this->colorTable);
+ }
+
+ /**
+ * Set image data of frame block
+ *
+ * @param ImageData $data
+ * @return self
+ */
+ public function setImageData(ImageData $data): self
+ {
+ $this->imageData = $data;
+
+ return $this;
+ }
+
+ /**
+ * Get image data of current frame block
+ *
+ * @return ImageData
+ */
+ public function getImageData(): ImageData
+ {
+ return $this->imageData;
+ }
+
+ /**
+ * Set plain text extension
+ *
+ * @param PlainTextExtension $extension
+ * @return self
+ */
+ public function setPlainTextExtension(PlainTextExtension $extension): self
+ {
+ $this->plainTextExtension = $extension;
+
+ return $this;
+ }
+
+ /**
+ * Get plain text extension
+ *
+ * @return null|PlainTextExtension
+ */
+ public function getPlainTextExtension(): ?PlainTextExtension
+ {
+ return $this->plainTextExtension;
+ }
+
+ /**
+ * Add given application extension to the current frame block
+ *
+ * @param ApplicationExtension $extension
+ * @return self
+ */
+ public function addApplicationExtension(ApplicationExtension $extension): self
+ {
+ $this->applicationExtensions[] = $extension;
+
+ return $this;
+ }
+
+ /**
+ * Add given comment extension to the current frame block
+ *
+ * @param CommentExtension $extension
+ * @return self
+ */
+ public function addCommentExtension(CommentExtension $extension): self
+ {
+ $this->commentExtensions[] = $extension;
+
+ return $this;
+ }
+
+ /**
+ * Return netscape extension of the frame block if available
+ *
+ * @return null|NetscapeApplicationExtension
+ */
+ public function getNetscapeExtension(): ?NetscapeApplicationExtension
+ {
+ $extensions = array_filter(
+ $this->applicationExtensions,
+ fn(ApplicationExtension $extension): bool => $extension instanceof NetscapeApplicationExtension,
+ );
+
+ return count($extensions) ? reset($extensions) : null;
+ }
+
+ /**
+ * Set the table based image of the current frame block
+ *
+ * @param TableBasedImage $tableBasedImage
+ * @return self
+ */
+ public function setTableBasedImage(TableBasedImage $tableBasedImage): self
+ {
+ $this->setImageDescriptor($tableBasedImage->getImageDescriptor());
+
+ if ($colorTable = $tableBasedImage->getColorTable()) {
+ $this->setColorTable($colorTable);
+ }
+
+ $this->setImageData($tableBasedImage->getImageData());
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php b/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php
new file mode 100755
index 00000000..f95e15af
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php
@@ -0,0 +1,159 @@
+delay = $value;
+
+ return $this;
+ }
+
+ /**
+ * Return delay time (1/100 second)
+ *
+ * @return int
+ */
+ public function getDelay(): int
+ {
+ return $this->delay;
+ }
+
+ /**
+ * Set disposal method
+ *
+ * @param DisposalMethod $method
+ * @return self
+ */
+ public function setDisposalMethod(DisposalMethod $method): self
+ {
+ $this->disposalMethod = $method;
+
+ return $this;
+ }
+
+ /**
+ * Get disposal method
+ *
+ * @return DisposalMethod
+ */
+ public function getDisposalMethod(): DisposalMethod
+ {
+ return $this->disposalMethod;
+ }
+
+ /**
+ * Get transparent color index
+ *
+ * @return int
+ */
+ public function getTransparentColorIndex(): int
+ {
+ return $this->transparentColorIndex;
+ }
+
+ /**
+ * Set transparent color index
+ *
+ * @param int $index
+ */
+ public function setTransparentColorIndex(int $index): self
+ {
+ $this->transparentColorIndex = $index;
+
+ return $this;
+ }
+
+ /**
+ * Get current transparent color existance
+ *
+ * @return bool
+ */
+ public function getTransparentColorExistance(): bool
+ {
+ return $this->transparentColorExistance;
+ }
+
+ /**
+ * Set existance flag of transparent color
+ *
+ * @param bool $existance
+ */
+ public function setTransparentColorExistance(bool $existance = true): self
+ {
+ $this->transparentColorExistance = $existance;
+
+ return $this;
+ }
+
+ /**
+ * Get user input flag
+ *
+ * @return bool
+ */
+ public function getUserInput(): bool
+ {
+ return $this->userInput;
+ }
+
+ /**
+ * Set user input flag
+ *
+ * @param bool $value
+ */
+ public function setUserInput(bool $value = true): self
+ {
+ $this->userInput = $value;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/Header.php b/vendor/intervention/gif/src/Blocks/Header.php
new file mode 100755
index 00000000..ee561b91
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/Header.php
@@ -0,0 +1,42 @@
+version = $value;
+
+ return $this;
+ }
+
+ /**
+ * Return current version
+ *
+ * @return string
+ */
+ public function getVersion(): string
+ {
+ return $this->version;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/ImageData.php b/vendor/intervention/gif/src/Blocks/ImageData.php
new file mode 100755
index 00000000..b07d300a
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/ImageData.php
@@ -0,0 +1,80 @@
+
+ */
+ protected array $blocks = [];
+
+ /**
+ * Get LZW min. code size
+ *
+ * @return int
+ */
+ public function getLzwMinCodeSize(): int
+ {
+ return $this->lzw_min_code_size;
+ }
+
+ /**
+ * Set lzw min. code size
+ *
+ * @param int $size
+ * @return ImageData
+ */
+ public function setLzwMinCodeSize(int $size): self
+ {
+ $this->lzw_min_code_size = $size;
+
+ return $this;
+ }
+
+ /**
+ * Get current data sub blocks
+ *
+ * @return array
+ */
+ public function getBlocks(): array
+ {
+ return $this->blocks;
+ }
+
+ /**
+ * Addd sub block
+ *
+ * @param DataSubBlock $block
+ * @return ImageData
+ */
+ public function addBlock(DataSubBlock $block): self
+ {
+ $this->blocks[] = $block;
+
+ return $this;
+ }
+
+ /**
+ * Determine if data sub blocks are present
+ *
+ * @return bool
+ */
+ public function hasBlocks(): bool
+ {
+ return count($this->blocks) >= 1;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/ImageDescriptor.php b/vendor/intervention/gif/src/Blocks/ImageDescriptor.php
new file mode 100755
index 00000000..29e2f65f
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/ImageDescriptor.php
@@ -0,0 +1,246 @@
+width);
+ }
+
+ /**
+ * Get current width
+ *
+ * @return int
+ */
+ public function getHeight(): int
+ {
+ return intval($this->height);
+ }
+
+ /**
+ * Get current Top
+ *
+ * @return int
+ */
+ public function getTop(): int
+ {
+ return intval($this->top);
+ }
+
+ /**
+ * Get current Left
+ *
+ * @return int
+ */
+ public function getLeft(): int
+ {
+ return intval($this->left);
+ }
+
+ /**
+ * Set size of current instance
+ *
+ * @param int $width
+ * @param int $height
+ */
+ public function setSize(int $width, int $height): self
+ {
+ $this->width = $width;
+ $this->height = $height;
+
+ return $this;
+ }
+
+ /**
+ * Set position of current instance
+ *
+ * @param int $left
+ * @param int $top
+ */
+ public function setPosition(int $left, int $top): self
+ {
+ $this->left = $left;
+ $this->top = $top;
+
+ return $this;
+ }
+
+ /**
+ * Determine if frame is interlaced
+ *
+ * @return bool
+ */
+ public function isInterlaced(): bool
+ {
+ return $this->interlaced;
+ }
+
+ /**
+ * Set or unset interlaced value
+ *
+ * @param bool $value
+ */
+ public function setInterlaced(bool $value = true): self
+ {
+ $this->interlaced = $value;
+
+ return $this;
+ }
+
+ /**
+ * Determine if local color table is present
+ *
+ * @return bool
+ */
+ public function getLocalColorTableExistance(): bool
+ {
+ return $this->localColorTableExistance;
+ }
+
+ /**
+ * Alias for getLocalColorTableExistance
+ *
+ * @return bool
+ */
+ public function hasLocalColorTable(): bool
+ {
+ return $this->getLocalColorTableExistance();
+ }
+
+ /**
+ * Set local color table flag
+ *
+ * @param bool $existance
+ * @return self
+ */
+ public function setLocalColorTableExistance(bool $existance = true): self
+ {
+ $this->localColorTableExistance = $existance;
+
+ return $this;
+ }
+
+ /**
+ * Get local color table sorted flag
+ *
+ * @return bool
+ */
+ public function getLocalColorTableSorted(): bool
+ {
+ return $this->localColorTableSorted;
+ }
+
+ /**
+ * Set local color table sorted flag
+ *
+ * @param bool $sorted
+ * @return self
+ */
+ public function setLocalColorTableSorted(bool $sorted = true): self
+ {
+ $this->localColorTableSorted = $sorted;
+
+ return $this;
+ }
+
+ /**
+ * Get size of local color table
+ *
+ * @return int
+ */
+ public function getLocalColorTableSize(): int
+ {
+ return $this->localColorTableSize;
+ }
+
+ /**
+ * Get byte size of global color table
+ *
+ * @return int
+ */
+ public function getLocalColorTableByteSize(): int
+ {
+ return 3 * pow(2, $this->getLocalColorTableSize() + 1);
+ }
+
+ /**
+ * Set size of local color table
+ *
+ * @param int $size
+ */
+ public function setLocalColorTableSize(int $size): self
+ {
+ $this->localColorTableSize = $size;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php b/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php
new file mode 100755
index 00000000..821f1b27
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php
@@ -0,0 +1,254 @@
+width = $width;
+ $this->height = $height;
+
+ return $this;
+ }
+
+ /**
+ * Get width of current instance
+ *
+ * @return int
+ */
+ public function getWidth(): int
+ {
+ return intval($this->width);
+ }
+
+ /**
+ * Get height of current instance
+ *
+ * @return int
+ */
+ public function getHeight(): int
+ {
+ return intval($this->height);
+ }
+
+ /**
+ * Determine if global color table is present
+ *
+ * @return bool
+ */
+ public function getGlobalColorTableExistance(): bool
+ {
+ return $this->globalColorTableExistance;
+ }
+
+ /**
+ * Alias of getGlobalColorTableExistance
+ *
+ * @return bool
+ */
+ public function hasGlobalColorTable(): bool
+ {
+ return $this->getGlobalColorTableExistance();
+ }
+
+ /**
+ * Set global color table flag
+ *
+ * @param bool $existance
+ * @return self
+ */
+ public function setGlobalColorTableExistance(bool $existance = true): self
+ {
+ $this->globalColorTableExistance = $existance;
+
+ return $this;
+ }
+
+ /**
+ * Get global color table sorted flag
+ *
+ * @return bool
+ */
+ public function getGlobalColorTableSorted(): bool
+ {
+ return $this->globalColorTableSorted;
+ }
+
+ /**
+ * Set global color table sorted flag
+ *
+ * @param bool $sorted
+ * @return self
+ */
+ public function setGlobalColorTableSorted(bool $sorted = true): self
+ {
+ $this->globalColorTableSorted = $sorted;
+
+ return $this;
+ }
+
+ /**
+ * Get size of global color table
+ *
+ * @return int
+ */
+ public function getGlobalColorTableSize(): int
+ {
+ return $this->globalColorTableSize;
+ }
+
+ /**
+ * Get byte size of global color table
+ *
+ * @return int
+ */
+ public function getGlobalColorTableByteSize(): int
+ {
+ return 3 * pow(2, $this->getGlobalColorTableSize() + 1);
+ }
+
+ /**
+ * Set size of global color table
+ *
+ * @param int $size
+ */
+ public function setGlobalColorTableSize(int $size): self
+ {
+ $this->globalColorTableSize = $size;
+
+ return $this;
+ }
+
+ /**
+ * Get background color index
+ *
+ * @return int
+ */
+ public function getBackgroundColorIndex(): int
+ {
+ return $this->backgroundColorIndex;
+ }
+
+ /**
+ * Set background color index
+ *
+ * @param int $index
+ */
+ public function setBackgroundColorIndex(int $index): self
+ {
+ $this->backgroundColorIndex = $index;
+
+ return $this;
+ }
+
+ /**
+ * Get current pixel aspect ration
+ *
+ * @return int
+ */
+ public function getPixelAspectRatio(): int
+ {
+ return $this->pixelAspectRatio;
+ }
+
+ /**
+ * Set pixel aspect ratio
+ *
+ * @param int $ratio
+ */
+ public function setPixelAspectRatio(int $ratio): self
+ {
+ $this->pixelAspectRatio = $ratio;
+
+ return $this;
+ }
+
+ /**
+ * Get color resolution
+ *
+ * @return int
+ */
+ public function getBitsPerPixel(): int
+ {
+ return $this->bitsPerPixel;
+ }
+
+ /**
+ * Set color resolution
+ *
+ * @param int $value
+ */
+ public function setBitsPerPixel(int $value): self
+ {
+ $this->bitsPerPixel = $value;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php b/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php
new file mode 100755
index 00000000..72fe59ad
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php
@@ -0,0 +1,52 @@
+setApplication(self::IDENTIFIER . self::AUTH_CODE);
+ $this->setBlocks([new DataSubBlock(self::SUB_BLOCK_PREFIX . "\x00\x00")]);
+ }
+
+ /**
+ * Get number of loops
+ *
+ * @return int
+ */
+ public function getLoops(): int
+ {
+ return unpack('v*', substr($this->getBlocks()[0]->getValue(), 1))[1];
+ }
+
+ /**
+ * Set number of loops
+ *
+ * @param int $loops
+ * @throws FormatException
+ * @return self
+ */
+ public function setLoops(int $loops): self
+ {
+ $this->setBlocks([
+ new DataSubBlock(self::SUB_BLOCK_PREFIX . pack('v*', $loops))
+ ]);
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/PlainTextExtension.php b/vendor/intervention/gif/src/Blocks/PlainTextExtension.php
new file mode 100755
index 00000000..6b102f99
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/PlainTextExtension.php
@@ -0,0 +1,63 @@
+
+ */
+ protected array $text = [];
+
+ /**
+ * Get current text
+ *
+ * @return array
+ */
+ public function getText(): array
+ {
+ return $this->text;
+ }
+
+ /**
+ * Add text
+ *
+ * @param string $text
+ */
+ public function addText(string $text): self
+ {
+ $this->text[] = $text;
+
+ return $this;
+ }
+
+ /**
+ * Set text array of extension
+ *
+ * @param array $text
+ */
+ public function setText(array $text): self
+ {
+ $this->text = $text;
+
+ return $this;
+ }
+
+ /**
+ * Determine if any text is present
+ *
+ * @return bool
+ */
+ public function hasText(): bool
+ {
+ return $this->text !== [];
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/TableBasedImage.php b/vendor/intervention/gif/src/Blocks/TableBasedImage.php
new file mode 100755
index 00000000..cbd447bd
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/TableBasedImage.php
@@ -0,0 +1,50 @@
+imageDescriptor;
+ }
+
+ public function setImageDescriptor(ImageDescriptor $descriptor): self
+ {
+ $this->imageDescriptor = $descriptor;
+
+ return $this;
+ }
+
+ public function getImageData(): ImageData
+ {
+ return $this->imageData;
+ }
+
+ public function setImageData(ImageData $data): self
+ {
+ $this->imageData = $data;
+
+ return $this;
+ }
+
+ public function getColorTable(): ?ColorTable
+ {
+ return $this->colorTable;
+ }
+
+ public function setColorTable(ColorTable $table): self
+ {
+ $this->colorTable = $table;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/gif/src/Blocks/Trailer.php b/vendor/intervention/gif/src/Blocks/Trailer.php
new file mode 100755
index 00000000..2c68bc49
--- /dev/null
+++ b/vendor/intervention/gif/src/Blocks/Trailer.php
@@ -0,0 +1,12 @@
+gif;
+ }
+
+ /**
+ * Set canvas size of gif
+ *
+ * @param int $width
+ * @param int $height
+ * @return Builder
+ */
+ public function setSize(int $width, int $height): self
+ {
+ $this->gif->getLogicalScreenDescriptor()->setSize($width, $height);
+
+ return $this;
+ }
+
+ /**
+ * Create new canvas
+ *
+ * @param int $width
+ * @param int $height
+ * @return self
+ */
+ public static function canvas(int $width, int $height): self
+ {
+ return (new self())->setSize($width, $height);
+ }
+
+ /**
+ * Set loop count
+ *
+ * @param int $loops
+ * @return Builder
+ * @throws Exception
+ */
+ public function setLoops(int $loops): self
+ {
+ if ($this->gif->getFrames() === []) {
+ throw new Exception('Add at least one frame before setting the loop count');
+ }
+
+ if ($loops >= 0) {
+ // add frame count to existing or new netscape extension on first frame
+ if (!$this->gif->getFirstFrame()->getNetscapeExtension()) {
+ $this->gif->getFirstFrame()->addApplicationExtension(
+ new NetscapeApplicationExtension()
+ );
+ }
+ $this->gif->getFirstFrame()->getNetscapeExtension()->setLoops($loops);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Create new animation frame from given source
+ * which can be path to a file or GIF image data
+ *
+ * @param string|resource $source
+ * @param float $delay time delay in seconds
+ * @param int $left position offset in pixels from left
+ * @param int $top position offset in pixels from top
+ * @param bool $interlaced
+ * @throws DecoderException
+ * @return Builder
+ */
+ public function addFrame(
+ mixed $source,
+ float $delay = 0,
+ int $left = 0,
+ int $top = 0,
+ bool $interlaced = false
+ ): self {
+ $frame = new FrameBlock();
+ $source = Decoder::decode($source);
+
+ // store delay
+ $frame->setGraphicControlExtension(
+ $this->buildGraphicControlExtension(
+ $source,
+ intval($delay * 100)
+ )
+ );
+
+ // store image
+ $frame->setTableBasedImage(
+ $this->buildTableBasedImage($source, $left, $top, $interlaced)
+ );
+
+ // add frame
+ $this->gif->addFrame($frame);
+
+ return $this;
+ }
+
+ /**
+ * Build new graphic control extension with given delay & disposal method
+ *
+ * @param GifDataStream $source
+ * @param int $delay
+ * @param DisposalMethod $disposalMethod
+ * @return GraphicControlExtension
+ */
+ protected function buildGraphicControlExtension(
+ GifDataStream $source,
+ int $delay,
+ DisposalMethod $disposalMethod = DisposalMethod::BACKGROUND
+ ): GraphicControlExtension {
+ // create extension
+ $extension = new GraphicControlExtension($delay, $disposalMethod);
+
+ // set transparency index
+ $control = $source->getFirstFrame()->getGraphicControlExtension();
+ if ($control && $control->getTransparentColorExistance()) {
+ $extension->setTransparentColorExistance();
+ $extension->setTransparentColorIndex(
+ $control->getTransparentColorIndex()
+ );
+ }
+
+ return $extension;
+ }
+
+ /**
+ * Build table based image object from given source
+ *
+ * @param GifDataStream $source
+ * @param int $left
+ * @param int $top
+ * @param bool $interlaced
+ * @return TableBasedImage
+ */
+ protected function buildTableBasedImage(
+ GifDataStream $source,
+ int $left,
+ int $top,
+ bool $interlaced
+ ): TableBasedImage {
+ $block = new TableBasedImage();
+ $block->setImageDescriptor(new ImageDescriptor());
+
+ // set global color table from source as local color table
+ $block->getImageDescriptor()->setLocalColorTableExistance();
+ $block->setColorTable($source->getGlobalColorTable());
+
+ $block->getImageDescriptor()->setLocalColorTableSorted(
+ $source->getLogicalScreenDescriptor()->getGlobalColorTableSorted()
+ );
+
+ $block->getImageDescriptor()->setLocalColorTableSize(
+ $source->getLogicalScreenDescriptor()->getGlobalColorTableSize()
+ );
+
+ $block->getImageDescriptor()->setSize(
+ $source->getLogicalScreenDescriptor()->getWidth(),
+ $source->getLogicalScreenDescriptor()->getHeight()
+ );
+
+ // set position
+ $block->getImageDescriptor()->setPosition($left, $top);
+
+ // set interlaced flag
+ $block->getImageDescriptor()->setInterlaced($interlaced);
+
+ // add image data from source
+ $block->setImageData($source->getFirstFrame()->getImageData());
+
+ return $block;
+ }
+
+ /**
+ * Encode the current build
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function encode(): string
+ {
+ return $this->gif->encode();
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoder.php b/vendor/intervention/gif/src/Decoder.php
new file mode 100755
index 00000000..f39025a8
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoder.php
@@ -0,0 +1,47 @@
+ self::getHandleFromFilePath($input),
+ is_string($input) => self::getHandleFromData($input),
+ self::isFileHandle($input) => $input,
+ default => throw new DecoderException(
+ 'Decoder input must be either file path, file pointer resource or binary data.'
+ )
+ };
+
+ rewind($handle);
+
+ return GifDataStream::decode($handle);
+ }
+
+ /**
+ * Determine if input is file pointer resource
+ *
+ * @param mixed $input
+ * @return bool
+ */
+ private static function isFileHandle(mixed $input): bool
+ {
+ return is_resource($input) && get_resource_type($input) === 'stream';
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/AbstractDecoder.php b/vendor/intervention/gif/src/Decoders/AbstractDecoder.php
new file mode 100755
index 00000000..8253053c
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/AbstractDecoder.php
@@ -0,0 +1,165 @@
+handle = $handle;
+
+ return $this;
+ }
+
+ /**
+ * Read given number of bytes and move file pointer
+ *
+ * @param int $length
+ * @throws DecoderException
+ * @return string
+ */
+ protected function getNextBytesOrFail(int $length): string
+ {
+ $bytes = fread($this->handle, $length);
+
+ if (strlen($bytes) !== $length) {
+ throw new DecoderException('Unexpected end of file.');
+ }
+
+ return $bytes;
+ }
+
+ /**
+ * Read given number of bytes and move pointer back to previous position
+ *
+ * @param int $length
+ * @throws DecoderException
+ * @return string
+ */
+ protected function viewNextBytesOrFail(int $length): string
+ {
+ $bytes = $this->getNextBytesOrFail($length);
+ $this->movePointer($length * -1);
+
+ return $bytes;
+ }
+
+ /**
+ * Read next byte and move pointer back to previous position
+ *
+ * @throws DecoderException
+ * @return string
+ */
+ protected function viewNextByteOrFail(): string
+ {
+ return $this->viewNextBytesOrFail(1);
+ }
+
+ /**
+ * Read all remaining bytes from file handler
+ *
+ * @return string
+ */
+ protected function getRemainingBytes(): string
+ {
+ $all = '';
+ do {
+ $byte = fread($this->handle, 1);
+ $all .= $byte;
+ } while (!feof($this->handle));
+
+ return $all;
+ }
+
+ /**
+ * Get next byte in stream and move file pointer
+ *
+ * @throws DecoderException
+ * @return string
+ */
+ protected function getNextByteOrFail(): string
+ {
+ return $this->getNextBytesOrFail(1);
+ }
+
+ /**
+ * Move file pointer on handle by given offset
+ *
+ * @param int $offset
+ * @return self
+ */
+ protected function movePointer(int $offset): self
+ {
+ fseek($this->handle, $offset, SEEK_CUR);
+
+ return $this;
+ }
+
+ /**
+ * Decode multi byte value
+ *
+ * @return int
+ */
+ protected function decodeMultiByte(string $bytes): int
+ {
+ return unpack('v*', $bytes)[1];
+ }
+
+ /**
+ * Set length
+ *
+ * @param int $length
+ */
+ public function setLength(int $length): self
+ {
+ $this->length = $length;
+
+ return $this;
+ }
+
+ /**
+ * Get length
+ *
+ * @return null|int
+ */
+ public function getLength(): ?int
+ {
+ return $this->length;
+ }
+
+ /**
+ * Get current handle position
+ *
+ * @return int
+ */
+ public function getPosition(): int
+ {
+ return ftell($this->handle);
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php b/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php
new file mode 100755
index 00000000..69066fa7
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php
@@ -0,0 +1,43 @@
+getPackedBits($byte)[$num];
+ }
+
+ /**
+ * Get packed bits
+ *
+ * @param int $start
+ * @param int $length
+ * @return string
+ */
+ protected function getPackedBits(string $byte, int $start = 0, int $length = 8): string
+ {
+ $bits = str_pad(decbin($this->decodePackedByte($byte)), 8, '0', STR_PAD_LEFT);
+
+ return substr($bits, $start, $length);
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php
new file mode 100755
index 00000000..ea59d5d3
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php
@@ -0,0 +1,71 @@
+getNextByteOrFail(); // marker
+ $this->getNextByteOrFail(); // label
+ $blocksize = $this->decodeBlockSize($this->getNextByteOrFail());
+ $application = $this->getNextBytesOrFail($blocksize);
+
+ if ($application === NetscapeApplicationExtension::IDENTIFIER . NetscapeApplicationExtension::AUTH_CODE) {
+ $result = new NetscapeApplicationExtension();
+
+ // skip length
+ $this->getNextByteOrFail();
+
+ $result->setBlocks([
+ new DataSubBlock(
+ $this->getNextBytesOrFail(3)
+ )
+ ]);
+
+ // skip terminator
+ $this->getNextByteOrFail();
+
+ return $result;
+ }
+
+ $result->setApplication($application);
+
+ // decode data sub blocks
+ $blocksize = $this->decodeBlockSize($this->getNextByteOrFail());
+ while ($blocksize > 0) {
+ $result->addBlock(new DataSubBlock($this->getNextBytesOrFail($blocksize)));
+ $blocksize = $this->decodeBlockSize($this->getNextByteOrFail());
+ }
+
+ return $result;
+ }
+
+ /**
+ * Decode block size of ApplicationExtension from given byte
+ *
+ * @param string $byte
+ * @return int
+ */
+ protected function decodeBlockSize(string $byte): int
+ {
+ return (int) @unpack('C', $byte)[1];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/ColorDecoder.php b/vendor/intervention/gif/src/Decoders/ColorDecoder.php
new file mode 100755
index 00000000..ef0e2b48
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/ColorDecoder.php
@@ -0,0 +1,38 @@
+setRed($this->decodeColorValue($this->getNextByteOrFail()));
+ $color->setGreen($this->decodeColorValue($this->getNextByteOrFail()));
+ $color->setBlue($this->decodeColorValue($this->getNextByteOrFail()));
+
+ return $color;
+ }
+
+ /**
+ * Decode red value from source
+ *
+ * @return int
+ */
+ protected function decodeColorValue(string $byte): int
+ {
+ return unpack('C', $byte)[1];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php b/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php
new file mode 100755
index 00000000..c5a48751
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php
@@ -0,0 +1,28 @@
+getLength() / 3); $i++) {
+ $table->addColor(Color::decode($this->handle));
+ }
+
+ return $table;
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php
new file mode 100755
index 00000000..18bbf7db
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php
@@ -0,0 +1,61 @@
+getNextBytesOrFail(2); // skip marker & label
+
+ $extension = new CommentExtension();
+ foreach ($this->decodeComments() as $comment) {
+ $extension->addComment($comment);
+ }
+
+ return $extension;
+ }
+
+ /**
+ * Decode comment from current source
+ *
+ * @throws DecoderException
+ * @return array
+ */
+ protected function decodeComments(): array
+ {
+ $comments = [];
+
+ do {
+ $byte = $this->getNextByteOrFail();
+ $size = $this->decodeBlocksize($byte);
+ if ($size > 0) {
+ $comments[] = $this->getNextBytesOrFail($size);
+ }
+ } while ($byte !== CommentExtension::TERMINATOR);
+
+ return $comments;
+ }
+
+ /**
+ * Decode blocksize of following comment
+ *
+ * @param string $byte
+ * @return int
+ */
+ protected function decodeBlocksize(string $byte): int
+ {
+ return (int) @unpack('C', $byte)[1];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php b/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php
new file mode 100755
index 00000000..2715ea45
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php
@@ -0,0 +1,27 @@
+getNextByteOrFail();
+ $size = (int) unpack('C', $char)[1];
+
+ return new DataSubBlock($this->getNextBytesOrFail($size));
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php b/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php
new file mode 100755
index 00000000..600cee6d
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php
@@ -0,0 +1,53 @@
+viewNextBytesOrFail(2)) {
+ AbstractExtension::MARKER . GraphicControlExtension::LABEL
+ => GraphicControlExtension::decode($this->handle),
+ AbstractExtension::MARKER . NetscapeApplicationExtension::LABEL
+ => NetscapeApplicationExtension::decode($this->handle),
+ AbstractExtension::MARKER . ApplicationExtension::LABEL
+ => ApplicationExtension::decode($this->handle),
+ AbstractExtension::MARKER . PlainTextExtension::LABEL
+ => PlainTextExtension::decode($this->handle),
+ AbstractExtension::MARKER . CommentExtension::LABEL
+ => CommentExtension::decode($this->handle),
+ default => match ($this->viewNextByteOrFail()) {
+ ImageDescriptor::SEPARATOR => TableBasedImage::decode($this->handle),
+ default => throw new DecoderException('Unable to decode Data Block'),
+ }
+ };
+
+ $frame->addEntity($block);
+ } while (!($block instanceof TableBasedImage));
+
+ return $frame;
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php b/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php
new file mode 100755
index 00000000..ea4d8b31
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php
@@ -0,0 +1,59 @@
+setHeader(
+ Header::decode($this->handle),
+ );
+
+ $gif->setLogicalScreenDescriptor(
+ LogicalScreenDescriptor::decode($this->handle),
+ );
+
+ if ($gif->getLogicalScreenDescriptor()->hasGlobalColorTable()) {
+ $length = $gif->getLogicalScreenDescriptor()->getGlobalColorTableByteSize();
+ $gif->setGlobalColorTable(
+ ColorTable::decode($this->handle, $length)
+ );
+ }
+
+ while ($this->viewNextByteOrFail() !== Trailer::MARKER) {
+ match ($this->viewNextBytesOrFail(2)) {
+ // trailing "global" comment blocks which are not part of "FrameBlock"
+ AbstractExtension::MARKER . CommentExtension::LABEL
+ => $gif->addComment(
+ CommentExtension::decode($this->handle)
+ ),
+ default => $gif->addFrame(
+ FrameBlock::decode($this->handle)
+ ),
+ };
+ }
+
+ return $gif;
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php
new file mode 100755
index 00000000..6e37e624
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php
@@ -0,0 +1,97 @@
+getNextBytesOrFail(3); // skip marker, label & bytesize
+
+ // byte #4
+ $packedField = $this->getNextByteOrFail();
+ $result->setDisposalMethod($this->decodeDisposalMethod($packedField));
+ $result->setUserInput($this->decodeUserInput($packedField));
+ $result->setTransparentColorExistance($this->decodeTransparentColorExistance($packedField));
+
+ // bytes 5-6
+ $result->setDelay($this->decodeDelay($this->getNextBytesOrFail(2)));
+
+ // byte #7
+ $result->setTransparentColorIndex($this->decodeTransparentColorIndex(
+ $this->getNextByteOrFail()
+ ));
+
+ // byte #8 (terminator)
+ $this->getNextByteOrFail();
+
+ return $result;
+ }
+
+ /**
+ * Decode disposal method
+ *
+ * @return DisposalMethod
+ */
+ protected function decodeDisposalMethod(string $byte): DisposalMethod
+ {
+ return DisposalMethod::from(
+ bindec($this->getPackedBits($byte, 3, 3))
+ );
+ }
+
+ /**
+ * Decode user input flag
+ *
+ * @return bool
+ */
+ protected function decodeUserInput(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 6);
+ }
+
+ /**
+ * Decode transparent color existance
+ *
+ * @return bool
+ */
+ protected function decodeTransparentColorExistance(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 7);
+ }
+
+ /**
+ * Decode delay value
+ *
+ * @return int
+ */
+ protected function decodeDelay(string $bytes): int
+ {
+ return unpack('v*', $bytes)[1];
+ }
+
+ /**
+ * Decode transparent color index
+ *
+ * @return int
+ */
+ protected function decodeTransparentColorIndex(string $byte): int
+ {
+ return unpack('C', $byte)[1];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/HeaderDecoder.php b/vendor/intervention/gif/src/Decoders/HeaderDecoder.php
new file mode 100755
index 00000000..05616282
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/HeaderDecoder.php
@@ -0,0 +1,42 @@
+setVersion($this->decodeVersion());
+
+ return $header;
+ }
+
+ /**
+ * Decode version string
+ *
+ * @throws DecoderException
+ * @return string
+ */
+ protected function decodeVersion(): string
+ {
+ $parsed = (bool) preg_match("/^GIF(?P[0-9]{2}[a-z])$/", $this->getNextBytesOrFail(6), $matches);
+
+ if ($parsed === false) {
+ throw new DecoderException('Unable to parse file header.');
+ }
+
+ return $matches['version'];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php b/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php
new file mode 100755
index 00000000..9bbacd81
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php
@@ -0,0 +1,42 @@
+getNextByteOrFail();
+ $size = (int) unpack('C', $char)[1];
+ $data->setLzwMinCodeSize($size);
+
+ do {
+ // decode sub blocks
+ $char = $this->getNextByteOrFail();
+ $size = (int) unpack('C', $char)[1];
+ if ($size > 0) {
+ $data->addBlock(new DataSubBlock($this->getNextBytesOrFail($size)));
+ }
+ } while ($char !== AbstractEntity::TERMINATOR);
+
+ return $data;
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php b/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php
new file mode 100755
index 00000000..4d3ed699
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php
@@ -0,0 +1,94 @@
+getNextByteOrFail(); // skip separator
+
+ $descriptor->setPosition(
+ $this->decodeMultiByte($this->getNextBytesOrFail(2)),
+ $this->decodeMultiByte($this->getNextBytesOrFail(2))
+ );
+
+ $descriptor->setSize(
+ $this->decodeMultiByte($this->getNextBytesOrFail(2)),
+ $this->decodeMultiByte($this->getNextBytesOrFail(2))
+ );
+
+ $packedField = $this->getNextByteOrFail();
+
+ $descriptor->setLocalColorTableExistance(
+ $this->decodeLocalColorTableExistance($packedField)
+ );
+
+ $descriptor->setLocalColorTableSorted(
+ $this->decodeLocalColorTableSorted($packedField)
+ );
+
+ $descriptor->setLocalColorTableSize(
+ $this->decodeLocalColorTableSize($packedField)
+ );
+
+ $descriptor->setInterlaced(
+ $this->decodeInterlaced($packedField)
+ );
+
+ return $descriptor;
+ }
+
+ /**
+ * Decode local color table existance
+ *
+ * @return bool
+ */
+ protected function decodeLocalColorTableExistance(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 0);
+ }
+
+ /**
+ * Decode local color table sort method
+ *
+ * @return bool
+ */
+ protected function decodeLocalColorTableSorted(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 2);
+ }
+
+ /**
+ * Decode local color table size
+ *
+ * @return int
+ */
+ protected function decodeLocalColorTableSize(string $byte): int
+ {
+ return bindec($this->getPackedBits($byte, 5, 3));
+ }
+
+ /**
+ * Decode interlaced flag
+ *
+ * @return bool
+ */
+ protected function decodeInterlaced(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 1);
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php b/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php
new file mode 100755
index 00000000..1cd09893
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php
@@ -0,0 +1,139 @@
+setSize(
+ $this->decodeWidth($this->getNextBytesOrFail(2)),
+ $this->decodeHeight($this->getNextBytesOrFail(2))
+ );
+
+ // byte 5
+ $packedField = $this->getNextByteOrFail();
+
+ $logicalScreenDescriptor->setGlobalColorTableExistance(
+ $this->decodeGlobalColorTableExistance($packedField)
+ );
+
+ $logicalScreenDescriptor->setBitsPerPixel(
+ $this->decodeBitsPerPixel($packedField)
+ );
+
+ $logicalScreenDescriptor->setGlobalColorTableSorted(
+ $this->decodeGlobalColorTableSorted($packedField)
+ );
+
+ $logicalScreenDescriptor->setGlobalColorTableSize(
+ $this->decodeGlobalColorTableSize($packedField)
+ );
+
+ // byte 6
+ $logicalScreenDescriptor->setBackgroundColorIndex(
+ $this->decodeBackgroundColorIndex($this->getNextByteOrFail())
+ );
+
+ // byte 7
+ $logicalScreenDescriptor->setPixelAspectRatio(
+ $this->decodePixelAspectRatio($this->getNextByteOrFail())
+ );
+
+ return $logicalScreenDescriptor;
+ }
+
+ /**
+ * Decode width
+ *
+ * @return int
+ */
+ protected function decodeWidth(string $source): int
+ {
+ return unpack('v*', $source)[1];
+ }
+
+ /**
+ * Decode height
+ *
+ * @return int
+ */
+ protected function decodeHeight(string $source): int
+ {
+ return unpack('v*', $source)[1];
+ }
+
+ /**
+ * Decode existance of global color table
+ *
+ * @return bool
+ */
+ protected function decodeGlobalColorTableExistance(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 0);
+ }
+
+ /**
+ * Decode color resolution in bits per pixel
+ *
+ * @return int
+ */
+ protected function decodeBitsPerPixel(string $byte): int
+ {
+ return bindec($this->getPackedBits($byte, 1, 3)) + 1;
+ }
+
+ /**
+ * Decode global color table sorted status
+ *
+ * @return bool
+ */
+ protected function decodeGlobalColorTableSorted(string $byte): bool
+ {
+ return $this->hasPackedBit($byte, 4);
+ }
+
+ /**
+ * Decode size of global color table
+ *
+ * @return int
+ */
+ protected function decodeGlobalColorTableSize(string $byte): int
+ {
+ return bindec($this->getPackedBits($byte, 5, 3));
+ }
+
+ /**
+ * Decode background color index
+ *
+ * @return int
+ */
+ protected function decodeBackgroundColorIndex(string $source): int
+ {
+ return unpack('C', $source)[1];
+ }
+
+ /**
+ * Decode pixel aspect ratio
+ *
+ * @return int
+ */
+ protected function decodePixelAspectRatio(string $source): int
+ {
+ return unpack('C', $source)[1];
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php
new file mode 100755
index 00000000..3074f89f
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php
@@ -0,0 +1,9 @@
+getNextBytesOrFail(2);
+
+ // skip info block
+ $this->getNextBytesOrFail($this->getInfoBlockSize());
+
+ // text blocks
+ $extension->setText($this->decodeTextBlocks());
+
+ return $extension;
+ }
+
+ /**
+ * Get number of bytes in header block
+ *
+ * @throws DecoderException
+ * @return int
+ */
+ protected function getInfoBlockSize(): int
+ {
+ return unpack('C', $this->getNextByteOrFail())[1];
+ }
+
+ /**
+ * Decode text sub blocks
+ *
+ * @throws DecoderException
+ * @return array
+ */
+ protected function decodeTextBlocks(): array
+ {
+ $blocks = [];
+
+ do {
+ $char = $this->getNextByteOrFail();
+ $size = (int) unpack('C', $char)[1];
+ if ($size > 0) {
+ $blocks[] = $this->getNextBytesOrFail($size);
+ }
+ } while ($char !== PlainTextExtension::TERMINATOR);
+
+ return $blocks;
+ }
+}
diff --git a/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php b/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php
new file mode 100755
index 00000000..660a088f
--- /dev/null
+++ b/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php
@@ -0,0 +1,42 @@
+setImageDescriptor(ImageDescriptor::decode($this->handle));
+
+ if ($block->getImageDescriptor()->hasLocalColorTable()) {
+ $block->setColorTable(
+ ColorTable::decode(
+ $this->handle,
+ $block->getImageDescriptor()->getLocalColorTableByteSize()
+ )
+ );
+ }
+
+ $block->setImageData(
+ ImageData::decode($this->handle)
+ );
+
+ return $block;
+ }
+}
diff --git a/vendor/intervention/gif/src/DisposalMethod.php b/vendor/intervention/gif/src/DisposalMethod.php
new file mode 100755
index 00000000..7b05044f
--- /dev/null
+++ b/vendor/intervention/gif/src/DisposalMethod.php
@@ -0,0 +1,13 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ ApplicationExtension::MARKER,
+ ApplicationExtension::LABEL,
+ pack('C', $this->source->getBlockSize()),
+ $this->source->getApplication(),
+ implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())),
+ ApplicationExtension::TERMINATOR,
+ ]);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/ColorEncoder.php b/vendor/intervention/gif/src/Encoders/ColorEncoder.php
new file mode 100755
index 00000000..1d5799c0
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/ColorEncoder.php
@@ -0,0 +1,44 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ $this->encodeColorValue($this->source->getRed()),
+ $this->encodeColorValue($this->source->getGreen()),
+ $this->encodeColorValue($this->source->getBlue()),
+ ]);
+ }
+
+ /**
+ * Encode color value
+ *
+ * @return string
+ */
+ protected function encodeColorValue(int $value): string
+ {
+ return pack('C', $value);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php b/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php
new file mode 100755
index 00000000..a54dcd18
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php
@@ -0,0 +1,36 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', array_map(
+ fn(Color $color): string => $color->encode(),
+ $this->source->getColors(),
+ ));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php
new file mode 100755
index 00000000..0bd56314
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php
@@ -0,0 +1,47 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ CommentExtension::MARKER,
+ CommentExtension::LABEL,
+ $this->encodeComments(),
+ CommentExtension::TERMINATOR,
+ ]);
+ }
+
+ /**
+ * Encode comment blocks
+ *
+ * @return string
+ */
+ protected function encodeComments(): string
+ {
+ return implode('', array_map(function (string $comment): string {
+ return pack('C', strlen($comment)) . $comment;
+ }, $this->source->getComments()));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php b/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php
new file mode 100755
index 00000000..a1474693
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php
@@ -0,0 +1,30 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return pack('C', $this->source->getSize()) . $this->source->getValue();
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php b/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php
new file mode 100755
index 00000000..b74f1c3a
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php
@@ -0,0 +1,49 @@
+source = $source;
+ }
+
+ /**
+ * @throws EncoderException
+ */
+ public function encode(): string
+ {
+ $graphicControlExtension = $this->source->getGraphicControlExtension();
+ $colorTable = $this->source->getColorTable();
+ $plainTextExtension = $this->source->getPlainTextExtension();
+
+ return implode('', [
+ implode('', array_map(
+ fn(ApplicationExtension $extension): string => $extension->encode(),
+ $this->source->getApplicationExtensions(),
+ )),
+ implode('', array_map(
+ fn(CommentExtension $extension): string => $extension->encode(),
+ $this->source->getCommentExtensions(),
+ )),
+ $plainTextExtension ? $plainTextExtension->encode() : '',
+ $graphicControlExtension ? $graphicControlExtension->encode() : '',
+ $this->source->getImageDescriptor()->encode(),
+ $colorTable ? $colorTable->encode() : '',
+ $this->source->getImageData()->encode(),
+ ]);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php b/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php
new file mode 100755
index 00000000..4e691383
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php
@@ -0,0 +1,78 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ $this->source->getHeader()->encode(),
+ $this->source->getLogicalScreenDescriptor()->encode(),
+ $this->maybeEncodeGlobalColorTable(),
+ $this->encodeFrames(),
+ $this->encodeComments(),
+ $this->source->getTrailer()->encode(),
+ ]);
+ }
+
+ protected function maybeEncodeGlobalColorTable(): string
+ {
+ if (!$this->source->hasGlobalColorTable()) {
+ return '';
+ }
+
+ return $this->source->getGlobalColorTable()->encode();
+ }
+
+ /**
+ * Encode data blocks of source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ protected function encodeFrames(): string
+ {
+ return implode('', array_map(
+ fn(FrameBlock $frame): string => $frame->encode(),
+ $this->source->getFrames(),
+ ));
+ }
+
+ /**
+ * Encode comment extension blocks of source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ protected function encodeComments(): string
+ {
+ return implode('', array_map(
+ fn(CommentExtension $commentExtension): string => $commentExtension->encode(),
+ $this->source->getComments()
+ ));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php
new file mode 100755
index 00000000..eef4e9af
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php
@@ -0,0 +1,73 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ GraphicControlExtension::MARKER,
+ GraphicControlExtension::LABEL,
+ GraphicControlExtension::BLOCKSIZE,
+ $this->encodePackedField(),
+ $this->encodeDelay(),
+ $this->encodeTransparentColorIndex(),
+ GraphicControlExtension::TERMINATOR,
+ ]);
+ }
+
+ /**
+ * Encode delay time
+ *
+ * @return string
+ */
+ protected function encodeDelay(): string
+ {
+ return pack('v*', $this->source->getDelay());
+ }
+
+ /**
+ * Encode transparent color index
+ *
+ * @return string
+ */
+ protected function encodeTransparentColorIndex(): string
+ {
+ return pack('C', $this->source->getTransparentColorIndex());
+ }
+
+ /**
+ * Encode packed field
+ *
+ * @return string
+ */
+ protected function encodePackedField(): string
+ {
+ return pack('C', bindec(implode('', [
+ str_pad('0', 3, '0', STR_PAD_LEFT),
+ str_pad(decbin($this->source->getDisposalMethod()->value), 3, '0', STR_PAD_LEFT),
+ (int) $this->source->getUserInput(),
+ (int) $this->source->getTransparentColorExistance(),
+ ])));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/HeaderEncoder.php b/vendor/intervention/gif/src/Encoders/HeaderEncoder.php
new file mode 100755
index 00000000..336ce8bc
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/HeaderEncoder.php
@@ -0,0 +1,30 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return Header::SIGNATURE . $this->source->getVersion();
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php b/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php
new file mode 100755
index 00000000..f601911a
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php
@@ -0,0 +1,45 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @throws EncoderException
+ * @return string
+ */
+ public function encode(): string
+ {
+ if (!$this->source->hasBlocks()) {
+ throw new EncoderException("No data blocks in ImageData.");
+ }
+
+ return implode('', [
+ pack('C', $this->source->getLzwMinCodeSize()),
+ implode('', array_map(
+ fn(DataSubBlock $block): string => $block->encode(),
+ $this->source->getBlocks(),
+ )),
+ AbstractEntity::TERMINATOR,
+ ]);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php b/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php
new file mode 100755
index 00000000..2566a106
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php
@@ -0,0 +1,113 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ ImageDescriptor::SEPARATOR,
+ $this->encodeLeft(),
+ $this->encodeTop(),
+ $this->encodeWidth(),
+ $this->encodeHeight(),
+ $this->encodePackedField(),
+ ]);
+ }
+
+ /**
+ * Encode left value
+ *
+ * @return string
+ */
+ protected function encodeLeft(): string
+ {
+ return pack('v*', $this->source->getLeft());
+ }
+
+ /**
+ * Encode top value
+ *
+ * @return string
+ */
+ protected function encodeTop(): string
+ {
+ return pack('v*', $this->source->getTop());
+ }
+
+ /**
+ * Encode width value
+ *
+ * @return string
+ */
+ protected function encodeWidth(): string
+ {
+ return pack('v*', $this->source->getWidth());
+ }
+
+ /**
+ * Encode height value
+ *
+ * @return string
+ */
+ protected function encodeHeight(): string
+ {
+ return pack('v*', $this->source->getHeight());
+ }
+
+ /**
+ * Encode size of local color table
+ *
+ * @return string
+ */
+ protected function encodeLocalColorTableSize(): string
+ {
+ return str_pad(decbin($this->source->getLocalColorTableSize()), 3, '0', STR_PAD_LEFT);
+ }
+
+ /**
+ * Encode reserved field
+ *
+ * @return string
+ */
+ protected function encodeReservedField(): string
+ {
+ return str_pad('0', 2, '0', STR_PAD_LEFT);
+ }
+
+ /**
+ * Encode packed field
+ *
+ * @return string
+ */
+ protected function encodePackedField(): string
+ {
+ return pack('C', bindec(implode('', [
+ (int) $this->source->getLocalColorTableExistance(),
+ (int) $this->source->isInterlaced(),
+ (int) $this->source->getLocalColorTableSorted(),
+ $this->encodeReservedField(),
+ $this->encodeLocalColorTableSize(),
+ ])));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php b/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php
new file mode 100755
index 00000000..b9404163
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php
@@ -0,0 +1,111 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ $this->encodeWidth(),
+ $this->encodeHeight(),
+ $this->encodePackedField(),
+ $this->encodeBackgroundColorIndex(),
+ $this->encodePixelAspectRatio(),
+ ]);
+ }
+
+ /**
+ * Encode width of current instance
+ *
+ * @return string
+ */
+ protected function encodeWidth(): string
+ {
+ return pack('v*', $this->source->getWidth());
+ }
+
+ /**
+ * Encode height of current instance
+ *
+ * @return string
+ */
+ protected function encodeHeight(): string
+ {
+ return pack('v*', $this->source->getHeight());
+ }
+
+ /**
+ * Encode background color index of global color table
+ *
+ * @return string
+ */
+ protected function encodeBackgroundColorIndex(): string
+ {
+ return pack('C', $this->source->getBackgroundColorIndex());
+ }
+
+ /**
+ * Encode pixel aspect ratio
+ *
+ * @return string
+ */
+ protected function encodePixelAspectRatio(): string
+ {
+ return pack('C', $this->source->getPixelAspectRatio());
+ }
+
+ /**
+ * Return color resolution for encoding
+ *
+ * @return string
+ */
+ protected function encodeColorResolution(): string
+ {
+ return str_pad(decbin($this->source->getBitsPerPixel() - 1), 3, '0', STR_PAD_LEFT);
+ }
+
+ /**
+ * Encode size of global color table
+ *
+ * @return string
+ */
+ protected function encodeGlobalColorTableSize(): string
+ {
+ return str_pad(decbin($this->source->getGlobalColorTableSize()), 3, '0', STR_PAD_LEFT);
+ }
+
+ /**
+ * Encode packed field of current instance
+ *
+ * @return string
+ */
+ protected function encodePackedField(): string
+ {
+ return pack('C', bindec(implode('', [
+ (int) $this->source->getGlobalColorTableExistance(),
+ $this->encodeColorResolution(),
+ (int) $this->source->getGlobalColorTableSorted(),
+ $this->encodeGlobalColorTableSize(),
+ ])));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php
new file mode 100755
index 00000000..a280e185
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php
@@ -0,0 +1,39 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return implode('', [
+ ApplicationExtension::MARKER,
+ ApplicationExtension::LABEL,
+ pack('C', $this->source->getBlockSize()),
+ $this->source->getApplication(),
+ implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())),
+ ApplicationExtension::TERMINATOR,
+ ]);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php
new file mode 100755
index 00000000..9ddd6fb9
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php
@@ -0,0 +1,63 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ if (!$this->source->hasText()) {
+ return '';
+ }
+
+ return implode('', [
+ PlainTextExtension::MARKER,
+ PlainTextExtension::LABEL,
+ $this->encodeHead(),
+ $this->encodeTexts(),
+ PlainTextExtension::TERMINATOR,
+ ]);
+ }
+
+ /**
+ * Encode head block
+ *
+ * @return string
+ */
+ protected function encodeHead(): string
+ {
+ return "\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
+ }
+
+ /**
+ * Encode text chunks
+ *
+ * @return string
+ */
+ protected function encodeTexts(): string
+ {
+ return implode('', array_map(
+ fn(string $text): string => pack('C', strlen($text)) . $text,
+ $this->source->getText(),
+ ));
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php b/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php
new file mode 100755
index 00000000..1f3867ce
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php
@@ -0,0 +1,29 @@
+source = $source;
+ }
+
+ public function encode(): string
+ {
+ return implode('', [
+ $this->source->getImageDescriptor()->encode(),
+ $this->source->getColorTable() ? $this->source->getColorTable()->encode() : '',
+ $this->source->getImageData()->encode(),
+ ]);
+ }
+}
diff --git a/vendor/intervention/gif/src/Encoders/TrailerEncoder.php b/vendor/intervention/gif/src/Encoders/TrailerEncoder.php
new file mode 100755
index 00000000..c24b8a64
--- /dev/null
+++ b/vendor/intervention/gif/src/Encoders/TrailerEncoder.php
@@ -0,0 +1,30 @@
+source = $source;
+ }
+
+ /**
+ * Encode current source
+ *
+ * @return string
+ */
+ public function encode(): string
+ {
+ return Trailer::MARKER;
+ }
+}
diff --git a/vendor/intervention/gif/src/Exceptions/DecoderException.php b/vendor/intervention/gif/src/Exceptions/DecoderException.php
new file mode 100755
index 00000000..7b4650e2
--- /dev/null
+++ b/vendor/intervention/gif/src/Exceptions/DecoderException.php
@@ -0,0 +1,9 @@
+ $frames
+ * @param array $comments
+ * @return void
+ */
+ public function __construct(
+ protected Header $header = new Header(),
+ protected LogicalScreenDescriptor $logicalScreenDescriptor = new LogicalScreenDescriptor(),
+ protected ?ColorTable $globalColorTable = null,
+ protected array $frames = [],
+ protected array $comments = []
+ ) {
+ }
+
+ /**
+ * Get header
+ *
+ * @return Header
+ */
+ public function getHeader(): Header
+ {
+ return $this->header;
+ }
+
+ /**
+ * Set header
+ *
+ * @param Header $header
+ */
+ public function setHeader(Header $header): self
+ {
+ $this->header = $header;
+
+ return $this;
+ }
+
+ /**
+ * Get logical screen descriptor
+ *
+ * @return LogicalScreenDescriptor
+ */
+ public function getLogicalScreenDescriptor(): LogicalScreenDescriptor
+ {
+ return $this->logicalScreenDescriptor;
+ }
+
+ /**
+ * Set logical screen descriptor
+ *
+ * @param LogicalScreenDescriptor $descriptor
+ * @return GifDataStream
+ */
+ public function setLogicalScreenDescriptor(LogicalScreenDescriptor $descriptor): self
+ {
+ $this->logicalScreenDescriptor = $descriptor;
+
+ return $this;
+ }
+
+ /**
+ * Return global color table if available else null
+ *
+ * @return null|ColorTable
+ */
+ public function getGlobalColorTable(): ?ColorTable
+ {
+ return $this->globalColorTable;
+ }
+
+ /**
+ * Set global color table
+ *
+ * @param ColorTable $table
+ * @return GifDataStream
+ */
+ public function setGlobalColorTable(ColorTable $table): self
+ {
+ $this->globalColorTable = $table;
+ $this->logicalScreenDescriptor->setGlobalColorTableExistance(true);
+ $this->logicalScreenDescriptor->setGlobalColorTableSize(
+ $table->getLogicalSize()
+ );
+
+ return $this;
+ }
+
+ /**
+ * Get main graphic control extension
+ *
+ * @return NetscapeApplicationExtension
+ */
+ public function getMainApplicationExtension(): ?NetscapeApplicationExtension
+ {
+ foreach ($this->frames as $frame) {
+ if ($extension = $frame->getNetscapeExtension()) {
+ return $extension;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Get array of frames
+ *
+ * @return array
+ */
+ public function getFrames(): array
+ {
+ return $this->frames;
+ }
+
+ /**
+ * Return array of "global" comments
+ *
+ * @return array
+ */
+ public function getComments(): array
+ {
+ return $this->comments;
+ }
+
+ /**
+ * Return first frame
+ *
+ * @return null|FrameBlock
+ */
+ public function getFirstFrame(): ?FrameBlock
+ {
+ if (!array_key_exists(0, $this->frames)) {
+ return null;
+ }
+
+ return $this->frames[0];
+ }
+
+ /**
+ * Add frame
+ *
+ * @param FrameBlock $frame
+ * @return GifDataStream
+ */
+ public function addFrame(FrameBlock $frame): self
+ {
+ $this->frames[] = $frame;
+
+ return $this;
+ }
+
+ /**
+ * Add comment extension
+ *
+ * @param CommentExtension $comment
+ * @return GifDataStream
+ */
+ public function addComment(CommentExtension $comment): self
+ {
+ $this->comments[] = $comment;
+
+ return $this;
+ }
+
+ /**
+ * Set the current data
+ *
+ * @param array $frames
+ */
+ public function setFrames(array $frames): self
+ {
+ $this->frames = $frames;
+
+ return $this;
+ }
+
+ /**
+ * Get trailer
+ *
+ * @return Trailer
+ */
+ public function getTrailer(): Trailer
+ {
+ return new Trailer();
+ }
+
+ /**
+ * Determine if gif is animated
+ *
+ * @return bool
+ */
+ public function isAnimated(): bool
+ {
+ return count($this->getFrames()) > 1;
+ }
+
+ /**
+ * Determine if global color table is set
+ *
+ * @return bool
+ */
+ public function hasGlobalColorTable(): bool
+ {
+ return !is_null($this->globalColorTable);
+ }
+}
diff --git a/vendor/intervention/gif/src/Splitter.php b/vendor/intervention/gif/src/Splitter.php
new file mode 100755
index 00000000..6377093f
--- /dev/null
+++ b/vendor/intervention/gif/src/Splitter.php
@@ -0,0 +1,283 @@
+
+ */
+class Splitter implements IteratorAggregate
+{
+ /**
+ * Single frames resolved to GifDataStream
+ *
+ * @var array
+ */
+ protected array $frames = [];
+
+ /**
+ * Delays of each frame
+ *
+ * @var array
+ */
+ protected array $delays = [];
+
+ /**
+ * Create new instance
+ *
+ * @param GifDataStream $stream
+ */
+ public function __construct(protected GifDataStream $stream)
+ {
+ //
+ }
+
+ /**
+ * Iterator
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator($this->frames);
+ }
+
+ /**
+ * Get frames
+ *
+ * @return array
+ */
+ public function getFrames(): array
+ {
+ return $this->frames;
+ }
+
+ /**
+ * Get delays
+ *
+ * @return array
+ */
+ public function getDelays(): array
+ {
+ return $this->delays;
+ }
+
+ /**
+ * Set stream of instance
+ *
+ * @param GifDataStream $stream
+ */
+ public function setStream(GifDataStream $stream): self
+ {
+ $this->stream = $stream;
+
+ return $this;
+ }
+
+ /**
+ * Static constructor method
+ *
+ * @param GifDataStream $stream
+ * @return Splitter
+ */
+ public static function create(GifDataStream $stream): self
+ {
+ return new self($stream);
+ }
+
+ /**
+ * Split current stream into array of seperate streams for each frame
+ *
+ * @return Splitter
+ */
+ public function split(): self
+ {
+ $this->frames = [];
+
+ foreach ($this->stream->getFrames() as $frame) {
+ // create separate stream for each frame
+ $gif = Builder::canvas(
+ $this->stream->getLogicalScreenDescriptor()->getWidth(),
+ $this->stream->getLogicalScreenDescriptor()->getHeight()
+ )->getGifDataStream();
+
+ // check if working stream has global color table
+ if ($this->stream->hasGlobalColorTable()) {
+ $gif->setGlobalColorTable($this->stream->getGlobalColorTable());
+ $gif->getLogicalScreenDescriptor()->setGlobalColorTableExistance(true);
+
+ $gif->getLogicalScreenDescriptor()->setGlobalColorTableSorted(
+ $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSorted()
+ );
+
+ $gif->getLogicalScreenDescriptor()->setGlobalColorTableSize(
+ $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSize()
+ );
+
+ $gif->getLogicalScreenDescriptor()->setBackgroundColorIndex(
+ $this->stream->getLogicalScreenDescriptor()->getBackgroundColorIndex()
+ );
+
+ $gif->getLogicalScreenDescriptor()->setPixelAspectRatio(
+ $this->stream->getLogicalScreenDescriptor()->getPixelAspectRatio()
+ );
+
+ $gif->getLogicalScreenDescriptor()->setBitsPerPixel(
+ $this->stream->getLogicalScreenDescriptor()->getBitsPerPixel()
+ );
+ }
+
+ // copy original frame
+ $gif->addFrame($frame);
+
+ $this->frames[] = $gif;
+ $this->delays[] = match (is_object($frame->getGraphicControlExtension())) {
+ true => $frame->getGraphicControlExtension()->getDelay(),
+ default => 0,
+ };
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return array of GD library resources for each frame
+ *
+ * @throws EncoderException
+ * @return array
+ */
+ public function toResources(): array
+ {
+ $resources = [];
+
+ foreach ($this->frames as $frame) {
+ $resource = imagecreatefromstring($frame->encode());
+ imagepalettetotruecolor($resource);
+ imagesavealpha($resource, true);
+ $resources[] = $resource;
+ }
+
+ return $resources;
+ }
+
+ /**
+ * Return array of coalesced GD library resources for each frame
+ *
+ * @throws EncoderException
+ * @return array
+ */
+ public function coalesceToResources(): array
+ {
+ $resources = $this->toResources();
+
+ // static gif files don't need to be coalesced
+ if (count($resources) === 1) {
+ return $resources;
+ }
+
+ $width = imagesx($resources[0]);
+ $height = imagesy($resources[0]);
+ $transparent = imagecolortransparent($resources[0]);
+
+ foreach ($resources as $key => $resource) {
+ // get meta data
+ $gif = $this->frames[$key];
+ $descriptor = $gif->getFirstFrame()->getImageDescriptor();
+ $offset_x = $descriptor->getLeft();
+ $offset_y = $descriptor->getTop();
+ $w = $descriptor->getWidth();
+ $h = $descriptor->getHeight();
+
+ if (in_array($this->getDisposalMethod($gif), [DisposalMethod::NONE, DisposalMethod::PREVIOUS])) {
+ if ($key >= 1) {
+ // create normalized gd image
+ $canvas = imagecreatetruecolor($width, $height);
+ if (imagecolortransparent($resource) != -1) {
+ $transparent = imagecolortransparent($resource);
+ } else {
+ $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127);
+ }
+
+ // fill with transparent
+ imagefill($canvas, 0, 0, $transparent);
+ imagecolortransparent($canvas, $transparent);
+ imagealphablending($canvas, true);
+
+ // insert last as base
+ imagecopy(
+ $canvas,
+ $resources[$key - 1],
+ 0,
+ 0,
+ 0,
+ 0,
+ $width,
+ $height
+ );
+
+ // insert resource
+ imagecopy(
+ $canvas,
+ $resource,
+ $offset_x,
+ $offset_y,
+ 0,
+ 0,
+ $w,
+ $h
+ );
+ } else {
+ imagealphablending($resource, true);
+ $canvas = $resource;
+ }
+ } else {
+ // create normalized gd image
+ $canvas = imagecreatetruecolor($width, $height);
+ if (imagecolortransparent($resource) != -1) {
+ $transparent = imagecolortransparent($resource);
+ } else {
+ $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127);
+ }
+
+ // fill with transparent
+ imagefill($canvas, 0, 0, $transparent);
+ imagecolortransparent($canvas, $transparent);
+ imagealphablending($canvas, true);
+
+ // insert frame resource
+ imagecopy(
+ $canvas,
+ $resource,
+ $offset_x,
+ $offset_y,
+ 0,
+ 0,
+ $w,
+ $h
+ );
+ }
+
+ $resources[$key] = $canvas;
+ }
+
+ return $resources;
+ }
+
+ /**
+ * Find and return disposal method of given gif data stream
+ *
+ * @param GifDataStream $gif
+ * @return DisposalMethod
+ */
+ private function getDisposalMethod(GifDataStream $gif): DisposalMethod
+ {
+ return $gif->getFirstFrame()->getGraphicControlExtension()->getDisposalMethod();
+ }
+}
diff --git a/vendor/intervention/gif/src/Traits/CanDecode.php b/vendor/intervention/gif/src/Traits/CanDecode.php
new file mode 100755
index 00000000..0a9109f6
--- /dev/null
+++ b/vendor/intervention/gif/src/Traits/CanDecode.php
@@ -0,0 +1,53 @@
+decode();
+ }
+
+ /**
+ * Get decoder for current instance
+ *
+ * @param resource $source
+ * @param null|int $length
+ * @throws DecoderException
+ * @return AbstractDecoder
+ */
+ protected static function getDecoder($source, ?int $length = null): AbstractDecoder
+ {
+ $classname = self::getDecoderClassname();
+
+ if (!class_exists($classname)) {
+ throw new DecoderException("Decoder for '" . static::class . "' not found.");
+ }
+
+ return new $classname($source, $length);
+ }
+
+ /**
+ * Get classname of decoder for current classname
+ *
+ * @return string
+ */
+ protected static function getDecoderClassname(): string
+ {
+ return sprintf('Intervention\Gif\Decoders\%sDecoder', self::getShortClassname());
+ }
+}
diff --git a/vendor/intervention/gif/src/Traits/CanEncode.php b/vendor/intervention/gif/src/Traits/CanEncode.php
new file mode 100755
index 00000000..3ff546ec
--- /dev/null
+++ b/vendor/intervention/gif/src/Traits/CanEncode.php
@@ -0,0 +1,49 @@
+getEncoder()->encode();
+ }
+
+ /**
+ * Get encoder object for current entity
+ *
+ * @throws EncoderException
+ * @return AbstractEncoder
+ */
+ protected function getEncoder(): AbstractEncoder
+ {
+ $classname = $this->getEncoderClassname();
+
+ if (!class_exists($classname)) {
+ throw new EncoderException("Encoder for '" . $this::class . "' not found.");
+ }
+
+ return new $classname($this);
+ }
+
+ /**
+ * Get encoder classname for current entity
+ *
+ * @return string
+ */
+ protected function getEncoderClassname(): string
+ {
+ return sprintf('Intervention\Gif\Encoders\%sEncoder', $this->getShortClassname());
+ }
+}
diff --git a/vendor/intervention/gif/src/Traits/CanHandleFiles.php b/vendor/intervention/gif/src/Traits/CanHandleFiles.php
new file mode 100755
index 00000000..21ce0c84
--- /dev/null
+++ b/vendor/intervention/gif/src/Traits/CanHandleFiles.php
@@ -0,0 +1,56 @@
+
+ */
+class Collection implements CollectionInterface, IteratorAggregate, Countable
+{
+ /**
+ * Create new collection object
+ *
+ * @param array $items
+ * @return void
+ */
+ public function __construct(protected array $items = [])
+ {
+ //
+ }
+
+ /**
+ * Static constructor
+ *
+ * @param array $items
+ * @return self
+ */
+ public static function create(array $items = []): self
+ {
+ return new self($items);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::has()
+ */
+ public function has(int|string $key): bool
+ {
+ return array_key_exists($key, $this->items);
+ }
+
+ /**
+ * Returns Iterator
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator($this->items);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::toArray()
+ */
+ public function toArray(): array
+ {
+ return $this->items;
+ }
+
+ /**
+ * Count items in collection
+ */
+ public function count(): int
+ {
+ return count($this->items);
+ }
+
+ /**
+ * Append new item to collection
+ *
+ * @return CollectionInterface
+ */
+ public function push(mixed $item): CollectionInterface
+ {
+ $this->items[] = $item;
+
+ return $this;
+ }
+
+ /**
+ * Return first item in collection
+ */
+ public function first(): mixed
+ {
+ if ($item = reset($this->items)) {
+ return $item;
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns last item in collection
+ */
+ public function last(): mixed
+ {
+ if ($item = end($this->items)) {
+ return $item;
+ }
+
+ return null;
+ }
+
+ /**
+ * Return item at given position starting at 0
+ */
+ public function getAtPosition(int $key = 0, mixed $default = null): mixed
+ {
+ if ($this->count() == 0) {
+ return $default;
+ }
+
+ $positions = array_values($this->items);
+ if (!array_key_exists($key, $positions)) {
+ return $default;
+ }
+
+ return $positions[$key];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::get()
+ */
+ public function get(int|string $query, mixed $default = null): mixed
+ {
+ if ($this->count() == 0) {
+ return $default;
+ }
+
+ if (is_int($query) && array_key_exists($query, $this->items)) {
+ return $this->items[$query];
+ }
+
+ if (is_string($query) && !str_contains($query, '.')) {
+ return array_key_exists($query, $this->items) ? $this->items[$query] : $default;
+ }
+
+ $query = explode('.', (string) $query);
+
+ $result = $default;
+ $items = $this->items;
+ foreach ($query as $key) {
+ if (!is_array($items) || !array_key_exists($key, $items)) {
+ $result = $default;
+ break;
+ }
+
+ $result = $items[$key];
+ $items = $result;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Map each item of collection by given callback
+ */
+ public function map(callable $callback): self
+ {
+
+ return new self(
+ array_map(
+ fn(mixed $item) => $callback($item),
+ $this->items,
+ )
+ );
+ }
+
+ /**
+ * Run callback on each item of the collection an remove it if it does not return true
+ */
+ public function filter(callable $callback): self
+ {
+ return new self(
+ array_filter(
+ $this->items,
+ fn(mixed $item) => $callback($item),
+ )
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::empty()
+ */
+ public function empty(): CollectionInterface
+ {
+ $this->items = [];
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::slice()
+ */
+ public function slice(int $offset, ?int $length = null): CollectionInterface
+ {
+ $this->items = array_slice($this->items, $offset, $length);
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/AbstractColor.php b/vendor/intervention/image/src/Colors/AbstractColor.php
new file mode 100755
index 00000000..9628795e
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/AbstractColor.php
@@ -0,0 +1,116 @@
+
+ */
+ protected array $channels;
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::channels()
+ */
+ public function channels(): array
+ {
+ return $this->channels;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::channel()
+ */
+ public function channel(string $classname): ColorChannelInterface
+ {
+ $channels = array_filter(
+ $this->channels(),
+ fn(ColorChannelInterface $channel): bool => $channel::class === $classname,
+ );
+
+ if (count($channels) == 0) {
+ throw new ColorException('Color channel ' . $classname . ' could not be found.');
+ }
+
+ return reset($channels);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::normalize()
+ */
+ public function normalize(): array
+ {
+ return array_map(
+ fn(ColorChannelInterface $channel): float => $channel->normalize(),
+ $this->channels(),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toArray()
+ */
+ public function toArray(): array
+ {
+ return array_map(
+ fn(ColorChannelInterface $channel): int => $channel->value(),
+ $this->channels()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::convertTo()
+ */
+ public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface
+ {
+ $colorspace = match (true) {
+ is_object($colorspace) => $colorspace,
+ default => new $colorspace(),
+ };
+
+ return $colorspace->importColor($this);
+ }
+
+ /**
+ * Show debug info for the current color
+ *
+ * @return array
+ */
+ public function __debugInfo(): array
+ {
+ return array_reduce($this->channels(), function (array $result, ColorChannelInterface $item) {
+ $key = strtolower((new ReflectionClass($item))->getShortName());
+ $result[$key] = $item->value();
+ return $result;
+ }, []);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::__toString()
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/AbstractColorChannel.php b/vendor/intervention/image/src/Colors/AbstractColorChannel.php
new file mode 100755
index 00000000..5c529092
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/AbstractColorChannel.php
@@ -0,0 +1,92 @@
+value = $this->validate(
+ match (true) {
+ is_null($value) && is_numeric($normalized) => intval(round($normalized * $this->max())),
+ is_numeric($value) && is_null($normalized) => $value,
+ default => throw new ColorException('Color channels must either have a value or a normalized value')
+ }
+ );
+ }
+
+ /**
+ * Alias of value()
+ */
+ public function toInt(): int
+ {
+ return $this->value;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorChannelInterface::value()
+ */
+ public function value(): int
+ {
+ return $this->value;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorChannelInterface::normalize()
+ */
+ public function normalize(int $precision = 32): float
+ {
+ return round(($this->value() - $this->min()) / ($this->max() - $this->min()), $precision);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorChannelInterface::validate()
+ */
+ public function validate(mixed $value): mixed
+ {
+ if ($value < $this->min() || $value > $this->max()) {
+ throw new ColorException('Color channel value must be in range ' . $this->min() . ' to ' . $this->max());
+ }
+
+ return $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorChannelInterface::toString()
+ */
+ public function toString(): string
+ {
+ return (string) $this->value();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorChannelInterface::__toString()
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php b/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php
new file mode 100755
index 00000000..f56b095c
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php
@@ -0,0 +1,20 @@
+channels = [
+ new Cyan($c),
+ new Magenta($m),
+ new Yellow($y),
+ new Key($k),
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::create()
+ */
+ public static function create(mixed $input): ColorInterface
+ {
+ return InputHandler::withDecoders([
+ Decoders\StringColorDecoder::class,
+ ])->handle($input);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::colorspace()
+ */
+ public function colorspace(): ColorspaceInterface
+ {
+ return new Colorspace();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toHex()
+ */
+ public function toHex(string $prefix = ''): string
+ {
+ return $this->convertTo(RgbColorspace::class)->toHex($prefix);
+ }
+
+ /**
+ * Return the CMYK cyan channel
+ */
+ public function cyan(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Cyan::class);
+ }
+
+ /**
+ * Return the CMYK magenta channel
+ */
+ public function magenta(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Magenta::class);
+ }
+
+ /**
+ * Return the CMYK yellow channel
+ */
+ public function yellow(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Yellow::class);
+ }
+
+ /**
+ * Return the CMYK key channel
+ */
+ public function key(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Key::class);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toString()
+ */
+ public function toString(): string
+ {
+ return sprintf(
+ 'cmyk(%d%%, %d%%, %d%%, %d%%)',
+ $this->cyan()->value(),
+ $this->magenta()->value(),
+ $this->yellow()->value(),
+ $this->key()->value()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isGreyscale()
+ */
+ public function isGreyscale(): bool
+ {
+ return 0 === array_sum([
+ $this->cyan()->value(),
+ $this->magenta()->value(),
+ $this->yellow()->value(),
+ ]);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isTransparent()
+ */
+ public function isTransparent(): bool
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isClear()
+ */
+ public function isClear(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php b/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php
new file mode 100755
index 00000000..4484ef7c
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php
@@ -0,0 +1,77 @@
+
+ */
+ public static array $channels = [
+ Channels\Cyan::class,
+ Channels\Magenta::class,
+ Channels\Yellow::class,
+ Channels\Key::class
+ ];
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorspaceInterface::createColor()
+ */
+ public function colorFromNormalized(array $normalized): ColorInterface
+ {
+ return new Color(...array_map(
+ fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(),
+ self::$channels,
+ $normalized,
+ ));
+ }
+
+ /**
+ * @throws ColorException
+ */
+ public function importColor(ColorInterface $color): ColorInterface
+ {
+ return match ($color::class) {
+ RgbColor::class => $this->importRgbColor($color),
+ HsvColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)),
+ HslColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)),
+ default => $color,
+ };
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importRgbColor(ColorInterface $color): CmykColor
+ {
+ if (!($color instanceof RgbColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ $c = (255 - $color->red()->value()) / 255.0 * 100;
+ $m = (255 - $color->green()->value()) / 255.0 * 100;
+ $y = (255 - $color->blue()->value()) / 255.0 * 100;
+ $k = intval(round(min([$c, $m, $y])));
+
+ $c = intval(round($c - $k));
+ $m = intval(round($m - $k));
+ $y = intval(round($y - $k));
+
+ return new CmykColor($c, $m, $y, $k);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php
new file mode 100755
index 00000000..e160f2e3
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php
@@ -0,0 +1,36 @@
+[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i';
+ if (preg_match($pattern, $input, $matches) != 1) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ $values = array_map(function (string $value): int {
+ return intval(round(floatval(trim(str_replace('%', '', $value)))));
+ }, [$matches['c'], $matches['m'], $matches['y'], $matches['k']]);
+
+ return new Color(...$values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php b/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php
new file mode 100755
index 00000000..049a849c
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php
@@ -0,0 +1,30 @@
+channels = [
+ new Hue($h),
+ new Saturation($s),
+ new Luminance($l),
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::colorspace()
+ */
+ public function colorspace(): ColorspaceInterface
+ {
+ return new Colorspace();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::create()
+ */
+ public static function create(mixed $input): ColorInterface
+ {
+ return InputHandler::withDecoders([
+ Decoders\StringColorDecoder::class,
+ ])->handle($input);
+ }
+
+ /**
+ * Return the Hue channel
+ */
+ public function hue(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Hue::class);
+ }
+
+ /**
+ * Return the Saturation channel
+ */
+ public function saturation(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Saturation::class);
+ }
+
+ /**
+ * Return the Luminance channel
+ */
+ public function luminance(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Luminance::class);
+ }
+
+ public function toHex(string $prefix = ''): string
+ {
+ return $this->convertTo(RgbColorspace::class)->toHex($prefix);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toString()
+ */
+ public function toString(): string
+ {
+ return sprintf(
+ 'hsl(%d, %d%%, %d%%)',
+ $this->hue()->value(),
+ $this->saturation()->value(),
+ $this->luminance()->value()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isGreyscale()
+ */
+ public function isGreyscale(): bool
+ {
+ return $this->saturation()->value() == 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isTransparent()
+ */
+ public function isTransparent(): bool
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isClear()
+ */
+ public function isClear(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsl/Colorspace.php b/vendor/intervention/image/src/Colors/Hsl/Colorspace.php
new file mode 100755
index 00000000..de4c2cf8
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsl/Colorspace.php
@@ -0,0 +1,137 @@
+
+ */
+ public static array $channels = [
+ Channels\Hue::class,
+ Channels\Saturation::class,
+ Channels\Luminance::class
+ ];
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorspaceInterface::colorFromNormalized()
+ */
+ public function colorFromNormalized(array $normalized): ColorInterface
+ {
+ return new Color(...array_map(
+ fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(),
+ self::$channels,
+ $normalized
+ ));
+ }
+
+ /**
+ * @throws ColorException
+ */
+ public function importColor(ColorInterface $color): ColorInterface
+ {
+ return match ($color::class) {
+ CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)),
+ RgbColor::class => $this->importRgbColor($color),
+ HsvColor::class => $this->importHsvColor($color),
+ default => $color,
+ };
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importRgbColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof RgbColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ // normalized values of rgb channels
+ $values = array_map(
+ fn(ColorChannelInterface $channel): float => $channel->normalize(),
+ $color->channels(),
+ );
+
+ // take only RGB
+ $values = array_slice($values, 0, 3);
+
+ // calculate Luminance
+ $min = min(...$values);
+ $max = max(...$values);
+ $luminance = ($max + $min) / 2;
+ $delta = $max - $min;
+
+ // calculate saturation
+ $saturation = match (true) {
+ $delta == 0 => 0,
+ default => $delta / (1 - abs(2 * $luminance - 1)),
+ };
+
+ // calculate hue
+ [$r, $g, $b] = $values;
+ $hue = match (true) {
+ ($delta == 0) => 0,
+ ($max == $r) => 60 * fmod((($g - $b) / $delta), 6),
+ ($max == $g) => 60 * ((($b - $r) / $delta) + 2),
+ ($max == $b) => 60 * ((($r - $g) / $delta) + 4),
+ default => 0,
+ };
+
+ $hue = ($hue + 360) % 360; // normalize hue
+
+ return new Color(
+ intval(round($hue)),
+ intval(round($saturation * 100)),
+ intval(round($luminance * 100)),
+ );
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importHsvColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof HsvColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ // normalized values of hsv channels
+ [$h, $s, $v] = array_map(
+ fn(ColorChannelInterface $channel): float => $channel->normalize(),
+ $color->channels(),
+ );
+
+ // calculate Luminance
+ $luminance = (2 - $s) * $v / 2;
+
+ // calculate Saturation
+ $saturation = match (true) {
+ $luminance == 0 => $s,
+ $luminance == 1 => 0,
+ $luminance < .5 => $s * $v / ($luminance * 2),
+ default => $s * $v / (2 - $luminance * 2),
+ };
+
+ return new Color(
+ intval(round($h * 360)),
+ intval(round($saturation * 100)),
+ intval(round($luminance * 100)),
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php
new file mode 100755
index 00000000..8ea7ed94
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php
@@ -0,0 +1,39 @@
+[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i';
+ if (preg_match($pattern, $input, $matches) != 1) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ $values = array_map(function (string $value): int {
+ return match (strpos($value, '%')) {
+ false => intval(trim($value)),
+ default => intval(trim(str_replace('%', '', $value))),
+ };
+ }, [$matches['h'], $matches['s'], $matches['l']]);
+
+ return new Color(...$values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php b/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php
new file mode 100755
index 00000000..bbfc1feb
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php
@@ -0,0 +1,30 @@
+channels = [
+ new Hue($h),
+ new Saturation($s),
+ new Value($v),
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::colorspace()
+ */
+ public function colorspace(): ColorspaceInterface
+ {
+ return new Colorspace();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::create()
+ */
+ public static function create(mixed $input): ColorInterface
+ {
+ return InputHandler::withDecoders([
+ Decoders\StringColorDecoder::class,
+ ])->handle($input);
+ }
+
+ /**
+ * Return the Hue channel
+ */
+ public function hue(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Hue::class);
+ }
+
+ /**
+ * Return the Saturation channel
+ */
+ public function saturation(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Saturation::class);
+ }
+
+ /**
+ * Return the Value channel
+ */
+ public function value(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Value::class);
+ }
+
+ public function toHex(string $prefix = ''): string
+ {
+ return $this->convertTo(RgbColorspace::class)->toHex($prefix);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toString()
+ */
+ public function toString(): string
+ {
+ return sprintf(
+ 'hsv(%d, %d%%, %d%%)',
+ $this->hue()->value(),
+ $this->saturation()->value(),
+ $this->value()->value()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isGreyscale()
+ */
+ public function isGreyscale(): bool
+ {
+ return $this->saturation()->value() == 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isTransparent()
+ */
+ public function isTransparent(): bool
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isClear()
+ */
+ public function isClear(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsv/Colorspace.php b/vendor/intervention/image/src/Colors/Hsv/Colorspace.php
new file mode 100755
index 00000000..5cf08e2f
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsv/Colorspace.php
@@ -0,0 +1,122 @@
+
+ */
+ public static array $channels = [
+ Channels\Hue::class,
+ Channels\Saturation::class,
+ Channels\Value::class
+ ];
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorspaceInterface::colorFromNormalized()
+ */
+ public function colorFromNormalized(array $normalized): ColorInterface
+ {
+ return new Color(...array_map(
+ fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(),
+ self::$channels,
+ $normalized
+ ));
+ }
+
+ /**
+ * @throws ColorException
+ */
+ public function importColor(ColorInterface $color): ColorInterface
+ {
+ return match ($color::class) {
+ CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)),
+ RgbColor::class => $this->importRgbColor($color),
+ HslColor::class => $this->importHslColor($color),
+ default => $color,
+ };
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importRgbColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof RgbColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ // normalized values of rgb channels
+ $values = array_map(fn(ColorChannelInterface $channel): float => $channel->normalize(), $color->channels());
+
+ // take only RGB
+ $values = array_slice($values, 0, 3);
+
+ // calculate chroma
+ $min = min(...$values);
+ $max = max(...$values);
+ $chroma = $max - $min;
+
+ // calculate value
+ $v = 100 * $max;
+
+ if ($chroma == 0) {
+ // greyscale color
+ return new Color(0, 0, intval(round($v)));
+ }
+
+ // calculate saturation
+ $s = 100 * ($chroma / $max);
+
+ // calculate hue
+ [$r, $g, $b] = $values;
+ $h = match (true) {
+ ($r == $min) => 3 - (($g - $b) / $chroma),
+ ($b == $min) => 1 - (($r - $g) / $chroma),
+ default => 5 - (($b - $r) / $chroma),
+ } * 60;
+
+ return new Color(
+ intval(round($h)),
+ intval(round($s)),
+ intval(round($v))
+ );
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importHslColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof HslColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ // normalized values of hsl channels
+ [$h, $s, $l] = array_map(
+ fn(ColorChannelInterface $channel): float => $channel->normalize(),
+ $color->channels()
+ );
+
+ $v = $l + $s * min($l, 1 - $l);
+ $s = ($v == 0) ? 0 : 2 * (1 - $l / $v);
+
+ return $this->colorFromNormalized([$h, $s, $v]);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php
new file mode 100755
index 00000000..0f1ada36
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php
@@ -0,0 +1,39 @@
+[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i';
+ if (preg_match($pattern, $input, $matches) != 1) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ $values = array_map(function (string $value): int {
+ return match (strpos($value, '%')) {
+ false => intval(trim($value)),
+ default => intval(trim(str_replace('%', '', $value))),
+ };
+ }, [$matches['h'], $matches['s'], $matches['v']]);
+
+ return new Color(...$values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Profile.php b/vendor/intervention/image/src/Colors/Profile.php
new file mode 100755
index 00000000..b6aa0e9e
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Profile.php
@@ -0,0 +1,22 @@
+normalize(), 6));
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php b/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php
new file mode 100755
index 00000000..c5f9ed74
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php
@@ -0,0 +1,10 @@
+channels = [
+ new Red($r),
+ new Green($g),
+ new Blue($b),
+ new Alpha($a),
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::colorspace()
+ */
+ public function colorspace(): ColorspaceInterface
+ {
+ return new Colorspace();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::create()
+ */
+ public static function create(mixed $input): ColorInterface
+ {
+ return InputHandler::withDecoders([
+ Decoders\HexColorDecoder::class,
+ Decoders\StringColorDecoder::class,
+ Decoders\TransparentColorDecoder::class,
+ Decoders\HtmlColornameDecoder::class,
+ ])->handle($input);
+ }
+
+ /**
+ * Return the RGB red color channel
+ */
+ public function red(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Red::class);
+ }
+
+ /**
+ * Return the RGB green color channel
+ */
+ public function green(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Green::class);
+ }
+
+ /**
+ * Return the RGB blue color channel
+ */
+ public function blue(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Blue::class);
+ }
+
+ /**
+ * Return the colors alpha channel
+ */
+ public function alpha(): ColorChannelInterface
+ {
+ /** @throws void */
+ return $this->channel(Alpha::class);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toHex()
+ */
+ public function toHex(string $prefix = ''): string
+ {
+ if ($this->isTransparent()) {
+ return sprintf(
+ '%s%02x%02x%02x%02x',
+ $prefix,
+ $this->red()->value(),
+ $this->green()->value(),
+ $this->blue()->value(),
+ $this->alpha()->value()
+ );
+ }
+
+ return sprintf(
+ '%s%02x%02x%02x',
+ $prefix,
+ $this->red()->value(),
+ $this->green()->value(),
+ $this->blue()->value()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::toString()
+ */
+ public function toString(): string
+ {
+ if ($this->isTransparent()) {
+ return sprintf(
+ 'rgba(%d, %d, %d, %.1F)',
+ $this->red()->value(),
+ $this->green()->value(),
+ $this->blue()->value(),
+ $this->alpha()->normalize(),
+ );
+ }
+
+ return sprintf(
+ 'rgb(%d, %d, %d)',
+ $this->red()->value(),
+ $this->green()->value(),
+ $this->blue()->value()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isGreyscale()
+ */
+ public function isGreyscale(): bool
+ {
+ $values = [$this->red()->value(), $this->green()->value(), $this->blue()->value()];
+
+ return count(array_unique($values, SORT_REGULAR)) === 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isTransparent()
+ */
+ public function isTransparent(): bool
+ {
+ return $this->alpha()->value() < $this->alpha()->max();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorInterface::isClear()
+ */
+ public function isClear(): bool
+ {
+ return $this->alpha()->value() == 0;
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Colorspace.php b/vendor/intervention/image/src/Colors/Rgb/Colorspace.php
new file mode 100755
index 00000000..dfeaef64
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Colorspace.php
@@ -0,0 +1,135 @@
+
+ */
+ public static array $channels = [
+ Channels\Red::class,
+ Channels\Green::class,
+ Channels\Blue::class,
+ Channels\Alpha::class
+ ];
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorspaceInterface::colorFromNormalized()
+ */
+ public function colorFromNormalized(array $normalized): ColorInterface
+ {
+ return new Color(...array_map(
+ fn($classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(),
+ self::$channels,
+ $normalized,
+ ));
+ }
+
+ /**
+ * @throws ColorException
+ */
+ public function importColor(ColorInterface $color): ColorInterface
+ {
+ return match ($color::class) {
+ CmykColor::class => $this->importCmykColor($color),
+ HsvColor::class => $this->importHsvColor($color),
+ HslColor::class => $this->importHslColor($color),
+ default => $color,
+ };
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importCmykColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof CmykColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ return new Color(
+ (int) (255 * (1 - $color->cyan()->normalize()) * (1 - $color->key()->normalize())),
+ (int) (255 * (1 - $color->magenta()->normalize()) * (1 - $color->key()->normalize())),
+ (int) (255 * (1 - $color->yellow()->normalize()) * (1 - $color->key()->normalize())),
+ );
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importHsvColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof HsvColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ $chroma = $color->value()->normalize() * $color->saturation()->normalize();
+ $hue = $color->hue()->normalize() * 6;
+ $x = $chroma * (1 - abs(fmod($hue, 2) - 1));
+
+ // connect channel values
+ $values = match (true) {
+ $hue < 1 => [$chroma, $x, 0],
+ $hue < 2 => [$x, $chroma, 0],
+ $hue < 3 => [0, $chroma, $x],
+ $hue < 4 => [0, $x, $chroma],
+ $hue < 5 => [$x, 0, $chroma],
+ default => [$chroma, 0, $x],
+ };
+
+ // add to each value
+ $values = array_map(fn(float|int $value): float => $value + $color->value()->normalize() - $chroma, $values);
+ $values[] = 1; // append alpha channel value
+
+ return $this->colorFromNormalized($values);
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function importHslColor(ColorInterface $color): ColorInterface
+ {
+ if (!($color instanceof HslColor)) {
+ throw new ColorException('Unabled to import color of type ' . $color::class . '.');
+ }
+
+ // normalized values of hsl channels
+ [$h, $s, $l] = array_map(
+ fn(ColorChannelInterface $channel): float => $channel->normalize(),
+ $color->channels()
+ );
+
+ $c = (1 - abs(2 * $l - 1)) * $s;
+ $x = $c * (1 - abs(fmod($h * 6, 2) - 1));
+ $m = $l - $c / 2;
+
+ $values = match (true) {
+ $h < 1 / 6 => [$c, $x, 0],
+ $h < 2 / 6 => [$x, $c, 0],
+ $h < 3 / 6 => [0, $c, $x],
+ $h < 4 / 6 => [0, $x, $c],
+ $h < 5 / 6 => [$x, 0, $c],
+ default => [$c, 0, $x],
+ };
+
+ $values = array_map(fn(float|int $value): float => $value + $m, $values);
+ $values[] = 1; // append alpha channel value
+
+ return $this->colorFromNormalized($values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php
new file mode 100755
index 00000000..b19eee2a
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php
@@ -0,0 +1,46 @@
+[a-f\d]{3}(?:[a-f\d]?|(?:[a-f\d]{3}(?:[a-f\d]{2})?)?)\b)$/i';
+ if (preg_match($pattern, $input, $matches) != 1) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ $values = match (strlen($matches['hex'])) {
+ 3, 4 => str_split($matches['hex']),
+ 6, 8 => str_split($matches['hex'], 2),
+ default => throw new DecoderException('Unable to decode input'),
+ };
+
+ $values = array_map(function (string $value): float|int {
+ return match (strlen($value)) {
+ 1 => hexdec($value . $value),
+ 2 => hexdec($value),
+ default => throw new DecoderException('Unable to decode input'),
+ };
+ }, $values);
+
+ return new Color(...$values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php
new file mode 100755
index 00000000..8fc8e70d
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php
@@ -0,0 +1,176 @@
+
+ */
+ protected static array $names = [
+ 'lightsalmon' => '#ffa07a',
+ 'salmon' => '#fa8072',
+ 'darksalmon' => '#e9967a',
+ 'lightcoral' => '#f08080',
+ 'indianred' => '#cd5c5c',
+ 'crimson' => '#dc143c',
+ 'firebrick' => '#b22222',
+ 'red' => '#ff0000',
+ 'darkred' => '#8b0000',
+ 'coral' => '#ff7f50',
+ 'tomato' => '#ff6347',
+ 'orangered' => '#ff4500',
+ 'gold' => '#ffd700',
+ 'orange' => '#ffa500',
+ 'darkorange' => '#ff8c00',
+ 'lightyellow' => '#ffffe0',
+ 'lemonchiffon' => '#fffacd',
+ 'lightgoldenrodyellow' => '#fafad2',
+ 'papayawhip' => '#ffefd5',
+ 'moccasin' => '#ffe4b5',
+ 'peachpuff' => '#ffdab9',
+ 'palegoldenrod' => '#eee8aa',
+ 'khaki' => '#f0e68c',
+ 'darkkhaki' => '#bdb76b',
+ 'yellow' => '#ffff00',
+ 'lawngreen' => '#7cfc00',
+ 'chartreuse' => '#7fff00',
+ 'limegreen' => '#32cd32',
+ 'lime' => '#00ff00',
+ 'forestgreen' => '#228b22',
+ 'green' => '#008000',
+ 'darkgreen' => '#006400',
+ 'greenyellow' => '#adff2f',
+ 'yellowgreen' => '#9acd32',
+ 'springgreen' => '#00ff7f',
+ 'mediumspringgreen' => '#00fa9a',
+ 'lightgreen' => '#90ee90',
+ 'palegreen' => '#98fb98',
+ 'darkseagreen' => '#8fbc8f',
+ 'mediumseagre' => 'en #3cb371',
+ 'seagreen' => '#2e8b57',
+ 'olive' => '#808000',
+ 'darkolivegreen' => '#556b2f',
+ 'olivedrab' => '#6b8e23',
+ 'lightcyan' => '#e0ffff',
+ 'cyan' => '#00ffff',
+ 'aqua' => '#00ffff',
+ 'aquamarine' => '#7fffd4',
+ 'mediumaquamarine' => '#66cdaa',
+ 'paleturquoise' => '#afeeee',
+ 'turquoise' => '#40e0d0',
+ 'mediumturquoise' => '#48d1cc',
+ 'darkturquoise' => '#00ced1',
+ 'lightseagreen' => '#20b2aa',
+ 'cadetblue' => '#5f9ea0',
+ 'darkcyan' => '#008b8b',
+ 'teal' => '#008080',
+ 'powderblue' => '#b0e0e6',
+ 'lightblue' => '#add8e6',
+ 'lightskyblue' => '#87cefa',
+ 'skyblue' => '#87ceeb',
+ 'deepskyblue' => '#00bfff',
+ 'lightsteelblue' => '#b0c4de',
+ 'dodgerblue' => '#1e90ff',
+ 'cornflowerblue' => '#6495ed',
+ 'steelblue' => '#4682b4',
+ 'royalblue' => '#4169e1',
+ 'blue' => '#0000ff',
+ 'mediumblue' => '#0000cd',
+ 'darkblue' => '#00008b',
+ 'navy' => '#000080',
+ 'midnightblue' => '#191970',
+ 'mediumslateblue' => '#7b68ee',
+ 'slateblue' => '#6a5acd',
+ 'darkslateblue' => '#483d8b',
+ 'lavender' => '#e6e6fa',
+ 'thistle' => '#d8bfd8',
+ 'plum' => '#dda0dd',
+ 'violet' => '#ee82ee',
+ 'orchid' => '#da70d6',
+ 'fuchsia' => '#ff00ff',
+ 'magenta' => '#ff00ff',
+ 'mediumorchid' => '#ba55d3',
+ 'mediumpurple' => '#9370db',
+ 'blueviolet' => '#8a2be2',
+ 'darkviolet' => '#9400d3',
+ 'darkorchid' => '#9932cc',
+ 'darkmagenta' => '#8b008b',
+ 'purple' => '#800080',
+ 'indigo' => '#4b0082',
+ 'pink' => '#ffc0cb',
+ 'lightpink' => '#ffb6c1',
+ 'hotpink' => '#ff69b4',
+ 'deeppink' => '#ff1493',
+ 'palevioletred' => '#db7093',
+ 'mediumvioletred' => '#c71585',
+ 'white' => '#ffffff',
+ 'snow' => '#fffafa',
+ 'honeydew' => '#f0fff0',
+ 'mintcream' => '#f5fffa',
+ 'azure' => '#f0ffff',
+ 'aliceblue' => '#f0f8ff',
+ 'ghostwhite' => '#f8f8ff',
+ 'whitesmoke' => '#f5f5f5',
+ 'seashell' => '#fff5ee',
+ 'beige' => '#f5f5dc',
+ 'oldlace' => '#fdf5e6',
+ 'floralwhite' => '#fffaf0',
+ 'ivory' => '#fffff0',
+ 'antiquewhite' => '#faebd7',
+ 'linen' => '#faf0e6',
+ 'lavenderblush' => '#fff0f5',
+ 'mistyrose' => '#ffe4e1',
+ 'gainsboro' => '#dcdcdc',
+ 'lightgray' => '#d3d3d3',
+ 'silver' => '#c0c0c0',
+ 'darkgray' => '#a9a9a9',
+ 'gray' => '#808080',
+ 'dimgray' => '#696969',
+ 'lightslategray' => '#778899',
+ 'slategray' => '#708090',
+ 'darkslategray' => '#2f4f4f',
+ 'black' => '#000000',
+ 'cornsilk' => '#fff8dc',
+ 'blanchedalmond' => '#ffebcd',
+ 'bisque' => '#ffe4c4',
+ 'navajowhite' => '#ffdead',
+ 'wheat' => '#f5deb3',
+ 'burlywood' => '#deb887',
+ 'tan' => '#d2b48c',
+ 'rosybrown' => '#bc8f8f',
+ 'sandybrown' => '#f4a460',
+ 'goldenrod' => '#daa520',
+ 'peru' => '#cd853f',
+ 'chocolate' => '#d2691e',
+ 'saddlebrown' => '#8b4513',
+ 'sienna' => '#a0522d',
+ 'brown' => '#a52a2a',
+ 'maroon' => '#800000',
+ ];
+
+ /**
+ * Decode html color names
+ */
+ public function decode(mixed $input): ImageInterface|ColorInterface
+ {
+ if (!is_string($input)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ if (!array_key_exists(strtolower($input), static::$names)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ return parent::decode(static::$names[strtolower($input)]);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php
new file mode 100755
index 00000000..a2ddb6ca
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php
@@ -0,0 +1,49 @@
+[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)' .
+ '(?:, ?(?P(?:1)|(?:1\.0*)|(?:0)|(?:0?\.\d+%?)|(?:\d{1,3}%)))?\)$/i';
+ if (preg_match($pattern, $input, $matches) != 1) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ // rgb values
+ $values = array_map(function (string $value): int {
+ return match (strpos($value, '%')) {
+ false => intval(trim($value)),
+ default => intval(round(floatval(trim(str_replace('%', '', $value))) / 100 * 255)),
+ };
+ }, [$matches['r'], $matches['g'], $matches['b']]);
+
+ // alpha value
+ if (array_key_exists('a', $matches)) {
+ $values[] = match (true) {
+ strpos($matches['a'], '%') => round(intval(trim(str_replace('%', '', $matches['a']))) / 2.55),
+ default => intval(round(floatval(trim($matches['a'])) * 255)),
+ };
+ }
+
+ return new Color(...$values);
+ }
+}
diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php
new file mode 100755
index 00000000..8d968a66
--- /dev/null
+++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php
@@ -0,0 +1,30 @@
+prepareOptions($options) as $name => $value) {
+ if (!property_exists($this, $name)) {
+ throw new InputException('Property ' . $name . ' does not exists for ' . $this::class . '.');
+ }
+
+ $this->{$name} = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * This method makes it possible to call self::setOptions() with a single
+ * array instead of named parameters
+ *
+ * @param array $options
+ * @return array
+ */
+ private function prepareOptions(array $options): array
+ {
+ if ($options === []) {
+ return $options;
+ }
+
+ if (count($options) > 1) {
+ return $options;
+ }
+
+ if (!array_key_exists(0, $options)) {
+ return $options;
+ }
+
+ if (!is_array($options[0])) {
+ return $options;
+ }
+
+ return $options[0];
+ }
+}
diff --git a/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php b/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php
new file mode 100755
index 00000000..6dffb2b8
--- /dev/null
+++ b/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php
@@ -0,0 +1,12 @@
+ PHP_MAXPATHLEN) {
+ return false;
+ }
+
+ try {
+ if (!@is_file($input)) {
+ return false;
+ }
+ } catch (Exception) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Extract and return EXIF data from given input which can be binary image
+ * data or a file path.
+ *
+ * @return CollectionInterface
+ */
+ protected function extractExifData(string $path_or_data): CollectionInterface
+ {
+ if (!function_exists('exif_read_data')) {
+ return new Collection();
+ }
+
+ try {
+ $source = match (true) {
+ $this->isFile($path_or_data) => $path_or_data, // path
+ default => $this->buildFilePointer($path_or_data), // data
+ };
+
+ // extract exif data
+ $data = @exif_read_data($source, null, true);
+ if (is_resource($source)) {
+ fclose($source);
+ }
+ } catch (Exception) {
+ $data = [];
+ }
+
+ return new Collection(is_array($data) ? $data : []);
+ }
+
+ /**
+ * Determine if given input is base64 encoded data
+ */
+ protected function isValidBase64(mixed $input): bool
+ {
+ if (!is_string($input)) {
+ return false;
+ }
+
+ return base64_encode(base64_decode($input)) === str_replace(["\n", "\r"], '', $input);
+ }
+
+ /**
+ * Parse data uri
+ */
+ protected function parseDataUri(mixed $input): object
+ {
+ $pattern = "/^data:(?P\w+\/[-+.\w]+)?" .
+ "(?P(;[-\w]+=[-\w]+)*)(?P;base64)?,(?P.*)/";
+
+ $result = preg_match($pattern, (string) $input, $matches);
+
+ return new class ($matches, $result)
+ {
+ /**
+ * @param array $matches
+ * @return void
+ */
+ public function __construct(private array $matches, private int|false $result)
+ {
+ //
+ }
+
+ public function isValid(): bool
+ {
+ return (bool) $this->result;
+ }
+
+ public function mediaType(): ?string
+ {
+ if (isset($this->matches['mediatype']) && !empty($this->matches['mediatype'])) {
+ return $this->matches['mediatype'];
+ }
+
+ return null;
+ }
+
+ public function hasMediaType(): bool
+ {
+ return !empty($this->mediaType());
+ }
+
+ public function isBase64Encoded(): bool
+ {
+ return isset($this->matches['base64']) && $this->matches['base64'] === ';base64';
+ }
+
+ public function data(): ?string
+ {
+ if (isset($this->matches['data']) && !empty($this->matches['data'])) {
+ return $this->matches['data'];
+ }
+
+ return null;
+ }
+ };
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/AbstractDriver.php b/vendor/intervention/image/src/Drivers/AbstractDriver.php
new file mode 100755
index 00000000..f5d70240
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/AbstractDriver.php
@@ -0,0 +1,127 @@
+config = new Config();
+ $this->checkHealth();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::config()
+ */
+ public function config(): Config
+ {
+ return $this->config;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::handleInput()
+ */
+ public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface
+ {
+ return InputHandler::withDecoders($decoders, $this)->handle($input);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::specialize()
+ */
+ public function specialize(
+ ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object
+ ): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface {
+ // return object directly if no specializing is possible
+ if (!($object instanceof SpecializableInterface)) {
+ return $object;
+ }
+
+ // return directly and only attach driver if object is already specialized
+ if ($object instanceof SpecializedInterface) {
+ $object->setDriver($this);
+
+ return $object;
+ }
+
+ // resolve classname for specializable object
+ $specialized_classname = implode("\\", [
+ (new ReflectionClass($this))->getNamespaceName(), // driver's namespace
+ match (true) {
+ $object instanceof ModifierInterface => 'Modifiers',
+ $object instanceof AnalyzerInterface => 'Analyzers',
+ $object instanceof EncoderInterface => 'Encoders',
+ $object instanceof DecoderInterface => 'Decoders',
+ },
+ $object_shortname = (new ReflectionClass($object))->getShortName(),
+ ]);
+
+ // fail if driver specialized classname does not exists
+ if (!class_exists($specialized_classname)) {
+ throw new NotSupportedException(
+ "Class '" . $object_shortname . "' is not supported by " . $this->id() . " driver."
+ );
+ }
+
+ // create a driver specialized object with the specializable properties of generic object
+ $specialized = new $specialized_classname(...$object->specializable());
+
+ // attach driver
+ return $specialized->setDriver($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::specializeMultiple()
+ *
+ * @throws NotSupportedException
+ * @throws DriverException
+ */
+ public function specializeMultiple(array $objects): array
+ {
+ return array_map(
+ function (string|object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface {
+ return $this->specialize(
+ match (true) {
+ is_string($object) => new $object(),
+ is_object($object) => $object,
+ }
+ );
+ },
+ $objects
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/AbstractEncoder.php b/vendor/intervention/image/src/Drivers/AbstractEncoder.php
new file mode 100755
index 00000000..747cdcbc
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/AbstractEncoder.php
@@ -0,0 +1,42 @@
+encode($this);
+ }
+
+ /**
+ * Build new file pointer, run callback with it and return result as encoded image
+ *
+ * @throws RuntimeException
+ */
+ protected function createEncodedImage(callable $callback, ?string $mediaType = null): EncodedImage
+ {
+ $pointer = $this->buildFilePointer();
+ $callback($pointer);
+
+ return is_string($mediaType) ? new EncodedImage($pointer, $mediaType) : new EncodedImage($pointer);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php b/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php
new file mode 100755
index 00000000..6d0ae663
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php
@@ -0,0 +1,172 @@
+wrapTextBlock(new TextBlock($text), $font);
+ $pivot = $this->buildPivot($lines, $font, $position);
+
+ $leading = $this->leading($font);
+ $blockWidth = $this->boxSize((string) $lines->longestLine(), $font)->width();
+
+ $x = $pivot->x();
+ $y = $font->hasFilename() ? $pivot->y() + $this->capHeight($font) : $pivot->y();
+ $xAdjustment = 0;
+
+ // adjust line positions according to alignment
+ foreach ($lines as $line) {
+ $lineBoxSize = $this->boxSize((string) $line, $font);
+ $lineWidth = $lineBoxSize->width() + $lineBoxSize->pivot()->x();
+ $xAdjustment = $font->alignment() === 'left' ? 0 : $blockWidth - $lineWidth;
+ $xAdjustment = $font->alignment() === 'right' ? intval(round($xAdjustment)) : $xAdjustment;
+ $xAdjustment = $font->alignment() === 'center' ? intval(round($xAdjustment / 2)) : $xAdjustment;
+ $position = new Point($x + $xAdjustment, $y);
+ $position->rotate($font->angle(), $pivot);
+ $line->setPosition($position);
+ $y += $leading;
+ }
+
+ return $lines;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::nativeFontSize()
+ */
+ public function nativeFontSize(FontInterface $font): float
+ {
+ return $font->size();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::typographicalSize()
+ */
+ public function typographicalSize(FontInterface $font): int
+ {
+ return $this->boxSize('Hy', $font)->height();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::capHeight()
+ */
+ public function capHeight(FontInterface $font): int
+ {
+ return $this->boxSize('T', $font)->height();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::leading()
+ */
+ public function leading(FontInterface $font): int
+ {
+ return intval(round($this->typographicalSize($font) * $font->lineHeight()));
+ }
+
+ /**
+ * Reformat a text block by wrapping each line before the given maximum width
+ *
+ * @throws FontException
+ */
+ protected function wrapTextBlock(TextBlock $block, FontInterface $font): TextBlock
+ {
+ $newLines = [];
+ foreach ($block as $line) {
+ foreach ($this->wrapLine($line, $font) as $newLine) {
+ $newLines[] = $newLine;
+ }
+ }
+
+ return $block->setLines($newLines);
+ }
+
+ /**
+ * Check if a line exceeds the given maximum width and wrap it if necessary.
+ * The output will be an array of formatted lines that are all within the
+ * maximum width.
+ *
+ * @throws FontException
+ * @return array
+ */
+ protected function wrapLine(Line $line, FontInterface $font): array
+ {
+ // no wrap width - no wrapping
+ if (is_null($font->wrapWidth())) {
+ return [$line];
+ }
+
+ $wrapped = [];
+ $formattedLine = new Line();
+
+ foreach ($line as $word) {
+ // calculate width of newly formatted line
+ $lineWidth = $this->boxSize(match ($formattedLine->count()) {
+ 0 => $word,
+ default => $formattedLine . ' ' . $word,
+ }, $font)->width();
+
+ // decide if word fits on current line or a new line must be created
+ if ($line->count() === 1 || $lineWidth <= $font->wrapWidth()) {
+ $formattedLine->add($word);
+ } else {
+ if ($formattedLine->count() !== 0) {
+ $wrapped[] = $formattedLine;
+ }
+ $formattedLine = new Line($word);
+ }
+ }
+
+ $wrapped[] = $formattedLine;
+
+ return $wrapped;
+ }
+
+ /**
+ * Build pivot point of textblock according to the font settings and based on given position
+ *
+ * @throws FontException
+ */
+ protected function buildPivot(TextBlock $block, FontInterface $font, PointInterface $position): PointInterface
+ {
+ // bounding box
+ $box = new Rectangle(
+ $this->boxSize((string) $block->longestLine(), $font)->width(),
+ $this->leading($font) * ($block->count() - 1) + $this->capHeight($font)
+ );
+
+ // set position
+ $box->setPivot($position);
+
+ // alignment
+ $box->align($font->alignment());
+ $box->valign($font->valignment());
+ $box->rotate($font->angle());
+
+ return $box->last();
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/AbstractFrame.php b/vendor/intervention/image/src/Drivers/AbstractFrame.php
new file mode 100755
index 00000000..706ddf52
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/AbstractFrame.php
@@ -0,0 +1,25 @@
+
+ */
+ public function __debugInfo(): array
+ {
+ return [
+ 'delay' => $this->delay(),
+ 'left' => $this->offsetLeft(),
+ 'top' => $this->offsetTop(),
+ 'dispose' => $this->dispose(),
+ ];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php
new file mode 100755
index 00000000..73057f72
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php
@@ -0,0 +1,23 @@
+core()->native());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php
new file mode 100755
index 00000000..80542f3c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php
@@ -0,0 +1,51 @@
+colorAt(
+ $image->colorspace(),
+ $image->core()->frame($this->frame_key)->native()
+ );
+ }
+
+ /**
+ * @throws GeometryException
+ * @throws ColorException
+ */
+ protected function colorAt(ColorspaceInterface $colorspace, GdImage $gd): ColorInterface
+ {
+ $index = @imagecolorat($gd, $this->x, $this->y);
+
+ if (!imageistruecolor($gd)) {
+ $index = imagecolorsforindex($gd, $index);
+ }
+
+ if ($index === false) {
+ throw new GeometryException(
+ 'The specified position is not in the valid image area.'
+ );
+ }
+
+ return $this->driver()->colorProcessor($colorspace)->nativeToColor($index);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php
new file mode 100755
index 00000000..862d41e1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php
@@ -0,0 +1,30 @@
+colorspace();
+
+ foreach ($image as $frame) {
+ $colors->push(
+ parent::colorAt($colorspace, $frame->native())
+ );
+ }
+
+ return $colors;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php
new file mode 100755
index 00000000..93d37f24
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php
@@ -0,0 +1,23 @@
+core()->native()));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php
new file mode 100755
index 00000000..9c6b793b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php
@@ -0,0 +1,22 @@
+core()->native());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Cloner.php b/vendor/intervention/image/src/Drivers/Gd/Cloner.php
new file mode 100755
index 00000000..e8719963
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Cloner.php
@@ -0,0 +1,90 @@
+width(), $size->height());
+
+ // copy resolution to clone
+ $resolution = imageresolution($gd);
+ if (is_array($resolution) && array_key_exists(0, $resolution) && array_key_exists(1, $resolution)) {
+ imageresolution($clone, $resolution[0], $resolution[1]);
+ }
+
+ // fill with background
+ $processor = new ColorProcessor();
+ imagefill($clone, 0, 0, $processor->colorToNative($background));
+ imagealphablending($clone, true);
+ imagesavealpha($clone, true);
+
+ // set background image as transparent if alpha channel value if color is below .5
+ // comes into effect when the end format only supports binary transparency (like GIF)
+ if ($background->channel(Alpha::class)->value() < 128) {
+ imagecolortransparent($clone, $processor->colorToNative($background));
+ }
+
+ return $clone;
+ }
+
+ /**
+ * Create a clone of an GdImage that is positioned on the specified background color.
+ * Possible transparent areas are mixed with this color.
+ *
+ * @throws ColorException
+ */
+ public static function cloneBlended(GdImage $gd, ColorInterface $background): GdImage
+ {
+ // create empty canvas with same size
+ $clone = static::cloneEmpty($gd, background: $background);
+
+ // transfer actual image to clone
+ imagecopy($clone, $gd, 0, 0, 0, 0, imagesx($gd), imagesy($gd));
+
+ return $clone;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php b/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php
new file mode 100755
index 00000000..6d738a4f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php
@@ -0,0 +1,148 @@
+convertTo($this->colorspace);
+
+ // gd only supports rgb so the channels can be accessed directly
+ $r = $color->channel(Red::class)->value();
+ $g = $color->channel(Green::class)->value();
+ $b = $color->channel(Blue::class)->value();
+ $a = $color->channel(Alpha::class)->value();
+
+ // convert alpha value to gd alpha
+ // ([opaque]255-0[transparent]) to ([opaque]0-127[transparent])
+ $a = (int) $this->convertRange($a, 0, 255, 127, 0);
+
+ return ($a << 24) + ($r << 16) + ($g << 8) + $b;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ColorProcessorInterface::nativeToColor()
+ */
+ public function nativeToColor(mixed $value): ColorInterface
+ {
+ if (!is_int($value) && !is_array($value)) {
+ throw new ColorException('GD driver can only decode colors in integer and array format.');
+ }
+
+ if (is_array($value)) {
+ // array conversion
+ if (!$this->isValidArrayColor($value)) {
+ throw new ColorException(
+ 'GD driver can only decode array color format array{red: int, green: int, blue: int, alpha: int}.',
+ );
+ }
+
+ $r = $value['red'];
+ $g = $value['green'];
+ $b = $value['blue'];
+ $a = $value['alpha'];
+ } else {
+ // integer conversion
+ $a = ($value >> 24) & 0xFF;
+ $r = ($value >> 16) & 0xFF;
+ $g = ($value >> 8) & 0xFF;
+ $b = $value & 0xFF;
+ }
+
+ // convert gd apha integer to intervention alpha integer
+ // ([opaque]0-127[transparent]) to ([opaque]255-0[transparent])
+ $a = (int) static::convertRange($a, 127, 0, 0, 255);
+
+ return new Color($r, $g, $b, $a);
+ }
+
+ /**
+ * Convert input in range (min) to (max) to the corresponding value
+ * in target range (targetMin) to (targetMax).
+ */
+ protected function convertRange(
+ float|int $input,
+ float|int $min,
+ float|int $max,
+ float|int $targetMin,
+ float|int $targetMax
+ ): float|int {
+ return ceil(((($input - $min) * ($targetMax - $targetMin)) / ($max - $min)) + $targetMin);
+ }
+
+ /**
+ * Check if given array is valid color format
+ * array{red: int, green: int, blue: int, alpha: int}
+ * i.e. result of imagecolorsforindex()
+ *
+ * @param array $color
+ */
+ private function isValidArrayColor(array $color): bool
+ {
+ if (!array_key_exists('red', $color)) {
+ return false;
+ }
+
+ if (!array_key_exists('green', $color)) {
+ return false;
+ }
+
+ if (!array_key_exists('blue', $color)) {
+ return false;
+ }
+
+ if (!array_key_exists('alpha', $color)) {
+ return false;
+ }
+
+ if (!is_int($color['red'])) {
+ return false;
+ }
+
+ if (!is_int($color['green'])) {
+ return false;
+ }
+
+ if (!is_int($color['blue'])) {
+ return false;
+ }
+
+ if (!is_int($color['alpha'])) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Core.php b/vendor/intervention/image/src/Drivers/Gd/Core.php
new file mode 100755
index 00000000..66424ad1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Core.php
@@ -0,0 +1,117 @@
+push($frame);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::native()
+ */
+ public function native(): mixed
+ {
+ return $this->first()->native();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::setNative()
+ */
+ public function setNative(mixed $native): self
+ {
+ $this->empty()->push(new Frame($native));
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::frame()
+ */
+ public function frame(int $position): FrameInterface
+ {
+ $frame = $this->getAtPosition($position);
+
+ if (!($frame instanceof FrameInterface)) {
+ throw new AnimationException('Frame #' . $position . ' could not be found in the image.');
+ }
+
+ return $frame;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::loops()
+ */
+ public function loops(): int
+ {
+ return $this->loops;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::setLoops()
+ */
+ public function setLoops(int $loops): self
+ {
+ $this->loops = $loops;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::first()
+ */
+ public function first(): FrameInterface
+ {
+ return parent::first();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::last()
+ */
+ public function last(): FrameInterface
+ {
+ return parent::last();
+ }
+
+ /**
+ * Clone instance
+ */
+ public function __clone(): void
+ {
+ foreach ($this->items as $key => $frame) {
+ $this->items[$key] = clone $frame;
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php
new file mode 100755
index 00000000..17e2559e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php
@@ -0,0 +1,57 @@
+isValidBase64($input)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ return parent::decode(base64_decode((string) $input));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php
new file mode 100755
index 00000000..ea199580
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php
@@ -0,0 +1,68 @@
+isGifFormat($input)) {
+ true => $this->decodeGif($input),
+ default => $this->decodeBinary($input),
+ };
+ }
+
+ /**
+ * Decode image from given binary data
+ *
+ * @throws RuntimeException
+ */
+ private function decodeBinary(string $input): ImageInterface
+ {
+ $gd = @imagecreatefromstring($input);
+
+ if ($gd === false) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ // create image instance
+ $image = parent::decode($gd);
+
+ // get media type
+ $mediaType = $this->getMediaTypeByBinary($input);
+
+ // extract & set exif data for appropriate formats
+ if (in_array($mediaType->format(), [Format::JPEG, Format::TIFF])) {
+ $image->setExif($this->extractExifData($input));
+ }
+
+ // set mediaType on origin
+ $image->origin()->setMediaType($mediaType);
+
+ // adjust image orientation
+ if ($this->driver()->config()->autoOrientation) {
+ $image->modify(new AlignRotationModifier());
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php
new file mode 100755
index 00000000..fe3abe6f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php
@@ -0,0 +1,37 @@
+parseDataUri($input);
+
+ if (!$uri->isValid()) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ if ($uri->isBase64Encoded()) {
+ return parent::decode(base64_decode($uri->data()));
+ }
+
+ return parent::decode(urldecode($uri->data()));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php
new file mode 100755
index 00000000..f65d0a5b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php
@@ -0,0 +1,27 @@
+toString());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php
new file mode 100755
index 00000000..bb6ddd5c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php
@@ -0,0 +1,60 @@
+isFile($input)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ // detect media (mime) type
+ $mediaType = $this->getMediaTypeByFilePath($input);
+
+ $image = match ($mediaType->format()) {
+ // gif files might be animated and therefore cannot
+ // be handled by the standard GD decoder.
+ Format::GIF => $this->decodeGif($input),
+ default => parent::decode(match ($mediaType->format()) {
+ Format::JPEG => @imagecreatefromjpeg($input),
+ Format::WEBP => @imagecreatefromwebp($input),
+ Format::PNG => @imagecreatefrompng($input),
+ Format::AVIF => @imagecreatefromavif($input),
+ Format::BMP => @imagecreatefrombmp($input),
+ default => throw new DecoderException('Unable to decode input'),
+ }),
+ };
+
+ // set file path & mediaType on origin
+ $image->origin()->setFilePath($input);
+ $image->origin()->setMediaType($mediaType);
+
+ // extract exif for the appropriate formats
+ if ($mediaType->format() === Format::JPEG) {
+ $image->setExif($this->extractExifData($input));
+ }
+
+ // adjust image orientation
+ if ($this->driver()->config()->autoOrientation) {
+ $image->modify(new AlignRotationModifier());
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php
new file mode 100755
index 00000000..0bf649dc
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php
@@ -0,0 +1,32 @@
+driver(),
+ new Core([
+ new Frame($input)
+ ])
+ );
+ }
+
+ /**
+ * Decode image from given GIF source which can be either a file path or binary data
+ *
+ * Depending on the configuration, this is taken over by the native GD function
+ * or, if animations are required, by our own extended decoder.
+ *
+ * @throws RuntimeException
+ */
+ protected function decodeGif(mixed $input): ImageInterface
+ {
+ // create non-animated image depending on config
+ if (!$this->driver()->config()->decodeAnimation) {
+ $native = match (true) {
+ $this->isGifFormat($input) => @imagecreatefromstring($input),
+ default => @imagecreatefromgif($input),
+ };
+
+ if ($native === false) {
+ throw new DecoderException('Unable to decode input.');
+ }
+
+ $image = self::decode($native);
+ $image->origin()->setMediaType('image/gif');
+
+ return $image;
+ }
+
+ try {
+ // create empty core
+ $core = new Core();
+
+ $gif = GifDecoder::decode($input);
+ $splitter = GifSplitter::create($gif)->split();
+ $delays = $splitter->getDelays();
+
+ // set loops on core
+ if ($loops = $gif->getMainApplicationExtension()?->getLoops()) {
+ $core->setLoops($loops);
+ }
+
+ // add GDImage instances to core
+ foreach ($splitter->coalesceToResources() as $key => $native) {
+ $core->push(
+ new Frame($native, $delays[$key] / 100)
+ );
+ }
+ } catch (Exception $e) {
+ throw new DecoderException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ // create (possibly) animated image
+ $image = new Image($this->driver(), $core);
+
+ // set media type
+ $image->origin()->setMediaType('image/gif');
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php
new file mode 100755
index 00000000..7aee8f58
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php
@@ -0,0 +1,28 @@
+getRealPath());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Driver.php b/vendor/intervention/image/src/Drivers/Gd/Driver.php
new file mode 100755
index 00000000..a0202e11
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Driver.php
@@ -0,0 +1,163 @@
+core->add(
+ $this->driver->handleInput($source)->core()->first()->setDelay($delay)
+ );
+
+ return $this;
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ public function __invoke(): ImageInterface
+ {
+ return new Image(
+ $this->driver,
+ $this->core
+ );
+ }
+ };
+
+ $init($animation);
+
+ return call_user_func($animation);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::colorProcessor()
+ */
+ public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
+ {
+ return new ColorProcessor($colorspace);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::fontProcessor()
+ */
+ public function fontProcessor(): FontProcessorInterface
+ {
+ return new FontProcessor();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::supports()
+ */
+ public function supports(string|Format|FileExtension|MediaType $identifier): bool
+ {
+ return match (Format::tryCreate($identifier)) {
+ Format::JPEG => boolval(imagetypes() & IMG_JPEG),
+ Format::WEBP => boolval(imagetypes() & IMG_WEBP),
+ Format::GIF => boolval(imagetypes() & IMG_GIF),
+ Format::PNG => boolval(imagetypes() & IMG_PNG),
+ Format::AVIF => boolval(imagetypes() & IMG_AVIF),
+ Format::BMP => boolval(imagetypes() & IMG_BMP),
+ default => false,
+ };
+ }
+
+ /**
+ * Return version of GD library
+ */
+ public static function version(): string
+ {
+ return gd_info()['GD Version'];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php
new file mode 100755
index 00000000..8b642719
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php
@@ -0,0 +1,25 @@
+createEncodedImage(function ($pointer) use ($image): void {
+ imageavif($image->core()->native(), $pointer, $this->quality);
+ }, 'image/avif');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php
new file mode 100755
index 00000000..1bb34c2c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php
@@ -0,0 +1,25 @@
+createEncodedImage(function ($pointer) use ($image): void {
+ imagebmp($image->core()->native(), $pointer, false);
+ }, 'image/bmp');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php
new file mode 100755
index 00000000..29d97ecc
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php
@@ -0,0 +1,64 @@
+isAnimated()) {
+ return $this->encodeAnimated($image);
+ }
+
+ $gd = Cloner::clone($image->core()->native());
+
+ return $this->createEncodedImage(function ($pointer) use ($gd): void {
+ imageinterlace($gd, $this->interlaced);
+ imagegif($gd, $pointer);
+ }, 'image/gif');
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ protected function encodeAnimated(ImageInterface $image): EncodedImage
+ {
+ try {
+ $builder = GifBuilder::canvas(
+ $image->width(),
+ $image->height()
+ );
+
+ foreach ($image as $frame) {
+ $builder->addFrame(
+ source: $this->encode($frame->toImage($image->driver()))->toFilePointer(),
+ delay: $frame->delay(),
+ interlaced: $this->interlaced
+ );
+ }
+
+ $builder->setLoops($image->loops());
+
+ return new EncodedImage($builder->encode(), 'image/gif');
+ } catch (Exception $e) {
+ throw new EncoderException($e->getMessage(), $e->getCode(), $e);
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php
new file mode 100755
index 00000000..0e3ecb88
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php
@@ -0,0 +1,36 @@
+driver()->handleInput(
+ $this->driver()->config()->blendingColor
+ );
+
+ $output = Cloner::cloneBlended(
+ $image->core()->native(),
+ background: $blendingColor
+ );
+
+ return $this->createEncodedImage(function ($pointer) use ($output): void {
+ imageinterlace($output, $this->progressive);
+ imagejpeg($output, $pointer, $this->quality);
+ }, 'image/jpeg');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php
new file mode 100755
index 00000000..fc58e9f0
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php
@@ -0,0 +1,52 @@
+prepareOutput($image);
+
+ return $this->createEncodedImage(function ($pointer) use ($output): void {
+ imageinterlace($output, $this->interlaced);
+ imagepng($output, $pointer, -1);
+ }, 'image/png');
+ }
+
+ /**
+ * Prepare given image instance for PNG format output according to encoder settings
+ *
+ * @throws RuntimeException
+ * @throws ColorException
+ * @throws AnimationException
+ */
+ private function prepareOutput(ImageInterface $image): GdImage
+ {
+ if ($this->indexed) {
+ $output = clone $image;
+ $output->reduceColors(255);
+
+ return $output->core()->native();
+ }
+
+ return Cloner::clone($image->core()->native());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php
new file mode 100755
index 00000000..076c9155
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php
@@ -0,0 +1,27 @@
+quality === 100 && defined('IMG_WEBP_LOSSLESS') ? IMG_WEBP_LOSSLESS : $this->quality;
+
+ return $this->createEncodedImage(function ($pointer) use ($image, $quality): void {
+ imagewebp($image->core()->native(), $pointer, $quality);
+ }, 'image/webp');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php b/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php
new file mode 100755
index 00000000..cedad439
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php
@@ -0,0 +1,107 @@
+hasFilename()) {
+ // calculate box size from gd font
+ $box = new Rectangle(0, 0);
+ $chars = mb_strlen($text);
+ if ($chars > 0) {
+ $box->setWidth(
+ $chars * $this->gdCharacterWidth((int) $font->filename())
+ );
+ $box->setHeight(
+ $this->gdCharacterHeight((int) $font->filename())
+ );
+ }
+ return $box;
+ }
+
+ // build full path to font file to make sure to pass absolute path to imageftbbox()
+ // because of issues with different GD version behaving differently when passing
+ // relative paths to imageftbbox()
+ $fontPath = realpath($font->filename());
+ if ($fontPath === false) {
+ throw new FontException('Font file ' . $font->filename() . ' does not exist.');
+ }
+
+ // calculate box size from ttf font file with angle 0
+ $box = imageftbbox(
+ size: $this->nativeFontSize($font),
+ angle: 0,
+ font_filename: $fontPath,
+ string: $text,
+ );
+
+ if ($box === false) {
+ throw new FontException('Unable to calculate box size of font ' . $font->filename() . '.');
+ }
+
+ // build size from points
+ return new Rectangle(
+ width: intval(abs($box[6] - $box[4])), // difference of upper-left-x and upper-right-x
+ height: intval(abs($box[7] - $box[1])), // difference if upper-left-y and lower-left-y
+ pivot: new Point($box[6], $box[7]), // position of upper-left corner
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::nativeFontSize()
+ */
+ public function nativeFontSize(FontInterface $font): float
+ {
+ return floatval(round($font->size() * .76, 6));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FontProcessorInterface::leading()
+ */
+ public function leading(FontInterface $font): int
+ {
+ return (int) round(parent::leading($font) * .8);
+ }
+
+ /**
+ * Return width of a single character
+ */
+ protected function gdCharacterWidth(int $gdfont): int
+ {
+ return $gdfont + 4;
+ }
+
+ /**
+ * Return height of a single character
+ */
+ protected function gdCharacterHeight(int $gdfont): int
+ {
+ return match ($gdfont) {
+ 2, 3 => 14,
+ 4, 5 => 16,
+ default => 8,
+ };
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Frame.php b/vendor/intervention/image/src/Drivers/Gd/Frame.php
new file mode 100755
index 00000000..e344f53f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Frame.php
@@ -0,0 +1,193 @@
+native = $native;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::native()
+ */
+ public function native(): GdImage
+ {
+ return $this->native;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::size()
+ */
+ public function size(): SizeInterface
+ {
+ return new Rectangle(imagesx($this->native), imagesy($this->native));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::delay()
+ */
+ public function delay(): float
+ {
+ return $this->delay;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::setDelay()
+ */
+ public function setDelay(float $delay): FrameInterface
+ {
+ $this->delay = $delay;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::dispose()
+ */
+ public function dispose(): int
+ {
+ return $this->dispose;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::setDispose()
+ *
+ * @throws InputException
+ */
+ public function setDispose(int $dispose): FrameInterface
+ {
+ if (!in_array($dispose, [0, 1, 2, 3])) {
+ throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.');
+ }
+
+ $this->dispose = $dispose;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::setOffset()
+ */
+ public function setOffset(int $left, int $top): FrameInterface
+ {
+ $this->offset_left = $left;
+ $this->offset_top = $top;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::offsetLeft()
+ */
+ public function offsetLeft(): int
+ {
+ return $this->offset_left;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::setOffsetLeft()
+ */
+ public function setOffsetLeft(int $offset): FrameInterface
+ {
+ $this->offset_left = $offset;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::offsetTop()
+ */
+ public function offsetTop(): int
+ {
+ return $this->offset_top;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FrameInterface::setOffsetTop()
+ */
+ public function setOffsetTop(int $offset): FrameInterface
+ {
+ $this->offset_top = $offset;
+
+ return $this;
+ }
+
+ /**
+ * This workaround helps cloning GdImages which is currently not possible.
+ *
+ * @throws ColorException
+ */
+ public function __clone(): void
+ {
+ $this->native = Cloner::clone($this->native);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php
new file mode 100755
index 00000000..4e453378
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php
@@ -0,0 +1,52 @@
+exif('IFD0.Orientation')) {
+ 2 => $image->flop(),
+ 3 => $image->rotate(180),
+ 4 => $image->rotate(180)->flop(),
+ 5 => $image->rotate(270)->flop(),
+ 6 => $image->rotate(270),
+ 7 => $image->rotate(90)->flop(),
+ 8 => $image->rotate(90),
+ default => $image
+ };
+
+ return $this->markAligned($image);
+ }
+
+ /**
+ * Set exif data of image to top-left orientation, marking the image as
+ * aligned and making sure the rotation correction process is not
+ * performed again.
+ */
+ private function markAligned(ImageInterface $image): ImageInterface
+ {
+ $exif = $image->exif()->map(function ($item) {
+ if (is_array($item) && array_key_exists('Orientation', $item)) {
+ $item['Orientation'] = 1;
+ return $item;
+ }
+
+ return $item;
+ });
+
+ return $image->setExif($exif);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php
new file mode 100755
index 00000000..861d11cb
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php
@@ -0,0 +1,36 @@
+blendingColor($this->driver());
+
+ foreach ($image as $frame) {
+ // create new canvas with blending color as background
+ $modified = Cloner::cloneBlended(
+ $frame->native(),
+ background: $blendingColor
+ );
+
+ // set new gd image
+ $frame->setNative($modified);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php
new file mode 100755
index 00000000..14fe41a4
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php
@@ -0,0 +1,28 @@
+amount; $i++) {
+ imagefilter($frame->native(), IMG_FILTER_GAUSSIAN_BLUR);
+ }
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php
new file mode 100755
index 00000000..022c679a
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FILTER_BRIGHTNESS, intval($this->level * 2.55));
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php
new file mode 100755
index 00000000..c753e438
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php
@@ -0,0 +1,31 @@
+red * 2.55);
+ $green = (int) round($this->green * 2.55);
+ $blue = (int) round($this->blue * 2.55);
+
+ foreach ($image as $frame) {
+ imagefilter($frame->native(), IMG_FILTER_COLORIZE, $red, $green, $blue);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php
new file mode 100755
index 00000000..2065a155
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php
@@ -0,0 +1,30 @@
+targetColorspace() instanceof RgbColorspace)) {
+ throw new NotSupportedException(
+ 'Only RGB colorspace is supported by GD driver.'
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php
new file mode 100755
index 00000000..8462e8ef
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php
@@ -0,0 +1,93 @@
+getCropSize($image);
+ $resize = $this->getResizeSize($image);
+ $background = $this->driver()->handleInput($this->background);
+ $blendingColor = $this->driver()->handleInput(
+ $this->driver()->config()->blendingColor
+ );
+
+ foreach ($image as $frame) {
+ $this->modify($frame, $crop, $resize, $background, $blendingColor);
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function modify(
+ FrameInterface $frame,
+ SizeInterface $crop,
+ SizeInterface $resize,
+ ColorInterface $background,
+ ColorInterface $blendingColor
+ ): void {
+ // create new gd image
+ $modified = Cloner::cloneEmpty($frame->native(), $resize, $background);
+
+ // make image area transparent to keep transparency
+ // even if background-color is set
+ $transparent = imagecolorallocatealpha(
+ $modified,
+ $blendingColor->channel(Red::class)->value(),
+ $blendingColor->channel(Green::class)->value(),
+ $blendingColor->channel(Blue::class)->value(),
+ 127,
+ );
+ imagealphablending($modified, false); // do not blend / just overwrite
+ imagecolortransparent($modified, $transparent);
+ imagefilledrectangle(
+ $modified,
+ $crop->pivot()->x(),
+ $crop->pivot()->y(),
+ $crop->pivot()->x() + $crop->width() - 1,
+ $crop->pivot()->y() + $crop->height() - 1,
+ $transparent
+ );
+
+ // copy image from original with blending alpha
+ imagealphablending($modified, true);
+ imagecopyresampled(
+ $modified,
+ $frame->native(),
+ $crop->pivot()->x(),
+ $crop->pivot()->y(),
+ 0,
+ 0,
+ $crop->width(),
+ $crop->height(),
+ $frame->size()->width(),
+ $frame->size()->height()
+ );
+
+ // set new content as resource
+ $frame->setNative($modified);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php
new file mode 100755
index 00000000..7a0ac6b8
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FILTER_CONTRAST, ($this->level * -1));
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php
new file mode 100755
index 00000000..ac1cec11
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php
@@ -0,0 +1,19 @@
+resizeDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php
new file mode 100755
index 00000000..e676e663
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php
@@ -0,0 +1,59 @@
+getCropSize($image);
+ $resize = $this->getResizeSize($crop);
+
+ foreach ($image as $frame) {
+ $this->modifyFrame($frame, $crop, $resize);
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function modifyFrame(FrameInterface $frame, SizeInterface $crop, SizeInterface $resize): void
+ {
+ // create new image
+ $modified = Cloner::cloneEmpty($frame->native(), $resize);
+
+ // copy content from resource
+ imagecopyresampled(
+ $modified,
+ $frame->native(),
+ 0,
+ 0,
+ $crop->pivot()->x(),
+ $crop->pivot()->y(),
+ $resize->width(),
+ $resize->height(),
+ $crop->width(),
+ $crop->height()
+ );
+
+ // set new content as resource
+ $frame->setNative($modified);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php
new file mode 100755
index 00000000..c1ea4825
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php
@@ -0,0 +1,78 @@
+size();
+ $crop = $this->crop($image);
+ $background = $this->driver()->handleInput($this->background);
+
+ foreach ($image as $frame) {
+ $this->cropFrame($frame, $originalSize, $crop, $background);
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function cropFrame(
+ FrameInterface $frame,
+ SizeInterface $originalSize,
+ SizeInterface $resizeTo,
+ ColorInterface $background
+ ): void {
+ // create new image with transparent background
+ $modified = Cloner::cloneEmpty($frame->native(), $resizeTo, $background);
+
+ // define offset
+ $offset_x = $resizeTo->pivot()->x() + $this->offset_x;
+ $offset_y = $resizeTo->pivot()->y() + $this->offset_y;
+
+ // define target width & height
+ $targetWidth = min($resizeTo->width(), $originalSize->width());
+ $targetHeight = min($resizeTo->height(), $originalSize->height());
+ $targetWidth = $targetWidth < $originalSize->width() ? $targetWidth + $offset_x : $targetWidth;
+ $targetHeight = $targetHeight < $originalSize->height() ? $targetHeight + $offset_y : $targetHeight;
+
+ // don't alpha blend for copy operation to keep transparent areas of original image
+ imagealphablending($modified, false);
+
+ // copy content from resource
+ imagecopyresampled(
+ $modified,
+ $frame->native(),
+ $offset_x * -1,
+ $offset_y * -1,
+ 0,
+ 0,
+ $targetWidth,
+ $targetHeight,
+ $targetWidth,
+ $targetHeight
+ );
+
+ // set new content as resource
+ $frame->setNative($modified);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php
new file mode 100755
index 00000000..768d6f85
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php
@@ -0,0 +1,234 @@
+drawable->count() !== 3 && $this->drawable->count() !== 4) {
+ throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve');
+ }
+
+ [$polygon, $polygon_border_segments] = $this->calculateBezierPoints();
+
+ if ($this->drawable->hasBackgroundColor() || $this->drawable->hasBorder()) {
+ imagealphablending($frame->native(), true);
+ imageantialias($frame->native(), true);
+ }
+
+ if ($this->drawable->hasBackgroundColor()) {
+ $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+
+ imagesetthickness($frame->native(), 0);
+ imagefilledpolygon(
+ $frame->native(),
+ $polygon,
+ $background_color
+ );
+ }
+
+ if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) {
+ $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ );
+
+ if ($this->drawable->borderSize() === 1) {
+ imagesetthickness($frame->native(), $this->drawable->borderSize());
+
+ $count = count($polygon);
+ for ($i = 0; $i < $count; $i += 2) {
+ if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) {
+ imageline(
+ $frame->native(),
+ $polygon[$i],
+ $polygon[$i + 1],
+ $polygon[$i + 2],
+ $polygon[$i + 3],
+ $border_color
+ );
+ }
+ }
+ } else {
+ $polygon_border_segments_total = count($polygon_border_segments);
+
+ for ($i = 0; $i < $polygon_border_segments_total; $i += 1) {
+ imagefilledpolygon(
+ $frame->native(),
+ $polygon_border_segments[$i],
+ $border_color
+ );
+ }
+ }
+ }
+ }
+
+ return $image;
+ }
+
+ /**
+ * Calculate interpolation points for quadratic beziers using the Bernstein polynomial form
+ *
+ * @return array{'x': float, 'y': float}
+ */
+ private function calculateQuadraticBezierInterpolationPoint(float $t = 0.05): array
+ {
+ $remainder = 1 - $t;
+ $control_point_1_multiplier = $remainder * $remainder;
+ $control_point_2_multiplier = $remainder * $t * 2;
+ $control_point_3_multiplier = $t * $t;
+
+ $x = (
+ $this->drawable->first()->x() * $control_point_1_multiplier +
+ $this->drawable->second()->x() * $control_point_2_multiplier +
+ $this->drawable->last()->x() * $control_point_3_multiplier
+ );
+ $y = (
+ $this->drawable->first()->y() * $control_point_1_multiplier +
+ $this->drawable->second()->y() * $control_point_2_multiplier +
+ $this->drawable->last()->y() * $control_point_3_multiplier
+ );
+
+ return ['x' => $x, 'y' => $y];
+ }
+
+ /**
+ * Calculate interpolation points for cubic beziers using the Bernstein polynomial form
+ *
+ * @return array{'x': float, 'y': float}
+ */
+ private function calculateCubicBezierInterpolationPoint(float $t = 0.05): array
+ {
+ $remainder = 1 - $t;
+ $t_squared = $t * $t;
+ $remainder_squared = $remainder * $remainder;
+ $control_point_1_multiplier = $remainder_squared * $remainder;
+ $control_point_2_multiplier = $remainder_squared * $t * 3;
+ $control_point_3_multiplier = $t_squared * $remainder * 3;
+ $control_point_4_multiplier = $t_squared * $t;
+
+ $x = (
+ $this->drawable->first()->x() * $control_point_1_multiplier +
+ $this->drawable->second()->x() * $control_point_2_multiplier +
+ $this->drawable->third()->x() * $control_point_3_multiplier +
+ $this->drawable->last()->x() * $control_point_4_multiplier
+ );
+ $y = (
+ $this->drawable->first()->y() * $control_point_1_multiplier +
+ $this->drawable->second()->y() * $control_point_2_multiplier +
+ $this->drawable->third()->y() * $control_point_3_multiplier +
+ $this->drawable->last()->y() * $control_point_4_multiplier
+ );
+
+ return ['x' => $x, 'y' => $y];
+ }
+
+ /**
+ * Calculate the points needed to draw a quadratic or cubic bezier with optional border/stroke
+ *
+ * @throws GeometryException
+ * @return array{0: array, 1: array}
+ */
+ private function calculateBezierPoints(): array
+ {
+ if ($this->drawable->count() !== 3 && $this->drawable->count() !== 4) {
+ throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve');
+ }
+
+ $polygon = [];
+ $inner_polygon = [];
+ $outer_polygon = [];
+ $polygon_border_segments = [];
+
+ // define ratio t; equivalent to 5 percent distance along edge
+ $t = 0.05;
+
+ $polygon[] = $this->drawable->first()->x();
+ $polygon[] = $this->drawable->first()->y();
+ for ($i = $t; $i < 1; $i += $t) {
+ if ($this->drawable->count() === 3) {
+ $ip = $this->calculateQuadraticBezierInterpolationPoint($i);
+ } elseif ($this->drawable->count() === 4) {
+ $ip = $this->calculateCubicBezierInterpolationPoint($i);
+ }
+ $polygon[] = (int) $ip['x'];
+ $polygon[] = (int) $ip['y'];
+ }
+ $polygon[] = $this->drawable->last()->x();
+ $polygon[] = $this->drawable->last()->y();
+
+ if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 1) {
+ // create the border/stroke effect by calculating two new curves with offset positions
+ // from the main polygon and then connecting the inner/outer curves to create separate
+ // 4-point polygon segments
+ $polygon_total_points = count($polygon);
+ $offset = ($this->drawable->borderSize() / 2);
+
+ for ($i = 0; $i < $polygon_total_points; $i += 2) {
+ if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) {
+ $dx = $polygon[$i + 2] - $polygon[$i];
+ $dy = $polygon[$i + 3] - $polygon[$i + 1];
+ $dxy_sqrt = ($dx * $dx + $dy * $dy) ** 0.5;
+
+ // inner polygon
+ $scale = $offset / $dxy_sqrt;
+ $ox = -$dy * $scale;
+ $oy = $dx * $scale;
+
+ $inner_polygon[] = $ox + $polygon[$i];
+ $inner_polygon[] = $oy + $polygon[$i + 1];
+ $inner_polygon[] = $ox + $polygon[$i + 2];
+ $inner_polygon[] = $oy + $polygon[$i + 3];
+
+ // outer polygon
+ $scale = -$offset / $dxy_sqrt;
+ $ox = -$dy * $scale;
+ $oy = $dx * $scale;
+
+ $outer_polygon[] = $ox + $polygon[$i];
+ $outer_polygon[] = $oy + $polygon[$i + 1];
+ $outer_polygon[] = $ox + $polygon[$i + 2];
+ $outer_polygon[] = $oy + $polygon[$i + 3];
+ }
+ }
+
+ $inner_polygon_total_points = count($inner_polygon);
+
+ for ($i = 0; $i < $inner_polygon_total_points; $i += 2) {
+ if (array_key_exists($i + 2, $inner_polygon) && array_key_exists($i + 3, $inner_polygon)) {
+ $polygon_border_segments[] = [
+ $inner_polygon[$i],
+ $inner_polygon[$i + 1],
+ $outer_polygon[$i],
+ $outer_polygon[$i + 1],
+ $outer_polygon[$i + 2],
+ $outer_polygon[$i + 3],
+ $inner_polygon[$i + 2],
+ $inner_polygon[$i + 3],
+ ];
+ }
+ }
+ }
+
+ return [$polygon, $polygon_border_segments];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php
new file mode 100755
index 00000000..4c4f6696
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php
@@ -0,0 +1,78 @@
+drawable->hasBorder()) {
+ imagealphablending($frame->native(), true);
+
+ // slightly smaller ellipse to keep 1px bordered edges clean
+ if ($this->drawable->hasBackgroundColor()) {
+ imagefilledellipse(
+ $frame->native(),
+ $this->drawable()->position()->x(),
+ $this->drawable->position()->y(),
+ $this->drawable->width() - 1,
+ $this->drawable->height() - 1,
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ )
+ );
+ }
+
+ // gd's imageellipse ignores imagesetthickness
+ // so i use imagearc with 360 degrees instead.
+ imagesetthickness(
+ $frame->native(),
+ $this->drawable->borderSize(),
+ );
+
+ imagearc(
+ $frame->native(),
+ $this->drawable()->position()->x(),
+ $this->drawable()->position()->y(),
+ $this->drawable->width(),
+ $this->drawable->height(),
+ 0,
+ 360,
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ )
+ );
+ } else {
+ imagealphablending($frame->native(), true);
+ imagesetthickness($frame->native(), 0);
+ imagefilledellipse(
+ $frame->native(),
+ $this->drawable()->position()->x(),
+ $this->drawable()->position()->y(),
+ $this->drawable->width(),
+ $this->drawable->height(),
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ )
+ );
+ }
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php
new file mode 100755
index 00000000..ccf6974f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php
@@ -0,0 +1,39 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+
+ foreach ($image as $frame) {
+ imagealphablending($frame->native(), true);
+ imageantialias($frame->native(), true);
+ imagesetthickness($frame->native(), $this->drawable->width());
+ imageline(
+ $frame->native(),
+ $this->drawable->start()->x(),
+ $this->drawable->start()->y(),
+ $this->drawable->end()->x(),
+ $this->drawable->end()->y(),
+ $color
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php
new file mode 100755
index 00000000..9fc954cd
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php
@@ -0,0 +1,36 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->color)
+ );
+
+ foreach ($image as $frame) {
+ imagealphablending($frame->native(), true);
+ imagesetpixel(
+ $frame->native(),
+ $this->position->x(),
+ $this->position->y(),
+ $color
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php
new file mode 100755
index 00000000..c0cc77b1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php
@@ -0,0 +1,51 @@
+drawable->hasBackgroundColor()) {
+ imagealphablending($frame->native(), true);
+ imagesetthickness($frame->native(), 0);
+ imagefilledpolygon(
+ $frame->native(),
+ $this->drawable->toArray(),
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ )
+ );
+ }
+
+ if ($this->drawable->hasBorder()) {
+ imagealphablending($frame->native(), true);
+ imagesetthickness($frame->native(), $this->drawable->borderSize());
+ imagepolygon(
+ $frame->native(),
+ $this->drawable->toArray(),
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ )
+ );
+ }
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php
new file mode 100755
index 00000000..f4a2d790
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php
@@ -0,0 +1,61 @@
+drawable->position();
+
+ foreach ($image as $frame) {
+ // draw background
+ if ($this->drawable->hasBackgroundColor()) {
+ imagealphablending($frame->native(), true);
+ imagesetthickness($frame->native(), 0);
+ imagefilledrectangle(
+ $frame->native(),
+ $position->x(),
+ $position->y(),
+ $position->x() + $this->drawable->width(),
+ $position->y() + $this->drawable->height(),
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ )
+ );
+ }
+
+ // draw border
+ if ($this->drawable->hasBorder()) {
+ imagealphablending($frame->native(), true);
+ imagesetthickness($frame->native(), $this->drawable->borderSize());
+ imagerectangle(
+ $frame->native(),
+ $position->x(),
+ $position->y(),
+ $position->x() + $this->drawable->width(),
+ $position->y() + $this->drawable->height(),
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ )
+ );
+ }
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php
new file mode 100755
index 00000000..412f8059
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php
@@ -0,0 +1,67 @@
+color($image);
+
+ foreach ($image as $frame) {
+ if ($this->hasPosition()) {
+ $this->floodFillWithColor($frame, $color);
+ } else {
+ $this->fillAllWithColor($frame, $color);
+ }
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ private function color(ImageInterface $image): int
+ {
+ return $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->color)
+ );
+ }
+
+ private function floodFillWithColor(FrameInterface $frame, int $color): void
+ {
+ imagefill(
+ $frame->native(),
+ $this->position->x(),
+ $this->position->y(),
+ $color
+ );
+ }
+
+ private function fillAllWithColor(FrameInterface $frame, int $color): void
+ {
+ imagealphablending($frame->native(), true);
+ imagefilledrectangle(
+ $frame->native(),
+ 0,
+ 0,
+ $frame->size()->width() - 1,
+ $frame->size()->height() - 1,
+ $color
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php
new file mode 100755
index 00000000..0107200a
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FLIP_VERTICAL);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php
new file mode 100755
index 00000000..70331754
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FLIP_HORIZONTAL);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php
new file mode 100755
index 00000000..8da6499e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php
@@ -0,0 +1,26 @@
+native(), 1, $this->gamma);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php
new file mode 100755
index 00000000..a1cf280a
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FILTER_GRAYSCALE);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php
new file mode 100755
index 00000000..e2c8dc67
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FILTER_NEGATE);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php
new file mode 100755
index 00000000..52a6acb0
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php
@@ -0,0 +1,24 @@
+size()
+ ->containMax(
+ $this->width,
+ $this->height
+ )
+ ->alignPivotTo(
+ $this->getResizeSize($image),
+ $this->position
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php
new file mode 100755
index 00000000..ecbe3e58
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php
@@ -0,0 +1,26 @@
+native(), IMG_FILTER_PIXELATE, $this->size, true);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php
new file mode 100755
index 00000000..44333c74
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php
@@ -0,0 +1,111 @@
+driver()->handleInput($this->element);
+ $position = $this->getPosition($image, $watermark);
+
+ foreach ($image as $frame) {
+ imagealphablending($frame->native(), true);
+
+ if ($this->opacity === 100) {
+ $this->placeOpaque($frame, $watermark, $position);
+ } else {
+ $this->placeTransparent($frame, $watermark, $position);
+ }
+ }
+
+ return $image;
+ }
+
+ /**
+ * Insert watermark with 100% opacity
+ *
+ * @throws RuntimeException
+ */
+ private function placeOpaque(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void
+ {
+ imagecopy(
+ $frame->native(),
+ $watermark->core()->native(),
+ $position->x(),
+ $position->y(),
+ 0,
+ 0,
+ $watermark->width(),
+ $watermark->height()
+ );
+ }
+
+ /**
+ * Insert watermark transparent with current opacity
+ *
+ * Unfortunately, the original PHP function imagecopymerge does not work reliably.
+ * For example, any transparency of the image to be inserted is not applied correctly.
+ * For this reason, a new GDImage is created into which the original image is inserted
+ * in the first step and the watermark is inserted with 100% opacity in the second
+ * step. This combination is then transferred to the original image again with the
+ * respective opacity.
+ *
+ * Please note: Unfortunately, there is still an edge case, when a transparent image
+ * is placed on a transparent background, the "double" transparent areas appear opaque!
+ *
+ * @throws RuntimeException
+ */
+ private function placeTransparent(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void
+ {
+ $cut = imagecreatetruecolor($watermark->width(), $watermark->height());
+
+ imagecopy(
+ $cut,
+ $frame->native(),
+ 0,
+ 0,
+ $position->x(),
+ $position->y(),
+ imagesx($cut),
+ imagesy($cut)
+ );
+
+ imagecopy(
+ $cut,
+ $watermark->core()->native(),
+ 0,
+ 0,
+ 0,
+ 0,
+ imagesx($cut),
+ imagesy($cut)
+ );
+
+ imagecopymerge(
+ $frame->native(),
+ $cut,
+ $position->x(),
+ $position->y(),
+ 0,
+ 0,
+ $watermark->width(),
+ $watermark->height(),
+ $this->opacity
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php
new file mode 100755
index 00000000..a862395b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php
@@ -0,0 +1,25 @@
+limit <= 0) {
+ throw new InputException('Quantization limit must be greater than 0.');
+ }
+
+ // no color reduction if the limit is higher than the colors in the img
+ $colorCount = imagecolorstotal($image->core()->native());
+ if ($colorCount > 0 && $this->limit > $colorCount) {
+ return $image;
+ }
+
+ $width = $image->width();
+ $height = $image->height();
+
+ $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->background)
+ );
+
+ $blendingColor = $this->driver()->handleInput(
+ $this->driver()->config()->blendingColor
+ );
+
+ foreach ($image as $frame) {
+ // create new image for color quantization
+ $reduced = Cloner::cloneEmpty($frame->native(), background: $blendingColor);
+
+ // fill with background
+ imagefill($reduced, 0, 0, $background);
+
+ // set transparency
+ imagecolortransparent($reduced, $background);
+
+ // copy original image (colors are limited automatically in the copy process)
+ imagecopy($reduced, $frame->native(), 0, 0, 0, 0, $width, $height);
+
+ // gd library does not support color quantization directly therefore the
+ // colors are decrease by transforming the image to a palette version
+ imagetruecolortopalette($reduced, true, $this->limit);
+
+ $frame->setNative($reduced);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php
new file mode 100755
index 00000000..2ef1d89a
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php
@@ -0,0 +1,26 @@
+core()->setNative(
+ $this->selectedFrame($image)->native()
+ );
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php
new file mode 100755
index 00000000..7f73cc73
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php
@@ -0,0 +1,32 @@
+cropSize($image);
+
+ $image->modify(new CropModifier(
+ $cropSize->width(),
+ $cropSize->height(),
+ $cropSize->pivot()->x(),
+ $cropSize->pivot()->y(),
+ $this->background,
+ ));
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php
new file mode 100755
index 00000000..53e375ff
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php
@@ -0,0 +1,16 @@
+size()->resizeDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php
new file mode 100755
index 00000000..cfaa295d
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php
@@ -0,0 +1,70 @@
+getAdjustedSize($image);
+ foreach ($image as $frame) {
+ $this->resizeFrame($frame, $resizeTo);
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws ColorException
+ */
+ private function resizeFrame(FrameInterface $frame, SizeInterface $resizeTo): void
+ {
+ // create empty canvas in target size
+ $modified = Cloner::cloneEmpty($frame->native(), $resizeTo);
+
+ // copy content from resource
+ imagecopyresampled(
+ $modified,
+ $frame->native(),
+ $resizeTo->pivot()->x(),
+ $resizeTo->pivot()->y(),
+ 0,
+ 0,
+ $resizeTo->width(),
+ $resizeTo->height(),
+ $frame->size()->width(),
+ $frame->size()->height()
+ );
+
+ // set new content as resource
+ $frame->setNative($modified);
+ }
+
+ /**
+ * Return the size the modifier will resize to
+ *
+ * @throws RuntimeException
+ * @throws GeometryException
+ */
+ protected function getAdjustedSize(ImageInterface $image): SizeInterface
+ {
+ return $image->size()->resize($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php
new file mode 100755
index 00000000..d6fd504c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php
@@ -0,0 +1,29 @@
+x));
+ $y = intval(round($this->y));
+
+ foreach ($image as $frame) {
+ imageresolution($frame->native(), $x, $y);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php
new file mode 100755
index 00000000..4db07502
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php
@@ -0,0 +1,106 @@
+driver()->handleInput($this->background);
+
+ foreach ($image as $frame) {
+ $this->modifyFrame($frame, $background);
+ }
+
+ return $image;
+ }
+
+ /**
+ * Apply rotation modification on given frame, given background
+ * color is used for newly create image areas
+ *
+ * @throws ColorException
+ */
+ protected function modifyFrame(FrameInterface $frame, ColorInterface $background): void
+ {
+ // get transparent color from frame core
+ $transparent = match ($transparent = imagecolortransparent($frame->native())) {
+ -1 => imagecolorallocatealpha(
+ $frame->native(),
+ $background->channel(Red::class)->value(),
+ $background->channel(Green::class)->value(),
+ $background->channel(Blue::class)->value(),
+ 127
+ ),
+ default => $transparent,
+ };
+
+ // rotate original image against transparent background
+ $rotated = imagerotate(
+ $frame->native(),
+ $this->rotationAngle(),
+ $transparent
+ );
+
+ // create size from original after rotation
+ $container = (new Rectangle(
+ imagesx($rotated),
+ imagesy($rotated),
+ ))->movePivot('center');
+
+ // create size from original and rotate points
+ $cutout = (new Rectangle(
+ imagesx($frame->native()),
+ imagesy($frame->native()),
+ $container->pivot()
+ ))->align('center')
+ ->valign('center')
+ ->rotate($this->rotationAngle() * -1);
+
+ // create new gd image
+ $modified = Cloner::cloneEmpty($frame->native(), $container, $background);
+
+ // draw the cutout on new gd image to have a transparent
+ // background where the rotated image will be placed
+ imagealphablending($modified, false);
+ imagefilledpolygon(
+ $modified,
+ $cutout->toArray(),
+ imagecolortransparent($modified)
+ );
+
+ // place rotated image on new gd image
+ imagealphablending($modified, true);
+ imagecopy(
+ $modified,
+ $rotated,
+ 0,
+ 0,
+ 0,
+ 0,
+ imagesx($rotated),
+ imagesy($rotated)
+ );
+
+ $frame->setNative($modified);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php
new file mode 100755
index 00000000..15287e6c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php
@@ -0,0 +1,21 @@
+size()->scaleDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php
new file mode 100755
index 00000000..2486cbb6
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php
@@ -0,0 +1,16 @@
+size()->scale($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php
new file mode 100755
index 00000000..3943d2cb
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php
@@ -0,0 +1,45 @@
+matrix();
+ foreach ($image as $frame) {
+ imageconvolution($frame->native(), $matrix, 1, 0);
+ }
+
+ return $image;
+ }
+
+ /**
+ * Create matrix to be used by imageconvolution()
+ *
+ * @return array>
+ */
+ private function matrix(): array
+ {
+ $min = $this->amount >= 10 ? $this->amount * -0.01 : 0;
+ $max = $this->amount * -0.025;
+ $abs = ((4 * $min + 4 * $max) * -1) + 1;
+
+ return [
+ [$min, $max, $min],
+ [$max, $abs, $max],
+ [$min, $max, $min]
+ ];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php
new file mode 100755
index 00000000..8986e7fe
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php
@@ -0,0 +1,29 @@
+offset >= $image->count()) {
+ throw new AnimationException('Offset is not in the range of frames.');
+ }
+
+ $image->core()->slice($this->offset, $this->length);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php
new file mode 100755
index 00000000..074f904c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php
@@ -0,0 +1,145 @@
+driver()->fontProcessor();
+ $lines = $fontProcessor->textBlock($this->text, $this->font, $this->position);
+
+ // decode text colors
+ $textColor = $this->gdTextColor($image);
+ $strokeColor = $this->gdStrokeColor($image);
+
+ // build full path to font file to make sure to pass absolute path to imageftbbox()
+ // because of issues with different GD version behaving differently when passing
+ // relative paths to imagettftext()
+ $fontPath = $this->font->hasFilename() ? realpath($this->font->filename()) : false;
+ if ($this->font->hasFilename() && $fontPath === false) {
+ throw new FontException('Font file ' . $this->font->filename() . ' does not exist.');
+ }
+
+ foreach ($image as $frame) {
+ imagealphablending($frame->native(), true);
+ if ($this->font->hasFilename()) {
+ foreach ($lines as $line) {
+ foreach ($this->strokeOffsets($this->font) as $offset) {
+ imagettftext(
+ image: $frame->native(),
+ size: $fontProcessor->nativeFontSize($this->font),
+ angle: $this->font->angle() * -1,
+ x: $line->position()->x() + $offset->x(),
+ y: $line->position()->y() + $offset->y(),
+ color: $strokeColor,
+ font_filename: $fontPath,
+ text: (string) $line
+ );
+ }
+
+ imagettftext(
+ image: $frame->native(),
+ size: $fontProcessor->nativeFontSize($this->font),
+ angle: $this->font->angle() * -1,
+ x: $line->position()->x(),
+ y: $line->position()->y(),
+ color: $textColor,
+ font_filename: $fontPath,
+ text: (string) $line
+ );
+ }
+ } else {
+ foreach ($lines as $line) {
+ foreach ($this->strokeOffsets($this->font) as $offset) {
+ imagestring(
+ $frame->native(),
+ $this->gdFont(),
+ $line->position()->x() + $offset->x(),
+ $line->position()->y() + $offset->y(),
+ (string) $line,
+ $strokeColor
+ );
+ }
+
+ imagestring(
+ $frame->native(),
+ $this->gdFont(),
+ $line->position()->x(),
+ $line->position()->y(),
+ (string) $line,
+ $textColor
+ );
+ }
+ }
+ }
+
+ return $image;
+ }
+
+ /**
+ * Decode text color in GD compatible format
+ *
+ * @throws RuntimeException
+ * @throws ColorException
+ */
+ protected function gdTextColor(ImageInterface $image): int
+ {
+ return $this
+ ->driver()
+ ->colorProcessor($image->colorspace())
+ ->colorToNative(parent::textColor());
+ }
+
+ /**
+ * Decode color for stroke (outline) effect in GD compatible format
+ *
+ * @throws RuntimeException
+ * @throws ColorException
+ */
+ protected function gdStrokeColor(ImageInterface $image): int
+ {
+ if (!$this->font->hasStrokeEffect()) {
+ return 0;
+ }
+
+ $color = parent::strokeColor();
+
+ if ($color->isTransparent()) {
+ throw new ColorException(
+ 'The stroke color must be fully opaque.'
+ );
+ }
+
+ return $this
+ ->driver()
+ ->colorProcessor($image->colorspace())
+ ->colorToNative($color);
+ }
+
+ /**
+ * Return GD's internal font size (if no ttf file is set)
+ */
+ private function gdFont(): int
+ {
+ if (is_numeric($this->font->filename())) {
+ return intval($this->font->filename());
+ }
+
+ return 1;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php
new file mode 100755
index 00000000..ff86c8b4
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php
@@ -0,0 +1,85 @@
+isAnimated()) {
+ throw new NotSupportedException('Trim modifier cannot be applied to animated images.');
+ }
+
+ // apply tolerance with a min. value of .5 because the default tolerance of '0' should
+ // already trim away similar colors which is not the case with imagecropauto.
+ $trimmed = imagecropauto(
+ $image->core()->native(),
+ IMG_CROP_THRESHOLD,
+ max([.5, $this->tolerance / 10]),
+ $this->trimColor($image)
+ );
+
+ // if the tolerance is very high, it is possible that no image is left.
+ // imagick returns a 1x1 pixel image in this case. this does the same.
+ if ($trimmed === false) {
+ $trimmed = $this->driver()->createImage(1, 1)->core()->native();
+ }
+
+ $image->core()->setNative($trimmed);
+
+ return $image;
+ }
+
+ /**
+ * Create an average color from the colors of the four corner points of the given image
+ *
+ * @throws RuntimeException
+ * @throws AnimationException
+ */
+ private function trimColor(ImageInterface $image): int
+ {
+ // trim color base
+ $red = 0;
+ $green = 0;
+ $blue = 0;
+
+ // corner coordinates
+ $size = $image->size();
+ $cornerPoints = [
+ new Point(0, 0),
+ new Point($size->width() - 1, 0),
+ new Point(0, $size->height() - 1),
+ new Point($size->width() - 1, $size->height() - 1),
+ ];
+
+ // create an average color to be used in trim operation
+ foreach ($cornerPoints as $pos) {
+ $cornerColor = imagecolorat($image->core()->native(), $pos->x(), $pos->y());
+ $rgb = imagecolorsforindex($image->core()->native(), $cornerColor);
+ $red += round(round(($rgb['red'] / 51)) * 51);
+ $green += round(round(($rgb['green'] / 51)) * 51);
+ $blue += round(round(($rgb['blue'] / 51)) * 51);
+ }
+
+ $red = (int) round($red / 4);
+ $green = (int) round($green / 4);
+ $blue = (int) round($blue / 4);
+
+ return imagecolorallocate($image->core()->native(), $red, $green, $blue);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php
new file mode 100755
index 00000000..181b4e46
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php
@@ -0,0 +1,23 @@
+core()->native()->getImageColorspace()) {
+ Imagick::COLORSPACE_CMYK => new CmykColorspace(),
+ default => new RgbColorspace(),
+ };
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php
new file mode 100755
index 00000000..b3ab9969
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php
@@ -0,0 +1,17 @@
+core()->native()->getImageHeight();
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php
new file mode 100755
index 00000000..d060e34d
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php
@@ -0,0 +1,36 @@
+colorAt(
+ $image->colorspace(),
+ $image->core()->frame($this->frame_key)->native()
+ );
+ }
+
+ /**
+ * @throws ColorException
+ */
+ protected function colorAt(ColorspaceInterface $colorspace, Imagick $imagick): ColorInterface
+ {
+ return $this->driver()
+ ->colorProcessor($colorspace)
+ ->nativeToColor(
+ $imagick->getImagePixelColor($this->x, $this->y)
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php
new file mode 100755
index 00000000..577b9c8c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php
@@ -0,0 +1,25 @@
+colorspace();
+
+ foreach ($image as $frame) {
+ $colors->push(
+ parent::colorAt($colorspace, $frame->native())
+ );
+ }
+
+ return $colors;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php
new file mode 100755
index 00000000..61fef32f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php
@@ -0,0 +1,25 @@
+core()->native()->getImageProfiles('icc');
+
+ if (!array_key_exists('icc', $profiles)) {
+ throw new ColorException('No ICC profile found in image.');
+ }
+
+ return new Profile($profiles['icc']);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php
new file mode 100755
index 00000000..1a1b6321
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php
@@ -0,0 +1,25 @@
+core()->native();
+ $imageResolution = $imagick->getImageResolution();
+
+ return new Resolution(
+ $imageResolution['x'],
+ $imageResolution['y'],
+ $imagick->getImageUnits(),
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php
new file mode 100755
index 00000000..77b1d502
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php
@@ -0,0 +1,17 @@
+core()->native()->getImageWidth();
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php b/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php
new file mode 100755
index 00000000..4676ab19
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php
@@ -0,0 +1,45 @@
+convertTo($this->colorspace)
+ );
+ }
+
+ public function nativeToColor(mixed $native): ColorInterface
+ {
+ return match ($this->colorspace::class) {
+ CmykColorspace::class => $this->colorspace->colorFromNormalized([
+ $native->getColorValue(Imagick::COLOR_CYAN),
+ $native->getColorValue(Imagick::COLOR_MAGENTA),
+ $native->getColorValue(Imagick::COLOR_YELLOW),
+ $native->getColorValue(Imagick::COLOR_BLACK),
+ ]),
+ default => $this->colorspace->colorFromNormalized([
+ $native->getColorValue(Imagick::COLOR_RED),
+ $native->getColorValue(Imagick::COLOR_GREEN),
+ $native->getColorValue(Imagick::COLOR_BLUE),
+ $native->getColorValue(Imagick::COLOR_ALPHA),
+ ]),
+ };
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Core.php b/vendor/intervention/image/src/Drivers/Imagick/Core.php
new file mode 100755
index 00000000..87dcf986
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Core.php
@@ -0,0 +1,324 @@
+
+ */
+class Core implements CoreInterface, Iterator
+{
+ protected int $iteratorIndex = 0;
+
+ /**
+ * Create new core instance
+ *
+ * @return void
+ */
+ public function __construct(protected Imagick $imagick)
+ {
+ //
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::has()
+ */
+ public function has(int|string $key): bool
+ {
+ try {
+ $result = $this->imagick->setIteratorIndex($key);
+ } catch (ImagickException) {
+ return false;
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::push()
+ */
+ public function push(mixed $item): CollectionInterface
+ {
+ return $this->add($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::get()
+ */
+ public function get(int|string $key, mixed $default = null): mixed
+ {
+ try {
+ $this->imagick->setIteratorIndex($key);
+ } catch (ImagickException) {
+ return $default;
+ }
+
+ return new Frame($this->imagick->current());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::getAtPosition()
+ */
+ public function getAtPosition(int $key = 0, mixed $default = null): mixed
+ {
+ return $this->get($key, $default);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::empty()
+ */
+ public function empty(): CollectionInterface
+ {
+ $this->imagick->clear();
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::slice()
+ */
+ public function slice(int $offset, ?int $length = null): CollectionInterface
+ {
+ $allowed_indexes = [];
+ $length = is_null($length) ? $this->count() : $length;
+ for ($i = $offset; $i < $offset + $length; $i++) {
+ $allowed_indexes[] = $i;
+ }
+
+ $sliced = new Imagick();
+ foreach ($this->imagick as $key => $native) {
+ if (in_array($key, $allowed_indexes)) {
+ $sliced->addImage($native->getImage());
+ }
+ }
+
+ $sliced = $sliced->coalesceImages();
+ $sliced->setImageIterations($this->imagick->getImageIterations());
+
+ $this->imagick = $sliced;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::add()
+ */
+ public function add(FrameInterface $frame): CoreInterface
+ {
+ $imagick = $frame->native();
+
+ $imagick->setImageDelay(
+ (int) round($frame->delay() * 100)
+ );
+
+ $imagick->setImageDispose($frame->dispose());
+
+ $size = $frame->size();
+ $imagick->setImagePage(
+ $size->width(),
+ $size->height(),
+ $frame->offsetLeft(),
+ $frame->offsetTop()
+ );
+
+ $this->imagick->addImage($imagick);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::count()
+ */
+ public function count(): int
+ {
+ return $this->imagick->getNumberImages();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see Iterator::rewind()
+ */
+ public function current(): mixed
+ {
+ $this->imagick->setIteratorIndex($this->iteratorIndex);
+
+ return new Frame($this->imagick->current());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see Iterator::rewind()
+ */
+ public function next(): void
+ {
+ $this->iteratorIndex += 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see Iterator::rewind()
+ */
+ public function key(): mixed
+ {
+ return $this->iteratorIndex;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see Iterator::rewind()
+ */
+ public function valid(): bool
+ {
+ try {
+ $result = $this->imagick->setIteratorIndex($this->iteratorIndex);
+ } catch (ImagickException) {
+ return false;
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see Iterator::rewind()
+ */
+ public function rewind(): void
+ {
+ $this->iteratorIndex = 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::native()
+ */
+ public function native(): mixed
+ {
+ return $this->imagick;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::setNative()
+ */
+ public function setNative(mixed $native): CoreInterface
+ {
+ $this->imagick = $native;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::frame()
+ */
+ public function frame(int $position): FrameInterface
+ {
+ foreach ($this->imagick as $core) {
+ if ($core->getIteratorIndex() === $position) {
+ return new Frame($core);
+ }
+ }
+
+ throw new AnimationException('Frame #' . $position . ' could not be found in the image.');
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::loops()
+ */
+ public function loops(): int
+ {
+ return $this->imagick->getImageIterations();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CoreInterface::setLoops()
+ */
+ public function setLoops(int $loops): CoreInterface
+ {
+ $this->imagick = $this->imagick->coalesceImages();
+ $this->imagick->setImageIterations($loops);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::first()
+ */
+ public function first(): FrameInterface
+ {
+ return $this->frame(0);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectableInterface::last()
+ */
+ public function last(): FrameInterface
+ {
+ return $this->frame($this->count() - 1);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see CollectionInterface::toArray()
+ */
+ public function toArray(): array
+ {
+ $frames = [];
+
+ foreach ($this as $frame) {
+ $frames[] = $frame;
+ }
+
+ return $frames;
+ }
+
+ /**
+ * Clone instance
+ */
+ public function __clone(): void
+ {
+ $this->imagick = clone $this->imagick;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php
new file mode 100755
index 00000000..ea150627
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php
@@ -0,0 +1,26 @@
+isValidBase64($input)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ return parent::decode(base64_decode((string) $input));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php
new file mode 100755
index 00000000..96850b3c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php
@@ -0,0 +1,47 @@
+readImageBlob($input);
+ } catch (ImagickException) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ // decode image
+ $image = parent::decode($imagick);
+
+ // get media type enum from string media type
+ $format = Format::tryCreate($image->origin()->mediaType());
+
+ // extract exif data for appropriate formats
+ if (in_array($format, [Format::JPEG, Format::TIFF])) {
+ $image->setExif($this->extractExifData($input));
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php
new file mode 100755
index 00000000..f395cb00
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php
@@ -0,0 +1,36 @@
+parseDataUri($input);
+
+ if (!$uri->isValid()) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ if ($uri->isBase64Encoded()) {
+ return parent::decode(base64_decode($uri->data()));
+ }
+
+ return parent::decode(urldecode($uri->data()));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php
new file mode 100755
index 00000000..2348a6b7
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php
@@ -0,0 +1,27 @@
+toString());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php
new file mode 100755
index 00000000..a418099c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php
@@ -0,0 +1,46 @@
+isFile($input)) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ try {
+ $imagick = new Imagick();
+ $imagick->readImage($input);
+ } catch (ImagickException) {
+ throw new DecoderException('Unable to decode input');
+ }
+
+ // decode image
+ $image = parent::decode($imagick);
+
+ // set file path on origin
+ $image->origin()->setFilePath($input);
+
+ // extract exif data for the appropriate formats
+ if (in_array($imagick->getImageFormat(), ['JPEG', 'TIFF', 'TIF'])) {
+ $image->setExif($this->extractExifData($input));
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php
new file mode 100755
index 00000000..08717e09
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php
@@ -0,0 +1,32 @@
+getImageFormat() !== 'JPEG') {
+ $input = $input->coalesceImages();
+ }
+
+ // turn images with colorspace 'GRAY' into 'SRGB' to avoid working on
+ // greyscale colorspace images as this results images loosing color
+ // information when placed into this image.
+ if ($input->getImageColorspace() == Imagick::COLORSPACE_GRAY) {
+ $input->setImageColorspace(Imagick::COLORSPACE_SRGB);
+ }
+
+ // create image object
+ $image = new Image(
+ $this->driver(),
+ new Core($input)
+ );
+
+ // discard animation depending on config
+ if (!$this->driver()->config()->decodeAnimation) {
+ $image->modify(new RemoveAnimationModifier());
+ }
+
+ // adjust image rotatation
+ if ($this->driver()->config()->autoOrientation) {
+ $image->modify(new AlignRotationModifier());
+ }
+
+ // set media type on origin
+ $image->origin()->setMediaType($input->getImageMimeType());
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php
new file mode 100755
index 00000000..8850123e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php
@@ -0,0 +1,27 @@
+getRealPath());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Driver.php b/vendor/intervention/image/src/Drivers/Imagick/Driver.php
new file mode 100755
index 00000000..61fd05f5
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Driver.php
@@ -0,0 +1,175 @@
+newImage($width, $height, $background, 'png');
+ $imagick->setType(Imagick::IMGTYPE_UNDEFINED);
+ $imagick->setImageType(Imagick::IMGTYPE_UNDEFINED);
+ $imagick->setColorspace(Imagick::COLORSPACE_SRGB);
+ $imagick->setImageResolution(96, 96);
+ $imagick->setImageBackgroundColor($background);
+
+ return new Image($this, new Core($imagick));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::createAnimation()
+ *
+ * @throws RuntimeException
+ */
+ public function createAnimation(callable $init): ImageInterface
+ {
+ $imagick = new Imagick();
+ $imagick->setFormat('gif');
+
+ $animation = new class ($this, $imagick)
+ {
+ public function __construct(
+ protected DriverInterface $driver,
+ public Imagick $imagick
+ ) {
+ //
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ public function add(mixed $source, float $delay = 1): self
+ {
+ $native = $this->driver->handleInput($source)->core()->native();
+ $native->setImageDelay(intval(round($delay * 100)));
+
+ $this->imagick->addImage($native);
+
+ return $this;
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ public function __invoke(): ImageInterface
+ {
+ return new Image(
+ $this->driver,
+ new Core($this->imagick)
+ );
+ }
+ };
+
+ $init($animation);
+
+ return call_user_func($animation);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::colorProcessor()
+ */
+ public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
+ {
+ return new ColorProcessor($colorspace);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::fontProcessor()
+ */
+ public function fontProcessor(): FontProcessorInterface
+ {
+ return new FontProcessor();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::supports()
+ */
+ public function supports(string|Format|FileExtension|MediaType $identifier): bool
+ {
+ try {
+ $format = Format::create($identifier);
+ } catch (NotSupportedException) {
+ return false;
+ }
+
+ return count(Imagick::queryFormats($format->name)) >= 1;
+ }
+
+ /**
+ * Return version of ImageMagick library
+ *
+ * @throws DriverException
+ */
+ public static function version(): string
+ {
+ $pattern = '/^ImageMagick (?P(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)' .
+ '(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?' .
+ '(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)/';
+
+ if (preg_match($pattern, Imagick::getVersion()['versionString'], $matches) !== 1) {
+ throw new DriverException('Unable to read ImageMagick version number.');
+ }
+
+ return $matches['version'];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php
new file mode 100755
index 00000000..64cb4aeb
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php
@@ -0,0 +1,37 @@
+strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/avif');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php
new file mode 100755
index 00000000..eede0f09
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php
@@ -0,0 +1,29 @@
+core()->native();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/bmp');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php
new file mode 100755
index 00000000..f9c98b0e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php
@@ -0,0 +1,34 @@
+core()->native();
+
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ if ($this->interlaced) {
+ $imagick->setInterlaceScheme(Imagick::INTERLACE_LINE);
+ }
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/gif');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php
new file mode 100755
index 00000000..471edb1f
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php
@@ -0,0 +1,33 @@
+strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/heic');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php
new file mode 100755
index 00000000..16f6593b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php
@@ -0,0 +1,39 @@
+strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->setImageBackgroundColor('white');
+ $imagick->setBackgroundColor('white');
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/jp2');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php
new file mode 100755
index 00000000..e2365f3c
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php
@@ -0,0 +1,57 @@
+driver()->handleInput(
+ $this->driver()->config()->blendingColor
+ );
+
+ // resolve blending color because jpeg has no transparency
+ $background = $this->driver()
+ ->colorProcessor($image->colorspace())
+ ->colorToNative($blendingColor);
+
+ // set alpha value to 1 because Imagick renders
+ // possible full transparent colors as black
+ $background->setColorValue(Imagick::COLOR_ALPHA, 1);
+
+ // strip meta data
+ if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ /** @var Imagick $imagick */
+ $imagick = $image->core()->native();
+ $imagick->setImageBackgroundColor($background);
+ $imagick->setBackgroundColor($background);
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+ $imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
+
+ if ($this->progressive) {
+ $imagick->setInterlaceScheme(Imagick::INTERLACE_PLANE);
+ }
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/jpeg');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php
new file mode 100755
index 00000000..cce49d51
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php
@@ -0,0 +1,46 @@
+indexed) {
+ // reduce colors
+ $output = clone $image;
+ $output->reduceColors(256);
+
+ $output = $output->core()->native();
+ $output->setFormat('PNG');
+ $output->setImageFormat('PNG');
+ } else {
+ $output = clone $image->core()->native();
+ $output->setFormat('PNG32');
+ $output->setImageFormat('PNG32');
+ }
+
+ $output->setCompression(Imagick::COMPRESSION_ZIP);
+ $output->setImageCompression(Imagick::COMPRESSION_ZIP);
+
+ if ($this->interlaced) {
+ $output->setInterlaceScheme(Imagick::INTERLACE_LINE);
+ }
+
+ return new EncodedImage($output->getImagesBlob(), 'image/png');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php
new file mode 100755
index 00000000..46e66536
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php
@@ -0,0 +1,35 @@
+strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($imagick->getImageCompression());
+ $imagick->setImageCompression($imagick->getImageCompression());
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/tiff');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php
new file mode 100755
index 00000000..b65be3bc
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php
@@ -0,0 +1,47 @@
+strip || (is_null($this->strip) && $this->driver()->config()->strip)) {
+ $image->modify(new StripMetaModifier());
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->setImageBackgroundColor(new ImagickPixel('transparent'));
+
+ if (!$image->isAnimated()) {
+ $imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE);
+ }
+
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ if ($this->quality === 100) {
+ $imagick->setOption('webp:lossless', 'true');
+ }
+
+ return new EncodedImage($imagick->getImagesBlob(), 'image/webp');
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php b/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php
new file mode 100755
index 00000000..16fc4c8e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php
@@ -0,0 +1,69 @@
+toImagickDraw($font);
+ $dimensions = (new Imagick())->queryFontMetrics($draw, $text);
+
+ return new Rectangle(
+ intval(round($dimensions['textWidth'])),
+ intval(round($dimensions['ascender'] + $dimensions['descender'])),
+ );
+ }
+
+ /**
+ * Imagick::annotateImage() needs an ImagickDraw object - this method takes
+ * the font object as the base and adds an optional passed color to the new
+ * ImagickDraw object.
+ *
+ * @throws FontException
+ * @throws ImagickDrawException
+ * @throws ImagickException
+ */
+ public function toImagickDraw(FontInterface $font, ?ImagickPixel $color = null): ImagickDraw
+ {
+ if (!$font->hasFilename()) {
+ throw new FontException('No font file specified.');
+ }
+
+ $draw = new ImagickDraw();
+ $draw->setStrokeAntialias(true);
+ $draw->setTextAntialias(true);
+ $draw->setFont($font->filename());
+ $draw->setFontSize($this->nativeFontSize($font));
+ $draw->setTextAlignment(Imagick::ALIGN_LEFT);
+
+ if ($color instanceof ImagickPixel) {
+ $draw->setFillColor($color);
+ }
+
+ return $draw;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Frame.php b/vendor/intervention/image/src/Drivers/Imagick/Frame.php
new file mode 100755
index 00000000..269a8dba
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Frame.php
@@ -0,0 +1,185 @@
+native->setImageBackgroundColor($background);
+ $this->native->setBackgroundColor($background);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::toImage()
+ */
+ public function toImage(DriverInterface $driver): ImageInterface
+ {
+ return new Image($driver, new Core($this->native()));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setNative()
+ */
+ public function setNative(mixed $native): FrameInterface
+ {
+ $this->native = $native;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::native()
+ */
+ public function native(): Imagick
+ {
+ return $this->native;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::size()
+ */
+ public function size(): SizeInterface
+ {
+ return new Rectangle(
+ $this->native->getImageWidth(),
+ $this->native->getImageHeight()
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::delay()
+ */
+ public function delay(): float
+ {
+ return $this->native->getImageDelay() / 100;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setDelay()
+ */
+ public function setDelay(float $delay): FrameInterface
+ {
+ $this->native->setImageDelay(intval(round($delay * 100)));
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::dispose()
+ */
+ public function dispose(): int
+ {
+ return $this->native->getImageDispose();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setDispose()
+ *
+ * @throws InputException
+ */
+ public function setDispose(int $dispose): FrameInterface
+ {
+ if (!in_array($dispose, [0, 1, 2, 3])) {
+ throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.');
+ }
+
+ $this->native->setImageDispose($dispose);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setOffset()
+ */
+ public function setOffset(int $left, int $top): FrameInterface
+ {
+ $this->native->setImagePage(
+ $this->native->getImageWidth(),
+ $this->native->getImageHeight(),
+ $left,
+ $top
+ );
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::offsetLeft()
+ */
+ public function offsetLeft(): int
+ {
+ return $this->native->getImagePage()['x'];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setOffsetLeft()
+ */
+ public function setOffsetLeft(int $offset): FrameInterface
+ {
+ return $this->setOffset($offset, $this->offsetTop());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::offsetTop()
+ */
+ public function offsetTop(): int
+ {
+ return $this->native->getImagePage()['y'];
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DriverInterface::setOffsetTop()
+ */
+ public function setOffsetTop(int $offset): FrameInterface
+ {
+ return $this->setOffset($this->offsetLeft(), $offset);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php
new file mode 100755
index 00000000..6b84b304
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php
@@ -0,0 +1,54 @@
+core()->native()->getImageOrientation()) {
+ case Imagick::ORIENTATION_TOPRIGHT: // 2
+ $image->core()->native()->flopImage();
+ break;
+
+ case Imagick::ORIENTATION_BOTTOMRIGHT: // 3
+ $image->core()->native()->rotateImage("#000", 180);
+ break;
+
+ case Imagick::ORIENTATION_BOTTOMLEFT: // 4
+ $image->core()->native()->rotateImage("#000", 180);
+ $image->core()->native()->flopImage();
+ break;
+
+ case Imagick::ORIENTATION_LEFTTOP: // 5
+ $image->core()->native()->rotateImage("#000", -270);
+ $image->core()->native()->flopImage();
+ break;
+
+ case Imagick::ORIENTATION_RIGHTTOP: // 6
+ $image->core()->native()->rotateImage("#000", -270);
+ break;
+
+ case Imagick::ORIENTATION_RIGHTBOTTOM: // 7
+ $image->core()->native()->rotateImage("#000", -90);
+ $image->core()->native()->flopImage();
+ break;
+
+ case Imagick::ORIENTATION_LEFTBOTTOM: // 8
+ $image->core()->native()->rotateImage("#000", -90);
+ break;
+ }
+
+ // set new orientation in image
+ $image->core()->native()->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php
new file mode 100755
index 00000000..8fdc0b3b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php
@@ -0,0 +1,32 @@
+blendingColor($this->driver());
+
+ // get imagickpixel from blending color
+ $pixel = $this->driver()
+ ->colorProcessor($image->colorspace())
+ ->colorToNative($blendingColor);
+
+ // merge transparent areas with the background color
+ foreach ($image as $frame) {
+ $frame->native()->setImageBackgroundColor($pixel);
+ $frame->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
+ $frame->native()->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php
new file mode 100755
index 00000000..94c52d1b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php
@@ -0,0 +1,21 @@
+native()->blurImage($this->amount, 0.5 * $this->amount);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php
new file mode 100755
index 00000000..80fd9dfa
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php
@@ -0,0 +1,21 @@
+native()->modulateImage(100 + $this->level, 100, 100);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php
new file mode 100755
index 00000000..c4abc30e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php
@@ -0,0 +1,34 @@
+normalizeLevel($this->red);
+ $green = $this->normalizeLevel($this->green);
+ $blue = $this->normalizeLevel($this->blue);
+
+ foreach ($image as $frame) {
+ $qrange = $frame->native()->getQuantumRange();
+ $frame->native()->levelImage(0, $red, $qrange['quantumRangeLong'], Imagick::CHANNEL_RED);
+ $frame->native()->levelImage(0, $green, $qrange['quantumRangeLong'], Imagick::CHANNEL_GREEN);
+ $frame->native()->levelImage(0, $blue, $qrange['quantumRangeLong'], Imagick::CHANNEL_BLUE);
+ }
+
+ return $image;
+ }
+
+ private function normalizeLevel(int $level): int
+ {
+ return $level > 0 ? intval(round($level / 5)) : intval(round(($level + 100) / 100));
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php
new file mode 100755
index 00000000..37e10200
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php
@@ -0,0 +1,51 @@
+
+ */
+ protected static array $mapping = [
+ RgbColorspace::class => Imagick::COLORSPACE_SRGB,
+ CmykColorspace::class => Imagick::COLORSPACE_CMYK,
+ ];
+
+ public function apply(ImageInterface $image): ImageInterface
+ {
+ $colorspace = $this->targetColorspace();
+
+ $imagick = $image->core()->native();
+ $imagick->transformImageColorspace(
+ $this->getImagickColorspace($colorspace)
+ );
+
+ return $image;
+ }
+
+ /**
+ * @throws NotSupportedException
+ */
+ private function getImagickColorspace(ColorspaceInterface $colorspace): int
+ {
+ if (!array_key_exists($colorspace::class, self::$mapping)) {
+ throw new NotSupportedException('Given colorspace is not supported.');
+ }
+
+ return self::$mapping[$colorspace::class];
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php
new file mode 100755
index 00000000..b01bfd3b
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php
@@ -0,0 +1,95 @@
+getCropSize($image);
+ $resize = $this->getResizeSize($image);
+ $transparent = new ImagickPixel('transparent');
+ $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->background)
+ );
+
+ foreach ($image as $frame) {
+ $frame->native()->scaleImage(
+ $crop->width(),
+ $crop->height(),
+ );
+
+ $frame->native()->setBackgroundColor($transparent);
+ $frame->native()->setImageBackgroundColor($transparent);
+
+ $frame->native()->extentImage(
+ $resize->width(),
+ $resize->height(),
+ $crop->pivot()->x() * -1,
+ $crop->pivot()->y() * -1
+ );
+
+ if ($resize->width() > $crop->width()) {
+ // fill new emerged background
+ $draw = new ImagickDraw();
+ $draw->setFillColor($background);
+
+ $delta = abs($crop->pivot()->x());
+
+ if ($delta > 0) {
+ $draw->rectangle(
+ 0,
+ 0,
+ $delta - 1,
+ $resize->height()
+ );
+ }
+
+ $draw->rectangle(
+ $crop->width() + $delta,
+ 0,
+ $resize->width(),
+ $resize->height()
+ );
+
+ $frame->native()->drawImage($draw);
+ }
+
+ if ($resize->height() > $crop->height()) {
+ // fill new emerged background
+ $draw = new ImagickDraw();
+ $draw->setFillColor($background);
+
+ $delta = abs($crop->pivot()->y());
+
+ if ($delta > 0) {
+ $draw->rectangle(
+ 0,
+ 0,
+ $resize->width(),
+ $delta - 1
+ );
+ }
+
+ $draw->rectangle(
+ 0,
+ $crop->height() + $delta,
+ $resize->width(),
+ $resize->height()
+ );
+
+ $frame->native()->drawImage($draw);
+ }
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php
new file mode 100755
index 00000000..72083fa1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php
@@ -0,0 +1,21 @@
+native()->sigmoidalContrastImage($this->level > 0, abs($this->level / 4), 0);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php
new file mode 100755
index 00000000..44ab79e4
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php
@@ -0,0 +1,19 @@
+resizeDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php
new file mode 100755
index 00000000..835c4de3
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php
@@ -0,0 +1,36 @@
+getCropSize($image);
+ $resize = $this->getResizeSize($crop);
+
+ foreach ($image as $frame) {
+ $frame->native()->cropImage(
+ $crop->width(),
+ $crop->height(),
+ $crop->pivot()->x(),
+ $crop->pivot()->y()
+ );
+
+ $frame->native()->scaleImage(
+ $resize->width(),
+ $resize->height()
+ );
+
+ $frame->native()->setImagePage(0, 0, 0, 0);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php
new file mode 100755
index 00000000..6a2e8d31
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php
@@ -0,0 +1,75 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->background)
+ );
+
+ // create empty container imagick to rebuild core
+ $imagick = new Imagick();
+
+ // save resolution to add it later
+ $resolution = $image->resolution()->perInch();
+
+ // define position of the image on the new canvas
+ $crop = $this->crop($image);
+ $position = [
+ ($crop->pivot()->x() + $this->offset_x) * -1,
+ ($crop->pivot()->y() + $this->offset_y) * -1,
+ ];
+
+ foreach ($image as $frame) {
+ // create new frame canvas with modifiers background
+ $canvas = new Imagick();
+ $canvas->newImage($crop->width(), $crop->height(), $background, 'png');
+ $canvas->setImageResolution($resolution->x(), $resolution->y());
+ $canvas->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); // or ALPHACHANNEL_ACTIVATE?
+
+ // set animation details
+ if ($image->isAnimated()) {
+ $canvas->setImageDelay($frame->native()->getImageDelay());
+ $canvas->setImageIterations($frame->native()->getImageIterations());
+ $canvas->setImageDispose($frame->native()->getImageDispose());
+ }
+
+ // make the rectangular position of the original image transparent
+ // so that we can later place the original on top. this preserves
+ // the transparency of the original and shows the background color
+ // of the modifier in the other areas. if the original image has no
+ // transparent area the rectangular transparency will be covered by
+ // the original.
+ $clearer = new Imagick();
+ $clearer->newImage(
+ $frame->native()->getImageWidth(),
+ $frame->native()->getImageHeight(),
+ new ImagickPixel('black'),
+ );
+ $canvas->compositeImage($clearer, Imagick::COMPOSITE_DSTOUT, ...$position);
+
+ // place original frame content onto prepared frame canvas
+ $canvas->compositeImage($frame->native(), Imagick::COMPOSITE_DEFAULT, ...$position);
+
+ // add newly built frame to container imagick
+ $imagick->addImage($canvas);
+ }
+
+ // replace imagick in the original image
+ $image->core()->setNative($imagick);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php
new file mode 100755
index 00000000..fda3ec45
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php
@@ -0,0 +1,77 @@
+drawable->count() !== 3 && $this->drawable->count() !== 4) {
+ throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve');
+ }
+
+ $drawing = new ImagickDraw();
+
+ if ($this->drawable->hasBackgroundColor()) {
+ $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+ } else {
+ $background_color = 'transparent';
+ }
+
+ $drawing->setFillColor($background_color);
+
+ if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) {
+ $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ );
+
+ $drawing->setStrokeColor($border_color);
+ $drawing->setStrokeWidth($this->drawable->borderSize());
+ }
+
+ $drawing->pathStart();
+ $drawing->pathMoveToAbsolute(
+ $this->drawable->first()->x(),
+ $this->drawable->first()->y()
+ );
+ if ($this->drawable->count() === 3) {
+ $drawing->pathCurveToQuadraticBezierAbsolute(
+ $this->drawable->second()->x(),
+ $this->drawable->second()->y(),
+ $this->drawable->last()->x(),
+ $this->drawable->last()->y()
+ );
+ } elseif ($this->drawable->count() === 4) {
+ $drawing->pathCurveToAbsolute(
+ $this->drawable->second()->x(),
+ $this->drawable->second()->y(),
+ $this->drawable->third()->x(),
+ $this->drawable->third()->y(),
+ $this->drawable->last()->x(),
+ $this->drawable->last()->y()
+ );
+ }
+ $drawing->pathFinish();
+
+ foreach ($image as $frame) {
+ $frame->native()->drawImage($drawing);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php
new file mode 100755
index 00000000..1508f918
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php
@@ -0,0 +1,51 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+
+ $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ );
+
+ foreach ($image as $frame) {
+ $drawing = new ImagickDraw();
+ $drawing->setFillColor($background_color);
+
+ if ($this->drawable->hasBorder()) {
+ $drawing->setStrokeWidth($this->drawable->borderSize());
+ $drawing->setStrokeColor($border_color);
+ }
+
+ $drawing->ellipse(
+ $this->drawable->position()->x(),
+ $this->drawable->position()->y(),
+ $this->drawable->width() / 2,
+ $this->drawable->height() / 2,
+ 0,
+ 360
+ );
+
+ $frame->native()->drawImage($drawing);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php
new file mode 100755
index 00000000..ac09e51d
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php
@@ -0,0 +1,42 @@
+setStrokeWidth($this->drawable->width());
+ $drawing->setFillOpacity(0);
+ $drawing->setStrokeColor(
+ $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ )
+ );
+
+ $drawing->line(
+ $this->drawable->start()->x(),
+ $this->drawable->start()->y(),
+ $this->drawable->end()->x(),
+ $this->drawable->end()->y(),
+ );
+
+ foreach ($image as $frame) {
+ $frame->native()->drawImage($drawing);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php
new file mode 100755
index 00000000..e69ecc27
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php
@@ -0,0 +1,30 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->color)
+ );
+
+ $pixel = new ImagickDraw();
+ $pixel->setFillColor($color);
+ $pixel->point($this->position->x(), $this->position->y());
+
+ foreach ($image as $frame) {
+ $frame->native()->drawImage($pixel);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php
new file mode 100755
index 00000000..003d88c6
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php
@@ -0,0 +1,64 @@
+setFillColor(new ImagickPixel('transparent')); // defaults to no backgroundColor
+
+ if ($this->drawable->hasBackgroundColor()) {
+ $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+
+ $drawing->setFillColor($background_color);
+ }
+
+ if ($this->drawable->hasBorder()) {
+ $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ );
+
+ $drawing->setStrokeColor($border_color);
+ $drawing->setStrokeWidth($this->drawable->borderSize());
+ }
+
+ $drawing->polygon($this->points());
+
+ foreach ($image as $frame) {
+ $frame->native()->drawImage($drawing);
+ }
+
+ return $image;
+ }
+
+ /**
+ * Return points of drawable in processable form for ImagickDraw
+ *
+ * @return array>
+ */
+ private function points(): array
+ {
+ $points = [];
+ foreach ($this->drawable as $point) {
+ $points[] = ['x' => $point->x(), 'y' => $point->y()];
+ }
+
+ return $points;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php
new file mode 100755
index 00000000..8f8e79ea
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php
@@ -0,0 +1,50 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->backgroundColor()
+ );
+
+ $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->borderColor()
+ );
+
+ $drawing->setFillColor($background_color);
+ if ($this->drawable->hasBorder()) {
+ $drawing->setStrokeColor($border_color);
+ $drawing->setStrokeWidth($this->drawable->borderSize());
+ }
+
+ // build rectangle
+ $drawing->rectangle(
+ $this->drawable->position()->x(),
+ $this->drawable->position()->y(),
+ $this->drawable->position()->x() + $this->drawable->width(),
+ $this->drawable->position()->y() + $this->drawable->height()
+ );
+
+ foreach ($image as $frame) {
+ $frame->native()->drawImage($drawing);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php
new file mode 100755
index 00000000..274745fa
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php
@@ -0,0 +1,63 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->color)
+ );
+
+ foreach ($image->core()->native() as $frame) {
+ if ($this->hasPosition()) {
+ $this->floodFillWithColor($frame, $pixel);
+ } else {
+ $this->fillAllWithColor($frame, $pixel);
+ }
+ }
+
+ return $image;
+ }
+
+ private function floodFillWithColor(Imagick $frame, ImagickPixel $pixel): void
+ {
+ $target = $frame->getImagePixelColor(
+ $this->position->x(),
+ $this->position->y()
+ );
+
+ $frame->floodfillPaintImage(
+ $pixel,
+ 100,
+ $target,
+ $this->position->x(),
+ $this->position->y(),
+ false,
+ Imagick::CHANNEL_ALL
+ );
+ }
+
+ private function fillAllWithColor(Imagick $frame, ImagickPixel $pixel): void
+ {
+ $draw = new ImagickDraw();
+ $draw->setFillColor($pixel);
+ $draw->rectangle(0, 0, $frame->getImageWidth(), $frame->getImageHeight());
+ $frame->drawImage($draw);
+
+ // deactive alpha channel when image was filled with opaque color
+ if ($pixel->getColorValue(Imagick::COLOR_ALPHA) == 1) {
+ $frame->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php
new file mode 100755
index 00000000..edfa1244
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php
@@ -0,0 +1,21 @@
+native()->flipImage();
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php
new file mode 100755
index 00000000..d05c239e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php
@@ -0,0 +1,21 @@
+native()->flopImage();
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php
new file mode 100755
index 00000000..f8b1c7ce
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php
@@ -0,0 +1,21 @@
+native()->gammaImage($this->gamma);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php
new file mode 100755
index 00000000..4bc2f284
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php
@@ -0,0 +1,21 @@
+native()->modulateImage(100, 0, 100);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php
new file mode 100755
index 00000000..d504ecb5
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php
@@ -0,0 +1,21 @@
+native()->negateImage(false);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php
new file mode 100755
index 00000000..40499d91
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php
@@ -0,0 +1,24 @@
+size()
+ ->containMax(
+ $this->width,
+ $this->height
+ )
+ ->alignPivotTo(
+ $this->getResizeSize($image),
+ $this->position
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php
new file mode 100755
index 00000000..e79eb420
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php
@@ -0,0 +1,34 @@
+pixelateFrame($frame);
+ }
+
+ return $image;
+ }
+
+ protected function pixelateFrame(FrameInterface $frame): void
+ {
+ $size = $frame->size();
+
+ $frame->native()->scaleImage(
+ (int) round(max(1, $size->width() / $this->size)),
+ (int) round(max(1, $size->height() / $this->size))
+ );
+
+ $frame->native()->scaleImage($size->width(), $size->height());
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php
new file mode 100755
index 00000000..eb5b7225
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php
@@ -0,0 +1,40 @@
+driver()->handleInput($this->element);
+ $position = $this->getPosition($image, $watermark);
+
+ // set opacity of watermark
+ if ($this->opacity < 100) {
+ $watermark->core()->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET);
+ $watermark->core()->native()->evaluateImage(
+ Imagick::EVALUATE_DIVIDE,
+ $this->opacity > 0 ? 100 / $this->opacity : 1000,
+ Imagick::CHANNEL_ALPHA,
+ );
+ }
+
+ foreach ($image as $frame) {
+ $frame->native()->compositeImage(
+ $watermark->core()->native(),
+ Imagick::COMPOSITE_DEFAULT,
+ $position->x(),
+ $position->y()
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php
new file mode 100755
index 00000000..22212d95
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php
@@ -0,0 +1,25 @@
+core()->native();
+ $result = $imagick->profileImage('icc', (string) $this->profile);
+
+ if ($result === false) {
+ throw new ColorException('ICC color profile could not be set.');
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php
new file mode 100755
index 00000000..ef4a2aba
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php
@@ -0,0 +1,25 @@
+core()->native();
+ $result = $imagick->profileImage('icc', null);
+
+ if ($result === false) {
+ throw new ColorException('ICC color profile could not be removed.');
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php
new file mode 100755
index 00000000..6a93482e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php
@@ -0,0 +1,37 @@
+limit <= 0) {
+ throw new InputException('Quantization limit must be greater than 0.');
+ }
+
+ // no color reduction if the limit is higher than the colors in the img
+ if ($this->limit > $image->core()->native()->getImageColors()) {
+ return $image;
+ }
+
+ foreach ($image as $frame) {
+ $frame->native()->quantizeImage(
+ $this->limit,
+ $frame->native()->getImageColorspace(),
+ 0,
+ false,
+ false
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php
new file mode 100755
index 00000000..61c884c1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php
@@ -0,0 +1,26 @@
+selectedFrame($image);
+ $imagick->addImage($frame->native()->getImage());
+
+ // set new imagick to image
+ $image->core()->setNative($imagick);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php
new file mode 100755
index 00000000..4459f329
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php
@@ -0,0 +1,27 @@
+cropSize($image);
+
+ $image->modify(new CropModifier(
+ $cropSize->width(),
+ $cropSize->height(),
+ $cropSize->pivot()->x(),
+ $cropSize->pivot()->y(),
+ $this->background,
+ ));
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php
new file mode 100755
index 00000000..e1fcb740
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php
@@ -0,0 +1,16 @@
+size()->resizeDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php
new file mode 100755
index 00000000..459aad02
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php
@@ -0,0 +1,36 @@
+getAdjustedSize($image);
+
+ foreach ($image as $frame) {
+ $frame->native()->scaleImage(
+ $resizeTo->width(),
+ $resizeTo->height()
+ );
+ }
+
+ return $image;
+ }
+
+ /**
+ * @throws RuntimeException
+ */
+ protected function getAdjustedSize(ImageInterface $image): SizeInterface
+ {
+ return $image->size()->resize($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php
new file mode 100755
index 00000000..426e683e
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php
@@ -0,0 +1,20 @@
+core()->native();
+ $imagick->setImageResolution($this->x, $this->y);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php
new file mode 100755
index 00000000..19ad2282
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php
@@ -0,0 +1,28 @@
+driver()->colorProcessor($image->colorspace())->colorToNative(
+ $this->driver()->handleInput($this->background)
+ );
+
+ foreach ($image as $frame) {
+ $frame->native()->rotateImage(
+ $background,
+ $this->rotationAngle() * -1
+ );
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php
new file mode 100755
index 00000000..ae874bb6
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php
@@ -0,0 +1,16 @@
+size()->scaleDown($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php
new file mode 100755
index 00000000..da8c2c48
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php
@@ -0,0 +1,16 @@
+size()->scale($this->width, $this->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php
new file mode 100755
index 00000000..120d3c89
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php
@@ -0,0 +1,21 @@
+native()->unsharpMaskImage(1, 1, $this->amount / 6.25, 0);
+ }
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php
new file mode 100755
index 00000000..16691079
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php
@@ -0,0 +1,24 @@
+offset >= $image->count()) {
+ throw new AnimationException('Offset is not in the range of frames.');
+ }
+
+ $image->core()->slice($this->offset, $this->length);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php
new file mode 100755
index 00000000..58d1e7a1
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php
@@ -0,0 +1,34 @@
+core()->native()->getImageProfiles('icc');
+
+ // remove meta data
+ $image->core()->native()->stripImage();
+ $image->setExif(new Collection());
+
+ if ($profiles !== []) {
+ // re-apply icc profiles
+ $image->core()->native()->profileImage("icc", $profiles['icc']);
+ }
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php
new file mode 100755
index 00000000..69ff34ca
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php
@@ -0,0 +1,139 @@
+processor()->textBlock($this->text, $this->font, $this->position);
+ $drawText = $this->imagickDrawText($image, $this->font);
+ $drawStroke = $this->imagickDrawStroke($image, $this->font);
+
+ foreach ($image as $frame) {
+ foreach ($lines as $line) {
+ foreach ($this->strokeOffsets($this->font) as $offset) {
+ // Draw the stroke outline under the actual text
+ $this->maybeDrawTextline($frame, $line, $drawStroke, $offset);
+ }
+
+ // Draw the actual text
+ $this->maybeDrawTextline($frame, $line, $drawText);
+ }
+ }
+
+ return $image;
+ }
+
+ /**
+ * Create an ImagickDraw object to draw text on the image
+ *
+ * @throws RuntimeException
+ * @throws ColorException
+ * @throws FontException
+ * @throws ImagickDrawException
+ * @throws ImagickException
+ */
+ private function imagickDrawText(ImageInterface $image, FontInterface $font): ImagickDraw
+ {
+ $color = $this->driver()->handleInput($font->color());
+
+ if ($font->hasStrokeEffect() && $color->isTransparent()) {
+ throw new ColorException(
+ 'The text color must be fully opaque when using the stroke effect.'
+ );
+ }
+
+ $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color);
+
+ return $this->processor()->toImagickDraw($font, $color);
+ }
+
+ /**
+ * Create a ImagickDraw object to draw the outline stroke effect on the Image
+ *
+ * @throws RuntimeException
+ * @throws ColorException
+ * @throws FontException
+ * @throws ImagickDrawException
+ * @throws ImagickException
+ */
+ private function imagickDrawStroke(ImageInterface $image, FontInterface $font): ?ImagickDraw
+ {
+ if (!$font->hasStrokeEffect()) {
+ return null;
+ }
+
+ $color = $this->driver()->handleInput($font->strokeColor());
+
+ if ($color->isTransparent()) {
+ throw new ColorException(
+ 'The stroke color must be fully opaque.'
+ );
+ }
+
+ $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color);
+
+ return $this->processor()->toImagickDraw($font, $color);
+ }
+
+ /**
+ * Maybe draw given line of text on frame instance depending on given
+ * ImageDraw instance. Optionally move line position by given offset.
+ */
+ private function maybeDrawTextline(
+ FrameInterface $frame,
+ Line $textline,
+ ?ImagickDraw $draw = null,
+ PointInterface $offset = new Point(),
+ ): void {
+ if ($draw instanceof ImagickDraw) {
+ $frame->native()->annotateImage(
+ $draw,
+ $textline->position()->x() + $offset->x(),
+ $textline->position()->y() + $offset->y(),
+ $this->font->angle(),
+ (string) $textline
+ );
+ }
+ }
+
+ /**
+ * Return imagick font processor
+ *
+ * @throws FontException
+ */
+ private function processor(): FontProcessor
+ {
+ $processor = $this->driver()->fontProcessor();
+
+ if (!($processor instanceof FontProcessor)) {
+ throw new FontException('Font processor does not match the driver.');
+ }
+
+ return $processor;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php
new file mode 100755
index 00000000..88bc46a2
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php
@@ -0,0 +1,26 @@
+isAnimated()) {
+ throw new NotSupportedException('Trim modifier cannot be applied to animated images.');
+ }
+
+ $imagick = $image->core()->native();
+ $imagick->trimImage(($this->tolerance / 100 * $imagick->getQuantum()) / 1.5);
+ $imagick->setImagePage(0, 0, 0, 0);
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/Specializable.php b/vendor/intervention/image/src/Drivers/Specializable.php
new file mode 100755
index 00000000..30a1c3f2
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/Specializable.php
@@ -0,0 +1,13 @@
+analyze($this);
+ }
+}
diff --git a/vendor/intervention/image/src/Drivers/SpecializableDecoder.php b/vendor/intervention/image/src/Drivers/SpecializableDecoder.php
new file mode 100755
index 00000000..9b0bf8bc
--- /dev/null
+++ b/vendor/intervention/image/src/Drivers/SpecializableDecoder.php
@@ -0,0 +1,26 @@
+modify($this);
+ }
+}
diff --git a/vendor/intervention/image/src/EncodedImage.php b/vendor/intervention/image/src/EncodedImage.php
new file mode 100755
index 00000000..e8c767a0
--- /dev/null
+++ b/vendor/intervention/image/src/EncodedImage.php
@@ -0,0 +1,65 @@
+mediaType;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see EncodedImageInterface::mimetype()
+ */
+ public function mimetype(): string
+ {
+ return $this->mediaType();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see EncodedImageInterface::toDataUri()
+ */
+ public function toDataUri(): string
+ {
+ return sprintf('data:%s;base64,%s', $this->mediaType(), base64_encode((string) $this));
+ }
+
+ /**
+ * Show debug info for the current image
+ *
+ * @return array
+ */
+ public function __debugInfo(): array
+ {
+ return [
+ 'mediaType' => $this->mediaType(),
+ 'size' => $this->size(),
+ ];
+ }
+}
diff --git a/vendor/intervention/image/src/Encoders/AutoEncoder.php b/vendor/intervention/image/src/Encoders/AutoEncoder.php
new file mode 100755
index 00000000..0c909d1c
--- /dev/null
+++ b/vendor/intervention/image/src/Encoders/AutoEncoder.php
@@ -0,0 +1,25 @@
+encode(
+ $this->encoderByMediaType(
+ $image->origin()->mediaType()
+ )
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Encoders/AvifEncoder.php
new file mode 100755
index 00000000..2cf708d3
--- /dev/null
+++ b/vendor/intervention/image/src/Encoders/AvifEncoder.php
@@ -0,0 +1,23 @@
+
+ */
+ protected array $options = [];
+
+ /**
+ * Create new encoder instance to encode to format of given file extension
+ *
+ * @param null|string|FileExtension $extension Target file extension for example "png"
+ * @return void
+ */
+ public function __construct(public null|string|FileExtension $extension = null, mixed ...$options)
+ {
+ $this->options = $options;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see EncoderInterface::encode()
+ */
+ public function encode(ImageInterface $image): EncodedImageInterface
+ {
+ $extension = is_null($this->extension) ? $image->origin()->fileExtension() : $this->extension;
+
+ return $image->encode(
+ $this->encoderByFileExtension(
+ $extension
+ )
+ );
+ }
+
+ /**
+ * Create matching encoder for given file extension
+ *
+ * @throws EncoderException
+ */
+ protected function encoderByFileExtension(null|string|FileExtension $extension): EncoderInterface
+ {
+ if (empty($extension)) {
+ throw new EncoderException('No encoder found for empty file extension.');
+ }
+
+ try {
+ $extension = is_string($extension) ? FileExtension::from(strtolower($extension)) : $extension;
+ } catch (Error) {
+ throw new EncoderException('No encoder found for file extension (' . $extension . ').');
+ }
+
+ return $extension->format()->encoder(...$this->options);
+ }
+}
diff --git a/vendor/intervention/image/src/Encoders/FilePathEncoder.php b/vendor/intervention/image/src/Encoders/FilePathEncoder.php
new file mode 100755
index 00000000..62c496da
--- /dev/null
+++ b/vendor/intervention/image/src/Encoders/FilePathEncoder.php
@@ -0,0 +1,38 @@
+encode(
+ $this->encoderByFileExtension(
+ is_null($this->path) ? $image->origin()->fileExtension() : pathinfo($this->path, PATHINFO_EXTENSION)
+ )
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Encoders/GifEncoder.php b/vendor/intervention/image/src/Encoders/GifEncoder.php
new file mode 100755
index 00000000..0ee950a6
--- /dev/null
+++ b/vendor/intervention/image/src/Encoders/GifEncoder.php
@@ -0,0 +1,20 @@
+
+ */
+ protected array $options = [];
+
+ /**
+ * Create new encoder instance
+ *
+ * @param null|string|MediaType $mediaType Target media type for example "image/jpeg"
+ * @return void
+ */
+ public function __construct(public null|string|MediaType $mediaType = null, mixed ...$options)
+ {
+ $this->options = $options;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see EncoderInterface::encode()
+ */
+ public function encode(ImageInterface $image): EncodedImageInterface
+ {
+ $mediaType = is_null($this->mediaType) ? $image->origin()->mediaType() : $this->mediaType;
+
+ return $image->encode(
+ $this->encoderByMediaType($mediaType)
+ );
+ }
+
+ /**
+ * Return new encoder by given media (MIME) type
+ *
+ * @throws EncoderException
+ */
+ protected function encoderByMediaType(string|MediaType $mediaType): EncoderInterface
+ {
+ try {
+ $mediaType = is_string($mediaType) ? MediaType::from($mediaType) : $mediaType;
+ } catch (Error) {
+ throw new EncoderException('No encoder found for media type (' . $mediaType . ').');
+ }
+
+ return $mediaType->format()->encoder(...$this->options);
+ }
+}
diff --git a/vendor/intervention/image/src/Encoders/PngEncoder.php b/vendor/intervention/image/src/Encoders/PngEncoder.php
new file mode 100755
index 00000000..f5420738
--- /dev/null
+++ b/vendor/intervention/image/src/Encoders/PngEncoder.php
@@ -0,0 +1,20 @@
+pointer = $this->buildFilePointer($data);
+ }
+
+ /**
+ * Create file object from path in file system
+ *
+ * @throws RuntimeException
+ */
+ public static function fromPath(string $path): self
+ {
+ return new self(fopen($path, 'r'));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FileInterface::save()
+ */
+ public function save(string $filepath): void
+ {
+ $dir = pathinfo($filepath, PATHINFO_DIRNAME);
+
+ if (!is_dir($dir)) {
+ throw new NotWritableException(
+ "Can't write image to path. Directory does not exist."
+ );
+ }
+
+ if (!is_writable($dir)) {
+ throw new NotWritableException(
+ "Can't write image to path. Directory is not writable."
+ );
+ }
+
+ if (is_file($filepath) && !is_writable($filepath)) {
+ throw new NotWritableException(
+ sprintf("Can't write image. Path (%s) is not writable.", $filepath)
+ );
+ }
+
+ // write data
+ $saved = @file_put_contents($filepath, $this->toFilePointer());
+ if ($saved === false) {
+ throw new NotWritableException(
+ sprintf("Can't write image data to path (%s).", $filepath)
+ );
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FileInterface::toString()
+ */
+ public function toString(): string
+ {
+ return stream_get_contents($this->toFilePointer(), offset: 0);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FileInterface::toFilePointer()
+ */
+ public function toFilePointer()
+ {
+ rewind($this->pointer);
+
+ return $this->pointer;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FileInterface::size()
+ */
+ public function size(): int
+ {
+ $info = fstat($this->toFilePointer());
+
+ return intval($info['size']);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see FileInterface::__toString()
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+}
diff --git a/vendor/intervention/image/src/FileExtension.php b/vendor/intervention/image/src/FileExtension.php
new file mode 100755
index 00000000..dce24c53
--- /dev/null
+++ b/vendor/intervention/image/src/FileExtension.php
@@ -0,0 +1,127 @@
+fileExtension();
+ }
+
+ if ($identifier instanceof MediaType) {
+ return $identifier->fileExtension();
+ }
+
+ try {
+ $extension = self::from(strtolower($identifier));
+ } catch (Error) {
+ try {
+ $extension = MediaType::from(strtolower($identifier))->fileExtension();
+ } catch (Error) {
+ throw new NotSupportedException('Unable to create file extension from "' . $identifier . '".');
+ }
+ }
+
+ return $extension;
+ }
+
+ /**
+ * Try to create media type from given identifier and return null on failure
+ *
+ * @param string|Format|MediaType|FileExtension $identifier
+ * @return FileExtension|null
+ */
+ public static function tryCreate(string|self|Format|MediaType $identifier): ?self
+ {
+ try {
+ return self::create($identifier);
+ } catch (NotSupportedException) {
+ return null;
+ }
+ }
+
+ /**
+ * Return the matching format for the current file extension
+ */
+ public function format(): Format
+ {
+ return match ($this) {
+ self::JPEG,
+ self::JPG => Format::JPEG,
+ self::WEBP => Format::WEBP,
+ self::GIF => Format::GIF,
+ self::PNG => Format::PNG,
+ self::AVIF => Format::AVIF,
+ self::BMP => Format::BMP,
+ self::TIF,
+ self::TIFF => Format::TIFF,
+ self::JP2,
+ self::JP2K,
+ self::J2K,
+ self::JPF,
+ self::JPM,
+ self::JPG2,
+ self::J2C,
+ self::JPC,
+ self::JPX => Format::JP2,
+ self::HEIC,
+ self::HEIF => Format::HEIC,
+ };
+ }
+
+ /**
+ * Return media types for the current format
+ *
+ * @return array
+ */
+ public function mediaTypes(): array
+ {
+ return $this->format()->mediaTypes();
+ }
+
+ /**
+ * Return the first found media type for the current format
+ */
+ public function mediaType(): MediaType
+ {
+ return $this->format()->mediaType();
+ }
+}
diff --git a/vendor/intervention/image/src/Format.php b/vendor/intervention/image/src/Format.php
new file mode 100755
index 00000000..09be895d
--- /dev/null
+++ b/vendor/intervention/image/src/Format.php
@@ -0,0 +1,165 @@
+format();
+ }
+
+ if ($identifier instanceof FileExtension) {
+ return $identifier->format();
+ }
+
+ try {
+ $format = MediaType::from(strtolower($identifier))->format();
+ } catch (Error) {
+ try {
+ $format = FileExtension::from(strtolower($identifier))->format();
+ } catch (Error) {
+ throw new NotSupportedException('Unable to create format from "' . $identifier . '".');
+ }
+ }
+
+ return $format;
+ }
+
+ /**
+ * Try to create format from given identifier and return null on failure
+ *
+ * @param string|Format|MediaType|FileExtension $identifier
+ * @return Format|null
+ */
+ public static function tryCreate(string|self|MediaType|FileExtension $identifier): ?self
+ {
+ try {
+ return self::create($identifier);
+ } catch (NotSupportedException) {
+ return null;
+ }
+ }
+
+ /**
+ * Return the possible media (MIME) types for the current format
+ *
+ * @return array
+ */
+ public function mediaTypes(): array
+ {
+ return array_filter(
+ MediaType::cases(),
+ fn(MediaType $mediaType): bool => $mediaType->format() === $this
+ );
+ }
+
+ /**
+ * Return the first found media type for the current format
+ */
+ public function mediaType(): MediaType
+ {
+ $types = $this->mediaTypes();
+
+ return reset($types);
+ }
+
+ /**
+ * Return the possible file extension for the current format
+ *
+ * @return array
+ */
+ public function fileExtensions(): array
+ {
+ return array_filter(
+ FileExtension::cases(),
+ fn(FileExtension $fileExtension): bool => $fileExtension->format() === $this
+ );
+ }
+
+ /**
+ * Return the first found file extension for the current format
+ */
+ public function fileExtension(): FileExtension
+ {
+ $extensions = $this->fileExtensions();
+
+ return reset($extensions);
+ }
+
+ /**
+ * Create an encoder instance with given options that matches the format
+ */
+ public function encoder(mixed ...$options): EncoderInterface
+ {
+ // get classname of target encoder from current format
+ $classname = match ($this) {
+ self::AVIF => AvifEncoder::class,
+ self::BMP => BmpEncoder::class,
+ self::GIF => GifEncoder::class,
+ self::HEIC => HeicEncoder::class,
+ self::JP2 => Jpeg2000Encoder::class,
+ self::JPEG => JpegEncoder::class,
+ self::PNG => PngEncoder::class,
+ self::TIFF => TiffEncoder::class,
+ self::WEBP => WebpEncoder::class,
+ };
+
+ // get parameters of target encoder
+ $parameters = [];
+ $reflectionClass = new ReflectionClass($classname);
+ if ($constructor = $reflectionClass->getConstructor()) {
+ $parameters = array_map(
+ fn(ReflectionParameter $parameter): string => $parameter->getName(),
+ $constructor->getParameters(),
+ );
+ }
+
+ // filter out unavailable options of target encoder
+ $options = array_filter(
+ $options,
+ fn(mixed $key): bool => in_array($key, $parameters),
+ ARRAY_FILTER_USE_KEY,
+ );
+
+ return new $classname(...$options);
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Bezier.php b/vendor/intervention/image/src/Geometry/Bezier.php
new file mode 100755
index 00000000..27dbba14
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Bezier.php
@@ -0,0 +1,202 @@
+
+ * @implements ArrayAccess
+ */
+class Bezier implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface
+{
+ use HasBorder;
+ use HasBackgroundColor;
+
+ /**
+ * Create new bezier instance
+ *
+ * @param array $points
+ * @return void
+ */
+ public function __construct(
+ protected array $points = [],
+ protected PointInterface $pivot = new Point()
+ ) {
+ //
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::position()
+ */
+ public function position(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setPosition()
+ */
+ public function setPosition(PointInterface $position): DrawableInterface
+ {
+ $this->pivot = $position;
+
+ return $this;
+ }
+
+ /**
+ * Implement iteration through all points of bezier
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator($this->points);
+ }
+
+ /**
+ * Return current pivot point
+ */
+ public function pivot(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * Change pivot point to given point
+ */
+ public function setPivot(PointInterface $pivot): self
+ {
+ $this->pivot = $pivot;
+
+ return $this;
+ }
+
+ /**
+ * Return first control point of bezier
+ */
+ public function first(): ?PointInterface
+ {
+ if ($point = reset($this->points)) {
+ return $point;
+ }
+
+ return null;
+ }
+
+ /**
+ * Return second control point of bezier
+ */
+ public function second(): ?PointInterface
+ {
+ if (array_key_exists(1, $this->points)) {
+ return $this->points[1];
+ }
+
+ return null;
+ }
+
+ /**
+ * Return third control point of bezier
+ */
+ public function third(): ?PointInterface
+ {
+ if (array_key_exists(2, $this->points)) {
+ return $this->points[2];
+ }
+
+ return null;
+ }
+
+ /**
+ * Return last control point of bezier
+ */
+ public function last(): ?PointInterface
+ {
+ if ($point = end($this->points)) {
+ return $point;
+ }
+
+ return null;
+ }
+
+ /**
+ * Return bezier's point count
+ */
+ public function count(): int
+ {
+ return count($this->points);
+ }
+
+ /**
+ * Determine if point exists at given offset
+ */
+ public function offsetExists(mixed $offset): bool
+ {
+ return array_key_exists($offset, $this->points);
+ }
+
+ /**
+ * Return point at given offset
+ */
+ public function offsetGet(mixed $offset): mixed
+ {
+ return $this->points[$offset];
+ }
+
+ /**
+ * Set point at given offset
+ */
+ public function offsetSet(mixed $offset, mixed $value): void
+ {
+ $this->points[$offset] = $value;
+ }
+
+ /**
+ * Unset offset at given offset
+ */
+ public function offsetUnset(mixed $offset): void
+ {
+ unset($this->points[$offset]);
+ }
+
+ /**
+ * Add given point to bezier
+ */
+ public function addPoint(PointInterface $point): self
+ {
+ $this->points[] = $point;
+
+ return $this;
+ }
+
+ /**
+ * Return array of all x/y values of all points of bezier
+ *
+ * @return array
+ */
+ public function toArray(): array
+ {
+ $coordinates = [];
+ foreach ($this->points as $point) {
+ $coordinates[] = $point->x();
+ $coordinates[] = $point->y();
+ }
+
+ return $coordinates;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Circle.php b/vendor/intervention/image/src/Geometry/Circle.php
new file mode 100755
index 00000000..dc2e28b9
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Circle.php
@@ -0,0 +1,57 @@
+setWidth($diameter);
+ $this->setHeight($diameter);
+
+ return $this;
+ }
+
+ /**
+ * Get diameter of circle
+ */
+ public function diameter(): int
+ {
+ return $this->width();
+ }
+
+ /**
+ * Set radius of circle
+ */
+ public function setRadius(int $radius): self
+ {
+ return $this->setDiameter(intval($radius * 2));
+ }
+
+ /**
+ * Get radius of circle
+ */
+ public function radius(): int
+ {
+ return intval(round($this->diameter() / 2));
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Ellipse.php b/vendor/intervention/image/src/Geometry/Ellipse.php
new file mode 100755
index 00000000..e27c9d8e
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Ellipse.php
@@ -0,0 +1,103 @@
+pivot;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setPosition()
+ */
+ public function setPosition(PointInterface $position): self
+ {
+ $this->pivot = $position;
+
+ return $this;
+ }
+
+ /**
+ * Return pivot point of Ellipse
+ */
+ public function pivot(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * Set size of Ellipse
+ */
+ public function setSize(int $width, int $height): self
+ {
+ return $this->setWidth($width)->setHeight($height);
+ }
+
+ /**
+ * Set width of Ellipse
+ */
+ public function setWidth(int $width): self
+ {
+ $this->width = $width;
+
+ return $this;
+ }
+
+ /**
+ * Set height of Ellipse
+ */
+ public function setHeight(int $height): self
+ {
+ $this->height = $height;
+
+ return $this;
+ }
+
+ /**
+ * Get width of Ellipse
+ */
+ public function width(): int
+ {
+ return $this->width;
+ }
+
+ /**
+ * Get height of Ellipse
+ */
+ public function height(): int
+ {
+ return $this->height;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php b/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php
new file mode 100755
index 00000000..2d8410ba
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php
@@ -0,0 +1,88 @@
+bezier = is_a($init, Bezier::class) ? $init : new Bezier([]);
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self($init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->bezier;
+ }
+
+ /**
+ * Add a point to the bezier to be produced
+ */
+ public function point(int $x, int $y): self
+ {
+ $this->bezier->addPoint(new Point($x, $y));
+
+ return $this;
+ }
+
+ /**
+ * Set the background color of the bezier to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->bezier->setBackgroundColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border color & border size of the bezier to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->bezier->setBorder($color, $size);
+
+ return $this;
+ }
+
+ /**
+ * Produce the bezier
+ */
+ public function __invoke(): Bezier
+ {
+ return $this->bezier;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php b/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php
new file mode 100755
index 00000000..f45b5812
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php
@@ -0,0 +1,102 @@
+circle = is_a($init, Circle::class) ? $init : new Circle(0);
+ $this->circle->setPosition($pivot);
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self(init: $init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->circle;
+ }
+
+ /**
+ * Set the radius of the circle to be produced
+ */
+ public function radius(int $radius): self
+ {
+ $this->circle->setSize($radius * 2, $radius * 2);
+
+ return $this;
+ }
+
+ /**
+ * Set the diameter of the circle to be produced
+ */
+ public function diameter(int $diameter): self
+ {
+ $this->circle->setSize($diameter, $diameter);
+
+ return $this;
+ }
+
+ /**
+ * Set the background color of the circle to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->circle->setBackgroundColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border color & border size of the ellipse to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->circle->setBorder($color, $size);
+
+ return $this;
+ }
+
+ /**
+ * Produce the circle
+ */
+ public function __invoke(): Circle
+ {
+ return $this->circle;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/Drawable.php b/vendor/intervention/image/src/Geometry/Factories/Drawable.php
new file mode 100755
index 00000000..e7f14ba9
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/Drawable.php
@@ -0,0 +1,56 @@
+ellipse = is_a($init, Ellipse::class) ? $init : new Ellipse(0, 0);
+ $this->ellipse->setPosition($pivot);
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self(init: $init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->ellipse;
+ }
+
+ /**
+ * Set the size of the ellipse to be produced
+ */
+ public function size(int $width, int $height): self
+ {
+ $this->ellipse->setSize($width, $height);
+
+ return $this;
+ }
+
+ /**
+ * Set the width of the ellipse to be produced
+ */
+ public function width(int $width): self
+ {
+ $this->ellipse->setWidth($width);
+
+ return $this;
+ }
+
+ /**
+ * Set the height of the ellipse to be produced
+ */
+ public function height(int $height): self
+ {
+ $this->ellipse->setHeight($height);
+
+ return $this;
+ }
+
+ /**
+ * Set the background color of the ellipse to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->ellipse->setBackgroundColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border color & border size of the ellipse to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->ellipse->setBorder($color, $size);
+
+ return $this;
+ }
+
+ /**
+ * Produce the ellipse
+ */
+ public function __invoke(): Ellipse
+ {
+ return $this->ellipse;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/LineFactory.php b/vendor/intervention/image/src/Geometry/Factories/LineFactory.php
new file mode 100755
index 00000000..ce65433a
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/LineFactory.php
@@ -0,0 +1,122 @@
+line = is_a($init, Line::class) ? $init : new Line(new Point(), new Point());
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self($init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->line;
+ }
+
+ /**
+ * Set the color of the line to be produced
+ */
+ public function color(mixed $color): self
+ {
+ $this->line->setBackgroundColor($color);
+ $this->line->setBorderColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the (background) color of the line to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->line->setBackgroundColor($color);
+ $this->line->setBorderColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border size & border color of the line to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->line->setBackgroundColor($color);
+ $this->line->setBorderColor($color);
+ $this->line->setWidth($size);
+
+ return $this;
+ }
+
+ /**
+ * Set the width of the line to be produced
+ */
+ public function width(int $size): self
+ {
+ $this->line->setWidth($size);
+
+ return $this;
+ }
+
+ /**
+ * Set the coordinates of the starting point of the line to be produced
+ */
+ public function from(int $x, int $y): self
+ {
+ $this->line->setStart(new Point($x, $y));
+
+ return $this;
+ }
+
+ /**
+ * Set the coordinates of the end point of the line to be produced
+ */
+ public function to(int $x, int $y): self
+ {
+ $this->line->setEnd(new Point($x, $y));
+
+ return $this;
+ }
+
+ /**
+ * Produce the line
+ */
+ public function __invoke(): Line
+ {
+ return $this->line;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php b/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php
new file mode 100755
index 00000000..d065eb86
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php
@@ -0,0 +1,88 @@
+polygon = is_a($init, Polygon::class) ? $init : new Polygon([]);
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self($init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->polygon;
+ }
+
+ /**
+ * Add a point to the polygon to be produced
+ */
+ public function point(int $x, int $y): self
+ {
+ $this->polygon->addPoint(new Point($x, $y));
+
+ return $this;
+ }
+
+ /**
+ * Set the background color of the polygon to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->polygon->setBackgroundColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border color & border size of the polygon to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->polygon->setBorder($color, $size);
+
+ return $this;
+ }
+
+ /**
+ * Produce the polygon
+ */
+ public function __invoke(): Polygon
+ {
+ return $this->polygon;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php b/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php
new file mode 100755
index 00000000..34732f24
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php
@@ -0,0 +1,112 @@
+rectangle = is_a($init, Rectangle::class) ? $init : new Rectangle(0, 0, $pivot);
+ $this->rectangle->setPosition($pivot);
+
+ if (is_callable($init)) {
+ $init($this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::init()
+ */
+ public static function init(null|Closure|DrawableInterface $init = null): self
+ {
+ return new self(init: $init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableFactoryInterface::create()
+ */
+ public function create(): DrawableInterface
+ {
+ return $this->rectangle;
+ }
+
+ /**
+ * Set the size of the rectangle to be produced
+ */
+ public function size(int $width, int $height): self
+ {
+ $this->rectangle->setSize($width, $height);
+
+ return $this;
+ }
+
+ /**
+ * Set the width of the rectangle to be produced
+ */
+ public function width(int $width): self
+ {
+ $this->rectangle->setWidth($width);
+
+ return $this;
+ }
+
+ /**
+ * Set the height of the rectangle to be produced
+ */
+ public function height(int $height): self
+ {
+ $this->rectangle->setHeight($height);
+
+ return $this;
+ }
+
+ /**
+ * Set the background color of the rectangle to be produced
+ */
+ public function background(mixed $color): self
+ {
+ $this->rectangle->setBackgroundColor($color);
+
+ return $this;
+ }
+
+ /**
+ * Set the border color & border size of the rectangle to be produced
+ */
+ public function border(mixed $color, int $size = 1): self
+ {
+ $this->rectangle->setBorder($color, $size);
+
+ return $this;
+ }
+
+ /**
+ * Produce the rectangle
+ */
+ public function __invoke(): Rectangle
+ {
+ return $this->rectangle;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Line.php b/vendor/intervention/image/src/Geometry/Line.php
new file mode 100755
index 00000000..14dd062d
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Line.php
@@ -0,0 +1,127 @@
+start;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setPosition()
+ */
+ public function setPosition(PointInterface $position): DrawableInterface
+ {
+ $this->start = $position;
+
+ return $this;
+ }
+
+ /**
+ * Return line width
+ */
+ public function width(): int
+ {
+ return $this->width;
+ }
+
+ /**
+ * Set line width
+ */
+ public function setWidth(int $width): self
+ {
+ $this->width = $width;
+
+ return $this;
+ }
+
+ /**
+ * Get starting point of line
+ */
+ public function start(): PointInterface
+ {
+ return $this->start;
+ }
+
+ /**
+ * get end point of line
+ */
+ public function end(): PointInterface
+ {
+ return $this->end;
+ }
+
+ /**
+ * Set starting point of line
+ */
+ public function setStart(PointInterface $start): self
+ {
+ $this->start = $start;
+
+ return $this;
+ }
+
+ /**
+ * Set starting point of line by coordinates
+ */
+ public function from(int $x, int $y): self
+ {
+ $this->start()->setX($x);
+ $this->start()->setY($y);
+
+ return $this;
+ }
+
+ /**
+ * Set end point of line by coordinates
+ */
+ public function to(int $x, int $y): self
+ {
+ $this->end()->setX($x);
+ $this->end()->setY($y);
+
+ return $this;
+ }
+
+ /**
+ * Set end point of line
+ */
+ public function setEnd(PointInterface $end): self
+ {
+ $this->end = $end;
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Pixel.php b/vendor/intervention/image/src/Geometry/Pixel.php
new file mode 100755
index 00000000..dc5c5804
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Pixel.php
@@ -0,0 +1,45 @@
+background = $background;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::backgroundColor()
+ */
+ public function backgroundColor(): ColorInterface
+ {
+ return $this->background;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Point.php b/vendor/intervention/image/src/Geometry/Point.php
new file mode 100755
index 00000000..f23cd565
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Point.php
@@ -0,0 +1,145 @@
+
+ */
+class Point implements PointInterface, IteratorAggregate
+{
+ /**
+ * Create new point instance
+ *
+ * @return void
+ */
+ public function __construct(
+ protected int $x = 0,
+ protected int $y = 0
+ ) {
+ //
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see IteratorAggregate::getIterator()
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator([$this->x, $this->y]);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::setX()
+ */
+ public function setX(int $x): self
+ {
+ $this->x = $x;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::x()
+ */
+ public function x(): int
+ {
+ return $this->x;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::setY()
+ */
+ public function setY(int $y): self
+ {
+ $this->y = $y;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::y()
+ */
+ public function y(): int
+ {
+ return $this->y;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::moveX()
+ */
+ public function moveX(int $value): self
+ {
+ $this->x += $value;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::moveY()
+ */
+ public function moveY(int $value): self
+ {
+ $this->y += $value;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::move()
+ */
+ public function move(int $x, int $y): self
+ {
+ return $this->moveX($x)->moveY($y);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::setPosition()
+ */
+ public function setPosition(int $x, int $y): self
+ {
+ $this->setX($x);
+ $this->setY($y);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see PointInterface::rotate()
+ */
+ public function rotate(float $angle, PointInterface $pivot): self
+ {
+ $sin = round(sin(deg2rad($angle)), 6);
+ $cos = round(cos(deg2rad($angle)), 6);
+
+ return $this->setPosition(
+ intval($cos * ($this->x() - $pivot->x()) - $sin * ($this->y() - $pivot->y()) + $pivot->x()),
+ intval($sin * ($this->x() - $pivot->x()) + $cos * ($this->y() - $pivot->y()) + $pivot->y())
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Polygon.php b/vendor/intervention/image/src/Geometry/Polygon.php
new file mode 100755
index 00000000..c416d39b
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Polygon.php
@@ -0,0 +1,390 @@
+
+ * @implements ArrayAccess
+ */
+class Polygon implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface
+{
+ use HasBorder;
+ use HasBackgroundColor;
+
+ /**
+ * Create new polygon instance
+ *
+ * @param array $points
+ * @return void
+ */
+ public function __construct(
+ protected array $points = [],
+ protected PointInterface $pivot = new Point()
+ ) {
+ //
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::position()
+ */
+ public function position(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setPosition()
+ */
+ public function setPosition(PointInterface $position): self
+ {
+ $this->pivot = $position;
+
+ return $this;
+ }
+
+ /**
+ * Implement iteration through all points of polygon
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator($this->points);
+ }
+
+ /**
+ * Return current pivot point
+ */
+ public function pivot(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * Change pivot point to given point
+ */
+ public function setPivot(PointInterface $pivot): self
+ {
+ $this->pivot = $pivot;
+
+ return $this;
+ }
+
+ /**
+ * Return first point of polygon
+ */
+ public function first(): ?PointInterface
+ {
+ if ($point = reset($this->points)) {
+ return $point;
+ }
+
+ return null;
+ }
+
+ /**
+ * Return last point of polygon
+ */
+ public function last(): ?PointInterface
+ {
+ if ($point = end($this->points)) {
+ return $point;
+ }
+
+ return null;
+ }
+
+ /**
+ * Return polygon's point count
+ */
+ public function count(): int
+ {
+ return count($this->points);
+ }
+
+ /**
+ * Determine if point exists at given offset
+ */
+ public function offsetExists(mixed $offset): bool
+ {
+ return array_key_exists($offset, $this->points);
+ }
+
+ /**
+ * Return point at given offset
+ */
+ public function offsetGet(mixed $offset): mixed
+ {
+ return $this->points[$offset];
+ }
+
+ /**
+ * Set point at given offset
+ */
+ public function offsetSet(mixed $offset, mixed $value): void
+ {
+ $this->points[$offset] = $value;
+ }
+
+ /**
+ * Unset offset at given offset
+ */
+ public function offsetUnset(mixed $offset): void
+ {
+ unset($this->points[$offset]);
+ }
+
+ /**
+ * Add given point to polygon
+ */
+ public function addPoint(PointInterface $point): self
+ {
+ $this->points[] = $point;
+
+ return $this;
+ }
+
+ /**
+ * Calculate total horizontal span of polygon
+ */
+ public function width(): int
+ {
+ return abs($this->mostLeftPoint()->x() - $this->mostRightPoint()->x());
+ }
+
+ /**
+ * Calculate total vertical span of polygon
+ */
+ public function height(): int
+ {
+ return abs($this->mostBottomPoint()->y() - $this->mostTopPoint()->y());
+ }
+
+ /**
+ * Return most left point of all points in polygon
+ */
+ public function mostLeftPoint(): PointInterface
+ {
+ $points = $this->points;
+
+ usort($points, function (PointInterface $a, PointInterface $b): int {
+ if ($a->x() === $b->x()) {
+ return 0;
+ }
+ return $a->x() < $b->x() ? -1 : 1;
+ });
+
+ return $points[0];
+ }
+
+ /**
+ * Return most right point in polygon
+ */
+ public function mostRightPoint(): PointInterface
+ {
+ $points = $this->points;
+
+ usort($points, function (PointInterface $a, PointInterface $b): int {
+ if ($a->x() === $b->x()) {
+ return 0;
+ }
+ return $a->x() > $b->x() ? -1 : 1;
+ });
+
+ return $points[0];
+ }
+
+ /**
+ * Return most top point in polygon
+ */
+ public function mostTopPoint(): PointInterface
+ {
+ $points = $this->points;
+
+ usort($points, function (PointInterface $a, PointInterface $b): int {
+ if ($a->y() === $b->y()) {
+ return 0;
+ }
+ return $a->y() > $b->y() ? -1 : 1;
+ });
+
+ return $points[0];
+ }
+
+ /**
+ * Return most bottom point in polygon
+ */
+ public function mostBottomPoint(): PointInterface
+ {
+ $points = $this->points;
+
+ usort($points, function (PointInterface $a, PointInterface $b): int {
+ if ($a->y() === $b->y()) {
+ return 0;
+ }
+ return $a->y() < $b->y() ? -1 : 1;
+ });
+
+ return $points[0];
+ }
+
+ /**
+ * Return point in absolute center of the polygon
+ */
+ public function centerPoint(): PointInterface
+ {
+ return new Point(
+ $this->mostRightPoint()->x() - (intval(round($this->width() / 2))),
+ $this->mostTopPoint()->y() - (intval(round($this->height() / 2)))
+ );
+ }
+
+ /**
+ * Align all points of polygon horizontally to given position around pivot point
+ */
+ public function align(string $position): self
+ {
+ switch (strtolower($position)) {
+ case 'center':
+ case 'middle':
+ $diff = $this->centerPoint()->x() - $this->pivot()->x();
+ break;
+
+ case 'right':
+ $diff = $this->mostRightPoint()->x() - $this->pivot()->x();
+ break;
+
+ default:
+ case 'left':
+ $diff = $this->mostLeftPoint()->x() - $this->pivot()->x();
+ break;
+ }
+
+ foreach ($this->points as $point) {
+ $point->setX(
+ intval($point->x() - $diff)
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Align all points of polygon vertically to given position around pivot point
+ */
+ public function valign(string $position): self
+ {
+ switch (strtolower($position)) {
+ case 'center':
+ case 'middle':
+ $diff = $this->centerPoint()->y() - $this->pivot()->y();
+ break;
+
+ case 'top':
+ $diff = $this->mostTopPoint()->y() - $this->pivot()->y() - $this->height();
+ break;
+
+ default:
+ case 'bottom':
+ $diff = $this->mostBottomPoint()->y() - $this->pivot()->y() + $this->height();
+ break;
+ }
+
+ foreach ($this->points as $point) {
+ $point->setY(
+ intval($point->y() - $diff),
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Rotate points of polygon around pivot point with given angle
+ */
+ public function rotate(float $angle): self
+ {
+ $sin = sin(deg2rad($angle));
+ $cos = cos(deg2rad($angle));
+
+ foreach ($this->points as $point) {
+ // translate point to pivot
+ $point->setX(
+ intval($point->x() - $this->pivot()->x()),
+ );
+ $point->setY(
+ intval($point->y() - $this->pivot()->y()),
+ );
+
+ // rotate point
+ $x = $point->x() * $cos - $point->y() * $sin;
+ $y = $point->x() * $sin + $point->y() * $cos;
+
+ // translate point back
+ $point->setX(
+ intval($x + $this->pivot()->x()),
+ );
+ $point->setY(
+ intval($y + $this->pivot()->y()),
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Move all points by given amount on the x-axis
+ */
+ public function movePointsX(int $amount): self
+ {
+ foreach ($this->points as $point) {
+ $point->moveX($amount);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Move all points by given amount on the y-axis
+ */
+ public function movePointsY(int $amount): self
+ {
+ foreach ($this->points as $point) {
+ $point->moveY($amount);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return array of all x/y values of all points of polygon
+ *
+ * @return array
+ */
+ public function toArray(): array
+ {
+ $coordinates = [];
+ foreach ($this->points as $point) {
+ $coordinates[] = $point->x();
+ $coordinates[] = $point->y();
+ }
+
+ return $coordinates;
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Rectangle.php b/vendor/intervention/image/src/Geometry/Rectangle.php
new file mode 100755
index 00000000..01e57f9b
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Rectangle.php
@@ -0,0 +1,335 @@
+addPoint(new Point($this->pivot->x(), $this->pivot->y()));
+ $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y()));
+ $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y() - $height));
+ $this->addPoint(new Point($this->pivot->x(), $this->pivot->y() - $height));
+ }
+
+ /**
+ * Set size of rectangle
+ */
+ public function setSize(int $width, int $height): self
+ {
+ return $this->setWidth($width)->setHeight($height);
+ }
+
+ /**
+ * Set width of rectangle
+ */
+ public function setWidth(int $width): self
+ {
+ $this[1]->setX($this[0]->x() + $width);
+ $this[2]->setX($this[3]->x() + $width);
+
+ return $this;
+ }
+
+ /**
+ * Set height of rectangle
+ */
+ public function setHeight(int $height): self
+ {
+ $this[2]->setY($this[1]->y() + $height);
+ $this[3]->setY($this[0]->y() + $height);
+
+ return $this;
+ }
+
+ /**
+ * Return pivot point of rectangle
+ */
+ public function pivot(): PointInterface
+ {
+ return $this->pivot;
+ }
+
+ /**
+ * Set pivot point of rectangle
+ */
+ public function setPivot(PointInterface $pivot): self
+ {
+ $this->pivot = $pivot;
+
+ return $this;
+ }
+
+ /**
+ * Move pivot to the given position in the rectangle and adjust the new
+ * position by given offset values.
+ */
+ public function movePivot(string $position, int $offset_x = 0, int $offset_y = 0): self
+ {
+ switch (strtolower($position)) {
+ case 'top':
+ case 'top-center':
+ case 'top-middle':
+ case 'center-top':
+ case 'middle-top':
+ $x = intval(round($this->width() / 2)) + $offset_x;
+ $y = $offset_y;
+ break;
+
+ case 'top-right':
+ case 'right-top':
+ $x = $this->width() - $offset_x;
+ $y = $offset_y;
+ break;
+
+ case 'left':
+ case 'left-center':
+ case 'left-middle':
+ case 'center-left':
+ case 'middle-left':
+ $x = $offset_x;
+ $y = intval(round($this->height() / 2)) + $offset_y;
+ break;
+
+ case 'right':
+ case 'right-center':
+ case 'right-middle':
+ case 'center-right':
+ case 'middle-right':
+ $x = $this->width() - $offset_x;
+ $y = intval(round($this->height() / 2)) + $offset_y;
+ break;
+
+ case 'bottom-left':
+ case 'left-bottom':
+ $x = $offset_x;
+ $y = $this->height() - $offset_y;
+ break;
+
+ case 'bottom':
+ case 'bottom-center':
+ case 'bottom-middle':
+ case 'center-bottom':
+ case 'middle-bottom':
+ $x = intval(round($this->width() / 2)) + $offset_x;
+ $y = $this->height() - $offset_y;
+ break;
+
+ case 'bottom-right':
+ case 'right-bottom':
+ $x = $this->width() - $offset_x;
+ $y = $this->height() - $offset_y;
+ break;
+
+ case 'center':
+ case 'middle':
+ case 'center-center':
+ case 'middle-middle':
+ $x = intval(round($this->width() / 2)) + $offset_x;
+ $y = intval(round($this->height() / 2)) + $offset_y;
+ break;
+
+ default:
+ case 'top-left':
+ case 'left-top':
+ $x = $offset_x;
+ $y = $offset_y;
+ break;
+ }
+
+ $this->pivot->setPosition($x, $y);
+
+ return $this;
+ }
+
+ /**
+ * Align pivot relative to given size at given position
+ */
+ public function alignPivotTo(SizeInterface $size, string $position): self
+ {
+ $reference = new self($size->width(), $size->height());
+ $reference->movePivot($position);
+
+ $this->movePivot($position)->setPivot(
+ $reference->relativePositionTo($this)
+ );
+
+ return $this;
+ }
+
+ /**
+ * Return relative position to given rectangle
+ */
+ public function relativePositionTo(SizeInterface $rectangle): PointInterface
+ {
+ return new Point(
+ $this->pivot()->x() - $rectangle->pivot()->x(),
+ $this->pivot()->y() - $rectangle->pivot()->y()
+ );
+ }
+
+ /**
+ * Return aspect ration of rectangle
+ */
+ public function aspectRatio(): float
+ {
+ return $this->width() / $this->height();
+ }
+
+ /**
+ * Determine if rectangle fits into given rectangle
+ */
+ public function fitsInto(SizeInterface $size): bool
+ {
+ if ($this->width() > $size->width()) {
+ return false;
+ }
+
+ if ($this->height() > $size->height()) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Determine if rectangle has landscape format
+ */
+ public function isLandscape(): bool
+ {
+ return $this->width() > $this->height();
+ }
+
+ /**
+ * Determine if rectangle has landscape format
+ */
+ public function isPortrait(): bool
+ {
+ return $this->width() < $this->height();
+ }
+
+ /**
+ * Return most top left point of rectangle
+ */
+ public function topLeftPoint(): PointInterface
+ {
+ return $this->points[0];
+ }
+
+ /**
+ * Return bottom right point of rectangle
+ */
+ public function bottomRightPoint(): PointInterface
+ {
+ return $this->points[2];
+ }
+
+ /**
+ * @see SizeInterface::resize()
+ *
+ * @throws GeometryException
+ */
+ public function resize(?int $width = null, ?int $height = null): SizeInterface
+ {
+ return $this->resizer($width, $height)->resize($this);
+ }
+
+ /**
+ * @see SizeInterface::resizeDown()
+ *
+ * @throws GeometryException
+ */
+ public function resizeDown(?int $width = null, ?int $height = null): SizeInterface
+ {
+ return $this->resizer($width, $height)->resizeDown($this);
+ }
+
+ /**
+ * @see SizeInterface::scale()
+ *
+ * @throws GeometryException
+ */
+ public function scale(?int $width = null, ?int $height = null): SizeInterface
+ {
+ return $this->resizer($width, $height)->scale($this);
+ }
+
+ /**
+ * @see SizeInterface::scaleDown()
+ *
+ * @throws GeometryException
+ */
+ public function scaleDown(?int $width = null, ?int $height = null): SizeInterface
+ {
+ return $this->resizer($width, $height)->scaleDown($this);
+ }
+
+ /**
+ * @see SizeInterface::cover()
+ *
+ * @throws GeometryException
+ */
+ public function cover(int $width, int $height): SizeInterface
+ {
+ return $this->resizer($width, $height)->cover($this);
+ }
+
+ /**
+ * @see SizeInterface::contain()
+ *
+ * @throws GeometryException
+ */
+ public function contain(int $width, int $height): SizeInterface
+ {
+ return $this->resizer($width, $height)->contain($this);
+ }
+
+ /**
+ * @see SizeInterface::containMax()
+ *
+ * @throws GeometryException
+ */
+ public function containMax(int $width, int $height): SizeInterface
+ {
+ return $this->resizer($width, $height)->containDown($this);
+ }
+
+ /**
+ * Create resizer instance with given target size
+ *
+ * @throws GeometryException
+ */
+ protected function resizer(?int $width = null, ?int $height = null): RectangleResizer
+ {
+ return new RectangleResizer($width, $height);
+ }
+
+ /**
+ * Show debug info for the current rectangle
+ *
+ * @return array
+ */
+ public function __debugInfo(): array
+ {
+ return [
+ 'width' => $this->width(),
+ 'height' => $this->height(),
+ 'pivot' => $this->pivot,
+ ];
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php b/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php
new file mode 100755
index 00000000..7136b367
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php
@@ -0,0 +1,341 @@
+width);
+ }
+
+ /**
+ * Return target width of resizer if available
+ */
+ protected function getTargetWidth(): ?int
+ {
+ return $this->hasTargetWidth() ? $this->width : null;
+ }
+
+ /**
+ * Determine if resize has target height
+ */
+ protected function hasTargetHeight(): bool
+ {
+ return is_int($this->height);
+ }
+
+ /**
+ * Return target width of resizer if available
+ */
+ protected function getTargetHeight(): ?int
+ {
+ return $this->hasTargetHeight() ? $this->height : null;
+ }
+
+ /**
+ * Return target size object
+ *
+ * @throws GeometryException
+ */
+ protected function getTargetSize(): SizeInterface
+ {
+ if (!$this->hasTargetWidth() || !$this->hasTargetHeight()) {
+ throw new GeometryException('Target size needs width and height.');
+ }
+
+ return new Rectangle($this->width, $this->height);
+ }
+
+ /**
+ * Set target width of resizer
+ */
+ public function toWidth(int $width): self
+ {
+ $this->width = $width;
+
+ return $this;
+ }
+
+ /**
+ * Set target height of resizer
+ */
+ public function toHeight(int $height): self
+ {
+ $this->height = $height;
+
+ return $this;
+ }
+
+ /**
+ * Set target size to given size object
+ */
+ public function toSize(SizeInterface $size): self
+ {
+ $this->width = $size->width();
+ $this->height = $size->height();
+
+ return $this;
+ }
+
+ /**
+ * Get proportinal width
+ */
+ protected function getProportionalWidth(SizeInterface $size): int
+ {
+ if (!$this->hasTargetHeight()) {
+ return $size->width();
+ }
+
+ return max([1, (int) round($this->height * $size->aspectRatio())]);
+ }
+
+ /**
+ * Get proportinal height
+ */
+ protected function getProportionalHeight(SizeInterface $size): int
+ {
+ if (!$this->hasTargetWidth()) {
+ return $size->height();
+ }
+
+ return max([1, (int) round($this->width / $size->aspectRatio())]);
+ }
+
+ /**
+ * Resize given size to target size of the resizer
+ */
+ public function resize(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ if ($width = $this->getTargetWidth()) {
+ $resized->setWidth($width);
+ }
+
+ if ($height = $this->getTargetHeight()) {
+ $resized->setHeight($height);
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Resize given size to target size of the resizer but do not exceed original size
+ */
+ public function resizeDown(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ if ($width = $this->getTargetWidth()) {
+ $resized->setWidth(
+ min($width, $size->width())
+ );
+ }
+
+ if ($height = $this->getTargetHeight()) {
+ $resized->setHeight(
+ min($height, $size->height())
+ );
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Resize given size to target size proportinally
+ */
+ public function scale(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ if ($this->hasTargetWidth() && $this->hasTargetHeight()) {
+ $resized->setWidth(min(
+ $this->getProportionalWidth($size),
+ $this->getTargetWidth()
+ ));
+ $resized->setHeight(min(
+ $this->getProportionalHeight($size),
+ $this->getTargetHeight()
+ ));
+ } elseif ($this->hasTargetWidth()) {
+ $resized->setWidth($this->getTargetWidth());
+ $resized->setHeight($this->getProportionalHeight($size));
+ } elseif ($this->hasTargetHeight()) {
+ $resized->setWidth($this->getProportionalWidth($size));
+ $resized->setHeight($this->getTargetHeight());
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Resize given size to target size proportinally but do not exceed original size
+ */
+ public function scaleDown(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ if ($this->hasTargetWidth() && $this->hasTargetHeight()) {
+ $resized->setWidth(min(
+ $this->getProportionalWidth($size),
+ $this->getTargetWidth(),
+ $size->width()
+ ));
+ $resized->setHeight(min(
+ $this->getProportionalHeight($size),
+ $this->getTargetHeight(),
+ $size->height()
+ ));
+ } elseif ($this->hasTargetWidth()) {
+ $resized->setWidth(min(
+ $this->getTargetWidth(),
+ $size->width()
+ ));
+ $resized->setHeight(min(
+ $this->getProportionalHeight($size),
+ $size->height()
+ ));
+ } elseif ($this->hasTargetHeight()) {
+ $resized->setWidth(min(
+ $this->getProportionalWidth($size),
+ $size->width()
+ ));
+ $resized->setHeight(min(
+ $this->getTargetHeight(),
+ $size->height()
+ ));
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Scale given size to cover target size
+ *
+ * @param SizeInterface $size Size to be resized
+ * @throws GeometryException
+ */
+ public function cover(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ // auto height
+ $resized->setWidth($this->getTargetWidth());
+ $resized->setHeight($this->getProportionalHeight($size));
+
+ if ($resized->fitsInto($this->getTargetSize())) {
+ // auto width
+ $resized->setWidth($this->getProportionalWidth($size));
+ $resized->setHeight($this->getTargetHeight());
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Scale given size to contain target size
+ *
+ * @param SizeInterface $size Size to be resized
+ * @throws GeometryException
+ */
+ public function contain(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ // auto height
+ $resized->setWidth($this->getTargetWidth());
+ $resized->setHeight($this->getProportionalHeight($size));
+
+ if (!$resized->fitsInto($this->getTargetSize())) {
+ // auto width
+ $resized->setWidth($this->getProportionalWidth($size));
+ $resized->setHeight($this->getTargetHeight());
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Scale given size to contain target size but prevent upsizing
+ *
+ * @param SizeInterface $size Size to be resized
+ * @throws GeometryException
+ */
+ public function containDown(SizeInterface $size): SizeInterface
+ {
+ $resized = new Rectangle($size->width(), $size->height());
+
+ // auto height
+ $resized->setWidth(
+ min($size->width(), $this->getTargetWidth())
+ );
+
+ $resized->setHeight(
+ min($size->height(), $this->getProportionalHeight($size))
+ );
+
+ if (!$resized->fitsInto($this->getTargetSize())) {
+ // auto width
+ $resized->setWidth(
+ min($size->width(), $this->getProportionalWidth($size))
+ );
+ $resized->setHeight(
+ min($size->height(), $this->getTargetHeight())
+ );
+ }
+
+ return $resized;
+ }
+
+ /**
+ * Crop target size out of given size at given position (i.e. move the pivot point)
+ */
+ public function crop(SizeInterface $size, string $position = 'top-left'): SizeInterface
+ {
+ return $this->resize($size)->alignPivotTo(
+ $size->movePivot($position),
+ $position
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php b/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php
new file mode 100755
index 00000000..a18c8b4a
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php
@@ -0,0 +1,42 @@
+backgroundColor = $color;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::backgroundColor()
+ */
+ public function backgroundColor(): mixed
+ {
+ return $this->backgroundColor;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::hasBackgroundColor()
+ */
+ public function hasBackgroundColor(): bool
+ {
+ return !empty($this->backgroundColor);
+ }
+}
diff --git a/vendor/intervention/image/src/Geometry/Traits/HasBorder.php b/vendor/intervention/image/src/Geometry/Traits/HasBorder.php
new file mode 100755
index 00000000..57ff83ae
--- /dev/null
+++ b/vendor/intervention/image/src/Geometry/Traits/HasBorder.php
@@ -0,0 +1,75 @@
+setBorderSize($size)->setBorderColor($color);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setBorderSize()
+ */
+ public function setBorderSize(int $size): self
+ {
+ $this->borderSize = $size;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::borderSize()
+ */
+ public function borderSize(): int
+ {
+ return $this->borderSize;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::setBorderColor()
+ */
+ public function setBorderColor(mixed $color): self
+ {
+ $this->borderColor = $color;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::borderColor()
+ */
+ public function borderColor(): mixed
+ {
+ return $this->borderColor;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see DrawableInterface::hasBorder()
+ */
+ public function hasBorder(): bool
+ {
+ return $this->borderSize > 0 && !is_null($this->borderColor);
+ }
+}
diff --git a/vendor/intervention/image/src/Image.php b/vendor/intervention/image/src/Image.php
new file mode 100755
index 00000000..738d0fec
--- /dev/null
+++ b/vendor/intervention/image/src/Image.php
@@ -0,0 +1,1082 @@
+origin = new Origin();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::driver()
+ */
+ public function driver(): DriverInterface
+ {
+ return $this->driver;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::core()
+ */
+ public function core(): CoreInterface
+ {
+ return $this->core;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::origin()
+ */
+ public function origin(): Origin
+ {
+ return $this->origin;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setOrigin()
+ */
+ public function setOrigin(Origin $origin): ImageInterface
+ {
+ $this->origin = $origin;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::count()
+ */
+ public function count(): int
+ {
+ return $this->core->count();
+ }
+
+ /**
+ * Implementation of IteratorAggregate
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return $this->core;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::isAnimated()
+ */
+ public function isAnimated(): bool
+ {
+ return $this->count() > 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::removeAnimation(
+ */
+ public function removeAnimation(int|string $position = 0): ImageInterface
+ {
+ return $this->modify(new RemoveAnimationModifier($position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::sliceAnimation()
+ */
+ public function sliceAnimation(int $offset = 0, ?int $length = null): ImageInterface
+ {
+ return $this->modify(new SliceAnimationModifier($offset, $length));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::loops()
+ */
+ public function loops(): int
+ {
+ return $this->core->loops();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setLoops()
+ */
+ public function setLoops(int $loops): ImageInterface
+ {
+ $this->core->setLoops($loops);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::exif()
+ */
+ public function exif(?string $query = null): mixed
+ {
+ return is_null($query) ? $this->exif : $this->exif->get($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setExif()
+ */
+ public function setExif(CollectionInterface $exif): ImageInterface
+ {
+ $this->exif = $exif;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::modify()
+ */
+ public function modify(ModifierInterface $modifier): ImageInterface
+ {
+ return $this->driver->specialize($modifier)->apply($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::analyze()
+ */
+ public function analyze(AnalyzerInterface $analyzer): mixed
+ {
+ return $this->driver->specialize($analyzer)->analyze($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::encode()
+ */
+ public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface
+ {
+ return $this->driver->specialize($encoder)->encode($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::save()
+ */
+ public function save(?string $path = null, mixed ...$options): ImageInterface
+ {
+ $path = is_null($path) ? $this->origin()->filePath() : $path;
+
+ if (is_null($path)) {
+ throw new EncoderException('Could not determine file path to save.');
+ }
+
+ try {
+ // try to determine encoding format by file extension of the path
+ $encoded = $this->encodeByPath($path, ...$options);
+ } catch (EncoderException) {
+ // fallback to encoding format by media type
+ $encoded = $this->encodeByMediaType(null, ...$options);
+ }
+
+ $encoded->save($path);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::width()
+ */
+ public function width(): int
+ {
+ return $this->analyze(new WidthAnalyzer());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::height()
+ */
+ public function height(): int
+ {
+ return $this->analyze(new HeightAnalyzer());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::size()
+ */
+ public function size(): SizeInterface
+ {
+ return new Rectangle($this->width(), $this->height());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::colorspace()
+ */
+ public function colorspace(): ColorspaceInterface
+ {
+ return $this->analyze(new ColorspaceAnalyzer());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setColorspace()
+ */
+ public function setColorspace(string|ColorspaceInterface $colorspace): ImageInterface
+ {
+ return $this->modify(new ColorspaceModifier($colorspace));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::resolution()
+ */
+ public function resolution(): ResolutionInterface
+ {
+ return $this->analyze(new ResolutionAnalyzer());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setResolution()
+ */
+ public function setResolution(float $x, float $y): ImageInterface
+ {
+ return $this->modify(new ResolutionModifier($x, $y));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::pickColor()
+ */
+ public function pickColor(int $x, int $y, int $frame_key = 0): ColorInterface
+ {
+ return $this->analyze(new PixelColorAnalyzer($x, $y, $frame_key));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::pickColors()
+ */
+ public function pickColors(int $x, int $y): CollectionInterface
+ {
+ return $this->analyze(new PixelColorsAnalyzer($x, $y));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::blendingColor()
+ */
+ public function blendingColor(): ColorInterface
+ {
+ return $this->driver()->handleInput(
+ $this->driver()->config()->blendingColor
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setBlendingColor()
+ */
+ public function setBlendingColor(mixed $color): ImageInterface
+ {
+ $this->driver()->config()->setOptions(
+ blendingColor: $this->driver()->handleInput($color)
+ );
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::blendTransparency()
+ */
+ public function blendTransparency(mixed $color = null): ImageInterface
+ {
+ return $this->modify(new BlendTransparencyModifier($color));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::profile()
+ */
+ public function profile(): ProfileInterface
+ {
+ return $this->analyze(new ProfileAnalyzer());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::setProfile()
+ */
+ public function setProfile(ProfileInterface $profile): ImageInterface
+ {
+ return $this->modify(new ProfileModifier($profile));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::removeProfile()
+ */
+ public function removeProfile(): ImageInterface
+ {
+ return $this->modify(new ProfileRemovalModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::reduceColors()
+ */
+ public function reduceColors(int $limit, mixed $background = 'transparent'): ImageInterface
+ {
+ return $this->modify(new QuantizeColorsModifier($limit, $background));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::sharpen()
+ */
+ public function sharpen(int $amount = 10): ImageInterface
+ {
+ return $this->modify(new SharpenModifier($amount));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::invert()
+ */
+ public function invert(): ImageInterface
+ {
+ return $this->modify(new InvertModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::pixelate()
+ */
+ public function pixelate(int $size): ImageInterface
+ {
+ return $this->modify(new PixelateModifier($size));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::greyscale()
+ */
+ public function greyscale(): ImageInterface
+ {
+ return $this->modify(new GreyscaleModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::brightness()
+ */
+ public function brightness(int $level): ImageInterface
+ {
+ return $this->modify(new BrightnessModifier($level));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::contrast()
+ */
+ public function contrast(int $level): ImageInterface
+ {
+ return $this->modify(new ContrastModifier($level));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::gamma()
+ */
+ public function gamma(float $gamma): ImageInterface
+ {
+ return $this->modify(new GammaModifier($gamma));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::colorize()
+ */
+ public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface
+ {
+ return $this->modify(new ColorizeModifier($red, $green, $blue));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::flip()
+ */
+ public function flip(): ImageInterface
+ {
+ return $this->modify(new FlipModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::flop()
+ */
+ public function flop(): ImageInterface
+ {
+ return $this->modify(new FlopModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::blur()
+ */
+ public function blur(int $amount = 5): ImageInterface
+ {
+ return $this->modify(new BlurModifier($amount));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::rotate()
+ */
+ public function rotate(float $angle, mixed $background = 'ffffff'): ImageInterface
+ {
+ return $this->modify(new RotateModifier($angle, $background));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::orient()
+ */
+ public function orient(): ImageInterface
+ {
+ return $this->modify(new AlignRotationModifier());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::text()
+ */
+ public function text(string $text, int $x, int $y, callable|Closure|FontInterface $font): ImageInterface
+ {
+ return $this->modify(
+ new TextModifier(
+ $text,
+ new Point($x, $y),
+ call_user_func(new FontFactory($font)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::resize()
+ */
+ public function resize(?int $width = null, ?int $height = null): ImageInterface
+ {
+ return $this->modify(new ResizeModifier($width, $height));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::resizeDown()
+ */
+ public function resizeDown(?int $width = null, ?int $height = null): ImageInterface
+ {
+ return $this->modify(new ResizeDownModifier($width, $height));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::scale()
+ */
+ public function scale(?int $width = null, ?int $height = null): ImageInterface
+ {
+ return $this->modify(new ScaleModifier($width, $height));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::scaleDown()
+ */
+ public function scaleDown(?int $width = null, ?int $height = null): ImageInterface
+ {
+ return $this->modify(new ScaleDownModifier($width, $height));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::cover()
+ */
+ public function cover(int $width, int $height, string $position = 'center'): ImageInterface
+ {
+ return $this->modify(new CoverModifier($width, $height, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::coverDown()
+ */
+ public function coverDown(int $width, int $height, string $position = 'center'): ImageInterface
+ {
+ return $this->modify(new CoverDownModifier($width, $height, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::resizeCanvas()
+ */
+ public function resizeCanvas(
+ ?int $width = null,
+ ?int $height = null,
+ mixed $background = 'ffffff',
+ string $position = 'center'
+ ): ImageInterface {
+ return $this->modify(new ResizeCanvasModifier($width, $height, $background, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::resizeCanvasRelative()
+ */
+ public function resizeCanvasRelative(
+ ?int $width = null,
+ ?int $height = null,
+ mixed $background = 'ffffff',
+ string $position = 'center'
+ ): ImageInterface {
+ return $this->modify(new ResizeCanvasRelativeModifier($width, $height, $background, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::padDown()
+ */
+ public function pad(
+ int $width,
+ int $height,
+ mixed $background = 'ffffff',
+ string $position = 'center'
+ ): ImageInterface {
+ return $this->modify(new PadModifier($width, $height, $background, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::pad()
+ */
+ public function contain(
+ int $width,
+ int $height,
+ mixed $background = 'ffffff',
+ string $position = 'center'
+ ): ImageInterface {
+ return $this->modify(new ContainModifier($width, $height, $background, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::crop()
+ */
+ public function crop(
+ int $width,
+ int $height,
+ int $offset_x = 0,
+ int $offset_y = 0,
+ mixed $background = 'ffffff',
+ string $position = 'top-left'
+ ): ImageInterface {
+ return $this->modify(new CropModifier($width, $height, $offset_x, $offset_y, $background, $position));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::trim()
+ */
+ public function trim(int $tolerance = 0): ImageInterface
+ {
+ return $this->modify(new TrimModifier($tolerance));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::place()
+ */
+ public function place(
+ mixed $element,
+ string $position = 'top-left',
+ int $offset_x = 0,
+ int $offset_y = 0,
+ int $opacity = 100
+ ): ImageInterface {
+ return $this->modify(new PlaceModifier($element, $position, $offset_x, $offset_y, $opacity));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::fill()
+ */
+ public function fill(mixed $color, ?int $x = null, ?int $y = null): ImageInterface
+ {
+ return $this->modify(
+ new FillModifier(
+ $color,
+ is_null($x) || is_null($y) ? null : new Point($x, $y),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawPixel()
+ */
+ public function drawPixel(int $x, int $y, mixed $color): ImageInterface
+ {
+ return $this->modify(new DrawPixelModifier(new Point($x, $y), $color));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawRectangle()
+ */
+ public function drawRectangle(int $x, int $y, callable|Closure|Rectangle $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawRectangleModifier(
+ call_user_func(new RectangleFactory(new Point($x, $y), $init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawEllipse()
+ */
+ public function drawEllipse(int $x, int $y, callable|Closure|Ellipse $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawEllipseModifier(
+ call_user_func(new EllipseFactory(new Point($x, $y), $init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawCircle()
+ */
+ public function drawCircle(int $x, int $y, callable|Closure|Circle $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawEllipseModifier(
+ call_user_func(new CircleFactory(new Point($x, $y), $init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawPolygon()
+ */
+ public function drawPolygon(callable|Closure|Polygon $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawPolygonModifier(
+ call_user_func(new PolygonFactory($init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawLine()
+ */
+ public function drawLine(callable|Closure|Line $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawLineModifier(
+ call_user_func(new LineFactory($init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::drawBezier()
+ */
+ public function drawBezier(callable|Closure|Bezier $init): ImageInterface
+ {
+ return $this->modify(
+ new DrawBezierModifier(
+ call_user_func(new BezierFactory($init)),
+ ),
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::encodeByMediaType()
+ */
+ public function encodeByMediaType(null|string|MediaType $type = null, mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new MediaTypeEncoder($type, ...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::encodeByExtension()
+ */
+ public function encodeByExtension(
+ null|string|FileExtension $extension = null,
+ mixed ...$options
+ ): EncodedImageInterface {
+ return $this->encode(new FileExtensionEncoder($extension, ...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::encodeByPath()
+ */
+ public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new FilePathEncoder($path, ...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toJpeg()
+ */
+ public function toJpeg(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new JpegEncoder(...$options));
+ }
+
+ /**
+ * Alias of self::toJpeg()
+ *
+ * @throws RuntimeException
+ */
+ public function toJpg(mixed ...$options): EncodedImageInterface
+ {
+ return $this->toJpeg(...$options);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toJpeg()
+ */
+ public function toJpeg2000(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new Jpeg2000Encoder(...$options));
+ }
+
+ /**
+ * ALias of self::toJpeg2000()
+ *
+ * @throws RuntimeException
+ */
+ public function toJp2(mixed ...$options): EncodedImageInterface
+ {
+ return $this->toJpeg2000(...$options);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toPng()
+ */
+ public function toPng(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new PngEncoder(...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toGif()
+ */
+ public function toGif(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new GifEncoder(...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toWebp()
+ */
+ public function toWebp(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new WebpEncoder(...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toBitmap()
+ */
+ public function toBitmap(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new BmpEncoder(...$options));
+ }
+
+ /**
+ * Alias if self::toBitmap()
+ *
+ * @throws RuntimeException
+ */
+ public function toBmp(mixed ...$options): EncodedImageInterface
+ {
+ return $this->toBitmap(...$options);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toAvif()
+ */
+ public function toAvif(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new AvifEncoder(...$options));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toTiff()
+ */
+ public function toTiff(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new TiffEncoder(...$options));
+ }
+
+ /**
+ * Alias of self::toTiff()
+ *
+ * @throws RuntimeException
+ */
+ public function toTif(mixed ...$options): EncodedImageInterface
+ {
+ return $this->toTiff(...$options);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageInterface::toHeic()
+ */
+ public function toHeic(mixed ...$options): EncodedImageInterface
+ {
+ return $this->encode(new HeicEncoder(...$options));
+ }
+
+ /**
+ * Show debug info for the current image
+ *
+ * @return array
+ */
+ public function __debugInfo(): array
+ {
+ try {
+ return [
+ 'width' => $this->width(),
+ 'height' => $this->height(),
+ ];
+ } catch (RuntimeException) {
+ return [];
+ }
+ }
+
+ /**
+ * Clone image
+ */
+ public function __clone(): void
+ {
+ $this->driver = clone $this->driver;
+ $this->core = clone $this->core;
+ $this->exif = clone $this->exif;
+ }
+}
diff --git a/vendor/intervention/image/src/ImageManager.php b/vendor/intervention/image/src/ImageManager.php
new file mode 100755
index 00000000..16e608b7
--- /dev/null
+++ b/vendor/intervention/image/src/ImageManager.php
@@ -0,0 +1,143 @@
+driver = $this->resolveDriver($driver, ...$options);
+ }
+
+ /**
+ * Create image manager with given driver
+ *
+ * @link https://image.intervention.io/v3/basics/configuration-drivers#static-constructor
+ *
+ * @throws DriverException
+ * @throws InputException
+ */
+ public static function withDriver(string|DriverInterface $driver, mixed ...$options): self
+ {
+ return new self(self::resolveDriver($driver, ...$options));
+ }
+
+ /**
+ * Create image manager with GD driver
+ *
+ * @link https://image.intervention.io/v3/basics/configuration-drivers#static-gd-driver-constructor
+ *
+ * @throws DriverException
+ * @throws InputException
+ */
+ public static function gd(mixed ...$options): self
+ {
+ return self::withDriver(new GdDriver(), ...$options);
+ }
+
+ /**
+ * Create image manager with Imagick driver
+ *
+ * @link https://image.intervention.io/v3/basics/configuration-drivers#static-imagick-driver-constructor
+ *
+ * @throws DriverException
+ * @throws InputException
+ */
+ public static function imagick(mixed ...$options): self
+ {
+ return self::withDriver(new ImagickDriver(), ...$options);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageManagerInterface::create()
+ */
+ public function create(int $width, int $height): ImageInterface
+ {
+ return $this->driver->createImage($width, $height);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageManagerInterface::read()
+ */
+ public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface
+ {
+ return $this->driver->handleInput(
+ $input,
+ match (true) {
+ is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders],
+ default => $decoders,
+ }
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageManagerInterface::animate()
+ */
+ public function animate(callable $init): ImageInterface
+ {
+ return $this->driver->createAnimation($init);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see ImageManagerInterface::driver()
+ */
+ public function driver(): DriverInterface
+ {
+ return $this->driver;
+ }
+
+ /**
+ * Return driver object from given input which might be driver classname or instance of DriverInterface
+ *
+ * @throws DriverException
+ * @throws InputException
+ */
+ private static function resolveDriver(string|DriverInterface $driver, mixed ...$options): DriverInterface
+ {
+ $driver = match (true) {
+ $driver instanceof DriverInterface => $driver,
+ class_exists($driver) => new $driver(),
+ default => throw new DriverException(
+ 'Unable to resolve driver. Argment must be either an instance of ' .
+ DriverInterface::class . '::class or a qualified namespaced name of the driver class.',
+ ),
+ };
+
+ if (!$driver instanceof DriverInterface) {
+ throw new DriverException(
+ 'Unable to resolve driver. Driver object must implement ' . DriverInterface::class . '.',
+ );
+ }
+
+ $driver->config()->setOptions(...$options);
+
+ return $driver;
+ }
+}
diff --git a/vendor/intervention/image/src/InputHandler.php b/vendor/intervention/image/src/InputHandler.php
new file mode 100755
index 00000000..9189aad9
--- /dev/null
+++ b/vendor/intervention/image/src/InputHandler.php
@@ -0,0 +1,132 @@
+
+ */
+ protected array $decoders = [
+ NativeObjectDecoder::class,
+ ImageObjectDecoder::class,
+ ColorObjectDecoder::class,
+ RgbHexColorDecoder::class,
+ RgbStringColorDecoder::class,
+ CmykStringColorDecoder::class,
+ HsvStringColorDecoder::class,
+ HslStringColorDecoder::class,
+ TransparentColorDecoder::class,
+ HtmlColornameDecoder::class,
+ FilePointerImageDecoder::class,
+ FilePathImageDecoder::class,
+ SplFileInfoImageDecoder::class,
+ BinaryImageDecoder::class,
+ DataUriImageDecoder::class,
+ Base64ImageDecoder::class,
+ EncodedImageObjectDecoder::class,
+ ];
+
+ /**
+ * Driver with which the decoder classes are specialized
+ */
+ protected ?DriverInterface $driver = null;
+
+ /**
+ * Create new input handler instance with given decoder classnames
+ *
+ * @param array $decoders
+ * @return void
+ */
+ public function __construct(array $decoders = [], ?DriverInterface $driver = null)
+ {
+ $this->decoders = count($decoders) ? $decoders : $this->decoders;
+ $this->driver = $driver;
+ }
+
+ /**
+ * Static factory method
+ *
+ * @param array $decoders
+ */
+ public static function withDecoders(array $decoders, ?DriverInterface $driver = null): self
+ {
+ return new self($decoders, $driver);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see InputHandlerInterface::handle()
+ */
+ public function handle(mixed $input): ImageInterface|ColorInterface
+ {
+ foreach ($this->decoders as $decoder) {
+ try {
+ // decode with driver specialized decoder
+ return $this->resolve($decoder)->decode($input);
+ } catch (DecoderException | NotSupportedException $e) {
+ // try next decoder
+ }
+ }
+
+ if (isset($e)) {
+ throw new ($e::class)($e->getMessage());
+ }
+
+ throw new DecoderException('Unable to decode input.');
+ }
+
+ /**
+ * Resolve the given classname to an decoder object
+ *
+ * @throws DriverException
+ * @throws NotSupportedException
+ */
+ private function resolve(string|DecoderInterface $decoder): DecoderInterface
+ {
+ if (($decoder instanceof DecoderInterface) && empty($this->driver)) {
+ return $decoder;
+ }
+
+ if (($decoder instanceof DecoderInterface) && !empty($this->driver)) {
+ return $this->driver->specialize($decoder);
+ }
+
+ if (empty($this->driver)) {
+ return new $decoder();
+ }
+
+ return $this->driver->specialize(new $decoder());
+ }
+}
diff --git a/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php b/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php
new file mode 100755
index 00000000..d11d874d
--- /dev/null
+++ b/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php
@@ -0,0 +1,17 @@
+
+ */
+interface CollectionInterface extends Traversable
+{
+ /**
+ * Determine if the collection has item at given key
+ */
+ public function has(int|string $key): bool;
+
+ /**
+ * Add item to collection
+ *
+ * @return CollectionInterface
+ */
+ public function push(mixed $item): self;
+
+ /**
+ * Return item for given key or return default is key does not exist
+ */
+ public function get(int|string $key, mixed $default = null): mixed;
+
+ /**
+ * Return item at given numeric position starting at 0
+ */
+ public function getAtPosition(int $key = 0, mixed $default = null): mixed;
+
+ /**
+ * Return first item in collection
+ */
+ public function first(): mixed;
+
+ /**
+ * Return last item in collection
+ */
+ public function last(): mixed;
+
+ /**
+ * Return item count of collection
+ */
+ public function count(): int;
+
+ /**
+ * Empty collection
+ *
+ * @return CollectionInterface
+ */
+ public function empty(): self;
+
+ /**
+ * Transform collection as array
+ *
+ * @return array
+ */
+ public function toArray(): array;
+
+ /**
+ * Extract items based on given values and discard the rest.
+ *
+ * @return CollectionInterface
+ */
+ public function slice(int $offset, ?int $length = 0): self;
+}
diff --git a/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php b/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php
new file mode 100755
index 00000000..ed705570
--- /dev/null
+++ b/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php
@@ -0,0 +1,57 @@
+
+ */
+ public function toArray(): array;
+
+ /**
+ * Cast color object to hex encoded web color
+ */
+ public function toHex(string $prefix = ''): string;
+
+ /**
+ * Return array of all color channels
+ *
+ * @return array
+ */
+ public function channels(): array;
+
+ /**
+ * Return array of normalized color channel values
+ *
+ * @return array
+ */
+ public function normalize(): array;
+
+ /**
+ * Retrieve the color channel by its classname
+ *
+ * @throws ColorException
+ */
+ public function channel(string $classname): ColorChannelInterface;
+
+ /**
+ * Convert color to given colorspace
+ */
+ public function convertTo(string|ColorspaceInterface $colorspace): self;
+
+ /**
+ * Determine if the current color is gray
+ */
+ public function isGreyscale(): bool;
+
+ /**
+ * Determine if the current color is (semi) transparent
+ */
+ public function isTransparent(): bool;
+
+ /**
+ * Determine whether the current color is completely transparent
+ */
+ public function isClear(): bool;
+
+ /**
+ * Cast color object to string
+ */
+ public function __toString(): string;
+}
diff --git a/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php b/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php
new file mode 100755
index 00000000..cd1d7ec9
--- /dev/null
+++ b/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php
@@ -0,0 +1,24 @@
+ $normalized
+ */
+ public function colorFromNormalized(array $normalized): ColorInterface;
+}
diff --git a/vendor/intervention/image/src/Interfaces/CoreInterface.php b/vendor/intervention/image/src/Interfaces/CoreInterface.php
new file mode 100755
index 00000000..40829844
--- /dev/null
+++ b/vendor/intervention/image/src/Interfaces/CoreInterface.php
@@ -0,0 +1,70 @@
+
+ */
+ public function setNative(mixed $native): self;
+
+ /**
+ * Count number of frames of animated image core
+ */
+ public function count(): int;
+
+ /**
+ * Return frame of given position in an animated image
+ *
+ * @throws AnimationException
+ */
+ public function frame(int $position): FrameInterface;
+
+ /**
+ * Add new frame to core
+ *
+ * @return CoreInterface
+ */
+ public function add(FrameInterface $frame): self;
+
+ /**
+ * Return number of repetitions of an animated image
+ */
+ public function loops(): int;
+
+ /**
+ * Set the number of repetitions for an animation. Where a
+ * value of 0 means infinite repetition.
+ *
+ * @return CoreInterface
+ */
+ public function setLoops(int $loops): self;
+
+ /**
+ * Get first frame in core
+ *
+ * @throws AnimationException
+ */
+ public function first(): FrameInterface;
+
+ /**
+ * Get last frame in core
+ *
+ * @throws AnimationException
+ */
+ public function last(): FrameInterface;
+}
diff --git a/vendor/intervention/image/src/Interfaces/DecoderInterface.php b/vendor/intervention/image/src/Interfaces/DecoderInterface.php
new file mode 100755
index 00000000..3383269d
--- /dev/null
+++ b/vendor/intervention/image/src/Interfaces/DecoderInterface.php
@@ -0,0 +1,17 @@
+ $objects
+ * @throws NotSupportedException
+ * @throws DriverException
+ * @return array