多🌹444收拾收拾计算机视觉手机手机手机手机4大尺寸惆怅长岑长
??????????????????????????С??????????????P??????????????????????????????????????????????????????^??????????
????j??????????
? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!database/migrations/2024_05_08_163635_create_ext_creative_suite_documents_table.php 0000644 00000001276 15266620634 0023774 0 ustar 00 id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->uuid('uuid')->unique();
$table->string('name');
$table->string('preview')->nullable();
$table->json('payload')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('ext_creative_suite_documents');
}
};
extension.json 0000644 00000000215 15266620634 0007463 0 ustar 00 {
"name": "Creative Suite",
"type": "extension",
"version": "1.4.0",
"description": "Creative Suite extension for magicai"
}
System/Helpers/Tool.php 0000644 00000077616 15266620634 0011113 0 ustar 00 (bool) setting('novita_api_key'),
'action' => 'merge_face',
'model' => setting('merge_face_model', 'novita') ?? 'novita',
'image' => 'assets/img/advanced-image/enhance/merge-face.png',
'title' => 'Merge Face',
'description' => 'Replace faces in source images with the target image.',
'premium' => false,
'icon' => ' ',
'models' => [
'novita',
],
],
[
'show' => (bool) setting('clipdrop_api_key'),
'action' => 'uncrop',
'model' => setting('uncrop_model', 'clipdrop') ?? 'clipdrop',
'image' => 'assets/img/advanced-image/enhance/generative-fill.jpg',
'title' => 'Generative Fill',
'description' => 'Fill in missing or damaged parts of images with smart restoration.',
'premium' => false,
'icon' => '',
'models' => [
'clipdrop',
],
],
[
'show' => (bool) setting('freepik_api_key'),
'model' => setting('reimagine_model', 'freepik') ?? 'freepik',
'action' => 'reimagine',
'image' => 'assets/img/advanced-image/enhance/reimagine.jpg',
'title' => 'Reimagine (Beta)',
'description' => 'Transform your existing images with creative, AI-driven edits.',
'premium' => false,
'icon' => '',
'models' => [
'freepik',
'gpt-image-1',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('novita_api_key'),
'action' => 'remove_background',
'model' => setting('remove_background_model', 'novita') ?? 'novita',
'image' => 'assets/img/advanced-image/enhance/remove-background.jpg',
'title' => 'Remove Background',
'description' => 'Instantly remove backgrounds to create transparent images. ',
'premium' => false,
'icon' => '',
'models' => [
'freepik',
// 'flux-pro/kontext',
// 'gpt-image-1',
],
],
[
'show' => (bool) setting('novita_api_key'),
'action' => 'cleanup',
'model' => setting('cleanup_model', 'novita') ?? 'novita',
'image' => 'assets/img/advanced-image/enhance/cleanup.jpg',
'title' => 'Cleanup',
'description' => 'Effortlessly remove unwanted objects or imperfections from your images.',
'premium' => false,
'icon' => '',
'models' => [
'novita',
'gpt-image-1',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('freepik_api_key'),
'action' => 'upscale',
'model' => 'freepik',
'image' => 'assets/img/advanced-image/enhance/upscaler.jpg',
'title' => 'Upscaler',
'description' => 'Enhance image resolution without losing detail or clarity.',
'premium' => false,
'icon' => '',
'models' => [
'freepik',
],
],
[
'show' => (bool) setting('novita_api_key'),
'action' => 'replace_background',
'model' => 'novita',
'image' => 'assets/img/advanced-image/enhance/replace-background.jpg',
'title' => 'Replace Background',
'description' => 'Easily change the background of any image to create a new setting.',
'premium' => false,
'icon' => '',
'models' => [
'novita',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('clipdrop_api_key') || Helper::setOpenAiKey(),
'action' => 'sketch_to_image',
'model' => setting('sketch_to_image_model', 'clipdrop') ?? 'clipdrop',
'image' => 'assets/img/advanced-image/enhance/sketch-to-image.jpg',
'title' => 'Sketch to Image',
'description' => 'Turn simple sketches into detailed, realistic images.',
'premium' => false,
'icon' => '',
'models' => [
'clipdrop',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('novita_api_key'),
'action' => 'remove_text',
'model' => setting('remove_text_model', 'novita') ?? 'novita',
'image' => 'assets/img/advanced-image/enhance/remove_text.png',
'title' => 'Remove Text',
'description' => 'Remove or eliminate unwanted text from images while preserving the background.',
'premium' => false,
'icon' => '',
'models' => [
'novita',
'gpt-image-1',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('novita_api_key') || Helper::setOpenAiKey(),
'action' => 'inpainting',
'model' => setting('inpainting_model', 'novita') ?? 'novita',
'image' => 'assets/img/advanced-image/enhance/inpainting.jpg',
'title' => 'Inpainting',
'description' => 'Seamlessly add new elements to your photos using AI-powered suggestions.',
'premium' => false,
'icon' => '',
'models' => [
'novita',
'gpt-image-1',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('freepik_api_key'),
'action' => 'style_transfer',
'model' => setting('style_transfer_model', 'freepik') ?? 'freepik',
'image' => 'assets/img/advanced-image/enhance/style-transfer.png',
'title' => 'Style Transfer',
'description' => 'Ensure stylistic consistency by transferring the style of your image.',
'premium' => false,
'icon' => ' ',
'models' => [
'freepik',
'gpt-image-1',
'flux-pro/kontext',
],
],
[
'show' => (bool) setting('freepik_api_key'),
'action' => 'image_relight',
'model' => setting('image_relight_model', 'freepik') ?? 'freepik',
'image' => 'assets/img/advanced-image/enhance/reimagine.jpg',
'title' => 'Image relight',
'description' => 'Relight an image using AI.',
'premium' => false,
'icon' => '',
'models' => [
'freepik',
'flux-pro/kontext',
],
],
];
$tools = array_filter($tools, function ($tool) {
return $tool['show'];
});
return array_values($tools);
}
}
System/Models/CreativeSuiteDocument.php 0000644 00000001750 15266620634 0014254 0 ustar 00
*/
protected $fillable = [
'user_id',
'uuid',
'name',
'preview',
'payload',
];
protected $appends = [
'preview_url',
];
public function previewUrl(): Attribute
{
return Attribute::make(
get: fn () => $this->preview
? (preg_match('/^https?:\/\//', $this->preview)
? $this->preview
: Storage::disk('uploads')->url($this->preview))
: null,
);
}
}
System/Models/.gitkeep 0000644 00000000016 15266620634 0010713 0 ustar 00 *
!.gitignore
System/Http/Controllers/CreativeSuiteController.php 0000644 00000001265 15266620634 0016624 0 ustar 00 firstOrFail();
$documents = CreativeSuiteDocument::query()
->where('user_id', Auth::id())
->orderBy('created_at', 'desc')
->take(20)
->get();
return view('creative-suite::index', compact(['documents', 'openai']));
}
}
System/Http/Controllers/CreativeSuiteDocumentController.php 0000644 00000007746 15266620634 0020335 0 ustar 00 json([
'status' => 'error',
'message' => trans('This feature is disabled in demo mode.'),
]);
}
$id = $request->input('id');
if ($id) {
$document = CreativeSuiteDocument::findOrFail($id);
$document->update([
'name' => $request->name,
'payload' => $request->payload,
]);
if ($request->hasFile('preview')) {
$document->update([
'preview' => $request->file('preview')->store('documents/previews', 'uploads'),
]);
}
return CreativeSuiteDocumentResource::make($document);
}
$document = CreativeSuiteDocument::create([
'user_id' => auth()->id(),
'uuid' => (string) \Illuminate\Support\Str::uuid(),
'name' => $request->name,
'preview' => $request->file('preview')->store('documents/previews', 'uploads'),
'payload' => $request->payload,
]);
return CreativeSuiteDocumentResource::make($document)->additional([
'status' => 'success',
'message' => trans('Document save successfully.'),
]);
}
public function show(CreativeSuiteDocument $document): CreativeSuiteDocumentResource
{
return CreativeSuiteDocumentResource::make($document)->additional([
'status' => 'success',
]);
}
public function duplicate(Request $request)
{
if (Helper::appIsDemo()) {
return response()->json([
'status' => 'error',
'message' => trans('This feature is disabled in demo mode.'),
]);
}
$request->validate(['id' => 'required']);
$document = CreativeSuiteDocument::findOrFail($request->id);
$newDocument = $document->replicate();
$newDocument->uuid = (string) \Illuminate\Support\Str::uuid();
$newDocument->name = $document->name . ' (Copy)';
$newDocument->save();
return CreativeSuiteDocumentResource::make($newDocument)->additional([
'status' => 'success',
]);
}
public function name(Request $request)
{
if (Helper::appIsDemo()) {
return response()->json([
'status' => 'error',
'message' => trans('This feature is disabled in demo mode.'),
]);
}
$request->validate([
'id' => 'required',
'name' => 'required|string|max:255',
]);
$document = CreativeSuiteDocument::findOrFail($request->id);
$document->update(['name' => $request->name]);
return CreativeSuiteDocumentResource::make($document)->additional([
'status' => 'success',
]);
}
public function destroy(Request $request): \Illuminate\Http\JsonResponse
{
if (Helper::appIsDemo()) {
return response()->json([
'status' => 'error',
'message' => trans('This feature is disabled in demo mode.'),
]);
}
$request->validate(['id' => 'required']);
$document = CreativeSuiteDocument::findOrFail($request->id);
$document->delete();
return response()->json([
'status' => 'success',
'message' => 'Document deleted successfully.',
]);
}
}
System/Http/Controllers/ImageUploadController.php 0000644 00000001342 15266620634 0016233 0 ustar 00 validate([
'image' => ['required', 'mimes:jpeg,jpg,png,webp,svg', 'max:8192'], // 6MB
]);
$image = $request->file('image');
$path = $image->store('', [
'disk' => 'uploads',
]);
return response()->json([
'data' => [
'path' => 'uploads/' . $path,
'url' => Storage::disk('uploads')->url($path),
],
]);
}
}
System/Http/Requests/.gitkeep 0000644 00000000016 15266620634 0012222 0 ustar 00 *
!.gitignore
System/Http/Requests/CreativeSuiteDocumentRequest.php 0000644 00000001625 15266620634 0017135 0 ustar 00 |string>
*/
public function rules(): array
{
return [
'id' => 'sometimes',
'name' => ['sometimes', 'string', 'max:255'],
'preview' => ['required'],
'payload' => ['sometimes'],
];
}
protected function prepareForValidation(): void
{
$this->merge([
'name' => $this->name ?? 'Untitled Document',
]);
}
}
System/Http/Requests/CreativeSuiteDocumentUpdateRequest.php 0000644 00000001646 15266620634 0020303 0 ustar 00 |string>
*/
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
'preview' => ['sometimes', 'mimes:jpeg,jpg,png,svg', 'max:100000'],
'payload' => ['sometimes', 'array'],
];
}
protected function prepareForValidation(): void
{
$this->merge([
'name' => $this->name ?? 'Untitled Document',
]);
}
}
System/Http/Resources/CreativeSuiteDocumentResource.php 0000644 00000001346 15266620634 0017433 0 ustar 00 $this->id,
'user_id' => $this->user_id,
'uuid' => $this->uuid,
'name' => $this->name,
'preview' => '/uploads/' . $this->preview,
'preview_url' => $this->preview ? Storage::disk('uploads')->url($this->preview) : null,
'payload' => $this->payload,
];
}
}
System/Http/Resources/.gitkeep 0000644 00000000016 15266620634 0012361 0 ustar 00 *
!.gitignore
System/CreativeSuiteServiceProvider.php 0000644 00000007003 15266620634 0014363 0 ustar 00 registerConfig();
}
public function boot(Kernel $kernel): void
{
$this->registerTranslations()
->registerViews()
->registerRoutes()
->registerMigrations()
->publishAssets()
->registerComponents();
}
public function registerComponents(): static
{
// $this->loadViewComponentsAs('example', []);
return $this;
}
public function publishAssets(): static
{
$this->publishes([
__DIR__ . '/../resources/assets/img' => public_path('vendor/creative-suite/img'),
__DIR__ . '/../resources/assets/templates' => public_path('vendor/creative-suite/templates'),
], 'extension');
return $this;
}
public function registerConfig(): static
{
$this->mergeConfigFrom(__DIR__ . '/../config/creative-suite.php', 'creative-suite');
return $this;
}
protected function registerTranslations(): static
{
$this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'creative-suite');
return $this;
}
public function registerViews(): static
{
$this->loadViewsFrom([__DIR__ . '/../resources/views'], 'creative-suite');
return $this;
}
public function registerMigrations(): static
{
$this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
return $this;
}
private function registerRoutes(): static
{
$this->router()
->group([
'middleware' => ['web', 'auth'],
'prefix' => 'dashboard/user/creative-suite',
'as' => 'dashboard.user.creative-suite.',
], function (Router $router) {
$router->get('', CreativeSuiteController::class)->name('index');
$router->post('image/upload', ImageUploadController::class)->name('image.upload');
$router->post('document', [CreativeSuiteDocumentController::class, 'updateOrCreate'])->name('document.update-or-create');
$router->post('document/duplicate', [CreativeSuiteDocumentController::class, 'duplicate'])->name('document.duplicate');
$router->post('document/name', [CreativeSuiteDocumentController::class, 'name'])->name('document.name');
$router->post('document/delete', [CreativeSuiteDocumentController::class, 'destroy'])->name('document.delete');
$router->get('document/{document}', [CreativeSuiteDocumentController::class, 'show'])->name('document.update-or-create');
});
return $this;
}
private function router(): Router|Route
{
return $this->app['router'];
}
public static function uninstall(): void
{
// TODO: Implement uninstall() method.
}
}
resources/.DS_Store 0000644 00000014004 15266620634 0010252 0 ustar 00 Bud1 t sbwspblob a s s e t sbwspblob ¹bplist00Ö ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{405, -185}, {850, 885}} #/;R_klmno‹
Œ a s s e t svSrnlong @ € @ € @ € @ E DSDB ` € @ € @ € @ resources/assets/.DS_Store 0000644 00000014004 15266620634 0011554 0 ustar 00 Bud1 l a t e sbw t e m p l a t e sbwspblob ¹bplist00Ö ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{405, -185}, {850, 885}} #/;R_klmno‹
Œ t e m p l a t e svSrnlong @ € @ € @ € @ E DSDB ` € @ € @ € @ resources/assets/templates/.DS_Store 0000644 00000020004 15266620634 0013547 0 ustar 00 Bud1 e sbwspblob @ € @ € @ € @ i m a g e sbwspblob ¹bplist00Ö ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{405, -185}, {850, 885}} #/;R_klmno‹
Œ i m a g e slsvCblob .bplist00Ú
UVUWXY_useRelativeDates_showIconPreviewWcolumns_calculateAllSizes_scrollPositionYXtextSize_scrollPositionXZsortColumnXiconSize_viewOptionsVersion ®!%*/49=BGKOÔWvisibleYascendingUwidthZidentifier ,TnameÔ#XubiquityÔ µ\dateModifiedÔ$[dateCreatedÔ() aTsizeÔ-. sTkindÔ23 dUlabelÔ78 KWversionÔ< XcommentsÔ@AÁ^dateLastOpenedÔEFÈZshareOwnerÔEJ_shareLastEditorÔNYdateAddedÔPQ_invitationStatusÒ# #@* Tsize#@0 0 B J ^ p y ‹ – Ÿ ´ µ ¶ Å Î Ö à æ ñ ò ó ö û+456BKLMOT]^_afopqsy‚ƒ„†Ž—˜™¢«¬¯¾ÇÈÉËÖßàáóüýþ$&'()2;@I Z Z i m a g e slsvpblob £bplist00Ú
GHGIJK_useRelativeDates_showIconPreviewWcolumns_calculateAllSizes_scrollPositionYXtextSize_scrollPositionXZsortColumnXiconSize_viewOptionsVersion Ù %*/48=AXcommentsUlabelWversion[dateCreatedTsize\dateModifiedTkindTname^dateLastOpenedÔUindexYascendingUwidthWvisible ,Ô!# dÔ&( KÔ+-µÔ02a Ô5- Ô9; s Ô> ÔBDÁ# #@* Tsize#@0 0 B J ^ p y ‹ – Ÿ ´ µ ¶ É Ò Ø à ì ñ þ &06>@ADENPQST]_`bclnoqr{}~€�ŠŒ�Ž—™šœ�¦¨©ª³µ¶¸¹ºÃÌÑÚ L ë i m a g e svSrnlong j s o nbwspblob ·bplist00Ö ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{1653, 0}, {850, 951}} #/;R_klmno‰
Š j s o nvSrnlong E DSDB ` € @ € @ € @ Ù %*/48=AXcommentsUlabelWversion[dateCreatedTsize\dateModifiedTkindTname^dateLastOpenedÔUindexYascendingUwidthWvisible ,Ô!# dÔ&( KÔ+-µÔ02a Ô5- Ô9; s Ô> ÔBDÁ# #@* Tsize#@0 0 B J ^ p y ‹ – Ÿ ´ µ ¶ É Ò Ø à ì ñ þ &06>@ADENPQST]_`bclnoqr{}~€�ŠŒ�Ž—™šœ�¦¨©ª³µ¶¸¹ºÃÌÑÚ L ë i m a g e svSrnlong j s o nbwspblob ·bplist00Ö ]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{1653, 0}, {850, 951}} #/;R_klmno‰
Š j s o nvSrnlong resources/assets/templates/images/google-ad.png 0000644 00000063430 15266620634 0015707 0 ustar 00 ‰PNG
IHDR f h Sò¡T APLTEͽÿÑ¿ÿÙ½þä¼ÿÑ¿òǹ뼳ߢÀχ³gÄ‘OÅvAÆg4ÇY*ÈOÉA˼ýßÌþëÕÿ°¥ÒŒ�°ˆ…¨mzŒåÑÿÚÈÿ˜’»5L?.:Tin@'QW]¢šÆ)1+#,$ÖÅü&H6€yš³¹¿°±®««¦¦¦¡ª¢—¥¢˜§Ÿ“›‘„¦œŽ©¡•ž™�ûöý’’Ž–Šhj_VMH;=?013HCA‹€uwh[kTF"!!n_T�sfztlW_Q‰{n<3,{|u 0 “†{hhn‘ƒxˆ‡ƒ|l_'˜›œØãæÁÊÍ@W6w>!n<S*d3="S9+0N#°{^ªkH�O-™]>Éh€I&ИxΓpÀ|SÔª�×´ Õ¡‚ÍŠbnh‚e6uG:qñö e’IDATxìך!@a’à$ÌýoÛêîÊÛûÿ�dÌÝ�F£Ñh€H¢µÎy6óÞ;gWÏ 3º&hpÖùcJ¹°H]$½~Y— —œR‰ÐŒÎó¢õ!¦\d‰Ê¦îRRtÃú¸oãmº"|Wµ–ä‰Ìh•.¿.ÄÌr?ï6uDf¨À)wß'$5{úóEØê|°°ìÅ§ß JøOhèÂr°,öƒ\t�Hq^Ø*Ƙt)í™Ê¾›H é¿„ñ2áNÆmBë±x ˜ Lÿ3fjcõòqëtBa}éVµXü£…ØÅ¤Âgx9§¼Å[Ž7 ú5ñ6u�ÿ°@#¡�¥ÖãÂÒ–^åU]0÷5!Ù�7?Nò�;ë/N|œxq@Ñ}Í#
¥ò*¡élj�‹¬€Ì3"›ê�;áqbÎ1tà'6!ÎÈ7Ã&Eq €v‚¨Iˆj:¢»zÿÿ7^9ÕÞÚÈJ;žŠø>ºµ_^õ<:'ö^Ïêô�-6†á 8�Ù?}†[)}:_,WËÅ<
eßJ1ž´·ØïކŸ:zjhßÈÜ€[‡¯
ãD¬¡t½ãÂüE±™¼èæL'Ï7dÕéc}NÄmZºžŒq«âÙ÷Ãkp'ϦÐâ ‡
Ö—à6¨×:æcÌ'/¾þÕSçD¸°Ãºü
îe©ÈkMšþÈŠDdÙo¹e>ÐÞ½fq›´*6ÇP$ÐrCuYþë¿{÷lÇiÛâf¬�ŒIq_¶xªs.±ü»¾NôgmŽg}ü‚(7Òjø*ÖüòîyŽ�5-cœ§ZAïpTg£¡ƒõ*Ö]ÄMù²96Öôø{N=•í.úœ¿Êñ”jÜWÆFgk èá‘´:>¦"éëó8›ñõ¢©eSsÄošŸ®ö�Ü�§-Ž‹·ø¢~d%Ï@ßð‰‡¯4„�î*|Î8'šöã‹'ð¤"Í‹Èef'›aÙ?Å¥zD�³¢Íñè
É·fs]³çe8x„»Xôü‚lìÛ:&É4§,
dù„¯Ø §ÿs,.ƒÌgškrËà<> ‹É…cÛìñ`Ú\nÏ=~]xd÷vUùÀX¼�cBI6�бKðqöŠ…±“üý™íޛùÆ-M«i z¬7õ0ÀÝèQqáx:N4¼-y÷)ЕÈÛK"¦-íÆýýƒ<³Í‡Þ8ÕðÆ$Å·f›I
ÜQ¯«³ÏQ¾jˆ™YÁ[£'tu$ÕIs8W» ×,äF,(Èo�6‚‹Ðý¹æ…:©�HÊaEšoC™AÅ¢y:™j¸Ây›ëÍš‚œ.G”áýê\sùÓ™ô£ƒ “œµCl[Øœj=‹Çð£Z4wd;k
AI®›UY±k#7:ŸöC¸¿Æ#
à€3ì' ¨U¼v9äwÝ8ë|Údzê
ÙW�*C&2ðrÿÙ°ßUä�AG퉆nõqÜY¸øã{ý$iÔšñ ™¥yvå¨ÍV 7þô”ß�e¾ˆˆO"‚Õb0iu¾Ê]F\”¾,K_.0Ö?»nÖÙ´Y¶#/ÍVwi^ojNĺÚV5“LK"tn,¯=ö†HÖ™f¬%`éDG‘±1Ÿóëæ¤�¾AçöËXwWkÑraÍgÔ‚7#�n¡ào—Ìv‹!7c*{í»“:’áØG'ÄÀ›Aë\g7:<¶Œ†d–äÁ7#iŠ×-� ûIæäFÞ¾=Ëg™ó�’AϤ{ᜯþ&:VÞÉ5Ëž{ƒ&eg.Ì1¶IÆ�Ä2|œdz Òrœ_ ÖÄ¥´Á±åâC€#¸
åçbüoޱÚy©¶£änp‚˹™†qP†l¹©‡CµYf!€˜£dø(Ä?UkGËB¹Vpÿ²sÛ
Â0†§„C¹\KÞÿmu¡®ÙL<Öÿ{†YLÒ@ÍïÚ‡—0„ùolZo�`MnÎ0#·×:#{˜��
Z¿ffÂŒþ0#û Ì…ÿ‘
Ù`Ù sýOÑ`}49#å‚|¾ Ž}üÿ«Á~Ï5ºàŸLFöwÖsüeî?c™+˜L°2™”–¹Œ€WÏÆA™£Ì!ãäÍd²2Çfnž2ÇfŽÍ\¾ºÌ¡õ‚2‡YÊ7ÈŠ›DÅÍ Ö‚Íâ`2)³»>©=ü˜=BÕîì�as¢¾Æ›[aîì}hM¬ÎàT‹ °÷û¹?Ìâ¡ý³ÝÎ>¥G$ÛÏœ“ k±�¢8þ8�?«Ë3›9º~4ÿOš™èÆËÓ§6ƒjÒ“›™ôú§üÅ„·fz~3ÿ0› Ÿ>�w¹žßÌÿ{ýnÂ籃uíËÌÃü×ÌB,âÓ@X_&¤é÷éûÌßcf!’øTsŨÁ˜}Û´óô_ãø\âG„IcÎöž÷}Öïéf}Ôt)W0Â@�øÓæŒï Š—ølYX^Z3˜¯±ù¼Ÿ€ùÝ@‘Äcˆ¯%k·µeËd¯Ä߯�º“ñ²1µn°$õtjFè¹ßΞ{k%¯g¬±XØHÎWëÛ\á®ÃÓöæð¦É|ÆŸäcàílÓ¯¥ÜjÇÚŸ¹ßü|qðL‰èDŒIo�=¤fZ�:p1ð0ynh:ŒxH‚‹E8º· þx�kdmô B
n~~Æ ÄU®äí³Ó˜ËÍÊê°Ùl–×p±r:,ˬx ©\1„XÞD¢¬HÐ?þ%fÁ7.€ó‡&":›„±¶ˆ‘Cœ{ágä\˜Éù�”U¿ŭ¤”j…¾O>W·ÚåΞ§Ú•E‚|mS±bÑàœ©ÑüXöFnœ•i 'Îôè® êc30N”ŽYò2õîKv�baW”kÅ¢r�%¬Ò¾ÃÌ¢²ÒvVâÃÔºÕNM£'ÔÀ–uíWIÔIÞF²”ü�š† 7éc˜Õ4f¥¶ÙÌ,gÌ*€bq2„©i-ãŽr¿ÀÇRÏÜ^˜·rËA.fnÃt¾›1;ËlÌè4ÏŠèÓøŽõö*öDÓ¶}ð 8Ûw_kÌLò æ¸Rr‘ÌÄÌîýWüÈ•…|“˜)o4vÃÃ�œL?à(Žy
ç6åqH¦ÉL7èÌ3fÛð!7†YD}q¹‚x÷ªtÕk¼½>6©¢ÈôœÇ¬3Ó1›åfHæ-¨ æÙ3ô0ÈD”;Ñî•4Á®›DÝvA`d‡g™Æl+ ’Êö³”rzY†´¬Ö#ÌÛnÿ(Ýy¨v¼Ã¼µÁmy×=�¾‹©• ë�m •ÈÙ’HÀ�•Ë�n¾¬€j•íP=ÌògºØ9ÐÇ<ˆYféUEÌj•§i¶‘n²ðL±ã˘éøAÉÜY½˜„8›[6=èP ï°Âƒ×Æ£<áætk኷+ð7ácÎ_’œðÀì!̽ý’nÁeÄi�ƒ×#Ì9Or˜ß¢¿;gˆÃËj ZqǾâįj*þ:²:½p¢b ƒ×@BºŸÍ}˜I³›Èz]z-�f(06y¨ŸQƦv”�y-£ò¥ª:pƒÁ‘§ae÷Ú‹æÐ'0§&�ä¸Þ@Ȥë=ÌÀœoß±;󌱉ˆj²pšH"W\hÑÍ ñÕ@wºØËЇÉú_WÀ|Lœc.vÁäìcEŸš»×ùIc27ç"ÏÊ(^F>æ"Ëñ2|
ô±·Zŧ™J§–Ð ´"¶W#SÂ@ŠÖ